2020-06-04 08:27:10 -05:00
|
|
|
package inthttp
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"github.com/gorilla/mux"
|
2021-11-24 04:45:23 -06:00
|
|
|
"github.com/matrix-org/dendrite/federationapi/api"
|
2020-06-12 08:55:57 -05:00
|
|
|
"github.com/matrix-org/dendrite/internal/httputil"
|
2020-06-04 08:27:10 -05:00
|
|
|
"github.com/matrix-org/util"
|
|
|
|
)
|
|
|
|
|
2021-11-24 04:45:23 -06:00
|
|
|
// AddRoutes adds the FederationInternalAPI handlers to the http.ServeMux.
|
2020-08-17 05:40:49 -05:00
|
|
|
// nolint:gocyclo
|
2021-11-24 04:45:23 -06:00
|
|
|
func AddRoutes(intAPI api.FederationInternalAPI, internalAPIMux *mux.Router) {
|
2022-08-05 09:29:08 -05:00
|
|
|
httputil.NewInternalAPIServer(
|
|
|
|
"QueryJoinedHostServerNamesInRoom",
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPIQueryJoinedHostServerNamesInRoomPath,
|
2022-08-05 09:29:08 -05:00
|
|
|
intAPI.QueryJoinedHostServerNamesInRoom,
|
|
|
|
).Serve(internalAPIMux)
|
|
|
|
|
|
|
|
httputil.NewInternalAPIServer(
|
|
|
|
"PerformLeave",
|
|
|
|
FederationAPIPerformLeaveRequestPath,
|
|
|
|
intAPI.PerformLeave,
|
|
|
|
).Serve(internalAPIMux)
|
|
|
|
|
|
|
|
httputil.NewInternalAPIServer(
|
|
|
|
"PerformDirectoryLookupRequest",
|
|
|
|
FederationAPIPerformDirectoryLookupRequestPath,
|
|
|
|
intAPI.PerformDirectoryLookup,
|
|
|
|
).Serve(internalAPIMux)
|
|
|
|
|
|
|
|
httputil.NewInternalAPIServer(
|
|
|
|
"PerformBroadcastEDU",
|
|
|
|
FederationAPIPerformBroadcastEDUPath,
|
|
|
|
intAPI.PerformBroadcastEDU,
|
|
|
|
).Serve(internalAPIMux)
|
|
|
|
|
2020-08-13 06:16:37 -05:00
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPIPerformJoinRequestPath,
|
2020-06-12 08:55:57 -05:00
|
|
|
httputil.MakeInternalAPI("PerformJoinRequest", func(req *http.Request) util.JSONResponse {
|
2020-06-04 08:27:10 -05:00
|
|
|
var request api.PerformJoinRequest
|
|
|
|
var response api.PerformJoinResponse
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
2020-06-25 09:04:48 -05:00
|
|
|
intAPI.PerformJoin(req.Context(), &request, &response)
|
2020-06-04 08:27:10 -05:00
|
|
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
|
|
|
}),
|
|
|
|
)
|
2022-08-05 09:29:08 -05:00
|
|
|
|
2020-08-20 11:03:07 -05:00
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPIGetUserDevicesPath,
|
2020-08-20 11:03:07 -05:00
|
|
|
httputil.MakeInternalAPI("GetUserDevices", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request getUserDevices
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
|
|
|
res, err := intAPI.GetUserDevices(req.Context(), request.S, request.UserID)
|
|
|
|
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}
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPIClaimKeysPath,
|
2020-08-20 11:03:07 -05:00
|
|
|
httputil.MakeInternalAPI("ClaimKeys", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request claimKeys
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
|
|
|
res, err := intAPI.ClaimKeys(req.Context(), request.S, request.OneTimeKeys)
|
|
|
|
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}
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPIQueryKeysPath,
|
2020-08-20 11:03:07 -05:00
|
|
|
httputil.MakeInternalAPI("QueryKeys", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request queryKeys
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
|
|
|
res, err := intAPI.QueryKeys(req.Context(), request.S, request.Keys)
|
|
|
|
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}
|
|
|
|
}),
|
|
|
|
)
|
2020-09-02 09:26:30 -05:00
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPIBackfillPath,
|
2020-09-02 09:26:30 -05:00
|
|
|
httputil.MakeInternalAPI("Backfill", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request backfill
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
|
|
|
res, err := intAPI.Backfill(req.Context(), request.S, request.RoomID, request.Limit, request.EventIDs)
|
|
|
|
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}
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPILookupStatePath,
|
2020-09-02 09:26:30 -05:00
|
|
|
httputil.MakeInternalAPI("LookupState", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request lookupState
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
|
|
|
res, err := intAPI.LookupState(req.Context(), request.S, request.RoomID, request.EventID, request.RoomVersion)
|
|
|
|
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}
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPILookupStateIDsPath,
|
2020-09-02 09:26:30 -05:00
|
|
|
httputil.MakeInternalAPI("LookupStateIDs", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request lookupStateIDs
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
|
|
|
res, err := intAPI.LookupStateIDs(req.Context(), request.S, request.RoomID, request.EventID)
|
|
|
|
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}
|
|
|
|
}),
|
|
|
|
)
|
2022-01-27 08:29:14 -06:00
|
|
|
internalAPIMux.Handle(
|
|
|
|
FederationAPILookupMissingEventsPath,
|
|
|
|
httputil.MakeInternalAPI("LookupMissingEvents", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request lookupMissingEvents
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
|
|
|
res, err := intAPI.LookupMissingEvents(req.Context(), request.S, request.RoomID, request.Missing, request.RoomVersion)
|
|
|
|
if err != nil {
|
|
|
|
ferr, ok := err.(*api.FederationClientError)
|
|
|
|
if ok {
|
|
|
|
request.Err = ferr
|
|
|
|
} else {
|
|
|
|
request.Err = &api.FederationClientError{
|
|
|
|
Err: err.Error(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, event := range res.Events {
|
|
|
|
js, err := json.Marshal(event)
|
|
|
|
if err != nil {
|
|
|
|
return util.MessageResponse(http.StatusInternalServerError, err.Error())
|
|
|
|
}
|
|
|
|
request.Res.Events = append(request.Res.Events, js)
|
|
|
|
}
|
|
|
|
return util.JSONResponse{Code: http.StatusOK, JSON: request}
|
|
|
|
}),
|
|
|
|
)
|
2020-09-02 09:26:30 -05:00
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPIGetEventPath,
|
2020-09-02 09:26:30 -05:00
|
|
|
httputil.MakeInternalAPI("GetEvent", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request getEvent
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
|
|
|
res, err := intAPI.GetEvent(req.Context(), request.S, request.EventID)
|
|
|
|
if err != nil {
|
|
|
|
ferr, ok := err.(*api.FederationClientError)
|
|
|
|
if ok {
|
|
|
|
request.Err = ferr
|
|
|
|
} else {
|
|
|
|
request.Err = &api.FederationClientError{
|
2022-01-27 08:29:14 -06:00
|
|
|
Err: err.Error(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
request.Res = &res
|
|
|
|
return util.JSONResponse{Code: http.StatusOK, JSON: request}
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
internalAPIMux.Handle(
|
|
|
|
FederationAPIGetEventAuthPath,
|
|
|
|
httputil.MakeInternalAPI("GetEventAuth", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request getEventAuth
|
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
|
|
|
res, err := intAPI.GetEventAuth(req.Context(), request.S, request.RoomVersion, request.RoomID, request.EventID)
|
|
|
|
if err != nil {
|
|
|
|
ferr, ok := err.(*api.FederationClientError)
|
|
|
|
if ok {
|
|
|
|
request.Err = ferr
|
|
|
|
} else {
|
|
|
|
request.Err = &api.FederationClientError{
|
2020-09-02 09:26:30 -05:00
|
|
|
Err: err.Error(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
request.Res = &res
|
|
|
|
return util.JSONResponse{Code: http.StatusOK, JSON: request}
|
|
|
|
}),
|
|
|
|
)
|
2020-09-22 08:40:54 -05:00
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPIQueryServerKeysPath,
|
2021-07-15 11:45:37 -05:00
|
|
|
httputil.MakeInternalAPI("QueryServerKeys", func(req *http.Request) util.JSONResponse {
|
|
|
|
var request api.QueryServerKeysRequest
|
|
|
|
var response api.QueryServerKeysResponse
|
2020-09-22 08:40:54 -05:00
|
|
|
if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
|
|
|
|
return util.MessageResponse(http.StatusBadRequest, err.Error())
|
|
|
|
}
|
2021-07-15 11:45:37 -05:00
|
|
|
if err := intAPI.QueryServerKeys(req.Context(), &request, &response); err != nil {
|
|
|
|
return util.ErrorResponse(err)
|
2020-09-22 08:40:54 -05:00
|
|
|
}
|
2021-07-15 11:45:37 -05:00
|
|
|
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
|
2020-09-22 08:40:54 -05:00
|
|
|
}),
|
|
|
|
)
|
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPILookupServerKeysPath,
|
2020-09-22 08:40:54 -05:00
|
|
|
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}
|
|
|
|
}),
|
|
|
|
)
|
2020-12-04 08:11:01 -06:00
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPIEventRelationshipsPath,
|
2020-12-04 08:11:01 -06:00
|
|
|
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}
|
|
|
|
}),
|
|
|
|
)
|
2021-01-19 11:14:25 -06:00
|
|
|
internalAPIMux.Handle(
|
2021-11-24 04:45:23 -06:00
|
|
|
FederationAPISpacesSummaryPath,
|
2021-01-19 11:14:25 -06:00
|
|
|
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())
|
|
|
|
}
|
2022-03-01 07:40:07 -06:00
|
|
|
res, err := intAPI.MSC2946Spaces(req.Context(), request.S, request.RoomID, request.SuggestedOnly)
|
2021-01-19 11:14:25 -06:00
|
|
|
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}
|
|
|
|
}),
|
|
|
|
)
|
2021-11-24 04:45:23 -06:00
|
|
|
internalAPIMux.Handle(FederationAPIQueryPublicKeyPath,
|
|
|
|
httputil.MakeInternalAPI("queryPublicKeys", 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}
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
internalAPIMux.Handle(FederationAPIInputPublicKeyPath,
|
|
|
|
httputil.MakeInternalAPI("inputPublicKeys", 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}
|
|
|
|
}),
|
|
|
|
)
|
2020-06-04 08:27:10 -05:00
|
|
|
}
|