aboutsummaryrefslogtreecommitdiff
path: root/keyserver
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2020-08-04 11:32:14 +0100
committerGitHub <noreply@github.com>2020-08-04 11:32:14 +0100
commit0c4e8f6d4f0f39d2bd72807675295e4fad70479c (patch)
tree9560b73d1aa1a62d0bff700523b1ea9586cdb7cf /keyserver
parentfb56bbf0b7d4b21da3f55b066e71d24bf4599887 (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.go12
-rw-r--r--keyserver/internal/internal.go18
-rw-r--r--keyserver/inthttp/client.go28
-rw-r--r--keyserver/inthttp/server.go11
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{}