aboutsummaryrefslogtreecommitdiff
path: root/federationsender
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2020-12-04 14:11:01 +0000
committerGitHub <noreply@github.com>2020-12-04 14:11:01 +0000
commitb507312d4cf9d35b5d4eaaa01a7f74d095b825f8 (patch)
tree2812bd7453da07a3c2850fb0b27a740c950af212 /federationsender
parentc052edafdd765d821f9732add4f5d33962ba5ba4 (diff)
MSC2836 threading: part 2 (#1596)
* Update GMSL * Add MSC2836EventRelationships to fedsender * Call MSC2836EventRelationships in reqCtx * auth remote servers * Extract room ID and servers from previous events; refactor a bit * initial cut of federated threading * Use the right client/fed struct in the response * Add QueryAuthChain for use with MSC2836 * Add auth chain to federated response * Fix pointers * under CI: more logging and enable mscs, nil fix * Handle direction: up * Actually send message events to the roomserver.. * Add children and children_hash to unsigned, with tests * Add logic for exploring threads and tracking children; missing storage functions * Implement storage functions for children * Add fetchUnknownEvent * Do federated hits for include_children if we have unexplored children * Use /ev_rel rather than /event as the former includes child metadata * Remove cross-room threading impl * Enable MSC2836 in the p2p demo * Namespace mscs db * Enable msc2836 for ygg Co-authored-by: Neil Alexander <neilalexander@users.noreply.github.com>
Diffstat (limited to 'federationsender')
-rw-r--r--federationsender/api/api.go1
-rw-r--r--federationsender/internal/api.go15
-rw-r--r--federationsender/inthttp/client.go51
-rw-r--r--federationsender/inthttp/server.go22
4 files changed, 80 insertions, 9 deletions
diff --git a/federationsender/api/api.go b/federationsender/api/api.go
index a4d15f1f..e4d176b1 100644
--- a/federationsender/api/api.go
+++ b/federationsender/api/api.go
@@ -21,6 +21,7 @@ type FederationClient interface {
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)
+ MSC2836EventRelationships(ctx context.Context, dst gomatrixserverlib.ServerName, r gomatrixserverlib.MSC2836EventRelationshipsRequest, roomVersion gomatrixserverlib.RoomVersion) (res gomatrixserverlib.MSC2836EventRelationshipsResponse, 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 a14cf3ca..407e7ffe 100644
--- a/federationsender/internal/api.go
+++ b/federationsender/internal/api.go
@@ -229,3 +229,18 @@ func (a *FederationSenderInternalAPI) LookupServerKeys(
}
return ires.([]gomatrixserverlib.ServerKeys), nil
}
+
+func (a *FederationSenderInternalAPI) MSC2836EventRelationships(
+ ctx context.Context, s gomatrixserverlib.ServerName, r gomatrixserverlib.MSC2836EventRelationshipsRequest,
+ roomVersion gomatrixserverlib.RoomVersion,
+) (res gomatrixserverlib.MSC2836EventRelationshipsResponse, err error) {
+ ctx, cancel := context.WithTimeout(ctx, time.Minute)
+ defer cancel()
+ ires, err := a.doRequest(s, func() (interface{}, error) {
+ return a.federation.MSC2836EventRelationships(ctx, s, r, roomVersion)
+ })
+ if err != nil {
+ return res, err
+ }
+ return ires.(gomatrixserverlib.MSC2836EventRelationshipsResponse), nil
+}
diff --git a/federationsender/inthttp/client.go b/federationsender/inthttp/client.go
index e0783ee1..fe98ff33 100644
--- a/federationsender/inthttp/client.go
+++ b/federationsender/inthttp/client.go
@@ -23,15 +23,16 @@ 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"
- FederationSenderGetServerKeysPath = "/federationsender/client/getServerKeys"
- FederationSenderLookupServerKeysPath = "/federationsender/client/lookupServerKeys"
+ 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"
+ FederationSenderEventRelationshipsPath = "/federationsender/client/msc2836eventRelationships"
)
// NewFederationSenderClient creates a FederationSenderInternalAPI implemented by talking to a HTTP POST API.
@@ -416,3 +417,35 @@ func (h *httpFederationSenderInternalAPI) LookupServerKeys(
}
return response.ServerKeys, nil
}
+
+type eventRelationships struct {
+ S gomatrixserverlib.ServerName
+ Req gomatrixserverlib.MSC2836EventRelationshipsRequest
+ RoomVer gomatrixserverlib.RoomVersion
+ Res gomatrixserverlib.MSC2836EventRelationshipsResponse
+ Err *api.FederationClientError
+}
+
+func (h *httpFederationSenderInternalAPI) MSC2836EventRelationships(
+ ctx context.Context, s gomatrixserverlib.ServerName, r gomatrixserverlib.MSC2836EventRelationshipsRequest,
+ roomVersion gomatrixserverlib.RoomVersion,
+) (res gomatrixserverlib.MSC2836EventRelationshipsResponse, err error) {
+ span, ctx := opentracing.StartSpanFromContext(ctx, "MSC2836EventRelationships")
+ defer span.Finish()
+
+ request := eventRelationships{
+ S: s,
+ Req: r,
+ RoomVer: roomVersion,
+ }
+ var response eventRelationships
+ apiURL := h.federationSenderURL + FederationSenderEventRelationshipsPath
+ 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 53e1183e..293fb420 100644
--- a/federationsender/inthttp/server.go
+++ b/federationsender/inthttp/server.go
@@ -307,4 +307,26 @@ func AddRoutes(intAPI api.FederationSenderInternalAPI, internalAPIMux *mux.Route
return util.JSONResponse{Code: http.StatusOK, JSON: request}
}),
)
+ internalAPIMux.Handle(
+ FederationSenderEventRelationshipsPath,
+ httputil.MakeInternalAPI("MSC2836EventRelationships", func(req *http.Request) util.JSONResponse {
+ var request eventRelationships
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ res, err := intAPI.MSC2836EventRelationships(req.Context(), request.S, request.Req, request.RoomVer)
+ 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}
+ }),
+ )
}