aboutsummaryrefslogtreecommitdiff
path: root/federationsender
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-09-22 14:40:54 +0100
committerGitHub <noreply@github.com>2020-09-22 14:40:54 +0100
commita14b29b52617c06a548145a18b4d7cee6e529b79 (patch)
tree813e96e05884248ac97959d64b0458eba69e0665 /federationsender
parenta7563ede3d61efa626095b8b9069af9f16e7dd3d (diff)
Initial notary support (#1436)
* Initial work on notary support * Somewhat working (but not properly filtered) notary support, other tweaks * Update gomatrixserverlib
Diffstat (limited to 'federationsender')
-rw-r--r--federationsender/api/api.go2
-rw-r--r--federationsender/internal/api.go24
-rw-r--r--federationsender/inthttp/client.go72
-rw-r--r--federationsender/inthttp/server.go44
4 files changed, 135 insertions, 7 deletions
diff --git a/federationsender/api/api.go b/federationsender/api/api.go
index adc3b34c..5ae419be 100644
--- a/federationsender/api/api.go
+++ b/federationsender/api/api.go
@@ -20,6 +20,8 @@ type FederationClient interface {
ClaimKeys(ctx context.Context, s gomatrixserverlib.ServerName, oneTimeKeys map[string]map[string]string) (res gomatrixserverlib.RespClaimKeys, err error)
QueryKeys(ctx context.Context, s gomatrixserverlib.ServerName, keys map[string][]string) (res gomatrixserverlib.RespQueryKeys, err error)
GetEvent(ctx context.Context, s gomatrixserverlib.ServerName, eventID string) (res gomatrixserverlib.Transaction, err error)
+ GetServerKeys(ctx context.Context, matrixServer gomatrixserverlib.ServerName) (gomatrixserverlib.ServerKeys, error)
+ LookupServerKeys(ctx context.Context, s gomatrixserverlib.ServerName, keyRequests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp) ([]gomatrixserverlib.ServerKeys, error)
}
// FederationClientError is returned from FederationClient methods in the event of a problem.
diff --git a/federationsender/internal/api.go b/federationsender/internal/api.go
index 49c53755..f9d35357 100644
--- a/federationsender/internal/api.go
+++ b/federationsender/internal/api.go
@@ -189,3 +189,27 @@ func (a *FederationSenderInternalAPI) GetEvent(
}
return ires.(gomatrixserverlib.Transaction), nil
}
+
+func (a *FederationSenderInternalAPI) GetServerKeys(
+ ctx context.Context, s gomatrixserverlib.ServerName,
+) (gomatrixserverlib.ServerKeys, error) {
+ ires, err := a.doRequest(s, func() (interface{}, error) {
+ return a.federation.GetServerKeys(ctx, s)
+ })
+ if err != nil {
+ return gomatrixserverlib.ServerKeys{}, err
+ }
+ return ires.(gomatrixserverlib.ServerKeys), nil
+}
+
+func (a *FederationSenderInternalAPI) LookupServerKeys(
+ ctx context.Context, s gomatrixserverlib.ServerName, keyRequests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp,
+) ([]gomatrixserverlib.ServerKeys, error) {
+ ires, err := a.doRequest(s, func() (interface{}, error) {
+ return a.federation.LookupServerKeys(ctx, s, keyRequests)
+ })
+ if err != nil {
+ return []gomatrixserverlib.ServerKeys{}, err
+ }
+ return ires.([]gomatrixserverlib.ServerKeys), nil
+}
diff --git a/federationsender/inthttp/client.go b/federationsender/inthttp/client.go
index 5bfe6089..e0783ee1 100644
--- a/federationsender/inthttp/client.go
+++ b/federationsender/inthttp/client.go
@@ -23,13 +23,15 @@ const (
FederationSenderPerformServersAlivePath = "/federationsender/performServersAlive"
FederationSenderPerformBroadcastEDUPath = "/federationsender/performBroadcastEDU"
- FederationSenderGetUserDevicesPath = "/federationsender/client/getUserDevices"
- FederationSenderClaimKeysPath = "/federationsender/client/claimKeys"
- FederationSenderQueryKeysPath = "/federationsender/client/queryKeys"
- FederationSenderBackfillPath = "/federationsender/client/backfill"
- FederationSenderLookupStatePath = "/federationsender/client/lookupState"
- FederationSenderLookupStateIDsPath = "/federationsender/client/lookupStateIDs"
- FederationSenderGetEventPath = "/federationsender/client/getEvent"
+ FederationSenderGetUserDevicesPath = "/federationsender/client/getUserDevices"
+ FederationSenderClaimKeysPath = "/federationsender/client/claimKeys"
+ FederationSenderQueryKeysPath = "/federationsender/client/queryKeys"
+ FederationSenderBackfillPath = "/federationsender/client/backfill"
+ FederationSenderLookupStatePath = "/federationsender/client/lookupState"
+ FederationSenderLookupStateIDsPath = "/federationsender/client/lookupStateIDs"
+ FederationSenderGetEventPath = "/federationsender/client/getEvent"
+ FederationSenderGetServerKeysPath = "/federationsender/client/getServerKeys"
+ FederationSenderLookupServerKeysPath = "/federationsender/client/lookupServerKeys"
)
// NewFederationSenderClient creates a FederationSenderInternalAPI implemented by talking to a HTTP POST API.
@@ -358,3 +360,59 @@ func (h *httpFederationSenderInternalAPI) GetEvent(
}
return *response.Res, nil
}
+
+type getServerKeys struct {
+ S gomatrixserverlib.ServerName
+ ServerKeys gomatrixserverlib.ServerKeys
+ Err *api.FederationClientError
+}
+
+func (h *httpFederationSenderInternalAPI) GetServerKeys(
+ ctx context.Context, s gomatrixserverlib.ServerName,
+) (gomatrixserverlib.ServerKeys, error) {
+ span, ctx := opentracing.StartSpanFromContext(ctx, "GetServerKeys")
+ defer span.Finish()
+
+ request := getServerKeys{
+ S: s,
+ }
+ var response getServerKeys
+ apiURL := h.federationSenderURL + FederationSenderGetServerKeysPath
+ err := httputil.PostJSON(ctx, span, h.httpClient, apiURL, &request, &response)
+ if err != nil {
+ return gomatrixserverlib.ServerKeys{}, err
+ }
+ if response.Err != nil {
+ return gomatrixserverlib.ServerKeys{}, response.Err
+ }
+ return response.ServerKeys, nil
+}
+
+type lookupServerKeys struct {
+ S gomatrixserverlib.ServerName
+ KeyRequests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp
+ ServerKeys []gomatrixserverlib.ServerKeys
+ Err *api.FederationClientError
+}
+
+func (h *httpFederationSenderInternalAPI) LookupServerKeys(
+ ctx context.Context, s gomatrixserverlib.ServerName, keyRequests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp,
+) ([]gomatrixserverlib.ServerKeys, error) {
+ span, ctx := opentracing.StartSpanFromContext(ctx, "LookupServerKeys")
+ defer span.Finish()
+
+ request := lookupServerKeys{
+ S: s,
+ KeyRequests: keyRequests,
+ }
+ var response lookupServerKeys
+ apiURL := h.federationSenderURL + FederationSenderLookupServerKeysPath
+ err := httputil.PostJSON(ctx, span, h.httpClient, apiURL, &request, &response)
+ if err != nil {
+ return []gomatrixserverlib.ServerKeys{}, err
+ }
+ if response.Err != nil {
+ return []gomatrixserverlib.ServerKeys{}, response.Err
+ }
+ return response.ServerKeys, nil
+}
diff --git a/federationsender/inthttp/server.go b/federationsender/inthttp/server.go
index dfbff1c0..53e1183e 100644
--- a/federationsender/inthttp/server.go
+++ b/federationsender/inthttp/server.go
@@ -263,4 +263,48 @@ func AddRoutes(intAPI api.FederationSenderInternalAPI, internalAPIMux *mux.Route
return util.JSONResponse{Code: http.StatusOK, JSON: request}
}),
)
+ internalAPIMux.Handle(
+ FederationSenderGetServerKeysPath,
+ httputil.MakeInternalAPI("GetServerKeys", func(req *http.Request) util.JSONResponse {
+ var request getServerKeys
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ res, err := intAPI.GetServerKeys(req.Context(), request.S)
+ if err != nil {
+ ferr, ok := err.(*api.FederationClientError)
+ if ok {
+ request.Err = ferr
+ } else {
+ request.Err = &api.FederationClientError{
+ Err: err.Error(),
+ }
+ }
+ }
+ request.ServerKeys = res
+ return util.JSONResponse{Code: http.StatusOK, JSON: request}
+ }),
+ )
+ internalAPIMux.Handle(
+ FederationSenderLookupServerKeysPath,
+ httputil.MakeInternalAPI("LookupServerKeys", func(req *http.Request) util.JSONResponse {
+ var request lookupServerKeys
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ res, err := intAPI.LookupServerKeys(req.Context(), request.S, request.KeyRequests)
+ if err != nil {
+ ferr, ok := err.(*api.FederationClientError)
+ if ok {
+ request.Err = ferr
+ } else {
+ request.Err = &api.FederationClientError{
+ Err: err.Error(),
+ }
+ }
+ }
+ request.ServerKeys = res
+ return util.JSONResponse{Code: http.StatusOK, JSON: request}
+ }),
+ )
}