change muxrpc room.registerAlias to return the resolve URL

This commit is contained in:
Henry 2021-03-23 16:50:25 +01:00
parent 6e6a8e4910
commit 0065312db1
8 changed files with 55 additions and 17 deletions

View File

@ -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)

View File

@ -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.

View File

@ -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, &registerResponse, 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")

View File

@ -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
}

View File

@ -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()

View File

@ -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() {

View File

@ -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

View File

@ -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 {