aboutsummaryrefslogtreecommitdiff
path: root/federationapi
diff options
context:
space:
mode:
Diffstat (limited to 'federationapi')
-rw-r--r--federationapi/federationapi.go8
-rw-r--r--federationapi/federationapi_keys_test.go6
-rw-r--r--federationapi/federationapi_test.go6
-rw-r--r--federationapi/internal/perform.go4
-rw-r--r--federationapi/inthttp/client.go548
-rw-r--r--federationapi/inthttp/server.go257
6 files changed, 6 insertions, 823 deletions
diff --git a/federationapi/federationapi.go b/federationapi/federationapi.go
index ed9a545d..10803916 100644
--- a/federationapi/federationapi.go
+++ b/federationapi/federationapi.go
@@ -17,14 +17,12 @@ package federationapi
import (
"time"
- "github.com/gorilla/mux"
"github.com/sirupsen/logrus"
"github.com/matrix-org/dendrite/federationapi/api"
federationAPI "github.com/matrix-org/dendrite/federationapi/api"
"github.com/matrix-org/dendrite/federationapi/consumers"
"github.com/matrix-org/dendrite/federationapi/internal"
- "github.com/matrix-org/dendrite/federationapi/inthttp"
"github.com/matrix-org/dendrite/federationapi/producers"
"github.com/matrix-org/dendrite/federationapi/queue"
"github.com/matrix-org/dendrite/federationapi/statistics"
@@ -41,12 +39,6 @@ import (
"github.com/matrix-org/dendrite/federationapi/routing"
)
-// AddInternalRoutes registers HTTP handlers for the internal API. Invokes functions
-// on the given input API.
-func AddInternalRoutes(router *mux.Router, intAPI api.FederationInternalAPI, enableMetrics bool) {
- inthttp.AddRoutes(intAPI, router, enableMetrics)
-}
-
// AddPublicRoutes sets up and registers HTTP handlers on the base API muxes for the FederationAPI component.
func AddPublicRoutes(
base *base.BaseDendrite,
diff --git a/federationapi/federationapi_keys_test.go b/federationapi/federationapi_keys_test.go
index cc03cdec..bb6ee893 100644
--- a/federationapi/federationapi_keys_test.go
+++ b/federationapi/federationapi_keys_test.go
@@ -77,8 +77,8 @@ func TestMain(m *testing.M) {
// API to work.
cfg := &config.Dendrite{}
cfg.Defaults(config.DefaultOpts{
- Generate: true,
- Monolithic: true,
+ Generate: true,
+ SingleDatabase: false,
})
cfg.Global.ServerName = gomatrixserverlib.ServerName(s.name)
cfg.Global.PrivateKey = testPriv
@@ -109,7 +109,7 @@ func TestMain(m *testing.M) {
)
// Finally, build the server key APIs.
- sbase := base.NewBaseDendrite(cfg, "Monolith", base.DisableMetrics)
+ sbase := base.NewBaseDendrite(cfg, base.DisableMetrics)
s.api = NewInternalAPI(sbase, s.fedclient, nil, s.cache, nil, true)
}
diff --git a/federationapi/federationapi_test.go b/federationapi/federationapi_test.go
index 7009230c..8d1d8514 100644
--- a/federationapi/federationapi_test.go
+++ b/federationapi/federationapi_test.go
@@ -266,14 +266,14 @@ func TestRoomsV3URLEscapeDoNot404(t *testing.T) {
_, privKey, _ := ed25519.GenerateKey(nil)
cfg := &config.Dendrite{}
cfg.Defaults(config.DefaultOpts{
- Generate: true,
- Monolithic: true,
+ Generate: true,
+ SingleDatabase: false,
})
cfg.Global.KeyID = gomatrixserverlib.KeyID("ed25519:auto")
cfg.Global.ServerName = gomatrixserverlib.ServerName("localhost")
cfg.Global.PrivateKey = privKey
cfg.Global.JetStream.InMemory = true
- b := base.NewBaseDendrite(cfg, "Monolith", base.DisableMetrics)
+ b := base.NewBaseDendrite(cfg, base.DisableMetrics)
keyRing := &test.NopJSONVerifier{}
// TODO: This is pretty fragile, as if anything calls anything on these nils this test will break.
// Unfortunately, it makes little sense to instantiate these dependencies when we just want to test routing.
diff --git a/federationapi/internal/perform.go b/federationapi/internal/perform.go
index b9684f76..dadb2b2b 100644
--- a/federationapi/internal/perform.go
+++ b/federationapi/internal/perform.go
@@ -121,8 +121,6 @@ func (r *FederationInternalAPI) PerformJoin(
var httpErr gomatrix.HTTPError
if ok := errors.As(lastErr, &httpErr); ok {
httpErr.Message = string(httpErr.Contents)
- // Clear the wrapped error, else serialising to JSON (in polylith mode) will fail
- httpErr.WrappedError = nil
response.LastError = &httpErr
} else {
response.LastError = &gomatrix.HTTPError{
@@ -391,8 +389,6 @@ func (r *FederationInternalAPI) PerformOutboundPeek(
var httpErr gomatrix.HTTPError
if ok := errors.As(lastErr, &httpErr); ok {
httpErr.Message = string(httpErr.Contents)
- // Clear the wrapped error, else serialising to JSON (in polylith mode) will fail
- httpErr.WrappedError = nil
response.LastError = &httpErr
} else {
response.LastError = &gomatrix.HTTPError{
diff --git a/federationapi/inthttp/client.go b/federationapi/inthttp/client.go
deleted file mode 100644
index 00e069d1..00000000
--- a/federationapi/inthttp/client.go
+++ /dev/null
@@ -1,548 +0,0 @@
-package inthttp
-
-import (
- "context"
- "errors"
- "net/http"
-
- "github.com/matrix-org/dendrite/federationapi/api"
- "github.com/matrix-org/dendrite/internal/caching"
- "github.com/matrix-org/dendrite/internal/httputil"
- "github.com/matrix-org/gomatrix"
- "github.com/matrix-org/gomatrixserverlib"
-)
-
-// HTTP paths for the internal HTTP API
-const (
- FederationAPIQueryJoinedHostServerNamesInRoomPath = "/federationapi/queryJoinedHostServerNamesInRoom"
- FederationAPIQueryServerKeysPath = "/federationapi/queryServerKeys"
-
- FederationAPIPerformDirectoryLookupRequestPath = "/federationapi/performDirectoryLookup"
- FederationAPIPerformJoinRequestPath = "/federationapi/performJoinRequest"
- FederationAPIPerformLeaveRequestPath = "/federationapi/performLeaveRequest"
- FederationAPIPerformInviteRequestPath = "/federationapi/performInviteRequest"
- FederationAPIPerformOutboundPeekRequestPath = "/federationapi/performOutboundPeekRequest"
- FederationAPIPerformBroadcastEDUPath = "/federationapi/performBroadcastEDU"
- FederationAPIPerformWakeupServers = "/federationapi/performWakeupServers"
- FederationAPIQueryRelayServers = "/federationapi/queryRelayServers"
- FederationAPIAddRelayServers = "/federationapi/addRelayServers"
- FederationAPIRemoveRelayServers = "/federationapi/removeRelayServers"
-
- FederationAPIGetUserDevicesPath = "/federationapi/client/getUserDevices"
- FederationAPIClaimKeysPath = "/federationapi/client/claimKeys"
- FederationAPIQueryKeysPath = "/federationapi/client/queryKeys"
- FederationAPIBackfillPath = "/federationapi/client/backfill"
- FederationAPILookupStatePath = "/federationapi/client/lookupState"
- FederationAPILookupStateIDsPath = "/federationapi/client/lookupStateIDs"
- FederationAPILookupMissingEventsPath = "/federationapi/client/lookupMissingEvents"
- FederationAPIGetEventPath = "/federationapi/client/getEvent"
- FederationAPILookupServerKeysPath = "/federationapi/client/lookupServerKeys"
- FederationAPIEventRelationshipsPath = "/federationapi/client/msc2836eventRelationships"
- FederationAPISpacesSummaryPath = "/federationapi/client/msc2946spacesSummary"
- FederationAPIGetEventAuthPath = "/federationapi/client/getEventAuth"
-
- FederationAPIInputPublicKeyPath = "/federationapi/inputPublicKey"
- FederationAPIQueryPublicKeyPath = "/federationapi/queryPublicKey"
-)
-
-// NewFederationAPIClient creates a FederationInternalAPI implemented by talking to a HTTP POST API.
-// If httpClient is nil an error is returned
-func NewFederationAPIClient(federationSenderURL string, httpClient *http.Client, cache caching.ServerKeyCache) (api.FederationInternalAPI, error) {
- if httpClient == nil {
- return nil, errors.New("NewFederationInternalAPIHTTP: httpClient is <nil>")
- }
- return &httpFederationInternalAPI{
- federationAPIURL: federationSenderURL,
- httpClient: httpClient,
- cache: cache,
- }, nil
-}
-
-type httpFederationInternalAPI struct {
- federationAPIURL string
- httpClient *http.Client
- cache caching.ServerKeyCache
-}
-
-// Handle an instruction to make_leave & send_leave with a remote server.
-func (h *httpFederationInternalAPI) PerformLeave(
- ctx context.Context,
- request *api.PerformLeaveRequest,
- response *api.PerformLeaveResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "PerformLeave", h.federationAPIURL+FederationAPIPerformLeaveRequestPath,
- h.httpClient, ctx, request, response,
- )
-}
-
-// Handle sending an invite to a remote server.
-func (h *httpFederationInternalAPI) PerformInvite(
- ctx context.Context,
- request *api.PerformInviteRequest,
- response *api.PerformInviteResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "PerformInvite", h.federationAPIURL+FederationAPIPerformInviteRequestPath,
- h.httpClient, ctx, request, response,
- )
-}
-
-// Handle starting a peek on a remote server.
-func (h *httpFederationInternalAPI) PerformOutboundPeek(
- ctx context.Context,
- request *api.PerformOutboundPeekRequest,
- response *api.PerformOutboundPeekResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "PerformOutboundPeek", h.federationAPIURL+FederationAPIPerformOutboundPeekRequestPath,
- h.httpClient, ctx, request, response,
- )
-}
-
-// QueryJoinedHostServerNamesInRoom implements FederationInternalAPI
-func (h *httpFederationInternalAPI) QueryJoinedHostServerNamesInRoom(
- ctx context.Context,
- request *api.QueryJoinedHostServerNamesInRoomRequest,
- response *api.QueryJoinedHostServerNamesInRoomResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "QueryJoinedHostServerNamesInRoom", h.federationAPIURL+FederationAPIQueryJoinedHostServerNamesInRoomPath,
- h.httpClient, ctx, request, response,
- )
-}
-
-// Handle an instruction to make_join & send_join with a remote server.
-func (h *httpFederationInternalAPI) PerformJoin(
- ctx context.Context,
- request *api.PerformJoinRequest,
- response *api.PerformJoinResponse,
-) {
- if err := httputil.CallInternalRPCAPI(
- "PerformJoinRequest", h.federationAPIURL+FederationAPIPerformJoinRequestPath,
- h.httpClient, ctx, request, response,
- ); err != nil {
- response.LastError = &gomatrix.HTTPError{
- Message: err.Error(),
- Code: 0,
- WrappedError: err,
- }
- }
-}
-
-// Handle an instruction to make_join & send_join with a remote server.
-func (h *httpFederationInternalAPI) PerformDirectoryLookup(
- ctx context.Context,
- request *api.PerformDirectoryLookupRequest,
- response *api.PerformDirectoryLookupResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "PerformDirectoryLookup", h.federationAPIURL+FederationAPIPerformDirectoryLookupRequestPath,
- h.httpClient, ctx, request, response,
- )
-}
-
-// Handle an instruction to broadcast an EDU to all servers in rooms we are joined to.
-func (h *httpFederationInternalAPI) PerformBroadcastEDU(
- ctx context.Context,
- request *api.PerformBroadcastEDURequest,
- response *api.PerformBroadcastEDUResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "PerformBroadcastEDU", h.federationAPIURL+FederationAPIPerformBroadcastEDUPath,
- h.httpClient, ctx, request, response,
- )
-}
-
-// Handle an instruction to remove the respective servers from being blacklisted.
-func (h *httpFederationInternalAPI) PerformWakeupServers(
- ctx context.Context,
- request *api.PerformWakeupServersRequest,
- response *api.PerformWakeupServersResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "PerformWakeupServers", h.federationAPIURL+FederationAPIPerformWakeupServers,
- h.httpClient, ctx, request, response,
- )
-}
-
-type getUserDevices struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- UserID string
-}
-
-func (h *httpFederationInternalAPI) GetUserDevices(
- ctx context.Context, origin, s gomatrixserverlib.ServerName, userID string,
-) (gomatrixserverlib.RespUserDevices, error) {
- return httputil.CallInternalProxyAPI[getUserDevices, gomatrixserverlib.RespUserDevices, *api.FederationClientError](
- "GetUserDevices", h.federationAPIURL+FederationAPIGetUserDevicesPath, h.httpClient,
- ctx, &getUserDevices{
- S: s,
- Origin: origin,
- UserID: userID,
- },
- )
-}
-
-type claimKeys struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- OneTimeKeys map[string]map[string]string
-}
-
-func (h *httpFederationInternalAPI) ClaimKeys(
- ctx context.Context, origin, s gomatrixserverlib.ServerName, oneTimeKeys map[string]map[string]string,
-) (gomatrixserverlib.RespClaimKeys, error) {
- return httputil.CallInternalProxyAPI[claimKeys, gomatrixserverlib.RespClaimKeys, *api.FederationClientError](
- "ClaimKeys", h.federationAPIURL+FederationAPIClaimKeysPath, h.httpClient,
- ctx, &claimKeys{
- S: s,
- Origin: origin,
- OneTimeKeys: oneTimeKeys,
- },
- )
-}
-
-type queryKeys struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- Keys map[string][]string
-}
-
-func (h *httpFederationInternalAPI) QueryKeys(
- ctx context.Context, origin, s gomatrixserverlib.ServerName, keys map[string][]string,
-) (gomatrixserverlib.RespQueryKeys, error) {
- return httputil.CallInternalProxyAPI[queryKeys, gomatrixserverlib.RespQueryKeys, *api.FederationClientError](
- "QueryKeys", h.federationAPIURL+FederationAPIQueryKeysPath, h.httpClient,
- ctx, &queryKeys{
- S: s,
- Origin: origin,
- Keys: keys,
- },
- )
-}
-
-type backfill struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- RoomID string
- Limit int
- EventIDs []string
-}
-
-func (h *httpFederationInternalAPI) Backfill(
- ctx context.Context, origin, s gomatrixserverlib.ServerName, roomID string, limit int, eventIDs []string,
-) (gomatrixserverlib.Transaction, error) {
- return httputil.CallInternalProxyAPI[backfill, gomatrixserverlib.Transaction, *api.FederationClientError](
- "Backfill", h.federationAPIURL+FederationAPIBackfillPath, h.httpClient,
- ctx, &backfill{
- S: s,
- Origin: origin,
- RoomID: roomID,
- Limit: limit,
- EventIDs: eventIDs,
- },
- )
-}
-
-type lookupState struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- RoomID string
- EventID string
- RoomVersion gomatrixserverlib.RoomVersion
-}
-
-func (h *httpFederationInternalAPI) LookupState(
- ctx context.Context, origin, s gomatrixserverlib.ServerName, roomID, eventID string, roomVersion gomatrixserverlib.RoomVersion,
-) (gomatrixserverlib.RespState, error) {
- return httputil.CallInternalProxyAPI[lookupState, gomatrixserverlib.RespState, *api.FederationClientError](
- "LookupState", h.federationAPIURL+FederationAPILookupStatePath, h.httpClient,
- ctx, &lookupState{
- S: s,
- Origin: origin,
- RoomID: roomID,
- EventID: eventID,
- RoomVersion: roomVersion,
- },
- )
-}
-
-type lookupStateIDs struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- RoomID string
- EventID string
-}
-
-func (h *httpFederationInternalAPI) LookupStateIDs(
- ctx context.Context, origin, s gomatrixserverlib.ServerName, roomID, eventID string,
-) (gomatrixserverlib.RespStateIDs, error) {
- return httputil.CallInternalProxyAPI[lookupStateIDs, gomatrixserverlib.RespStateIDs, *api.FederationClientError](
- "LookupStateIDs", h.federationAPIURL+FederationAPILookupStateIDsPath, h.httpClient,
- ctx, &lookupStateIDs{
- S: s,
- Origin: origin,
- RoomID: roomID,
- EventID: eventID,
- },
- )
-}
-
-type lookupMissingEvents struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- RoomID string
- Missing gomatrixserverlib.MissingEvents
- RoomVersion gomatrixserverlib.RoomVersion
-}
-
-func (h *httpFederationInternalAPI) LookupMissingEvents(
- ctx context.Context, origin, s gomatrixserverlib.ServerName, roomID string,
- missing gomatrixserverlib.MissingEvents, roomVersion gomatrixserverlib.RoomVersion,
-) (res gomatrixserverlib.RespMissingEvents, err error) {
- return httputil.CallInternalProxyAPI[lookupMissingEvents, gomatrixserverlib.RespMissingEvents, *api.FederationClientError](
- "LookupMissingEvents", h.federationAPIURL+FederationAPILookupMissingEventsPath, h.httpClient,
- ctx, &lookupMissingEvents{
- S: s,
- Origin: origin,
- RoomID: roomID,
- Missing: missing,
- RoomVersion: roomVersion,
- },
- )
-}
-
-type getEvent struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- EventID string
-}
-
-func (h *httpFederationInternalAPI) GetEvent(
- ctx context.Context, origin, s gomatrixserverlib.ServerName, eventID string,
-) (gomatrixserverlib.Transaction, error) {
- return httputil.CallInternalProxyAPI[getEvent, gomatrixserverlib.Transaction, *api.FederationClientError](
- "GetEvent", h.federationAPIURL+FederationAPIGetEventPath, h.httpClient,
- ctx, &getEvent{
- S: s,
- Origin: origin,
- EventID: eventID,
- },
- )
-}
-
-type getEventAuth struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- RoomVersion gomatrixserverlib.RoomVersion
- RoomID string
- EventID string
-}
-
-func (h *httpFederationInternalAPI) GetEventAuth(
- ctx context.Context, origin, s gomatrixserverlib.ServerName,
- roomVersion gomatrixserverlib.RoomVersion, roomID, eventID string,
-) (gomatrixserverlib.RespEventAuth, error) {
- return httputil.CallInternalProxyAPI[getEventAuth, gomatrixserverlib.RespEventAuth, *api.FederationClientError](
- "GetEventAuth", h.federationAPIURL+FederationAPIGetEventAuthPath, h.httpClient,
- ctx, &getEventAuth{
- S: s,
- Origin: origin,
- RoomVersion: roomVersion,
- RoomID: roomID,
- EventID: eventID,
- },
- )
-}
-
-func (h *httpFederationInternalAPI) QueryServerKeys(
- ctx context.Context, req *api.QueryServerKeysRequest, res *api.QueryServerKeysResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "QueryServerKeys", h.federationAPIURL+FederationAPIQueryServerKeysPath,
- h.httpClient, ctx, req, res,
- )
-}
-
-type lookupServerKeys struct {
- S gomatrixserverlib.ServerName
- KeyRequests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp
-}
-
-func (h *httpFederationInternalAPI) LookupServerKeys(
- ctx context.Context, s gomatrixserverlib.ServerName, keyRequests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp,
-) ([]gomatrixserverlib.ServerKeys, error) {
- return httputil.CallInternalProxyAPI[lookupServerKeys, []gomatrixserverlib.ServerKeys, *api.FederationClientError](
- "LookupServerKeys", h.federationAPIURL+FederationAPILookupServerKeysPath, h.httpClient,
- ctx, &lookupServerKeys{
- S: s,
- KeyRequests: keyRequests,
- },
- )
-}
-
-type eventRelationships struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- Req gomatrixserverlib.MSC2836EventRelationshipsRequest
- RoomVer gomatrixserverlib.RoomVersion
-}
-
-func (h *httpFederationInternalAPI) MSC2836EventRelationships(
- ctx context.Context, origin, s gomatrixserverlib.ServerName, r gomatrixserverlib.MSC2836EventRelationshipsRequest,
- roomVersion gomatrixserverlib.RoomVersion,
-) (res gomatrixserverlib.MSC2836EventRelationshipsResponse, err error) {
- return httputil.CallInternalProxyAPI[eventRelationships, gomatrixserverlib.MSC2836EventRelationshipsResponse, *api.FederationClientError](
- "MSC2836EventRelationships", h.federationAPIURL+FederationAPIEventRelationshipsPath, h.httpClient,
- ctx, &eventRelationships{
- S: s,
- Origin: origin,
- Req: r,
- RoomVer: roomVersion,
- },
- )
-}
-
-type spacesReq struct {
- S gomatrixserverlib.ServerName
- Origin gomatrixserverlib.ServerName
- SuggestedOnly bool
- RoomID string
-}
-
-func (h *httpFederationInternalAPI) MSC2946Spaces(
- ctx context.Context, origin, dst gomatrixserverlib.ServerName, roomID string, suggestedOnly bool,
-) (res gomatrixserverlib.MSC2946SpacesResponse, err error) {
- return httputil.CallInternalProxyAPI[spacesReq, gomatrixserverlib.MSC2946SpacesResponse, *api.FederationClientError](
- "MSC2836EventRelationships", h.federationAPIURL+FederationAPISpacesSummaryPath, h.httpClient,
- ctx, &spacesReq{
- S: dst,
- Origin: origin,
- SuggestedOnly: suggestedOnly,
- RoomID: roomID,
- },
- )
-}
-
-func (s *httpFederationInternalAPI) KeyRing() *gomatrixserverlib.KeyRing {
- // This is a bit of a cheat - we tell gomatrixserverlib that this API is
- // both the key database and the key fetcher. While this does have the
- // rather unfortunate effect of preventing gomatrixserverlib from handling
- // key fetchers directly, we can at least reimplement this behaviour on
- // the other end of the API.
- return &gomatrixserverlib.KeyRing{
- KeyDatabase: s,
- KeyFetchers: []gomatrixserverlib.KeyFetcher{},
- }
-}
-
-func (s *httpFederationInternalAPI) FetcherName() string {
- return "httpServerKeyInternalAPI"
-}
-
-func (s *httpFederationInternalAPI) StoreKeys(
- _ context.Context,
- results map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult,
-) error {
- // Run in a background context - we don't want to stop this work just
- // because the caller gives up waiting.
- ctx := context.Background()
- request := api.InputPublicKeysRequest{
- Keys: make(map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult),
- }
- response := api.InputPublicKeysResponse{}
- for req, res := range results {
- request.Keys[req] = res
- s.cache.StoreServerKey(req, res)
- }
- return s.InputPublicKeys(ctx, &request, &response)
-}
-
-func (s *httpFederationInternalAPI) FetchKeys(
- _ context.Context,
- requests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp,
-) (map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, error) {
- // Run in a background context - we don't want to stop this work just
- // because the caller gives up waiting.
- ctx := context.Background()
- result := make(map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult)
- request := api.QueryPublicKeysRequest{
- Requests: make(map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp),
- }
- response := api.QueryPublicKeysResponse{
- Results: make(map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult),
- }
- for req, ts := range requests {
- if res, ok := s.cache.GetServerKey(req, ts); ok {
- result[req] = res
- continue
- }
- request.Requests[req] = ts
- }
- err := s.QueryPublicKeys(ctx, &request, &response)
- if err != nil {
- return nil, err
- }
- for req, res := range response.Results {
- result[req] = res
- s.cache.StoreServerKey(req, res)
- }
- return result, nil
-}
-
-func (h *httpFederationInternalAPI) InputPublicKeys(
- ctx context.Context,
- request *api.InputPublicKeysRequest,
- response *api.InputPublicKeysResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "InputPublicKey", h.federationAPIURL+FederationAPIInputPublicKeyPath,
- h.httpClient, ctx, request, response,
- )
-}
-
-func (h *httpFederationInternalAPI) QueryPublicKeys(
- ctx context.Context,
- request *api.QueryPublicKeysRequest,
- response *api.QueryPublicKeysResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "QueryPublicKeys", h.federationAPIURL+FederationAPIQueryPublicKeyPath,
- h.httpClient, ctx, request, response,
- )
-}
-
-func (h *httpFederationInternalAPI) P2PQueryRelayServers(
- ctx context.Context,
- request *api.P2PQueryRelayServersRequest,
- response *api.P2PQueryRelayServersResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "QueryRelayServers", h.federationAPIURL+FederationAPIQueryRelayServers,
- h.httpClient, ctx, request, response,
- )
-}
-
-func (h *httpFederationInternalAPI) P2PAddRelayServers(
- ctx context.Context,
- request *api.P2PAddRelayServersRequest,
- response *api.P2PAddRelayServersResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "AddRelayServers", h.federationAPIURL+FederationAPIAddRelayServers,
- h.httpClient, ctx, request, response,
- )
-}
-
-func (h *httpFederationInternalAPI) P2PRemoveRelayServers(
- ctx context.Context,
- request *api.P2PRemoveRelayServersRequest,
- response *api.P2PRemoveRelayServersResponse,
-) error {
- return httputil.CallInternalRPCAPI(
- "RemoveRelayServers", h.federationAPIURL+FederationAPIRemoveRelayServers,
- h.httpClient, ctx, request, response,
- )
-}
diff --git a/federationapi/inthttp/server.go b/federationapi/inthttp/server.go
deleted file mode 100644
index 9068dc40..00000000
--- a/federationapi/inthttp/server.go
+++ /dev/null
@@ -1,257 +0,0 @@
-package inthttp
-
-import (
- "context"
- "encoding/json"
- "net/http"
- "net/url"
-
- "github.com/gorilla/mux"
- "github.com/matrix-org/gomatrix"
- "github.com/matrix-org/gomatrixserverlib"
- "github.com/matrix-org/util"
-
- "github.com/matrix-org/dendrite/federationapi/api"
- "github.com/matrix-org/dendrite/internal/httputil"
-)
-
-// AddRoutes adds the FederationInternalAPI handlers to the http.ServeMux.
-// nolint:gocyclo
-func AddRoutes(intAPI api.FederationInternalAPI, internalAPIMux *mux.Router, enableMetrics bool) {
- internalAPIMux.Handle(
- FederationAPIQueryJoinedHostServerNamesInRoomPath,
- httputil.MakeInternalRPCAPI("FederationAPIQueryJoinedHostServerNamesInRoom", enableMetrics, intAPI.QueryJoinedHostServerNamesInRoom),
- )
-
- internalAPIMux.Handle(
- FederationAPIPerformInviteRequestPath,
- httputil.MakeInternalRPCAPI("FederationAPIPerformInvite", enableMetrics, intAPI.PerformInvite),
- )
-
- internalAPIMux.Handle(
- FederationAPIPerformLeaveRequestPath,
- httputil.MakeInternalRPCAPI("FederationAPIPerformLeave", enableMetrics, intAPI.PerformLeave),
- )
-
- internalAPIMux.Handle(
- FederationAPIPerformDirectoryLookupRequestPath,
- httputil.MakeInternalRPCAPI("FederationAPIPerformDirectoryLookupRequest", enableMetrics, intAPI.PerformDirectoryLookup),
- )
-
- internalAPIMux.Handle(
- FederationAPIPerformBroadcastEDUPath,
- httputil.MakeInternalRPCAPI("FederationAPIPerformBroadcastEDU", enableMetrics, intAPI.PerformBroadcastEDU),
- )
-
- internalAPIMux.Handle(
- FederationAPIPerformWakeupServers,
- httputil.MakeInternalRPCAPI("FederationAPIPerformWakeupServers", enableMetrics, intAPI.PerformWakeupServers),
- )
-
- internalAPIMux.Handle(
- FederationAPIPerformJoinRequestPath,
- httputil.MakeInternalRPCAPI(
- "FederationAPIPerformJoinRequest", enableMetrics,
- func(ctx context.Context, req *api.PerformJoinRequest, res *api.PerformJoinResponse) error {
- intAPI.PerformJoin(ctx, req, res)
- return nil
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPIGetUserDevicesPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPIGetUserDevices", enableMetrics,
- func(ctx context.Context, req *getUserDevices) (*gomatrixserverlib.RespUserDevices, error) {
- res, err := intAPI.GetUserDevices(ctx, req.Origin, req.S, req.UserID)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPIClaimKeysPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPIClaimKeys", enableMetrics,
- func(ctx context.Context, req *claimKeys) (*gomatrixserverlib.RespClaimKeys, error) {
- res, err := intAPI.ClaimKeys(ctx, req.Origin, req.S, req.OneTimeKeys)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPIQueryKeysPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPIQueryKeys", enableMetrics,
- func(ctx context.Context, req *queryKeys) (*gomatrixserverlib.RespQueryKeys, error) {
- res, err := intAPI.QueryKeys(ctx, req.Origin, req.S, req.Keys)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPIBackfillPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPIBackfill", enableMetrics,
- func(ctx context.Context, req *backfill) (*gomatrixserverlib.Transaction, error) {
- res, err := intAPI.Backfill(ctx, req.Origin, req.S, req.RoomID, req.Limit, req.EventIDs)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPILookupStatePath,
- httputil.MakeInternalProxyAPI(
- "FederationAPILookupState", enableMetrics,
- func(ctx context.Context, req *lookupState) (*gomatrixserverlib.RespState, error) {
- res, err := intAPI.LookupState(ctx, req.Origin, req.S, req.RoomID, req.EventID, req.RoomVersion)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPILookupStateIDsPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPILookupStateIDs", enableMetrics,
- func(ctx context.Context, req *lookupStateIDs) (*gomatrixserverlib.RespStateIDs, error) {
- res, err := intAPI.LookupStateIDs(ctx, req.Origin, req.S, req.RoomID, req.EventID)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPILookupMissingEventsPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPILookupMissingEvents", enableMetrics,
- func(ctx context.Context, req *lookupMissingEvents) (*gomatrixserverlib.RespMissingEvents, error) {
- res, err := intAPI.LookupMissingEvents(ctx, req.Origin, req.S, req.RoomID, req.Missing, req.RoomVersion)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPIGetEventPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPIGetEvent", enableMetrics,
- func(ctx context.Context, req *getEvent) (*gomatrixserverlib.Transaction, error) {
- res, err := intAPI.GetEvent(ctx, req.Origin, req.S, req.EventID)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPIGetEventAuthPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPIGetEventAuth", enableMetrics,
- func(ctx context.Context, req *getEventAuth) (*gomatrixserverlib.RespEventAuth, error) {
- res, err := intAPI.GetEventAuth(ctx, req.Origin, req.S, req.RoomVersion, req.RoomID, req.EventID)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPIQueryServerKeysPath,
- httputil.MakeInternalRPCAPI("FederationAPIQueryServerKeys", enableMetrics, intAPI.QueryServerKeys),
- )
-
- internalAPIMux.Handle(
- FederationAPILookupServerKeysPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPILookupServerKeys", enableMetrics,
- func(ctx context.Context, req *lookupServerKeys) (*[]gomatrixserverlib.ServerKeys, error) {
- res, err := intAPI.LookupServerKeys(ctx, req.S, req.KeyRequests)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPIEventRelationshipsPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPIMSC2836EventRelationships", enableMetrics,
- func(ctx context.Context, req *eventRelationships) (*gomatrixserverlib.MSC2836EventRelationshipsResponse, error) {
- res, err := intAPI.MSC2836EventRelationships(ctx, req.Origin, req.S, req.Req, req.RoomVer)
- return &res, federationClientError(err)
- },
- ),
- )
-
- internalAPIMux.Handle(
- FederationAPISpacesSummaryPath,
- httputil.MakeInternalProxyAPI(
- "FederationAPIMSC2946SpacesSummary", enableMetrics,
- func(ctx context.Context, req *spacesReq) (*gomatrixserverlib.MSC2946SpacesResponse, error) {
- res, err := intAPI.MSC2946Spaces(ctx, req.Origin, req.S, req.RoomID, req.SuggestedOnly)
- return &res, federationClientError(err)
- },
- ),
- )
-
- // TODO: Look at this shape
- internalAPIMux.Handle(FederationAPIQueryPublicKeyPath,
- httputil.MakeInternalAPI("FederationAPIQueryPublicKeys", enableMetrics, func(req *http.Request) util.JSONResponse {
- request := api.QueryPublicKeysRequest{}
- response := api.QueryPublicKeysResponse{}
- if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
- return util.MessageResponse(http.StatusBadRequest, err.Error())
- }
- keys, err := intAPI.FetchKeys(req.Context(), request.Requests)
- if err != nil {
- return util.ErrorResponse(err)
- }
- response.Results = keys
- return util.JSONResponse{Code: http.StatusOK, JSON: &response}
- }),
- )
-
- // TODO: Look at this shape
- internalAPIMux.Handle(FederationAPIInputPublicKeyPath,
- httputil.MakeInternalAPI("FederationAPIInputPublicKeys", enableMetrics, func(req *http.Request) util.JSONResponse {
- request := api.InputPublicKeysRequest{}
- response := api.InputPublicKeysResponse{}
- if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
- return util.MessageResponse(http.StatusBadRequest, err.Error())
- }
- if err := intAPI.StoreKeys(req.Context(), request.Keys); err != nil {
- return util.ErrorResponse(err)
- }
- return util.JSONResponse{Code: http.StatusOK, JSON: &response}
- }),
- )
-}
-
-func federationClientError(err error) error {
- switch ferr := err.(type) {
- case nil:
- return nil
- case api.FederationClientError:
- return &ferr
- case *api.FederationClientError:
- return ferr
- case gomatrix.HTTPError:
- return &api.FederationClientError{
- Code: ferr.Code,
- }
- case *url.Error: // e.g. certificate error, unable to connect
- return &api.FederationClientError{
- Err: ferr.Error(),
- Code: 400,
- }
- default:
- // We don't know what exactly failed, but we probably don't
- // want to retry the request immediately in the device list updater
- return &api.FederationClientError{
- Err: err.Error(),
- Code: 400,
- }
- }
-}