aboutsummaryrefslogtreecommitdiff
path: root/syncapi
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2020-08-03 12:29:58 +0100
committerGitHub <noreply@github.com>2020-08-03 12:29:58 +0100
commitffcb6d2ea199cfa985e72ffbdcb884fb9bc9f54d (patch)
tree6d25818803444fead9ab18db15e88e30be6641c6 /syncapi
parentb5cb1d153458ad83abdfbebed7405dd9da159cb8 (diff)
Produce OTK counts in /sync response (#1235)
* Add QueryOneTimeKeys for /sync extensions * Unbreak tests * Produce OTK counts in /sync response * Linting
Diffstat (limited to 'syncapi')
-rw-r--r--syncapi/internal/keychange.go15
-rw-r--r--syncapi/internal/keychange_test.go3
-rw-r--r--syncapi/sync/requestpool.go19
-rw-r--r--syncapi/types/types.go2
4 files changed, 32 insertions, 7 deletions
diff --git a/syncapi/internal/keychange.go b/syncapi/internal/keychange.go
index 0272ffc0..66134d79 100644
--- a/syncapi/internal/keychange.go
+++ b/syncapi/internal/keychange.go
@@ -29,6 +29,20 @@ import (
const DeviceListLogName = "dl"
+// DeviceOTKCounts adds one-time key counts to the /sync response
+func DeviceOTKCounts(ctx context.Context, keyAPI keyapi.KeyInternalAPI, userID, deviceID string, res *types.Response) error {
+ var queryRes api.QueryOneTimeKeysResponse
+ keyAPI.QueryOneTimeKeys(ctx, &api.QueryOneTimeKeysRequest{
+ UserID: userID,
+ DeviceID: deviceID,
+ }, &queryRes)
+ if queryRes.Error != nil {
+ return queryRes.Error
+ }
+ res.DeviceListsOTKCount = queryRes.Count.KeyCount
+ return nil
+}
+
// DeviceListCatchup fills in the given response for the given user ID to bring it up-to-date with device lists. hasNew=true if the response
// was filled in, else false if there are no new device list changes because there is nothing to catch up on. The response MUST
// be already filled in with join/leave information.
@@ -36,6 +50,7 @@ func DeviceListCatchup(
ctx context.Context, keyAPI keyapi.KeyInternalAPI, stateAPI currentstateAPI.CurrentStateInternalAPI,
userID string, res *types.Response, from, to types.StreamingToken,
) (hasNew bool, err error) {
+
// Track users who we didn't track before but now do by virtue of sharing a room with them, or not.
newlyJoinedRooms := joinedRooms(res, userID)
newlyLeftRooms := leftRooms(res)
diff --git a/syncapi/internal/keychange_test.go b/syncapi/internal/keychange_test.go
index 2c3d154d..af456af4 100644
--- a/syncapi/internal/keychange_test.go
+++ b/syncapi/internal/keychange_test.go
@@ -39,6 +39,9 @@ func (k *mockKeyAPI) QueryKeys(ctx context.Context, req *keyapi.QueryKeysRequest
}
func (k *mockKeyAPI) QueryKeyChanges(ctx context.Context, req *keyapi.QueryKeyChangesRequest, res *keyapi.QueryKeyChangesResponse) {
}
+func (k *mockKeyAPI) QueryOneTimeKeys(ctx context.Context, req *keyapi.QueryOneTimeKeysRequest, res *keyapi.QueryOneTimeKeysResponse) {
+
+}
type mockCurrentStateAPI struct {
roomIDToJoinedMembers map[string][]string
diff --git a/syncapi/sync/requestpool.go b/syncapi/sync/requestpool.go
index b530b34d..12c597bb 100644
--- a/syncapi/sync/requestpool.go
+++ b/syncapi/sync/requestpool.go
@@ -192,8 +192,9 @@ func (rp *RequestPool) OnIncomingKeyChangeRequest(req *http.Request, device *use
}
}
-func (rp *RequestPool) currentSyncForUser(req syncRequest, latestPos types.StreamingToken) (res *types.Response, err error) {
- res = types.NewResponse()
+// nolint:gocyclo
+func (rp *RequestPool) currentSyncForUser(req syncRequest, latestPos types.StreamingToken) (*types.Response, error) {
+ res := types.NewResponse()
since := types.NewStreamToken(0, 0, nil)
if req.since != nil {
@@ -213,17 +214,21 @@ func (rp *RequestPool) currentSyncForUser(req syncRequest, latestPos types.Strea
res, err = rp.db.IncrementalSync(req.ctx, res, req.device, *req.since, latestPos, req.limit, req.wantFullState)
}
if err != nil {
- return
+ return res, err
}
accountDataFilter := gomatrixserverlib.DefaultEventFilter() // TODO: use filter provided in req instead
res, err = rp.appendAccountData(res, req.device.UserID, req, latestPos.PDUPosition(), &accountDataFilter)
if err != nil {
- return
+ return res, err
}
res, err = rp.appendDeviceLists(res, req.device.UserID, since, latestPos)
if err != nil {
- return
+ return res, err
+ }
+ err = internal.DeviceOTKCounts(req.ctx, rp.keyAPI, req.device.UserID, req.device.ID, res)
+ if err != nil {
+ return res, err
}
// Before we return the sync response, make sure that we take action on
@@ -233,7 +238,7 @@ func (rp *RequestPool) currentSyncForUser(req syncRequest, latestPos types.Strea
// Handle the updates and deletions in the database.
err = rp.db.CleanSendToDeviceUpdates(context.Background(), updates, deletions, since)
if err != nil {
- return
+ return res, err
}
}
if len(events) > 0 {
@@ -250,7 +255,7 @@ func (rp *RequestPool) currentSyncForUser(req syncRequest, latestPos types.Strea
}
}
- return
+ return res, err
}
func (rp *RequestPool) appendDeviceLists(
diff --git a/syncapi/types/types.go b/syncapi/types/types.go
index 4761cce2..f465d9ff 100644
--- a/syncapi/types/types.go
+++ b/syncapi/types/types.go
@@ -393,6 +393,7 @@ type Response struct {
Changed []string `json:"changed,omitempty"`
Left []string `json:"left,omitempty"`
} `json:"device_lists,omitempty"`
+ DeviceListsOTKCount map[string]int `json:"device_one_time_keys_count"`
}
// NewResponse creates an empty response with initialised maps.
@@ -411,6 +412,7 @@ func NewResponse() *Response {
res.AccountData.Events = make([]gomatrixserverlib.ClientEvent, 0)
res.Presence.Events = make([]gomatrixserverlib.ClientEvent, 0)
res.ToDevice.Events = make([]gomatrixserverlib.SendToDeviceEvent, 0)
+ res.DeviceListsOTKCount = make(map[string]int)
return &res
}