aboutsummaryrefslogtreecommitdiff
path: root/federationapi
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-09-22 14:40:54 +0100
committerGitHub <noreply@github.com>2020-09-22 14:40:54 +0100
commita14b29b52617c06a548145a18b4d7cee6e529b79 (patch)
tree813e96e05884248ac97959d64b0458eba69e0665 /federationapi
parenta7563ede3d61efa626095b8b9069af9f16e7dd3d (diff)
Initial notary support (#1436)
* Initial work on notary support * Somewhat working (but not properly filtered) notary support, other tweaks * Update gomatrixserverlib
Diffstat (limited to 'federationapi')
-rw-r--r--federationapi/routing/keys.go62
-rw-r--r--federationapi/routing/routing.go22
2 files changed, 84 insertions, 0 deletions
diff --git a/federationapi/routing/keys.go b/federationapi/routing/keys.go
index f1ed4176..785be090 100644
--- a/federationapi/routing/keys.go
+++ b/federationapi/routing/keys.go
@@ -19,11 +19,14 @@ import (
"net/http"
"time"
+ "github.com/matrix-org/dendrite/clientapi/httputil"
"github.com/matrix-org/dendrite/clientapi/jsonerror"
+ federationSenderAPI "github.com/matrix-org/dendrite/federationsender/api"
"github.com/matrix-org/dendrite/internal/config"
"github.com/matrix-org/dendrite/keyserver/api"
"github.com/matrix-org/gomatrixserverlib"
"github.com/matrix-org/util"
+ "github.com/sirupsen/logrus"
"golang.org/x/crypto/ed25519"
)
@@ -160,3 +163,62 @@ func localKeys(cfg *config.FederationAPI, validUntil time.Time) (*gomatrixserver
return &keys, nil
}
+
+func NotaryKeys(
+ httpReq *http.Request, cfg *config.FederationAPI,
+ fsAPI federationSenderAPI.FederationSenderInternalAPI,
+ req *gomatrixserverlib.PublicKeyNotaryLookupRequest,
+) util.JSONResponse {
+ if req == nil {
+ req = &gomatrixserverlib.PublicKeyNotaryLookupRequest{}
+ if reqErr := httputil.UnmarshalJSONRequest(httpReq, &req); reqErr != nil {
+ return *reqErr
+ }
+ }
+
+ var response struct {
+ ServerKeys []json.RawMessage `json:"server_keys"`
+ }
+ response.ServerKeys = []json.RawMessage{}
+
+ for serverName := range req.ServerKeys {
+ var keys *gomatrixserverlib.ServerKeys
+ if serverName == cfg.Matrix.ServerName {
+ if k, err := localKeys(cfg, time.Now().Add(cfg.Matrix.KeyValidityPeriod)); err == nil {
+ keys = k
+ } else {
+ return util.ErrorResponse(err)
+ }
+ } else {
+ if k, err := fsAPI.GetServerKeys(httpReq.Context(), serverName); err == nil {
+ keys = &k
+ } else {
+ return util.ErrorResponse(err)
+ }
+ }
+ if keys == nil {
+ continue
+ }
+
+ j, err := json.Marshal(keys)
+ if err != nil {
+ logrus.WithError(err).Errorf("Failed to marshal %q response", serverName)
+ return jsonerror.InternalServerError()
+ }
+
+ js, err := gomatrixserverlib.SignJSON(
+ string(cfg.Matrix.ServerName), cfg.Matrix.KeyID, cfg.Matrix.PrivateKey, j,
+ )
+ if err != nil {
+ logrus.WithError(err).Errorf("Failed to sign %q response", serverName)
+ return jsonerror.InternalServerError()
+ }
+
+ response.ServerKeys = append(response.ServerKeys, js)
+ }
+
+ return util.JSONResponse{
+ Code: http.StatusOK,
+ JSON: response,
+ }
+}
diff --git a/federationapi/routing/routing.go b/federationapi/routing/routing.go
index 71a09d42..06ed57af 100644
--- a/federationapi/routing/routing.go
+++ b/federationapi/routing/routing.go
@@ -61,6 +61,26 @@ func Setup(
return LocalKeys(cfg)
})
+ notaryKeys := httputil.MakeExternalAPI("notarykeys", func(req *http.Request) util.JSONResponse {
+ vars, err := httputil.URLDecodeMapValues(mux.Vars(req))
+ if err != nil {
+ return util.ErrorResponse(err)
+ }
+ var pkReq *gomatrixserverlib.PublicKeyNotaryLookupRequest
+ serverName := gomatrixserverlib.ServerName(vars["serverName"])
+ keyID := gomatrixserverlib.KeyID(vars["keyID"])
+ if serverName != "" && keyID != "" {
+ pkReq = &gomatrixserverlib.PublicKeyNotaryLookupRequest{
+ ServerKeys: map[gomatrixserverlib.ServerName]map[gomatrixserverlib.KeyID]gomatrixserverlib.PublicKeyNotaryQueryCriteria{
+ serverName: {
+ keyID: gomatrixserverlib.PublicKeyNotaryQueryCriteria{},
+ },
+ },
+ }
+ }
+ return NotaryKeys(req, cfg, fsAPI, pkReq)
+ })
+
// 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
@@ -68,6 +88,8 @@ func Setup(
v2keysmux.Handle("/server/{keyID}", localKeys).Methods(http.MethodGet)
v2keysmux.Handle("/server/", localKeys).Methods(http.MethodGet)
v2keysmux.Handle("/server", localKeys).Methods(http.MethodGet)
+ v2keysmux.Handle("/query", notaryKeys).Methods(http.MethodPost)
+ v2keysmux.Handle("/query/{serverName}/{keyID}", notaryKeys).Methods(http.MethodGet)
v1fedmux.Handle("/send/{txnID}", httputil.MakeFedAPI(
"federation_send", cfg.Matrix.ServerName, keys, wakeup,