aboutsummaryrefslogtreecommitdiff
path: root/federationapi/routing/routing.go
diff options
context:
space:
mode:
Diffstat (limited to 'federationapi/routing/routing.go')
-rw-r--r--federationapi/routing/routing.go230
1 files changed, 230 insertions, 0 deletions
diff --git a/federationapi/routing/routing.go b/federationapi/routing/routing.go
new file mode 100644
index 00000000..035d54aa
--- /dev/null
+++ b/federationapi/routing/routing.go
@@ -0,0 +1,230 @@
+// Copyright 2017 Vector Creations Ltd
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package routing
+
+import (
+ "net/http"
+
+ "github.com/gorilla/mux"
+ appserviceAPI "github.com/matrix-org/dendrite/appservice/api"
+ "github.com/matrix-org/dendrite/clientapi/auth/storage/accounts"
+ "github.com/matrix-org/dendrite/clientapi/auth/storage/devices"
+ "github.com/matrix-org/dendrite/clientapi/producers"
+ "github.com/matrix-org/dendrite/common"
+ "github.com/matrix-org/dendrite/common/config"
+ roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
+ "github.com/matrix-org/gomatrixserverlib"
+ "github.com/matrix-org/util"
+)
+
+const (
+ pathPrefixV2Keys = "/_matrix/key/v2"
+ pathPrefixV1Federation = "/_matrix/federation/v1"
+)
+
+// Setup registers HTTP handlers with the given ServeMux.
+func Setup(
+ apiMux *mux.Router,
+ cfg config.Dendrite,
+ query roomserverAPI.RoomserverQueryAPI,
+ aliasAPI roomserverAPI.RoomserverAliasAPI,
+ asAPI appserviceAPI.AppServiceQueryAPI,
+ producer *producers.RoomserverProducer,
+ keys gomatrixserverlib.KeyRing,
+ federation *gomatrixserverlib.FederationClient,
+ accountDB *accounts.Database,
+ deviceDB *devices.Database,
+) {
+ v2keysmux := apiMux.PathPrefix(pathPrefixV2Keys).Subrouter()
+ v1fedmux := apiMux.PathPrefix(pathPrefixV1Federation).Subrouter()
+
+ localKeys := common.MakeExternalAPI("localkeys", func(req *http.Request) util.JSONResponse {
+ return LocalKeys(cfg)
+ })
+
+ // Ignore the {keyID} argument as we only have a single server key so we always
+ // return that key.
+ // Even if we had more than one server key, we would probably still ignore the
+ // {keyID} argument and always return a response containing all of the keys.
+ v2keysmux.Handle("/server/{keyID}", localKeys).Methods(http.MethodGet)
+ v2keysmux.Handle("/server/", localKeys).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/send/{txnID}/", common.MakeFedAPI(
+ "federation_send", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ return Send(
+ httpReq, request, gomatrixserverlib.TransactionID(vars["txnID"]),
+ cfg, query, producer, keys, federation,
+ )
+ },
+ )).Methods(http.MethodPut, http.MethodOptions)
+
+ v1fedmux.Handle("/invite/{roomID}/{eventID}", common.MakeFedAPI(
+ "federation_invite", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ return Invite(
+ httpReq, request, vars["roomID"], vars["eventID"],
+ cfg, producer, keys,
+ )
+ },
+ )).Methods(http.MethodPut, http.MethodOptions)
+
+ v1fedmux.Handle("/3pid/onbind", common.MakeExternalAPI("3pid_onbind",
+ func(req *http.Request) util.JSONResponse {
+ return CreateInvitesFrom3PIDInvites(req, query, asAPI, cfg, producer, federation, accountDB)
+ },
+ )).Methods(http.MethodPost, http.MethodOptions)
+
+ v1fedmux.Handle("/exchange_third_party_invite/{roomID}", common.MakeFedAPI(
+ "exchange_third_party_invite", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ return ExchangeThirdPartyInvite(
+ httpReq, request, vars["roomID"], query, cfg, federation, producer,
+ )
+ },
+ )).Methods(http.MethodPut, http.MethodOptions)
+
+ v1fedmux.Handle("/event/{eventID}", common.MakeFedAPI(
+ "federation_get_event", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ return GetEvent(
+ httpReq.Context(), request, query, vars["eventID"],
+ )
+ },
+ )).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/state/{roomID}", common.MakeFedAPI(
+ "federation_get_event_auth", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ return GetState(
+ httpReq.Context(), request, query, vars["roomID"],
+ )
+ },
+ )).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/state_ids/{roomID}", common.MakeFedAPI(
+ "federation_get_event_auth", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ return GetStateIDs(
+ httpReq.Context(), request, query, vars["roomID"],
+ )
+ },
+ )).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/query/directory", common.MakeFedAPI(
+ "federation_query_room_alias", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ return RoomAliasToID(
+ httpReq, federation, cfg, aliasAPI,
+ )
+ },
+ )).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/query/profile", common.MakeFedAPI(
+ "federation_query_profile", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ return GetProfile(
+ httpReq, accountDB, cfg, asAPI,
+ )
+ },
+ )).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/user/devices/{userID}", common.MakeFedAPI(
+ "federation_user_devices", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ return GetUserDevices(
+ httpReq, deviceDB, vars["userID"],
+ )
+ },
+ )).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/make_join/{roomID}/{userID}", common.MakeFedAPI(
+ "federation_make_join", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ roomID := vars["roomID"]
+ userID := vars["userID"]
+ return MakeJoin(
+ httpReq, request, cfg, query, roomID, userID,
+ )
+ },
+ )).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/send_join/{roomID}/{userID}", common.MakeFedAPI(
+ "federation_send_join", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ roomID := vars["roomID"]
+ userID := vars["userID"]
+ return SendJoin(
+ httpReq, request, cfg, query, producer, keys, roomID, userID,
+ )
+ },
+ )).Methods(http.MethodPut)
+
+ v1fedmux.Handle("/make_leave/{roomID}/{userID}", common.MakeFedAPI(
+ "federation_make_leave", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ roomID := vars["roomID"]
+ userID := vars["userID"]
+ return MakeLeave(
+ httpReq, request, cfg, query, roomID, userID,
+ )
+ },
+ )).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/send_leave/{roomID}/{userID}", common.MakeFedAPI(
+ "federation_send_leave", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ roomID := vars["roomID"]
+ userID := vars["userID"]
+ return SendLeave(
+ httpReq, request, cfg, producer, keys, roomID, userID,
+ )
+ },
+ )).Methods(http.MethodPut)
+
+ v1fedmux.Handle("/version", common.MakeExternalAPI(
+ "federation_version",
+ func(httpReq *http.Request) util.JSONResponse {
+ return Version()
+ },
+ )).Methods(http.MethodGet)
+
+ v1fedmux.Handle("/get_missing_events/{roomID}", common.MakeFedAPI(
+ "federation_get_missing_events", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ return GetMissingEvents(httpReq, request, query, vars["roomID"])
+ },
+ )).Methods(http.MethodPost)
+
+ v1fedmux.Handle("/backfill/{roomID}/", common.MakeFedAPI(
+ "federation_backfill", cfg.Matrix.ServerName, keys,
+ func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
+ vars := mux.Vars(httpReq)
+ return Backfill(httpReq, request, query, vars["roomID"], cfg)
+ },
+ )).Methods(http.MethodGet)
+}