diff options
author | Kegsay <kegan@matrix.org> | 2020-08-04 11:32:14 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-04 11:32:14 +0100 |
commit | 0c4e8f6d4f0f39d2bd72807675295e4fad70479c (patch) | |
tree | 9560b73d1aa1a62d0bff700523b1ea9586cdb7cf /keyserver | |
parent | fb56bbf0b7d4b21da3f55b066e71d24bf4599887 (diff) |
Send device list updates to servers (outbound only) (#1237)
* Add QueryDeviceMessages to serve up device keys and stream IDs
* Consume key change events in fedsender
Don't yet send them to destinations as we haven't worked them out yet
* Send device list updates to all required servers
* Glue it all together
Diffstat (limited to 'keyserver')
-rw-r--r-- | keyserver/api/api.go | 12 | ||||
-rw-r--r-- | keyserver/internal/internal.go | 18 | ||||
-rw-r--r-- | keyserver/inthttp/client.go | 28 | ||||
-rw-r--r-- | keyserver/inthttp/server.go | 11 |
4 files changed, 64 insertions, 5 deletions
diff --git a/keyserver/api/api.go b/keyserver/api/api.go index 080d0e5f..c864b328 100644 --- a/keyserver/api/api.go +++ b/keyserver/api/api.go @@ -32,6 +32,7 @@ type KeyInternalAPI interface { QueryKeys(ctx context.Context, req *QueryKeysRequest, res *QueryKeysResponse) QueryKeyChanges(ctx context.Context, req *QueryKeyChangesRequest, res *QueryKeyChangesResponse) QueryOneTimeKeys(ctx context.Context, req *QueryOneTimeKeysRequest, res *QueryOneTimeKeysResponse) + QueryDeviceMessages(ctx context.Context, req *QueryDeviceMessagesRequest, res *QueryDeviceMessagesResponse) } // KeyError is returned if there was a problem performing/querying the server @@ -188,3 +189,14 @@ type QueryOneTimeKeysResponse struct { Count OneTimeKeysCount Error *KeyError } + +type QueryDeviceMessagesRequest struct { + UserID string +} + +type QueryDeviceMessagesResponse struct { + // The latest stream ID + StreamID int + Devices []DeviceMessage + Error *KeyError +} diff --git a/keyserver/internal/internal.go b/keyserver/internal/internal.go index 9027cbf4..474f30ff 100644 --- a/keyserver/internal/internal.go +++ b/keyserver/internal/internal.go @@ -179,6 +179,24 @@ func (a *KeyInternalAPI) QueryOneTimeKeys(ctx context.Context, req *api.QueryOne res.Count = *count } +func (a *KeyInternalAPI) QueryDeviceMessages(ctx context.Context, req *api.QueryDeviceMessagesRequest, res *api.QueryDeviceMessagesResponse) { + msgs, err := a.DB.DeviceKeysForUser(ctx, req.UserID, nil) + if err != nil { + res.Error = &api.KeyError{ + Err: fmt.Sprintf("failed to query DB for device keys: %s", err), + } + return + } + maxStreamID := 0 + for _, m := range msgs { + if m.StreamID > maxStreamID { + maxStreamID = m.StreamID + } + } + res.Devices = msgs + res.StreamID = maxStreamID +} + func (a *KeyInternalAPI) QueryKeys(ctx context.Context, req *api.QueryKeysRequest, res *api.QueryKeysResponse) { res.DeviceKeys = make(map[string]map[string]json.RawMessage) res.Failures = make(map[string]interface{}) diff --git a/keyserver/inthttp/client.go b/keyserver/inthttp/client.go index b65cbdaf..93b19051 100644 --- a/keyserver/inthttp/client.go +++ b/keyserver/inthttp/client.go @@ -27,11 +27,12 @@ import ( // HTTP paths for the internal HTTP APIs const ( - PerformUploadKeysPath = "/keyserver/performUploadKeys" - PerformClaimKeysPath = "/keyserver/performClaimKeys" - QueryKeysPath = "/keyserver/queryKeys" - QueryKeyChangesPath = "/keyserver/queryKeyChanges" - QueryOneTimeKeysPath = "/keyserver/queryOneTimeKeys" + PerformUploadKeysPath = "/keyserver/performUploadKeys" + PerformClaimKeysPath = "/keyserver/performClaimKeys" + QueryKeysPath = "/keyserver/queryKeys" + QueryKeyChangesPath = "/keyserver/queryKeyChanges" + QueryOneTimeKeysPath = "/keyserver/queryOneTimeKeys" + QueryDeviceMessagesPath = "/keyserver/queryDeviceMessages" ) // NewKeyServerClient creates a KeyInternalAPI implemented by talking to a HTTP POST API. @@ -126,6 +127,23 @@ func (h *httpKeyInternalAPI) QueryOneTimeKeys( } } +func (h *httpKeyInternalAPI) QueryDeviceMessages( + ctx context.Context, + request *api.QueryDeviceMessagesRequest, + response *api.QueryDeviceMessagesResponse, +) { + span, ctx := opentracing.StartSpanFromContext(ctx, "QueryDeviceMessages") + defer span.Finish() + + apiURL := h.apiURL + QueryDeviceMessagesPath + err := httputil.PostJSON(ctx, span, h.httpClient, apiURL, request, response) + if err != nil { + response.Error = &api.KeyError{ + Err: err.Error(), + } + } +} + func (h *httpKeyInternalAPI) QueryKeyChanges( ctx context.Context, request *api.QueryKeyChangesRequest, diff --git a/keyserver/inthttp/server.go b/keyserver/inthttp/server.go index 615b6f80..f0cd3038 100644 --- a/keyserver/inthttp/server.go +++ b/keyserver/inthttp/server.go @@ -69,6 +69,17 @@ func AddRoutes(internalAPIMux *mux.Router, s api.KeyInternalAPI) { return util.JSONResponse{Code: http.StatusOK, JSON: &response} }), ) + internalAPIMux.Handle(QueryDeviceMessagesPath, + httputil.MakeInternalAPI("queryDeviceMessages", func(req *http.Request) util.JSONResponse { + request := api.QueryDeviceMessagesRequest{} + response := api.QueryDeviceMessagesResponse{} + if err := json.NewDecoder(req.Body).Decode(&request); err != nil { + return util.MessageResponse(http.StatusBadRequest, err.Error()) + } + s.QueryDeviceMessages(req.Context(), &request, &response) + return util.JSONResponse{Code: http.StatusOK, JSON: &response} + }), + ) internalAPIMux.Handle(QueryKeyChangesPath, httputil.MakeInternalAPI("queryKeyChanges", func(req *http.Request) util.JSONResponse { request := api.QueryKeyChangesRequest{} |