From 1de97144bf5e4551106ed80955f246bfba69a654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hilmar=20G=C3=BAstafsson?= Date: Fri, 10 Apr 2020 11:55:29 +0200 Subject: [PATCH] Extract mDNSListener from base.go --- cmd/dendrite-p2p-demo/main.go | 33 ++++++++++++++- cmd/dendrite-p2p-demo/mdnslistener.go | 49 ++++++++++++++++++++++ common/basecomponent/base.go | 58 --------------------------- go.mod | 2 +- go.sum | 2 +- 5 files changed, 83 insertions(+), 61 deletions(-) create mode 100644 cmd/dendrite-p2p-demo/mdnslistener.go diff --git a/cmd/dendrite-p2p-demo/main.go b/cmd/dendrite-p2p-demo/main.go index 4f5c3ec87..0cd0fd46e 100644 --- a/cmd/dendrite-p2p-demo/main.go +++ b/cmd/dendrite-p2p-demo/main.go @@ -21,8 +21,10 @@ import ( "io/ioutil" "net/http" "os" + "time" gostream "github.com/libp2p/go-libp2p-gostream" + p2pdisc "github.com/libp2p/go-libp2p/p2p/discovery" "github.com/matrix-org/dendrite/appservice" "github.com/matrix-org/dendrite/clientapi" "github.com/matrix-org/dendrite/clientapi/producers" @@ -47,6 +49,35 @@ import ( "github.com/sirupsen/logrus" ) +func createKeyDB( + base *basecomponent.BaseDendrite, +) keydb.Database { + db, err := keydb.NewDatabase( + string(base.Cfg.Database.ServerKey), + base.Cfg.Matrix.ServerName, + base.Cfg.Matrix.PrivateKey.Public().(ed25519.PublicKey), + base.Cfg.Matrix.KeyID, + ) + if err != nil { + logrus.WithError(err).Panicf("failed to connect to keys db") + } + mdns := mDNSListener{ + host: base.LibP2P, + keydb: db, + } + serv, err := p2pdisc.NewMdnsService( + base.LibP2PContext, + base.LibP2P, + time.Second*10, + "_matrix-dendrite-p2p._tcp", + ) + if err != nil { + panic(err) + } + serv.RegisterNotifee(&mdns) + return db +} + func main() { instanceName := flag.String("name", "dendrite-p2p", "the name of this P2P demo instance") instancePort := flag.Int("port", 8080, "the port that the client API will listen on") @@ -96,7 +127,7 @@ func main() { accountDB := base.CreateAccountsDB() deviceDB := base.CreateDeviceDB() - keyDB := base.CreateKeyDB() + keyDB := createKeyDB(base) federation := base.CreateFederationClient() keyRing := keydb.CreateKeyRing(federation.Client, keyDB) diff --git a/cmd/dendrite-p2p-demo/mdnslistener.go b/cmd/dendrite-p2p-demo/mdnslistener.go new file mode 100644 index 000000000..40b2c5410 --- /dev/null +++ b/cmd/dendrite-p2p-demo/mdnslistener.go @@ -0,0 +1,49 @@ +package main + +import ( + "context" + "fmt" + "math" + + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/matrix-org/dendrite/common/keydb" + "github.com/matrix-org/gomatrixserverlib" +) + +type mDNSListener struct { + keydb keydb.Database + host host.Host +} + +func (n *mDNSListener) HandlePeerFound(p peer.AddrInfo) { + if err := n.host.Connect(context.Background(), p); err != nil { + fmt.Println("Error adding peer", p.ID.String(), "via mDNS:", err) + } + if pubkey, err := p.ID.ExtractPublicKey(); err == nil { + raw, _ := pubkey.Raw() + if err := n.keydb.StoreKeys( + context.Background(), + map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult{ + { + ServerName: gomatrixserverlib.ServerName(p.ID.String()), + KeyID: "ed25519:p2pdemo", + }: { + VerifyKey: gomatrixserverlib.VerifyKey{ + Key: gomatrixserverlib.Base64String(raw), + }, + ValidUntilTS: math.MaxUint64 >> 1, + ExpiredTS: gomatrixserverlib.PublicKeyNotExpired, + }, + }, + ); err != nil { + fmt.Println("Failed to store keys:", err) + } + } + fmt.Println("Discovered", len(n.host.Peerstore().Peers())-1, "other libp2p peer(s):") + for _, peer := range n.host.Peerstore().Peers() { + if peer != n.host.ID() { + fmt.Println("-", peer) + } + } +} diff --git a/common/basecomponent/base.go b/common/basecomponent/base.go index 6617dd441..9a398d853 100644 --- a/common/basecomponent/base.go +++ b/common/basecomponent/base.go @@ -19,24 +19,20 @@ import ( "database/sql" "fmt" "io" - "math" "net/http" "net/url" - "time" "golang.org/x/crypto/ed25519" "github.com/libp2p/go-libp2p" circuit "github.com/libp2p/go-libp2p-circuit" crypto "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" routing "github.com/libp2p/go-libp2p-core/routing" host "github.com/libp2p/go-libp2p-core/host" p2phttp "github.com/libp2p/go-libp2p-http" dht "github.com/libp2p/go-libp2p-kad-dht" pubsub "github.com/libp2p/go-libp2p-pubsub" - p2pdisc "github.com/libp2p/go-libp2p/p2p/discovery" "github.com/matrix-org/dendrite/common/keydb" "github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/naffka" @@ -256,22 +252,6 @@ func (b *BaseDendrite) CreateKeyDB() keydb.Database { if err != nil { logrus.WithError(err).Panicf("failed to connect to keys db") } - if b.LibP2P != nil { - mdns := mDNSListener{ - host: b.LibP2P, - keydb: db, - } - serv, err := p2pdisc.NewMdnsService( - b.LibP2PContext, - b.LibP2P, - time.Second*10, - "_matrix-dendrite-p2p._tcp", - ) - if err != nil { - panic(err) - } - serv.RegisterNotifee(&mdns) - } return db } @@ -382,41 +362,3 @@ func setupNaffka(cfg *config.Dendrite) (sarama.Consumer, sarama.SyncProducer) { return naff, naff } - -type mDNSListener struct { - keydb keydb.Database - host host.Host -} - -func (n *mDNSListener) HandlePeerFound(p peer.AddrInfo) { - //fmt.Println("Found libp2p peer via mDNS:", p) - if err := n.host.Connect(context.Background(), p); err != nil { - fmt.Println("Error adding peer", p.ID.String(), "via mDNS:", err) - } - if pubkey, err := p.ID.ExtractPublicKey(); err == nil { - raw, _ := pubkey.Raw() - if err := n.keydb.StoreKeys( - context.Background(), - map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult{ - gomatrixserverlib.PublicKeyLookupRequest{ - ServerName: gomatrixserverlib.ServerName(p.ID.String()), - KeyID: "ed25519:p2pdemo", - }: gomatrixserverlib.PublicKeyLookupResult{ - VerifyKey: gomatrixserverlib.VerifyKey{ - Key: gomatrixserverlib.Base64String(raw), - }, - ValidUntilTS: math.MaxUint64 >> 1, - ExpiredTS: gomatrixserverlib.PublicKeyNotExpired, - }, - }, - ); err != nil { - fmt.Println("Failed to store keys:", err) - } - } - fmt.Println("Discovered", len(n.host.Peerstore().Peers())-1, "other libp2p peer(s):") - for _, peer := range n.host.Peerstore().Peers() { - if peer != n.host.ID() { - fmt.Println("-", peer) - } - } -} diff --git a/go.mod b/go.mod index e93f22bf5..c368f6ca7 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/uber/jaeger-client-go v2.22.1+incompatible github.com/uber/jaeger-lib v2.2.0+incompatible go.uber.org/atomic v1.6.0 - golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d + golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d golang.org/x/tools v0.0.0-20200402223321-bcf690261a44 // indirect gopkg.in/Shopify/sarama.v1 v1.20.1 gopkg.in/h2non/bimg.v1 v1.0.18 diff --git a/go.sum b/go.sum index 66f4d5d62..cfb859828 100644 --- a/go.sum +++ b/go.sum @@ -566,11 +566,11 @@ github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSv github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.0 h1:vs7fgriifsPbGdK3bNuMWapNn3qnZhCRXc19NRdq010= go.uber.org/atomic v1.3.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=