2020-07-14 11:59:07 +00:00
// 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.
package storage
import (
"context"
"encoding/json"
2021-08-04 16:31:18 +00:00
"github.com/matrix-org/dendrite/internal"
2020-07-14 11:59:07 +00:00
"github.com/matrix-org/dendrite/keyserver/api"
2021-08-04 16:31:18 +00:00
"github.com/matrix-org/dendrite/keyserver/types"
2020-08-06 16:48:10 +00:00
"github.com/matrix-org/gomatrixserverlib"
2020-07-14 11:59:07 +00:00
)
type Database interface {
2021-08-04 16:31:18 +00:00
internal . PartitionStorer
2020-07-14 11:59:07 +00:00
// ExistingOneTimeKeys returns a map of keyIDWithAlgorithm to key JSON for the given parameters. If no keys exist with this combination
// of user/device/key/algorithm 4-uple then it is omitted from the map. Returns an error when failing to communicate with the database.
ExistingOneTimeKeys ( ctx context . Context , userID , deviceID string , keyIDsWithAlgorithms [ ] string ) ( map [ string ] json . RawMessage , error )
// StoreOneTimeKeys persists the given one-time keys.
2020-07-15 11:02:34 +00:00
StoreOneTimeKeys ( ctx context . Context , keys api . OneTimeKeys ) ( * api . OneTimeKeysCount , error )
2020-07-14 11:59:07 +00:00
2020-08-03 11:29:58 +00:00
// OneTimeKeysCount returns a count of all OTKs for this device.
OneTimeKeysCount ( ctx context . Context , userID , deviceID string ) ( * api . OneTimeKeysCount , error )
2020-08-03 16:07:06 +00:00
// DeviceKeysJSON populates the KeyJSON for the given keys. If any proided `keys` have a `KeyJSON` or `StreamID` already then it will be replaced.
DeviceKeysJSON ( ctx context . Context , keys [ ] api . DeviceMessage ) error
2020-07-14 11:59:07 +00:00
2020-08-05 12:41:16 +00:00
// StoreLocalDeviceKeys persists the given keys. Keys with the same user ID and device ID will be replaced. An empty KeyJSON removes the key
2020-07-30 17:00:56 +00:00
// for this (user, device).
2020-08-03 16:07:06 +00:00
// The `StreamID` for each message is set on successful insertion. In the event the key already exists, the existing StreamID is set.
2020-07-14 11:59:07 +00:00
// Returns an error if there was a problem storing the keys.
2020-08-05 12:41:16 +00:00
StoreLocalDeviceKeys ( ctx context . Context , keys [ ] api . DeviceMessage ) error
// StoreRemoteDeviceKeys persists the given keys. Keys with the same user ID and device ID will be replaced. An empty KeyJSON removes the key
2020-08-12 21:43:02 +00:00
// for this (user, device). Does not modify the stream ID for keys. User IDs in `clearUserIDs` will have all their device keys deleted prior
// to insertion - use this when you have a complete snapshot of a user's keys in order to track device deletions correctly.
StoreRemoteDeviceKeys ( ctx context . Context , keys [ ] api . DeviceMessage , clearUserIDs [ ] string ) error
2020-08-05 12:41:16 +00:00
// PrevIDsExists returns true if all prev IDs exist for this user.
PrevIDsExists ( ctx context . Context , userID string , prevIDs [ ] int ) ( bool , error )
2020-07-15 17:40:41 +00:00
// DeviceKeysForUser returns the device keys for the device IDs given. If the length of deviceIDs is 0, all devices are selected.
// If there are some missing keys, they are omitted from the returned slice. There is no ordering on the returned slice.
2020-08-03 16:07:06 +00:00
DeviceKeysForUser ( ctx context . Context , userID string , deviceIDs [ ] string ) ( [ ] api . DeviceMessage , error )
2020-07-21 13:47:53 +00:00
2021-08-18 11:07:09 +00:00
// DeleteDeviceKeys removes the device keys for a given user/device, and any accompanying
// cross-signing signatures relating to that device.
DeleteDeviceKeys ( ctx context . Context , userID string , deviceIDs [ ] gomatrixserverlib . KeyID ) error
2020-07-21 13:47:53 +00:00
// ClaimKeys based on the 3-uple of user_id, device_id and algorithm name. Returns the keys claimed. Returns no error if a key
// cannot be claimed or if none exist for this (user, device, algorithm), instead it is omitted from the returned slice.
ClaimKeys ( ctx context . Context , userToDeviceToAlgorithm map [ string ] map [ string ] string ) ( [ ] api . OneTimeKeys , error )
2020-07-28 16:38:30 +00:00
2022-01-21 09:56:06 +00:00
// StoreKeyChange stores key change metadata and returns the device change ID which represents the position in the /sync stream for this device change.
// `userID` is the the user who has changed their keys in some way.
StoreKeyChange ( ctx context . Context , userID string ) ( int64 , error )
2020-07-28 16:38:30 +00:00
2020-07-30 13:52:21 +00:00
// KeyChanges returns a list of user IDs who have modified their keys from the offset given (exclusive) to the offset given (inclusive).
// A to offset of sarama.OffsetNewest means no upper limit.
2020-07-28 16:38:30 +00:00
// Returns the offset of the latest key change.
2022-01-21 09:56:06 +00:00
KeyChanges ( ctx context . Context , fromOffset , toOffset int64 ) ( userIDs [ ] string , latestOffset int64 , err error )
2020-08-06 16:48:10 +00:00
// StaleDeviceLists returns a list of user IDs ending with the domains provided who have stale device lists.
// If no domains are given, all user IDs with stale device lists are returned.
StaleDeviceLists ( ctx context . Context , domains [ ] gomatrixserverlib . ServerName ) ( [ ] string , error )
// MarkDeviceListStale sets the stale bit for this user to isStale.
MarkDeviceListStale ( ctx context . Context , userID string , isStale bool ) error
2021-08-04 16:31:18 +00:00
2021-08-06 09:13:35 +00:00
CrossSigningKeysForUser ( ctx context . Context , userID string ) ( map [ gomatrixserverlib . CrossSigningKeyPurpose ] gomatrixserverlib . CrossSigningKey , error )
CrossSigningKeysDataForUser ( ctx context . Context , userID string ) ( types . CrossSigningKeyMap , error )
2021-08-04 16:31:18 +00:00
CrossSigningSigsForTarget ( ctx context . Context , targetUserID string , targetKeyID gomatrixserverlib . KeyID ) ( types . CrossSigningSigMap , error )
StoreCrossSigningKeysForUser ( ctx context . Context , userID string , keyMap types . CrossSigningKeyMap ) error
StoreCrossSigningSigsForTarget ( ctx context . Context , originUserID string , originKeyID gomatrixserverlib . KeyID , targetUserID string , targetKeyID gomatrixserverlib . KeyID , signature gomatrixserverlib . Base64Bytes ) error
2020-07-14 11:59:07 +00:00
}