aboutsummaryrefslogtreecommitdiff
path: root/federationsender
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2021-01-19 17:14:25 +0000
committerGitHub <noreply@github.com>2021-01-19 17:14:25 +0000
commit80aa9aa8b053655683cbdae1aeccb083166bc714 (patch)
treee1be2d3ead37283424d8b47482bf4175028279b5 /federationsender
parentccfcb2d2808f4daa960921174a40b52b956d3a2a (diff)
Implement MSC2946 over federation (#1722)
* Add fedsender dep on msc2946 * Add MSC2946Spaces to fsAPI * Add exclude_rooms impl * Implement fed spaces handler * Use stripped state not room version * Call federated spaces at the right time
Diffstat (limited to 'federationsender')
-rw-r--r--federationsender/api/api.go1
-rw-r--r--federationsender/internal/api.go14
-rw-r--r--federationsender/inthttp/client.go32
-rw-r--r--federationsender/inthttp/server.go22
4 files changed, 69 insertions, 0 deletions
diff --git a/federationsender/api/api.go b/federationsender/api/api.go
index e4d176b1..dfc2dd8a 100644
--- a/federationsender/api/api.go
+++ b/federationsender/api/api.go
@@ -22,6 +22,7 @@ type FederationClient interface {
GetEvent(ctx context.Context, s gomatrixserverlib.ServerName, eventID string) (res gomatrixserverlib.Transaction, err error)
GetServerKeys(ctx context.Context, matrixServer gomatrixserverlib.ServerName) (gomatrixserverlib.ServerKeys, error)
MSC2836EventRelationships(ctx context.Context, dst gomatrixserverlib.ServerName, r gomatrixserverlib.MSC2836EventRelationshipsRequest, roomVersion gomatrixserverlib.RoomVersion) (res gomatrixserverlib.MSC2836EventRelationshipsResponse, err error)
+ MSC2946Spaces(ctx context.Context, dst gomatrixserverlib.ServerName, roomID string, r gomatrixserverlib.MSC2946SpacesRequest) (res gomatrixserverlib.MSC2946SpacesResponse, err error)
LookupServerKeys(ctx context.Context, s gomatrixserverlib.ServerName, keyRequests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp) ([]gomatrixserverlib.ServerKeys, error)
}
diff --git a/federationsender/internal/api.go b/federationsender/internal/api.go
index 407e7ffe..1de774ef 100644
--- a/federationsender/internal/api.go
+++ b/federationsender/internal/api.go
@@ -244,3 +244,17 @@ func (a *FederationSenderInternalAPI) MSC2836EventRelationships(
}
return ires.(gomatrixserverlib.MSC2836EventRelationshipsResponse), nil
}
+
+func (a *FederationSenderInternalAPI) MSC2946Spaces(
+ ctx context.Context, s gomatrixserverlib.ServerName, roomID string, r gomatrixserverlib.MSC2946SpacesRequest,
+) (res gomatrixserverlib.MSC2946SpacesResponse, err error) {
+ ctx, cancel := context.WithTimeout(ctx, time.Minute)
+ defer cancel()
+ ires, err := a.doRequest(s, func() (interface{}, error) {
+ return a.federation.MSC2946Spaces(ctx, s, roomID, r)
+ })
+ if err != nil {
+ return res, err
+ }
+ return ires.(gomatrixserverlib.MSC2946SpacesResponse), nil
+}
diff --git a/federationsender/inthttp/client.go b/federationsender/inthttp/client.go
index fe98ff33..81d3fc51 100644
--- a/federationsender/inthttp/client.go
+++ b/federationsender/inthttp/client.go
@@ -33,6 +33,7 @@ const (
FederationSenderGetServerKeysPath = "/federationsender/client/getServerKeys"
FederationSenderLookupServerKeysPath = "/federationsender/client/lookupServerKeys"
FederationSenderEventRelationshipsPath = "/federationsender/client/msc2836eventRelationships"
+ FederationSenderSpacesSummaryPath = "/federationsender/client/msc2946spacesSummary"
)
// NewFederationSenderClient creates a FederationSenderInternalAPI implemented by talking to a HTTP POST API.
@@ -449,3 +450,34 @@ func (h *httpFederationSenderInternalAPI) MSC2836EventRelationships(
}
return response.Res, nil
}
+
+type spacesReq struct {
+ S gomatrixserverlib.ServerName
+ Req gomatrixserverlib.MSC2946SpacesRequest
+ RoomID string
+ Res gomatrixserverlib.MSC2946SpacesResponse
+ Err *api.FederationClientError
+}
+
+func (h *httpFederationSenderInternalAPI) MSC2946Spaces(
+ ctx context.Context, dst gomatrixserverlib.ServerName, roomID string, r gomatrixserverlib.MSC2946SpacesRequest,
+) (res gomatrixserverlib.MSC2946SpacesResponse, err error) {
+ span, ctx := opentracing.StartSpanFromContext(ctx, "MSC2946Spaces")
+ defer span.Finish()
+
+ request := spacesReq{
+ S: dst,
+ Req: r,
+ RoomID: roomID,
+ }
+ var response spacesReq
+ apiURL := h.federationSenderURL + FederationSenderSpacesSummaryPath
+ err = httputil.PostJSON(ctx, span, h.httpClient, apiURL, &request, &response)
+ if err != nil {
+ return res, err
+ }
+ if response.Err != nil {
+ return res, response.Err
+ }
+ return response.Res, nil
+}
diff --git a/federationsender/inthttp/server.go b/federationsender/inthttp/server.go
index 293fb420..be995111 100644
--- a/federationsender/inthttp/server.go
+++ b/federationsender/inthttp/server.go
@@ -329,4 +329,26 @@ func AddRoutes(intAPI api.FederationSenderInternalAPI, internalAPIMux *mux.Route
return util.JSONResponse{Code: http.StatusOK, JSON: request}
}),
)
+ internalAPIMux.Handle(
+ FederationSenderSpacesSummaryPath,
+ httputil.MakeInternalAPI("MSC2946SpacesSummary", func(req *http.Request) util.JSONResponse {
+ var request spacesReq
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ res, err := intAPI.MSC2946Spaces(req.Context(), request.S, request.RoomID, request.Req)
+ if err != nil {
+ ferr, ok := err.(*api.FederationClientError)
+ if ok {
+ request.Err = ferr
+ } else {
+ request.Err = &api.FederationClientError{
+ Err: err.Error(),
+ }
+ }
+ }
+ request.Res = res
+ return util.JSONResponse{Code: http.StatusOK, JSON: request}
+ }),
+ )
}