From 0065312db12a9c161ae9cecc2ab893b3fd8c2c5d Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 23 Mar 2021 16:50:25 +0100 Subject: [PATCH] change muxrpc room.registerAlias to return the resolve URL --- cmd/server/main.go | 8 ++++++-- muxrpc/handlers/alias/handler.go | 19 +++++++++++++++++-- muxrpc/test/go/alias_test.go | 13 ++++++++++--- muxrpc/test/go/utils_test.go | 2 +- muxrpc/test/nodejs/aliases_test.go | 11 ++++++++++- muxrpc/test/nodejs/setup_test.go | 13 +++++-------- roomsrv/init_handlers.go | 1 + roomsrv/server.go | 5 +++++ 8 files changed, 55 insertions(+), 17 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 387c1f0..e84b106 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -123,8 +123,11 @@ func runroomsrv() error { return nil } - if httpsDomain == "" && !development { - return fmt.Errorf("https-domain can't be empty. See '%s -h' for a full list of options", os.Args[0]) + if httpsDomain == "" { + if !development { + return fmt.Errorf("https-domain can't be empty. See '%s -h' for a full list of options", os.Args[0]) + } + httpsDomain = "dev.testing.local" } // validate listen addresses to bail out on invalid flag input before doing anything else @@ -204,6 +207,7 @@ func runroomsrv() error { roomsrv, err := mksrv.New( db.Members, db.Aliases, + httpsDomain, opts...) if err != nil { return fmt.Errorf("failed to instantiate ssb server: %w", err) diff --git a/muxrpc/handlers/alias/handler.go b/muxrpc/handlers/alias/handler.go index 96d3643..b6a877b 100644 --- a/muxrpc/handlers/alias/handler.go +++ b/muxrpc/handlers/alias/handler.go @@ -10,6 +10,8 @@ import ( "fmt" "strings" + "github.com/ssb-ngi-pointer/go-ssb-room/web/router" + kitlog "github.com/go-kit/kit/log" "go.cryptoscope.co/muxrpc/v2" @@ -25,12 +27,16 @@ type Handler struct { self refs.FeedRef db roomdb.AliasesService + + roomDomain string // the http(s) domain of the room to signal alias addresses } // New returns a fresh alias muxrpc handler -func New(log kitlog.Logger, self refs.FeedRef, aliasesDB roomdb.AliasesService) Handler { +func New(log kitlog.Logger, self refs.FeedRef, aliasesDB roomdb.AliasesService, roomDomain string) Handler { + var h Handler h.self = self + h.roomDomain = roomDomain h.logger = log h.db = aliasesDB @@ -39,6 +45,8 @@ func New(log kitlog.Logger, self refs.FeedRef, aliasesDB roomdb.AliasesService) const sigSuffix = ".sig.ed25519" +var httpRouter = router.CompleteApp() + // Register is an async muxrpc method handler for registering aliases. // It receives two string arguments over muxrpc (alias and signature), // checks the signature confirmation is correct (for this room and signed by the key of theconnection) @@ -93,7 +101,14 @@ func (h Handler) Register(ctx context.Context, req *muxrpc.Request) (interface{} return nil, fmt.Errorf("registerAlias: could not register alias: %w", err) } - return true, nil + resolveURL, err := httpRouter.Get(router.CompleteAliasResolve).URL("alias", confirmation.Alias) + if err != nil { + return nil, err + } + resolveURL.Host = h.roomDomain + resolveURL.Scheme = "https" + + return resolveURL.String(), nil } // Revoke checks that the alias is from that user before revoking the alias from the database. diff --git a/muxrpc/test/go/alias_test.go b/muxrpc/test/go/alias_test.go index 821d3fa..de77aa4 100644 --- a/muxrpc/test/go/alias_test.go +++ b/muxrpc/test/go/alias_test.go @@ -6,6 +6,7 @@ import ( "context" "crypto/rand" "encoding/base64" + "net/url" "testing" "time" @@ -96,10 +97,16 @@ func TestAliasRegister(t *testing.T) { // encode the signature as base64 sig := base64.StdEncoding.EncodeToString(confirmation.Signature) + ".sig.ed25519" - var worked bool - err = clientForServer.Async(ctx, &worked, muxrpc.TypeJSON, muxrpc.Method{"room", "registerAlias"}, "bob", sig) + var registerResponse string + err = clientForServer.Async(ctx, ®isterResponse, muxrpc.TypeString, muxrpc.Method{"room", "registerAlias"}, "bob", sig) r.NoError(err) - a.True(worked) + a.NotEqual("", registerResponse, "response isn't empty") + + resolveURL, err := url.Parse(registerResponse) + r.NoError(err) + t.Log("got URL:", resolveURL) + a.Equal("srv", resolveURL.Host) + a.Equal("/bob", resolveURL.Path) // server should have the alias now alias, err := serv.Aliases.Resolve(ctx, "bob") diff --git a/muxrpc/test/go/utils_test.go b/muxrpc/test/go/utils_test.go index c089164..c988b4b 100644 --- a/muxrpc/test/go/utils_test.go +++ b/muxrpc/test/go/utils_test.go @@ -88,7 +88,7 @@ func makeNamedTestBot(t testing.TB, name string, opts []roomsrv.Option) (roomdb. t.Log("db close failed: ", err) } }) - theBot, err := roomsrv.New(db.Members, db.Aliases, botOptions...) + theBot, err := roomsrv.New(db.Members, db.Aliases, name, botOptions...) r.NoError(err) return db.Members, theBot } diff --git a/muxrpc/test/nodejs/aliases_test.go b/muxrpc/test/nodejs/aliases_test.go index 44994cc..daccc6a 100644 --- a/muxrpc/test/nodejs/aliases_test.go +++ b/muxrpc/test/nodejs/aliases_test.go @@ -26,12 +26,21 @@ func TestGoServerJSClientAliases(t *testing.T) { // allow all peers (there arent any we dont want to allow) membersDB.GetByFeedReturns(roomdb.Member{Nickname: "free4all"}, nil) + // setup mocks for this test + aliasesDB.RegisterReturns(nil) + alice := ts.startJSClient("alice", "./testscripts/modern_aliases.js", srv.Network.GetListenAddr(), srv.Whoami(), ) - time.Sleep(10 * time.Second) + // the revoke call checks who the alias belongs to + aliasesDB.ResolveReturns(roomdb.Alias{ + Name: "alice", + Feed: alice, + }, nil) + + time.Sleep(5 * time.Second) // wait for both to exit ts.wait() diff --git a/muxrpc/test/nodejs/setup_test.go b/muxrpc/test/nodejs/setup_test.go index 045fd0c..d769a7b 100644 --- a/muxrpc/test/nodejs/setup_test.go +++ b/muxrpc/test/nodejs/setup_test.go @@ -19,21 +19,18 @@ import ( "testing" "time" - "github.com/ssb-ngi-pointer/go-ssb-room/internal/network" - - "github.com/ssb-ngi-pointer/go-ssb-room/roomdb" - - "golang.org/x/sync/errgroup" - "github.com/go-kit/kit/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.cryptoscope.co/muxrpc/v2/debug" "go.cryptoscope.co/netwrap" - refs "go.mindeco.de/ssb-refs" + "golang.org/x/sync/errgroup" "github.com/ssb-ngi-pointer/go-ssb-room/internal/maybemod/testutils" + "github.com/ssb-ngi-pointer/go-ssb-room/internal/network" + "github.com/ssb-ngi-pointer/go-ssb-room/roomdb" "github.com/ssb-ngi-pointer/go-ssb-room/roomsrv" + refs "go.mindeco.de/ssb-refs" ) func init() { @@ -120,7 +117,7 @@ func (ts *testSession) startGoServer( }), ) - srv, err := roomsrv.New(membersDB, aliasDB, opts...) + srv, err := roomsrv.New(membersDB, aliasDB, "go.test.room.server", opts...) r.NoError(err, "failed to init tees a server") ts.t.Logf("go server: %s", srv.Whoami().Ref()) ts.t.Cleanup(func() { diff --git a/roomsrv/init_handlers.go b/roomsrv/init_handlers.go index 828a253..28c2e96 100644 --- a/roomsrv/init_handlers.go +++ b/roomsrv/init_handlers.go @@ -28,6 +28,7 @@ func (s *Server) initHandlers(aliasDB roomdb.AliasesService) { kitlog.With(s.logger, "unit", "aliases"), s.Whoami(), aliasDB, + s.domain, ) // register muxrpc commands diff --git a/roomsrv/server.go b/roomsrv/server.go index 02d98d2..895d423 100644 --- a/roomsrv/server.go +++ b/roomsrv/server.go @@ -45,6 +45,8 @@ type Server struct { wsAddr string dialer netwrap.Dialer + domain string // the DNS domain name of the room + loadUnixSock bool repo repo.Interface @@ -73,6 +75,7 @@ func (s Server) Whoami() refs.FeedRef { func New( membersdb roomdb.MembersService, aliasdb roomdb.AliasesService, + domainName string, opts ...Option, ) (*Server, error) { var s Server @@ -81,6 +84,8 @@ func New( s.Members = membersdb s.Aliases = aliasdb + s.domain = domainName + for i, opt := range opts { err := opt(&s) if err != nil {