diff --git a/src/github.com/turt2live/matrix-media-repo/api/custom/federation.go b/src/github.com/turt2live/matrix-media-repo/api/custom/federation.go new file mode 100644 index 0000000000000000000000000000000000000000..ae931195ce47806ef7459b054e6bb2761b8ba14f --- /dev/null +++ b/src/github.com/turt2live/matrix-media-repo/api/custom/federation.go @@ -0,0 +1,54 @@ +package custom + +import ( + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/gorilla/mux" + "github.com/sirupsen/logrus" + "github.com/turt2live/matrix-media-repo/api" + "github.com/turt2live/matrix-media-repo/matrix" +) + +func GetFederationInfo(r *http.Request, log *logrus.Entry, user api.UserInfo) interface{} { + params := mux.Vars(r) + + serverName := params["serverName"] + + log = log.WithFields(logrus.Fields{ + "serverName": serverName, + }) + + url, hostname, err := matrix.GetServerApiUrl(serverName) + if err != nil { + log.Error(err) + return api.InternalServerError(err.Error()) + } + + versionUrl := url + "/_matrix/federation/v1/version" + versionResponse, err := matrix.FederatedGet(versionUrl, hostname) + if err != nil { + log.Error(err) + return api.InternalServerError(err.Error()) + } + + c, err := ioutil.ReadAll(versionResponse.Body) + if err != nil { + log.Error(err) + return api.InternalServerError(err.Error()) + } + + out := make(map[string]interface{}) + err = json.Unmarshal(c, &out) + if err != nil { + log.Error(err) + return api.InternalServerError(err.Error()) + } + + resp := make(map[string]interface{}) + resp["base_url"] = url + resp["hostname"] = hostname + resp["versions_response"] = out + return resp +} diff --git a/src/github.com/turt2live/matrix-media-repo/api/webserver/webserver.go b/src/github.com/turt2live/matrix-media-repo/api/webserver/webserver.go index ee2e76150e79657c281b3cfd4f07dcc722bbaaef..f9be9648fa9ff4cd09dd4089f4928625aa6371c8 100644 --- a/src/github.com/turt2live/matrix-media-repo/api/webserver/webserver.go +++ b/src/github.com/turt2live/matrix-media-repo/api/webserver/webserver.go @@ -40,6 +40,7 @@ func Init() { storageEstimateHandler := handler{api.RepoAdminRoute(custom.GetDatastoreStorageEstimate), "get_storage_estimate", counter} datastoreListHandler := handler{api.RepoAdminRoute(custom.GetDatastores), "list_datastores", counter} dsTransferHandler := handler{api.RepoAdminRoute(custom.MigrateBetweenDatastores), "datastore_transfer", counter} + fedTestHandler := handler{api.RepoAdminRoute(custom.GetFederationInfo), "federation_test", counter} routes := make(map[string]route) versions := []string{"r0", "v1", "unstable"} // r0 is typically clients and v1 is typically servers. v1 is deprecated. @@ -61,6 +62,7 @@ func Init() { routes["/_matrix/media/"+version+"/admin/datastores/{datastoreId:[^/]+}/size_estimate"] = route{"GET", storageEstimateHandler} routes["/_matrix/media/"+version+"/admin/datastores"] = route{"GET", datastoreListHandler} routes["/_matrix/media/"+version+"/admin/datastores/{sourceDsId:[^/]+}/transfer_to/{targetDsId:[^/]+}"] = route{"POST", dsTransferHandler} + routes["/_matrix/media/"+version+"/admin/federation/test/{serverName:[a-zA-Z0-9.:\\-_]+}"] = route{"GET", fedTestHandler} // Routes that we should handle but aren't in the media namespace (synapse compat) routes["/_matrix/client/"+version+"/admin/purge_media_cache"] = route{"POST", purgeHandler}