diff --git a/internal/keydb/cache/keydb.go b/internal/keydb/cache/keydb.go deleted file mode 100644 index a0cdb9007..000000000 --- a/internal/keydb/cache/keydb.go +++ /dev/null @@ -1,68 +0,0 @@ -package cache - -import ( - "context" - "errors" - - "github.com/matrix-org/dendrite/internal/caching" - "github.com/matrix-org/gomatrixserverlib" -) - -// A Database implements gomatrixserverlib.KeyDatabase and is used to store -// the public keys for other matrix servers. -type KeyDatabase struct { - inner gomatrixserverlib.KeyDatabase - cache caching.ImmutableCache -} - -func NewKeyDatabase(inner gomatrixserverlib.KeyDatabase, cache caching.ImmutableCache) (*KeyDatabase, error) { - if inner == nil { - return nil, errors.New("inner database can't be nil") - } - if cache == nil { - return nil, errors.New("cache can't be nil") - } - return &KeyDatabase{ - inner: inner, - cache: cache, - }, nil -} - -// FetcherName implements KeyFetcher -func (d KeyDatabase) FetcherName() string { - return "InMemoryKeyCache" -} - -// FetchKeys implements gomatrixserverlib.KeyDatabase -func (d *KeyDatabase) FetchKeys( - ctx context.Context, - requests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp, -) (map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, error) { - results := make(map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult) - for req := range requests { - if res, cached := d.cache.GetServerKey(req); cached { - results[req] = res - delete(requests, req) - } - } - fromDB, err := d.inner.FetchKeys(ctx, requests) - if err != nil { - return results, err - } - for req, res := range fromDB { - results[req] = res - d.cache.StoreServerKey(req, res) - } - return results, nil -} - -// StoreKeys implements gomatrixserverlib.KeyDatabase -func (d *KeyDatabase) StoreKeys( - ctx context.Context, - keyMap map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, -) error { - for req, res := range keyMap { - d.cache.StoreServerKey(req, res) - } - return d.inner.StoreKeys(ctx, keyMap) -} diff --git a/internal/keydb/interface.go b/internal/keydb/interface.go deleted file mode 100644 index 3a67ac55a..000000000 --- a/internal/keydb/interface.go +++ /dev/null @@ -1,13 +0,0 @@ -package storage - -import ( - "context" - - "github.com/matrix-org/gomatrixserverlib" -) - -type Database interface { - FetcherName() string - FetchKeys(ctx context.Context, requests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp) (map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, error) - StoreKeys(ctx context.Context, keyMap map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult) error -} diff --git a/internal/keydb/keydb.go b/internal/keydb/keydb.go deleted file mode 100644 index 3644a63e8..000000000 --- a/internal/keydb/keydb.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2020 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. - -// +build !wasm - -package storage - -import ( - "net/url" - - "golang.org/x/crypto/ed25519" - - "github.com/matrix-org/dendrite/internal" - "github.com/matrix-org/dendrite/internal/keydb/postgres" - "github.com/matrix-org/dendrite/internal/keydb/sqlite3" - "github.com/matrix-org/gomatrixserverlib" -) - -// NewDatabase opens a database connection. -func NewDatabase( - dataSourceName string, - dbProperties internal.DbProperties, - serverName gomatrixserverlib.ServerName, - serverKey ed25519.PublicKey, - serverKeyID gomatrixserverlib.KeyID, -) (Database, error) { - uri, err := url.Parse(dataSourceName) - if err != nil { - return postgres.NewDatabase(dataSourceName, dbProperties, serverName, serverKey, serverKeyID) - } - switch uri.Scheme { - case "postgres": - return postgres.NewDatabase(dataSourceName, dbProperties, serverName, serverKey, serverKeyID) - case "file": - return sqlite3.NewDatabase(dataSourceName, serverName, serverKey, serverKeyID) - default: - return postgres.NewDatabase(dataSourceName, dbProperties, serverName, serverKey, serverKeyID) - } -} diff --git a/internal/keydb/keydb_wasm.go b/internal/keydb/keydb_wasm.go deleted file mode 100644 index ca55dc846..000000000 --- a/internal/keydb/keydb_wasm.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2020 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. - -// +build wasm - -package storage - -import ( - "fmt" - "net/url" - - "golang.org/x/crypto/ed25519" - - "github.com/matrix-org/dendrite/internal" - "github.com/matrix-org/dendrite/internal/keydb/sqlite3" - "github.com/matrix-org/gomatrixserverlib" -) - -// NewDatabase opens a database connection. -func NewDatabase( - dataSourceName string, - dbProperties internal.DbProperties, // nolint:unparam - serverName gomatrixserverlib.ServerName, - serverKey ed25519.PublicKey, - serverKeyID gomatrixserverlib.KeyID, -) (Database, error) { - uri, err := url.Parse(dataSourceName) - if err != nil { - return nil, err - } - switch uri.Scheme { - case "postgres": - return nil, fmt.Errorf("Cannot use postgres implementation") - case "file": - return sqlite3.NewDatabase(uri.Path, serverName, serverKey, serverKeyID) - default: - return nil, fmt.Errorf("Cannot use postgres implementation") - } -} diff --git a/internal/keydb/postgres/keydb.go b/internal/keydb/postgres/keydb.go deleted file mode 100644 index da3a4d370..000000000 --- a/internal/keydb/postgres/keydb.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2017-2018 New Vector Ltd -// Copyright 2019-2020 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 postgres - -import ( - "context" - "time" - - "golang.org/x/crypto/ed25519" - - "github.com/matrix-org/dendrite/internal" - "github.com/matrix-org/dendrite/internal/sqlutil" - "github.com/matrix-org/gomatrixserverlib" -) - -// A Database implements gomatrixserverlib.KeyDatabase and is used to store -// the public keys for other matrix servers. -type Database struct { - statements serverKeyStatements -} - -// NewDatabase prepares a new key database. -// It creates the necessary tables if they don't already exist. -// It prepares all the SQL statements that it will use. -// Returns an error if there was a problem talking to the database. -func NewDatabase( - dataSourceName string, - dbProperties internal.DbProperties, - serverName gomatrixserverlib.ServerName, - serverKey ed25519.PublicKey, - serverKeyID gomatrixserverlib.KeyID, -) (*Database, error) { - db, err := sqlutil.Open("postgres", dataSourceName, dbProperties) - if err != nil { - return nil, err - } - d := &Database{} - err = d.statements.prepare(db) - if err != nil { - return nil, err - } - // Store our own keys so that we don't end up making HTTP requests to find our - // own keys - index := gomatrixserverlib.PublicKeyLookupRequest{ - ServerName: serverName, - KeyID: serverKeyID, - } - value := gomatrixserverlib.PublicKeyLookupResult{ - VerifyKey: gomatrixserverlib.VerifyKey{ - Key: gomatrixserverlib.Base64String(serverKey), - }, - ValidUntilTS: gomatrixserverlib.AsTimestamp(time.Now().Add(100 * 365 * 24 * time.Hour)), - ExpiredTS: gomatrixserverlib.PublicKeyNotExpired, - } - err = d.StoreKeys( - context.Background(), - map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult{ - index: value, - }, - ) - if err != nil { - return nil, err - } - return d, nil -} - -// FetcherName implements KeyFetcher -func (d Database) FetcherName() string { - return "PostgresKeyDatabase" -} - -// FetchKeys implements gomatrixserverlib.KeyDatabase -func (d *Database) FetchKeys( - ctx context.Context, - requests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp, -) (map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, error) { - return d.statements.bulkSelectServerKeys(ctx, requests) -} - -// StoreKeys implements gomatrixserverlib.KeyDatabase -func (d *Database) StoreKeys( - ctx context.Context, - keyMap map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, -) error { - // TODO: Inserting all the keys within a single transaction may - // be more efficient since the transaction overhead can be quite - // high for a single insert statement. - var lastErr error - for request, keys := range keyMap { - if err := d.statements.upsertServerKeys(ctx, request, keys); err != nil { - // Rather than returning immediately on error we try to insert the - // remaining keys. - // Since we are inserting the keys outside of a transaction it is - // possible for some of the inserts to succeed even though some - // of the inserts have failed. - // Ensuring that we always insert all the keys we can means that - // this behaviour won't depend on the iteration order of the map. - lastErr = err - } - } - return lastErr -} diff --git a/internal/keydb/postgres/server_key_table.go b/internal/keydb/postgres/server_key_table.go deleted file mode 100644 index b3c26a480..000000000 --- a/internal/keydb/postgres/server_key_table.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2017-2018 New Vector Ltd -// Copyright 2019-2020 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 postgres - -import ( - "context" - "database/sql" - - "github.com/matrix-org/dendrite/internal" - - "github.com/lib/pq" - "github.com/matrix-org/gomatrixserverlib" -) - -const serverKeysSchema = ` --- A cache of signing keys downloaded from remote servers. -CREATE TABLE IF NOT EXISTS keydb_server_keys ( - -- The name of the matrix server the key is for. - server_name TEXT NOT NULL, - -- The ID of the server key. - server_key_id TEXT NOT NULL, - -- Combined server name and key ID separated by the ASCII unit separator - -- to make it easier to run bulk queries. - server_name_and_key_id TEXT NOT NULL, - -- When the key is valid until as a millisecond timestamp. - -- 0 if this is an expired key (in which case expired_ts will be non-zero) - valid_until_ts BIGINT NOT NULL, - -- When the key expired as a millisecond timestamp. - -- 0 if this is an active key (in which case valid_until_ts will be non-zero) - expired_ts BIGINT NOT NULL, - -- The base64-encoded public key. - server_key TEXT NOT NULL, - CONSTRAINT keydb_server_keys_unique UNIQUE (server_name, server_key_id) -); - -CREATE INDEX IF NOT EXISTS keydb_server_name_and_key_id ON keydb_server_keys (server_name_and_key_id); -` - -const bulkSelectServerKeysSQL = "" + - "SELECT server_name, server_key_id, valid_until_ts, expired_ts, " + - " server_key FROM keydb_server_keys" + - " WHERE server_name_and_key_id = ANY($1)" - -const upsertServerKeysSQL = "" + - "INSERT INTO keydb_server_keys (server_name, server_key_id," + - " server_name_and_key_id, valid_until_ts, expired_ts, server_key)" + - " VALUES ($1, $2, $3, $4, $5, $6)" + - " ON CONFLICT ON CONSTRAINT keydb_server_keys_unique" + - " DO UPDATE SET valid_until_ts = $4, expired_ts = $5, server_key = $6" - -type serverKeyStatements struct { - bulkSelectServerKeysStmt *sql.Stmt - upsertServerKeysStmt *sql.Stmt -} - -func (s *serverKeyStatements) prepare(db *sql.DB) (err error) { - _, err = db.Exec(serverKeysSchema) - if err != nil { - return - } - if s.bulkSelectServerKeysStmt, err = db.Prepare(bulkSelectServerKeysSQL); err != nil { - return - } - if s.upsertServerKeysStmt, err = db.Prepare(upsertServerKeysSQL); err != nil { - return - } - return -} - -func (s *serverKeyStatements) bulkSelectServerKeys( - ctx context.Context, - requests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp, -) (map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, error) { - var nameAndKeyIDs []string - for request := range requests { - nameAndKeyIDs = append(nameAndKeyIDs, nameAndKeyID(request)) - } - stmt := s.bulkSelectServerKeysStmt - rows, err := stmt.QueryContext(ctx, pq.StringArray(nameAndKeyIDs)) - if err != nil { - return nil, err - } - defer internal.CloseAndLogIfError(ctx, rows, "bulkSelectServerKeys: rows.close() failed") - results := map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult{} - for rows.Next() { - var serverName string - var keyID string - var key string - var validUntilTS int64 - var expiredTS int64 - if err = rows.Scan(&serverName, &keyID, &validUntilTS, &expiredTS, &key); err != nil { - return nil, err - } - r := gomatrixserverlib.PublicKeyLookupRequest{ - ServerName: gomatrixserverlib.ServerName(serverName), - KeyID: gomatrixserverlib.KeyID(keyID), - } - vk := gomatrixserverlib.VerifyKey{} - err = vk.Key.Decode(key) - if err != nil { - return nil, err - } - results[r] = gomatrixserverlib.PublicKeyLookupResult{ - VerifyKey: vk, - ValidUntilTS: gomatrixserverlib.Timestamp(validUntilTS), - ExpiredTS: gomatrixserverlib.Timestamp(expiredTS), - } - } - return results, rows.Err() -} - -func (s *serverKeyStatements) upsertServerKeys( - ctx context.Context, - request gomatrixserverlib.PublicKeyLookupRequest, - key gomatrixserverlib.PublicKeyLookupResult, -) error { - _, err := s.upsertServerKeysStmt.ExecContext( - ctx, - string(request.ServerName), - string(request.KeyID), - nameAndKeyID(request), - key.ValidUntilTS, - key.ExpiredTS, - key.Key.Encode(), - ) - return err -} - -func nameAndKeyID(request gomatrixserverlib.PublicKeyLookupRequest) string { - return string(request.ServerName) + "\x1F" + string(request.KeyID) -} diff --git a/internal/keydb/sqlite3/keydb.go b/internal/keydb/sqlite3/keydb.go deleted file mode 100644 index d1dc61c98..000000000 --- a/internal/keydb/sqlite3/keydb.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2017-2018 New Vector Ltd -// Copyright 2019-2020 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 sqlite3 - -import ( - "context" - "time" - - "golang.org/x/crypto/ed25519" - - "github.com/matrix-org/dendrite/internal" - "github.com/matrix-org/dendrite/internal/sqlutil" - "github.com/matrix-org/gomatrixserverlib" - - _ "github.com/mattn/go-sqlite3" -) - -// A Database implements gomatrixserverlib.KeyDatabase and is used to store -// the public keys for other matrix servers. -type Database struct { - statements serverKeyStatements -} - -// NewDatabase prepares a new key database. -// It creates the necessary tables if they don't already exist. -// It prepares all the SQL statements that it will use. -// Returns an error if there was a problem talking to the database. -func NewDatabase( - dataSourceName string, - serverName gomatrixserverlib.ServerName, - serverKey ed25519.PublicKey, - serverKeyID gomatrixserverlib.KeyID, -) (*Database, error) { - db, err := sqlutil.Open(internal.SQLiteDriverName(), dataSourceName, nil) - if err != nil { - return nil, err - } - d := &Database{} - err = d.statements.prepare(db) - if err != nil { - return nil, err - } - // Store our own keys so that we don't end up making HTTP requests to find our - // own keys - index := gomatrixserverlib.PublicKeyLookupRequest{ - ServerName: serverName, - KeyID: serverKeyID, - } - value := gomatrixserverlib.PublicKeyLookupResult{ - VerifyKey: gomatrixserverlib.VerifyKey{ - Key: gomatrixserverlib.Base64String(serverKey), - }, - ValidUntilTS: gomatrixserverlib.AsTimestamp(time.Now().Add(100 * 365 * 24 * time.Hour)), - ExpiredTS: gomatrixserverlib.PublicKeyNotExpired, - } - err = d.StoreKeys( - context.Background(), - map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult{ - index: value, - }, - ) - if err != nil { - return nil, err - } - return d, nil -} - -// FetcherName implements KeyFetcher -func (d Database) FetcherName() string { - return "SqliteKeyDatabase" -} - -// FetchKeys implements gomatrixserverlib.KeyDatabase -func (d *Database) FetchKeys( - ctx context.Context, - requests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp, -) (map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, error) { - return d.statements.bulkSelectServerKeys(ctx, requests) -} - -// StoreKeys implements gomatrixserverlib.KeyDatabase -func (d *Database) StoreKeys( - ctx context.Context, - keyMap map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, -) error { - // TODO: Inserting all the keys within a single transaction may - // be more efficient since the transaction overhead can be quite - // high for a single insert statement. - var lastErr error - for request, keys := range keyMap { - if err := d.statements.upsertServerKeys(ctx, request, keys); err != nil { - // Rather than returning immediately on error we try to insert the - // remaining keys. - // Since we are inserting the keys outside of a transaction it is - // possible for some of the inserts to succeed even though some - // of the inserts have failed. - // Ensuring that we always insert all the keys we can means that - // this behaviour won't depend on the iteration order of the map. - lastErr = err - } - } - return lastErr -} diff --git a/internal/keydb/sqlite3/server_key_table.go b/internal/keydb/sqlite3/server_key_table.go deleted file mode 100644 index ae24a14d4..000000000 --- a/internal/keydb/sqlite3/server_key_table.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2017-2018 New Vector Ltd -// Copyright 2019-2020 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 sqlite3 - -import ( - "context" - "database/sql" - "strings" - - "github.com/matrix-org/dendrite/internal" - "github.com/matrix-org/gomatrixserverlib" -) - -const serverKeysSchema = ` --- A cache of signing keys downloaded from remote servers. -CREATE TABLE IF NOT EXISTS keydb_server_keys ( - -- The name of the matrix server the key is for. - server_name TEXT NOT NULL, - -- The ID of the server key. - server_key_id TEXT NOT NULL, - -- Combined server name and key ID separated by the ASCII unit separator - -- to make it easier to run bulk queries. - server_name_and_key_id TEXT NOT NULL, - -- When the key is valid until as a millisecond timestamp. - -- 0 if this is an expired key (in which case expired_ts will be non-zero) - valid_until_ts BIGINT NOT NULL, - -- When the key expired as a millisecond timestamp. - -- 0 if this is an active key (in which case valid_until_ts will be non-zero) - expired_ts BIGINT NOT NULL, - -- The base64-encoded public key. - server_key TEXT NOT NULL, - UNIQUE (server_name, server_key_id) -); - -CREATE INDEX IF NOT EXISTS keydb_server_name_and_key_id ON keydb_server_keys (server_name_and_key_id); -` - -const bulkSelectServerKeysSQL = "" + - "SELECT server_name, server_key_id, valid_until_ts, expired_ts, " + - " server_key FROM keydb_server_keys" + - " WHERE server_name_and_key_id IN ($1)" - -const upsertServerKeysSQL = "" + - "INSERT INTO keydb_server_keys (server_name, server_key_id," + - " server_name_and_key_id, valid_until_ts, expired_ts, server_key)" + - " VALUES ($1, $2, $3, $4, $5, $6)" + - " ON CONFLICT (server_name, server_key_id)" + - " DO UPDATE SET valid_until_ts = $4, expired_ts = $5, server_key = $6" - -type serverKeyStatements struct { - db *sql.DB - bulkSelectServerKeysStmt *sql.Stmt - upsertServerKeysStmt *sql.Stmt -} - -func (s *serverKeyStatements) prepare(db *sql.DB) (err error) { - s.db = db - _, err = db.Exec(serverKeysSchema) - if err != nil { - return - } - if s.bulkSelectServerKeysStmt, err = db.Prepare(bulkSelectServerKeysSQL); err != nil { - return - } - if s.upsertServerKeysStmt, err = db.Prepare(upsertServerKeysSQL); err != nil { - return - } - return -} - -func (s *serverKeyStatements) bulkSelectServerKeys( - ctx context.Context, - requests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp, -) (map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, error) { - var nameAndKeyIDs []string - for request := range requests { - nameAndKeyIDs = append(nameAndKeyIDs, nameAndKeyID(request)) - } - - query := strings.Replace(bulkSelectServerKeysSQL, "($1)", internal.QueryVariadic(len(nameAndKeyIDs)), 1) - - iKeyIDs := make([]interface{}, len(nameAndKeyIDs)) - for i, v := range nameAndKeyIDs { - iKeyIDs[i] = v - } - - rows, err := s.db.QueryContext(ctx, query, iKeyIDs...) - if err != nil { - return nil, err - } - defer internal.CloseAndLogIfError(ctx, rows, "bulkSelectServerKeys: rows.close() failed") - results := map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult{} - for rows.Next() { - var serverName string - var keyID string - var key string - var validUntilTS int64 - var expiredTS int64 - if err = rows.Scan(&serverName, &keyID, &validUntilTS, &expiredTS, &key); err != nil { - return nil, err - } - r := gomatrixserverlib.PublicKeyLookupRequest{ - ServerName: gomatrixserverlib.ServerName(serverName), - KeyID: gomatrixserverlib.KeyID(keyID), - } - vk := gomatrixserverlib.VerifyKey{} - err = vk.Key.Decode(key) - if err != nil { - return nil, err - } - results[r] = gomatrixserverlib.PublicKeyLookupResult{ - VerifyKey: vk, - ValidUntilTS: gomatrixserverlib.Timestamp(validUntilTS), - ExpiredTS: gomatrixserverlib.Timestamp(expiredTS), - } - } - return results, nil -} - -func (s *serverKeyStatements) upsertServerKeys( - ctx context.Context, - request gomatrixserverlib.PublicKeyLookupRequest, - key gomatrixserverlib.PublicKeyLookupResult, -) error { - _, err := s.upsertServerKeysStmt.ExecContext( - ctx, - string(request.ServerName), - string(request.KeyID), - nameAndKeyID(request), - key.ValidUntilTS, - key.ExpiredTS, - key.Key.Encode(), - ) - return err -} - -func nameAndKeyID(request gomatrixserverlib.PublicKeyLookupRequest) string { - return string(request.ServerName) + "\x1F" + string(request.KeyID) -} diff --git a/serverkeyapi/storage/keydb.go b/serverkeyapi/storage/keydb.go index 3644a63e8..b9389bd63 100644 --- a/serverkeyapi/storage/keydb.go +++ b/serverkeyapi/storage/keydb.go @@ -22,8 +22,8 @@ import ( "golang.org/x/crypto/ed25519" "github.com/matrix-org/dendrite/internal" - "github.com/matrix-org/dendrite/internal/keydb/postgres" - "github.com/matrix-org/dendrite/internal/keydb/sqlite3" + "github.com/matrix-org/dendrite/serverkeyapi/storage/postgres" + "github.com/matrix-org/dendrite/serverkeyapi/storage/sqlite3" "github.com/matrix-org/gomatrixserverlib" ) diff --git a/serverkeyapi/storage/keydb_wasm.go b/serverkeyapi/storage/keydb_wasm.go index 95a5c0027..3d2ca5505 100644 --- a/serverkeyapi/storage/keydb_wasm.go +++ b/serverkeyapi/storage/keydb_wasm.go @@ -23,7 +23,7 @@ import ( "golang.org/x/crypto/ed25519" "github.com/matrix-org/dendrite/internal" - "github.com/matrix-org/dendrite/internal/keydb/sqlite3" + "github.com/matrix-org/dendrite/serverkeyapi/storage/sqlite3" "github.com/matrix-org/gomatrixserverlib" )