diff --git a/clientapi/routing/routing.go b/clientapi/routing/routing.go index 9fe882376..c6be8939d 100644 --- a/clientapi/routing/routing.go +++ b/clientapi/routing/routing.go @@ -65,7 +65,7 @@ func Setup( userInteractiveAuth := auth.NewUserInteractive(accountDB.GetAccountByPassword, cfg) unstableFeatures := map[string]bool{ - "org.matrix.e2e_cross_signing": true, + //"org.matrix.e2e_cross_signing": true, } for _, msc := range cfg.MSCs.MSCs { unstableFeatures["org.matrix."+msc] = true diff --git a/keyserver/storage/postgres/cross_signing_keys_table.go b/keyserver/storage/postgres/cross_signing_keys_table.go index 8f3f7054e..63ad93035 100644 --- a/keyserver/storage/postgres/cross_signing_keys_table.go +++ b/keyserver/storage/postgres/cross_signing_keys_table.go @@ -23,13 +23,14 @@ import ( "github.com/matrix-org/dendrite/internal/sqlutil" "github.com/matrix-org/dendrite/keyserver/api" "github.com/matrix-org/dendrite/keyserver/storage/tables" + "github.com/matrix-org/dendrite/keyserver/types" "github.com/matrix-org/gomatrixserverlib" ) var crossSigningKeysSchema = ` CREATE TABLE IF NOT EXISTS keyserver_cross_signing_keys ( user_id TEXT NOT NULL, - key_type TEXT NOT NULL, + key_type SMALLINT NOT NULL, key_data TEXT NOT NULL, PRIMARY KEY (user_id, key_type) ); @@ -74,11 +75,15 @@ func (s *crossSigningKeysStatements) SelectCrossSigningKeysForUser( defer internal.CloseAndLogIfError(ctx, rows, "selectCrossSigningKeysForUserStmt: rows.close() failed") r = api.CrossSigningKeyMap{} for rows.Next() { - var keyType gomatrixserverlib.CrossSigningKeyPurpose + var keyTypeInt int16 var keyData gomatrixserverlib.Base64Bytes - if err := rows.Scan(&keyType, &keyData); err != nil { + if err := rows.Scan(&keyTypeInt, &keyData); err != nil { return nil, err } + keyType, ok := types.KeyTypeIntToPurpose[keyTypeInt] + if !ok { + return nil, fmt.Errorf("unknown key purpose int %d", keyTypeInt) + } r[keyType] = keyData } return @@ -87,7 +92,11 @@ func (s *crossSigningKeysStatements) SelectCrossSigningKeysForUser( func (s *crossSigningKeysStatements) UpsertCrossSigningKeysForUser( ctx context.Context, txn *sql.Tx, userID string, keyType gomatrixserverlib.CrossSigningKeyPurpose, keyData gomatrixserverlib.Base64Bytes, ) error { - if _, err := sqlutil.TxStmt(txn, s.upsertCrossSigningKeysForUserStmt).ExecContext(ctx, userID, keyType, keyData); err != nil { + keyTypeInt, ok := types.KeyTypePurposeToInt[keyType] + if !ok { + return fmt.Errorf("unknown key purpose %q", keyType) + } + if _, err := sqlutil.TxStmt(txn, s.upsertCrossSigningKeysForUserStmt).ExecContext(ctx, userID, keyTypeInt, keyData); err != nil { return fmt.Errorf("s.upsertCrossSigningKeysForUserStmt: %w", err) } return nil diff --git a/keyserver/storage/sqlite3/cross_signing_keys_table.go b/keyserver/storage/sqlite3/cross_signing_keys_table.go index 03b26d3c7..5aac9cac9 100644 --- a/keyserver/storage/sqlite3/cross_signing_keys_table.go +++ b/keyserver/storage/sqlite3/cross_signing_keys_table.go @@ -23,13 +23,14 @@ import ( "github.com/matrix-org/dendrite/internal/sqlutil" "github.com/matrix-org/dendrite/keyserver/api" "github.com/matrix-org/dendrite/keyserver/storage/tables" + "github.com/matrix-org/dendrite/keyserver/types" "github.com/matrix-org/gomatrixserverlib" ) var crossSigningKeysSchema = ` CREATE TABLE IF NOT EXISTS keyserver_cross_signing_keys ( user_id TEXT NOT NULL, - key_type TEXT NOT NULL, + key_type INTEGER NOT NULL, key_data TEXT NOT NULL, PRIMARY KEY (user_id, key_type) ); @@ -73,11 +74,15 @@ func (s *crossSigningKeysStatements) SelectCrossSigningKeysForUser( defer internal.CloseAndLogIfError(ctx, rows, "selectCrossSigningKeysForUserStmt: rows.close() failed") r = api.CrossSigningKeyMap{} for rows.Next() { - var keyType gomatrixserverlib.CrossSigningKeyPurpose + var keyTypeInt int16 var keyData gomatrixserverlib.Base64Bytes - if err := rows.Scan(&keyType, &keyData); err != nil { + if err := rows.Scan(&keyTypeInt, &keyData); err != nil { return nil, err } + keyType, ok := types.KeyTypeIntToPurpose[keyTypeInt] + if !ok { + return nil, fmt.Errorf("unknown key purpose int %d", keyTypeInt) + } r[keyType] = keyData } return @@ -86,7 +91,11 @@ func (s *crossSigningKeysStatements) SelectCrossSigningKeysForUser( func (s *crossSigningKeysStatements) UpsertCrossSigningKeysForUser( ctx context.Context, txn *sql.Tx, userID string, keyType gomatrixserverlib.CrossSigningKeyPurpose, keyData gomatrixserverlib.Base64Bytes, ) error { - if _, err := sqlutil.TxStmt(txn, s.upsertCrossSigningKeysForUserStmt).ExecContext(ctx, userID, keyType, keyData); err != nil { + keyTypeInt, ok := types.KeyTypePurposeToInt[keyType] + if !ok { + return fmt.Errorf("unknown key purpose %q", keyType) + } + if _, err := sqlutil.TxStmt(txn, s.upsertCrossSigningKeysForUserStmt).ExecContext(ctx, userID, keyTypeInt, keyData); err != nil { return fmt.Errorf("s.upsertCrossSigningKeysForUserStmt: %w", err) } return nil diff --git a/keyserver/types/storage.go b/keyserver/types/storage.go new file mode 100644 index 000000000..e5f914b62 --- /dev/null +++ b/keyserver/types/storage.go @@ -0,0 +1,33 @@ +// Copyright 2021 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import "github.com/matrix-org/gomatrixserverlib" + +// KeyTypePurposeToInt maps a purpose to an integer, which is used in the +// database to reduce the amount of space taken up by this column. +var KeyTypePurposeToInt = map[gomatrixserverlib.CrossSigningKeyPurpose]int16{ + gomatrixserverlib.CrossSigningKeyPurposeMaster: 1, + gomatrixserverlib.CrossSigningKeyPurposeSelfSigning: 2, + gomatrixserverlib.CrossSigningKeyPurposeUserSigning: 3, +} + +// KeyTypeIntToPurpose maps an integer to a purpose, which is used in the +// database to reduce the amount of space taken up by this column. +var KeyTypeIntToPurpose = map[int16]gomatrixserverlib.CrossSigningKeyPurpose{ + 1: gomatrixserverlib.CrossSigningKeyPurposeMaster, + 2: gomatrixserverlib.CrossSigningKeyPurposeSelfSigning, + 3: gomatrixserverlib.CrossSigningKeyPurposeUserSigning, +}