aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2021-12-13 13:24:49 +0000
committerNeil Alexander <neilalexander@users.noreply.github.com>2021-12-13 13:24:49 +0000
commit3113210f17221240397796d90879c50b1581316a (patch)
tree68cf1bd630b2b40783025ff43cc9718e25a1d3d9
parentc3dda0779d5cc176ae6c2213f5321f876fa22a99 (diff)
Fix keyring regressions in previous P2P demo
-rw-r--r--build/gobind-pinecone/monolith.go5
-rw-r--r--build/gobind-yggdrasil/monolith.go5
-rw-r--r--cmd/dendrite-demo-libp2p/main.go4
-rw-r--r--cmd/dendrite-demo-pinecone/main.go5
-rw-r--r--cmd/dendrite-demo-yggdrasil/main.go5
-rw-r--r--cmd/dendrite-monolith-server/main.go6
-rw-r--r--cmd/dendrite-polylith-multi/personalities/federationapi.go2
-rw-r--r--cmd/dendrite-polylith-multi/personalities/roomserver.go2
-rw-r--r--cmd/dendritejs-pinecone/main.go3
-rw-r--r--cmd/dendritejs/main.go3
-rw-r--r--federationapi/federationapi.go3
-rw-r--r--federationapi/federationapi_keys_test.go2
-rw-r--r--federationapi/internal/api.go81
-rw-r--r--roomserver/api/api.go3
-rw-r--r--roomserver/api/api_trace.go8
-rw-r--r--roomserver/internal/api.go10
-rw-r--r--roomserver/inthttp/client.go6
17 files changed, 68 insertions, 85 deletions
diff --git a/build/gobind-pinecone/monolith.go b/build/gobind-pinecone/monolith.go
index 9c739db3..1f7a889d 100644
--- a/build/gobind-pinecone/monolith.go
+++ b/build/gobind-pinecone/monolith.go
@@ -310,7 +310,7 @@ func (m *DendriteMonolith) Start() {
rsAPI := roomserver.NewInternalAPI(base)
fsAPI := federationapi.NewInternalAPI(
- base, federation, rsAPI, base.Caches, true,
+ base, federation, rsAPI, base.Caches, keyRing, true,
)
keyAPI := keyserver.NewInternalAPI(base, &base.Cfg.KeyServer, fsAPI)
@@ -325,8 +325,7 @@ func (m *DendriteMonolith) Start() {
// The underlying roomserver implementation needs to be able to call the fedsender.
// This is different to rsAPI which can be the http client which doesn't need this dependency
- rsAPI.SetFederationAPI(fsAPI)
- rsAPI.SetKeyring(keyRing)
+ rsAPI.SetFederationAPI(fsAPI, keyRing)
monolith := setup.Monolith{
Config: base.Cfg,
diff --git a/build/gobind-yggdrasil/monolith.go b/build/gobind-yggdrasil/monolith.go
index 07fcf836..582a2372 100644
--- a/build/gobind-yggdrasil/monolith.go
+++ b/build/gobind-yggdrasil/monolith.go
@@ -114,7 +114,7 @@ func (m *DendriteMonolith) Start() {
rsAPI := roomserver.NewInternalAPI(base)
fsAPI := federationapi.NewInternalAPI(
- base, federation, rsAPI, base.Caches, true,
+ base, federation, rsAPI, base.Caches, keyRing, true,
)
keyAPI := keyserver.NewInternalAPI(base, &base.Cfg.KeyServer, federation)
@@ -130,8 +130,7 @@ func (m *DendriteMonolith) Start() {
// The underlying roomserver implementation needs to be able to call the fedsender.
// This is different to rsAPI which can be the http client which doesn't need this dependency
- rsAPI.SetFederationAPI(fsAPI)
- rsAPI.SetKeyring(keyRing)
+ rsAPI.SetFederationAPI(fsAPI, keyRing)
monolith := setup.Monolith{
Config: base.Cfg,
diff --git a/cmd/dendrite-demo-libp2p/main.go b/cmd/dendrite-demo-libp2p/main.go
index d518d158..5f26e00c 100644
--- a/cmd/dendrite-demo-libp2p/main.go
+++ b/cmd/dendrite-demo-libp2p/main.go
@@ -158,10 +158,10 @@ func main() {
asAPI := appservice.NewInternalAPI(&base.Base, userAPI, rsAPI)
rsAPI.SetAppserviceAPI(asAPI)
fsAPI := federationapi.NewInternalAPI(
- &base.Base, federation, rsAPI, base.Base.Caches, true,
+ &base.Base, federation, rsAPI, base.Base.Caches, nil, true,
)
keyRing := fsAPI.KeyRing()
- rsAPI.SetFederationAPI(fsAPI)
+ rsAPI.SetFederationAPI(fsAPI, keyRing)
provider := newPublicRoomsProvider(base.LibP2PPubsub, rsAPI)
err = provider.Start()
if err != nil {
diff --git a/cmd/dendrite-demo-pinecone/main.go b/cmd/dendrite-demo-pinecone/main.go
index cc7238ea..180f8ae0 100644
--- a/cmd/dendrite-demo-pinecone/main.go
+++ b/cmd/dendrite-demo-pinecone/main.go
@@ -185,7 +185,7 @@ func main() {
rsComponent := roomserver.NewInternalAPI(base)
rsAPI := rsComponent
fsAPI := federationapi.NewInternalAPI(
- base, federation, rsAPI, base.Caches, true,
+ base, federation, rsAPI, base.Caches, keyRing, true,
)
keyAPI := keyserver.NewInternalAPI(base, &base.Cfg.KeyServer, fsAPI)
@@ -198,8 +198,7 @@ func main() {
asAPI := appservice.NewInternalAPI(base, userAPI, rsAPI)
- rsComponent.SetFederationAPI(fsAPI)
- rsComponent.SetKeyring(keyRing)
+ rsComponent.SetFederationAPI(fsAPI, keyRing)
monolith := setup.Monolith{
Config: base.Cfg,
diff --git a/cmd/dendrite-demo-yggdrasil/main.go b/cmd/dendrite-demo-yggdrasil/main.go
index 1e0a7d03..b8ac3f72 100644
--- a/cmd/dendrite-demo-yggdrasil/main.go
+++ b/cmd/dendrite-demo-yggdrasil/main.go
@@ -118,11 +118,10 @@ func main() {
asAPI := appservice.NewInternalAPI(base, userAPI, rsAPI)
rsAPI.SetAppserviceAPI(asAPI)
fsAPI := federationapi.NewInternalAPI(
- base, federation, rsAPI, base.Caches, true,
+ base, federation, rsAPI, base.Caches, keyRing, true,
)
- rsComponent.SetFederationAPI(fsAPI)
- rsComponent.SetKeyring(keyRing)
+ rsComponent.SetFederationAPI(fsAPI, keyRing)
monolith := setup.Monolith{
Config: base.Cfg,
diff --git a/cmd/dendrite-monolith-server/main.go b/cmd/dendrite-monolith-server/main.go
index 1f85cae9..08851734 100644
--- a/cmd/dendrite-monolith-server/main.go
+++ b/cmd/dendrite-monolith-server/main.go
@@ -91,7 +91,7 @@ func main() {
}
fsAPI := federationapi.NewInternalAPI(
- base, federation, rsAPI, base.Caches, false,
+ base, federation, rsAPI, base.Caches, nil, false,
)
if base.UseHTTPAPIs {
federationapi.AddInternalRoutes(base.InternalAPIMux, fsAPI)
@@ -101,7 +101,7 @@ func main() {
// The underlying roomserver implementation needs to be able to call the fedsender.
// This is different to rsAPI which can be the http client which doesn't need this dependency
- rsImpl.SetFederationAPI(fsAPI)
+ rsImpl.SetFederationAPI(fsAPI, keyRing)
keyImpl := keyserver.NewInternalAPI(base, &base.Cfg.KeyServer, fsAPI)
keyAPI := keyImpl
@@ -134,7 +134,7 @@ func main() {
// The underlying roomserver implementation needs to be able to call the fedsender.
// This is different to rsAPI which can be the http client which doesn't need this
// dependency. Other components also need updating after their dependencies are up.
- rsImpl.SetFederationAPI(fsAPI)
+ rsImpl.SetFederationAPI(fsAPI, keyRing)
rsImpl.SetAppserviceAPI(asAPI)
keyImpl.SetUserAPI(userAPI)
diff --git a/cmd/dendrite-polylith-multi/personalities/federationapi.go b/cmd/dendrite-polylith-multi/personalities/federationapi.go
index 5f87f96b..c5097379 100644
--- a/cmd/dendrite-polylith-multi/personalities/federationapi.go
+++ b/cmd/dendrite-polylith-multi/personalities/federationapi.go
@@ -35,7 +35,7 @@ func FederationAPI(base *basepkg.BaseDendrite, cfg *config.Dendrite) {
&base.Cfg.MSCs, nil,
)
- intAPI := federationapi.NewInternalAPI(base, federation, rsAPI, base.Caches, true)
+ intAPI := federationapi.NewInternalAPI(base, federation, rsAPI, base.Caches, nil, true)
federationapi.AddInternalRoutes(base.InternalAPIMux, intAPI)
base.SetupAndServeHTTP(
diff --git a/cmd/dendrite-polylith-multi/personalities/roomserver.go b/cmd/dendrite-polylith-multi/personalities/roomserver.go
index 23514dbe..1deb51ce 100644
--- a/cmd/dendrite-polylith-multi/personalities/roomserver.go
+++ b/cmd/dendrite-polylith-multi/personalities/roomserver.go
@@ -24,7 +24,7 @@ func RoomServer(base *basepkg.BaseDendrite, cfg *config.Dendrite) {
asAPI := base.AppserviceHTTPClient()
fsAPI := base.FederationAPIHTTPClient()
rsAPI := roomserver.NewInternalAPI(base)
- rsAPI.SetFederationAPI(fsAPI)
+ rsAPI.SetFederationAPI(fsAPI, fsAPI.KeyRing())
rsAPI.SetAppserviceAPI(asAPI)
roomserver.AddInternalRoutes(base.InternalAPIMux, rsAPI)
diff --git a/cmd/dendritejs-pinecone/main.go b/cmd/dendritejs-pinecone/main.go
index 10ba0717..8bcb063e 100644
--- a/cmd/dendritejs-pinecone/main.go
+++ b/cmd/dendritejs-pinecone/main.go
@@ -199,8 +199,7 @@ func startup() {
)
rsAPI.SetAppserviceAPI(asQuery)
fedSenderAPI := federationapi.NewInternalAPI(base, federation, rsAPI, base.Caches, true)
- rsAPI.SetFederationAPI(fedSenderAPI)
- rsAPI.SetKeyring(keyRing)
+ rsAPI.SetFederationAPI(fedSenderAPI, keyRing)
monolith := setup.Monolith{
Config: base.Cfg,
diff --git a/cmd/dendritejs/main.go b/cmd/dendritejs/main.go
index 96958116..789ea98e 100644
--- a/cmd/dendritejs/main.go
+++ b/cmd/dendritejs/main.go
@@ -211,8 +211,7 @@ func main() {
)
rsAPI.SetAppserviceAPI(asQuery)
fedSenderAPI := federationapi.NewInternalAPI(base, federation, rsAPI, base.Caches, true)
- rsAPI.SetFederationAPI(fedSenderAPI)
- rsAPI.SetKeyring(keyRing)
+ rsAPI.SetFederationAPI(fedSenderAPI, keyRing)
p2pPublicRoomProvider := NewLibP2PPublicRoomsProvider(node, fedSenderAPI, federation)
monolith := setup.Monolith{
diff --git a/federationapi/federationapi.go b/federationapi/federationapi.go
index 371b364c..02c4cfdb 100644
--- a/federationapi/federationapi.go
+++ b/federationapi/federationapi.go
@@ -73,6 +73,7 @@ func NewInternalAPI(
federation *gomatrixserverlib.FederationClient,
rsAPI roomserverAPI.RoomserverInternalAPI,
caches *caching.Caches,
+ keyRing *gomatrixserverlib.KeyRing,
resetBlacklist bool,
) api.FederationInternalAPI {
cfg := &base.Cfg.FederationAPI
@@ -125,5 +126,5 @@ func NewInternalAPI(
logrus.WithError(err).Panic("failed to start key server consumer")
}
- return internal.NewFederationInternalAPI(federationDB, cfg, rsAPI, federation, stats, caches, queues)
+ return internal.NewFederationInternalAPI(federationDB, cfg, rsAPI, federation, stats, caches, queues, keyRing)
}
diff --git a/federationapi/federationapi_keys_test.go b/federationapi/federationapi_keys_test.go
index fb4307aa..9e6c47cd 100644
--- a/federationapi/federationapi_keys_test.go
+++ b/federationapi/federationapi_keys_test.go
@@ -94,7 +94,7 @@ func TestMain(m *testing.M) {
// Finally, build the server key APIs.
sbase := base.NewBaseDendrite(cfg, "Monolith", base.NoCacheMetrics)
- s.api = NewInternalAPI(sbase, s.fedclient, nil, s.cache, true)
+ s.api = NewInternalAPI(sbase, s.fedclient, nil, s.cache, nil, true)
}
// Now that we have built our server key APIs, start the
diff --git a/federationapi/internal/api.go b/federationapi/internal/api.go
index 73d27315..1f31b07c 100644
--- a/federationapi/internal/api.go
+++ b/federationapi/internal/api.go
@@ -39,58 +39,61 @@ func NewFederationInternalAPI(
statistics *statistics.Statistics,
caches *caching.Caches,
queues *queue.OutgoingQueues,
+ keyRing *gomatrixserverlib.KeyRing,
) *FederationInternalAPI {
serverKeyDB, err := cache.NewKeyDatabase(db, caches)
if err != nil {
logrus.WithError(err).Panicf("failed to set up caching wrapper for server key database")
}
- keyRing := &gomatrixserverlib.KeyRing{
- KeyFetchers: []gomatrixserverlib.KeyFetcher{},
- KeyDatabase: serverKeyDB,
- }
-
- addDirectFetcher := func() {
- keyRing.KeyFetchers = append(
- keyRing.KeyFetchers,
- &gomatrixserverlib.DirectKeyFetcher{
- Client: federation,
- },
- )
- }
+ if keyRing == nil {
+ keyRing = &gomatrixserverlib.KeyRing{
+ KeyFetchers: []gomatrixserverlib.KeyFetcher{},
+ KeyDatabase: serverKeyDB,
+ }
- if cfg.PreferDirectFetch {
- addDirectFetcher()
- } else {
- defer addDirectFetcher()
- }
+ addDirectFetcher := func() {
+ keyRing.KeyFetchers = append(
+ keyRing.KeyFetchers,
+ &gomatrixserverlib.DirectKeyFetcher{
+ Client: federation,
+ },
+ )
+ }
- var b64e = base64.StdEncoding.WithPadding(base64.NoPadding)
- for _, ps := range cfg.KeyPerspectives {
- perspective := &gomatrixserverlib.PerspectiveKeyFetcher{
- PerspectiveServerName: ps.ServerName,
- PerspectiveServerKeys: map[gomatrixserverlib.KeyID]ed25519.PublicKey{},
- Client: federation,
+ if cfg.PreferDirectFetch {
+ addDirectFetcher()
+ } else {
+ defer addDirectFetcher()
}
- for _, key := range ps.Keys {
- rawkey, err := b64e.DecodeString(key.PublicKey)
- if err != nil {
- logrus.WithError(err).WithFields(logrus.Fields{
- "server_name": ps.ServerName,
- "public_key": key.PublicKey,
- }).Warn("Couldn't parse perspective key")
- continue
+ var b64e = base64.StdEncoding.WithPadding(base64.NoPadding)
+ for _, ps := range cfg.KeyPerspectives {
+ perspective := &gomatrixserverlib.PerspectiveKeyFetcher{
+ PerspectiveServerName: ps.ServerName,
+ PerspectiveServerKeys: map[gomatrixserverlib.KeyID]ed25519.PublicKey{},
+ Client: federation,
}
- perspective.PerspectiveServerKeys[key.KeyID] = rawkey
- }
- keyRing.KeyFetchers = append(keyRing.KeyFetchers, perspective)
+ for _, key := range ps.Keys {
+ rawkey, err := b64e.DecodeString(key.PublicKey)
+ if err != nil {
+ logrus.WithError(err).WithFields(logrus.Fields{
+ "server_name": ps.ServerName,
+ "public_key": key.PublicKey,
+ }).Warn("Couldn't parse perspective key")
+ continue
+ }
+ perspective.PerspectiveServerKeys[key.KeyID] = rawkey
+ }
- logrus.WithFields(logrus.Fields{
- "server_name": ps.ServerName,
- "num_public_keys": len(ps.Keys),
- }).Info("Enabled perspective key fetcher")
+ keyRing.KeyFetchers = append(keyRing.KeyFetchers, perspective)
+
+ logrus.WithFields(logrus.Fields{
+ "server_name": ps.ServerName,
+ "num_public_keys": len(ps.Keys),
+ }).Info("Enabled perspective key fetcher")
+ }
}
return &FederationInternalAPI{
diff --git a/roomserver/api/api.go b/roomserver/api/api.go
index 1e882ca1..d35fd84d 100644
--- a/roomserver/api/api.go
+++ b/roomserver/api/api.go
@@ -12,9 +12,8 @@ import (
type RoomserverInternalAPI interface {
// needed to avoid chicken and egg scenario when setting up the
// interdependencies between the roomserver and other input APIs
- SetFederationAPI(fsAPI fsAPI.FederationInternalAPI)
+ SetFederationAPI(fsAPI fsAPI.FederationInternalAPI, keyRing *gomatrixserverlib.KeyRing)
SetAppserviceAPI(asAPI asAPI.AppServiceQueryAPI)
- SetKeyring(keyRing *gomatrixserverlib.KeyRing)
InputRoomEvents(
ctx context.Context,
diff --git a/roomserver/api/api_trace.go b/roomserver/api/api_trace.go
index cb8c471a..64cbaca4 100644
--- a/roomserver/api/api_trace.go
+++ b/roomserver/api/api_trace.go
@@ -17,12 +17,8 @@ type RoomserverInternalAPITrace struct {
Impl RoomserverInternalAPI
}
-func (t *RoomserverInternalAPITrace) SetKeyring(keyRing *gomatrixserverlib.KeyRing) {
- t.Impl.SetKeyring(keyRing)
-}
-
-func (t *RoomserverInternalAPITrace) SetFederationAPI(fsAPI fsAPI.FederationInternalAPI) {
- t.Impl.SetFederationAPI(fsAPI)
+func (t *RoomserverInternalAPITrace) SetFederationAPI(fsAPI fsAPI.FederationInternalAPI, keyRing *gomatrixserverlib.KeyRing) {
+ t.Impl.SetFederationAPI(fsAPI, keyRing)
}
func (t *RoomserverInternalAPITrace) SetAppserviceAPI(asAPI asAPI.AppServiceQueryAPI) {
diff --git a/roomserver/internal/api.go b/roomserver/internal/api.go
index bda585cf..67bbc7ab 100644
--- a/roomserver/internal/api.go
+++ b/roomserver/internal/api.go
@@ -73,18 +73,12 @@ func NewRoomserverAPI(
return a
}
-// SetKeyring sets the keyring to a given keyring. This is only useful for the P2P
-// demos and must be called after SetFederationSenderInputAPI.
-func (r *RoomserverInternalAPI) SetKeyring(keyRing *gomatrixserverlib.KeyRing) {
- r.KeyRing = keyRing
-}
-
// SetFederationInputAPI passes in a federation input API reference so that we can
// avoid the chicken-and-egg problem of both the roomserver input API and the
// federation input API being interdependent.
-func (r *RoomserverInternalAPI) SetFederationAPI(fsAPI fsAPI.FederationInternalAPI) {
+func (r *RoomserverInternalAPI) SetFederationAPI(fsAPI fsAPI.FederationInternalAPI, keyRing *gomatrixserverlib.KeyRing) {
r.fsAPI = fsAPI
- r.SetKeyring(fsAPI.KeyRing())
+ r.KeyRing = keyRing
r.Inviter = &perform.Inviter{
DB: r.DB,
diff --git a/roomserver/inthttp/client.go b/roomserver/inthttp/client.go
index 2afeb8b1..4f6a58bd 100644
--- a/roomserver/inthttp/client.go
+++ b/roomserver/inthttp/client.go
@@ -83,12 +83,8 @@ func NewRoomserverClient(
}, nil
}
-// SetKeyring no-ops in HTTP client mode as there is no chicken/egg scenario
-func (h *httpRoomserverInternalAPI) SetKeyring(keyRing *gomatrixserverlib.KeyRing) {
-}
-
// SetFederationInputAPI no-ops in HTTP client mode as there is no chicken/egg scenario
-func (h *httpRoomserverInternalAPI) SetFederationAPI(fsAPI fsInputAPI.FederationInternalAPI) {
+func (h *httpRoomserverInternalAPI) SetFederationAPI(fsAPI fsInputAPI.FederationInternalAPI, keyRing *gomatrixserverlib.KeyRing) {
}
// SetAppserviceAPI no-ops in HTTP client mode as there is no chicken/egg scenario