diff options
author | kegsay <kegan@matrix.org> | 2021-07-27 19:29:32 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-27 19:29:32 +0100 |
commit | 32bf14a37c79a02fc5e76a7071d7494bb362be53 (patch) | |
tree | a7e8298c3c54999b6d691a8489c63cb890006b78 /userapi/internal/api.go | |
parent | b3754d68fcbe9022eb0bf4f8eda7102b7c27e62d (diff) |
Key Backups (3/3) : Implement querying keys and various bugfixes (#1946)
* Add querying device keys
Makes a bunch of sytests pass
* Apparently only the current version supports uploading keys
* Linting
Diffstat (limited to 'userapi/internal/api.go')
-rw-r--r-- | userapi/internal/api.go | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/userapi/internal/api.go b/userapi/internal/api.go index 27e17963..a2bc8ecf 100644 --- a/userapi/internal/api.go +++ b/userapi/internal/api.go @@ -475,6 +475,7 @@ func (a *UserInternalAPI) PerformKeyBackup(ctx context.Context, req *api.Perform if err != nil { res.Error = fmt.Sprintf("failed to update backup: %s", err) } + res.Exists = err == nil res.Version = req.Version return } @@ -483,8 +484,8 @@ func (a *UserInternalAPI) PerformKeyBackup(ctx context.Context, req *api.Perform } func (a *UserInternalAPI) uploadBackupKeys(ctx context.Context, req *api.PerformKeyBackupRequest, res *api.PerformKeyBackupResponse) { - // ensure the version metadata exists - version, _, _, _, deleted, err := a.AccountDB.GetKeyBackup(ctx, req.UserID, req.Version) + // you can only upload keys for the CURRENT version + version, _, _, _, deleted, err := a.AccountDB.GetKeyBackup(ctx, req.UserID, "") if err != nil { res.Error = fmt.Sprintf("failed to query version: %s", err) return @@ -493,6 +494,11 @@ func (a *UserInternalAPI) uploadBackupKeys(ctx context.Context, req *api.Perform res.Error = "backup was deleted" return } + if version != req.Version { + res.BadInput = true + res.Error = fmt.Sprintf("%s isn't the current version, %s is.", req.Version, version) + return + } res.Exists = true res.Version = version @@ -529,9 +535,21 @@ func (a *UserInternalAPI) QueryKeyBackup(ctx context.Context, req *api.QueryKeyB } res.Algorithm = algorithm res.AuthData = authData + res.ETag = etag res.Exists = !deleted - // TODO: - res.Count = 0 - res.ETag = etag + if !req.ReturnKeys { + res.Count, err = a.AccountDB.CountBackupKeys(ctx, version, req.UserID) + if err != nil { + res.Error = fmt.Sprintf("failed to count keys: %s", err) + } + return + } + + result, err := a.AccountDB.GetBackupKeys(ctx, version, req.UserID, req.KeysForRoomID, req.KeysForSessionID) + if err != nil { + res.Error = fmt.Sprintf("failed to query keys: %s", err) + return + } + res.Keys = result } |