From 921626b82988785d57b2ab4b43cb7fc7e2887faf Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 29 Mar 2021 12:23:11 +0200 Subject: [PATCH] move NetworkInfo to network package ... and implement MultiserverAddress() there. --- cmd/server/main.go | 3 ++- internal/network/interface.go | 20 ++++++++++++++++++ internal/network/msaddr_test.go | 31 +++++++++++++++++++++++++++ web/handlers/aliases.go | 37 +++++++++++++-------------------- web/handlers/auth/withssb.go | 20 ++++++++---------- web/handlers/http.go | 19 +++-------------- web/handlers/setup_test.go | 5 +++-- 7 files changed, 82 insertions(+), 53 deletions(-) create mode 100644 internal/network/msaddr_test.go diff --git a/cmd/server/main.go b/cmd/server/main.go index 59f11d9..10e6703 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -31,6 +31,7 @@ import ( "github.com/unrolled/secure" "go.cryptoscope.co/muxrpc/v2/debug" + "github.com/ssb-ngi-pointer/go-ssb-room/internal/network" "github.com/ssb-ngi-pointer/go-ssb-room/internal/repo" "github.com/ssb-ngi-pointer/go-ssb-room/internal/signinwithssb" "github.com/ssb-ngi-pointer/go-ssb-room/roomdb/sqlite" @@ -248,7 +249,7 @@ func runroomsrv() error { webHandler, err := handlers.New( kitlog.With(log, "package", "web"), repo.New(repoDir), - handlers.NetworkInfo{ + network.ServerEndpointDetails{ Domain: httpsDomain, PortHTTPS: uint(portHTTP), PortMUXRPC: uint(portMUXRPC), diff --git a/internal/network/interface.go b/internal/network/interface.go index dc0a7b6..f2d500d 100644 --- a/internal/network/interface.go +++ b/internal/network/interface.go @@ -4,7 +4,9 @@ package network import ( "context" + "encoding/base64" "errors" + "fmt" "io" "net" "net/http" @@ -16,6 +18,24 @@ import ( refs "go.mindeco.de/ssb-refs" ) +// ServerEndpointDetails encapsulates the endpoint information. +// Like domain name of the room, it's ssb/secret-handshake public key and the HTTP and MUXRPC TCP ports. +type ServerEndpointDetails struct { + PortMUXRPC uint + PortHTTPS uint // 0 assumes default (443) + + RoomID refs.FeedRef + + Domain string +} + +// MultiserverAddress returns net:domain:muxport~shs:roomPubKeyInBase64 +// ie: the room servers https://github.com/ssbc/multiserver-address +func (sed ServerEndpointDetails) MultiserverAddress() string { + var roomPubKey = base64.StdEncoding.EncodeToString(sed.RoomID.PubKey()) + return fmt.Sprintf("net:%s:%d~shs:%s", sed.Domain, sed.PortMUXRPC, roomPubKey) +} + // EndpointStat gives some information about a connected peer type EndpointStat struct { ID *refs.FeedRef diff --git a/internal/network/msaddr_test.go b/internal/network/msaddr_test.go new file mode 100644 index 0000000..e2cb8db --- /dev/null +++ b/internal/network/msaddr_test.go @@ -0,0 +1,31 @@ +package network + +import ( + "bytes" + "encoding/base64" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + refs "go.mindeco.de/ssb-refs" +) + +func TestMultiserverAddress(t *testing.T) { + a := assert.New(t) + + var sed ServerEndpointDetails + sed.Domain = "the.ho.st" + sed.PortMUXRPC = 8008 + + sed.RoomID = refs.FeedRef{ + ID: bytes.Repeat([]byte("ohai"), 8), + Algo: "doesnt-matter", // not part of msaddr v1 + } + + gotMultiAddr := sed.MultiserverAddress() + + a.Equal("net:the.ho.st:8008~shs:b2hhaW9oYWlvaGFpb2hhaW9oYWlvaGFpb2hhaW9oYWk=", gotMultiAddr) + a.True(strings.HasPrefix(gotMultiAddr, "net:the.ho.st:8008~shs:"), "not for the test host? %s", gotMultiAddr) + a.True(strings.HasSuffix(gotMultiAddr, base64.StdEncoding.EncodeToString(sed.RoomID.PubKey())), "public key missing? %s", gotMultiAddr) + +} diff --git a/web/handlers/aliases.go b/web/handlers/aliases.go index 52f8ff6..caf3ae4 100644 --- a/web/handlers/aliases.go +++ b/web/handlers/aliases.go @@ -11,9 +11,9 @@ import ( "github.com/gorilla/mux" "go.mindeco.de/http/render" - refs "go.mindeco.de/ssb-refs" "github.com/ssb-ngi-pointer/go-ssb-room/internal/aliases" + "github.com/ssb-ngi-pointer/go-ssb-room/internal/network" "github.com/ssb-ngi-pointer/go-ssb-room/roomdb" ) @@ -23,8 +23,7 @@ type aliasHandler struct { db roomdb.AliasesService - muxrpcHostAndPort string - roomID refs.FeedRef + roomEndpoint network.ServerEndpointDetails } func (a aliasHandler) resolve(rw http.ResponseWriter, req *http.Request) { @@ -38,7 +37,7 @@ func (a aliasHandler) resolve(rw http.ResponseWriter, req *http.Request) { ar = newAliasHTMLResponder(a.r, rw, req) } - ar.UpdateRoomInfo(a.muxrpcHostAndPort, a.roomID) + ar.UpdateRoomInfo(a.roomEndpoint) name := mux.Vars(req)["alias"] if name == "" && !aliases.IsValid(name) { @@ -61,7 +60,7 @@ type aliasResponder interface { SendConfirmation(roomdb.Alias) SendError(error) - UpdateRoomInfo(hostAndPort string, roomID refs.FeedRef) + UpdateRoomInfo(netInfo network.ServerEndpointDetails) } // aliasJSONResponse dictates the field names and format of the JSON response for the alias web endpoint @@ -78,8 +77,7 @@ type aliasJSONResponse struct { type aliasJSONResponder struct { enc *json.Encoder - roomID refs.FeedRef - multiservAddr string + netInfo network.ServerEndpointDetails } func newAliasJSONResponder(rw http.ResponseWriter) aliasResponder { @@ -89,18 +87,15 @@ func newAliasJSONResponder(rw http.ResponseWriter) aliasResponder { } } -func (json *aliasJSONResponder) UpdateRoomInfo(hostAndPort string, roomID refs.FeedRef) { - json.roomID = roomID - - roomPubKey := base64.StdEncoding.EncodeToString(roomID.PubKey()) - json.multiservAddr = fmt.Sprintf("net:%s~shs:%s", hostAndPort, roomPubKey) +func (json *aliasJSONResponder) UpdateRoomInfo(netInfo network.ServerEndpointDetails) { + json.netInfo = netInfo } func (json aliasJSONResponder) SendConfirmation(alias roomdb.Alias) { var resp = aliasJSONResponse{ Status: "successful", - RoomID: json.roomID.Ref(), - Address: json.multiservAddr, + RoomID: json.netInfo.RoomID.Ref(), + Address: json.netInfo.MultiserverAddress(), Alias: alias.Name, UserID: alias.Feed.Ref(), Signature: base64.StdEncoding.EncodeToString(alias.Signature), @@ -121,8 +116,7 @@ type aliasHTMLResponder struct { rw http.ResponseWriter req *http.Request - roomID refs.FeedRef - multiservAddr string + netInfo network.ServerEndpointDetails } func newAliasHTMLResponder(r *render.Renderer, rw http.ResponseWriter, req *http.Request) aliasResponder { @@ -133,11 +127,8 @@ func newAliasHTMLResponder(r *render.Renderer, rw http.ResponseWriter, req *http } } -func (html *aliasHTMLResponder) UpdateRoomInfo(hostAndPort string, roomID refs.FeedRef) { - html.roomID = roomID - - roomPubKey := base64.StdEncoding.EncodeToString(roomID.PubKey()) - html.multiservAddr = fmt.Sprintf("net:%s~shs:%s", hostAndPort, roomPubKey) +func (html *aliasHTMLResponder) UpdateRoomInfo(netInfo network.ServerEndpointDetails) { + html.netInfo = netInfo } func (html aliasHTMLResponder) SendConfirmation(alias roomdb.Alias) { @@ -145,11 +136,11 @@ func (html aliasHTMLResponder) SendConfirmation(alias roomdb.Alias) { // construct the ssb:experimental?action=consume-alias&... uri for linking into apps queryParams := url.Values{} queryParams.Set("action", "consume-alias") - queryParams.Set("roomId", html.roomID.Ref()) + queryParams.Set("roomId", html.netInfo.RoomID.Ref()) queryParams.Set("alias", alias.Name) queryParams.Set("userId", alias.Feed.Ref()) queryParams.Set("signature", base64.URLEncoding.EncodeToString(alias.Signature)) - queryParams.Set("multiserverAddress", html.multiservAddr) + queryParams.Set("multiserverAddress", html.netInfo.MultiserverAddress()) // html.multiservAddr ssbURI := url.URL{ diff --git a/web/handlers/auth/withssb.go b/web/handlers/auth/withssb.go index 78d0a21..5f1c409 100644 --- a/web/handlers/auth/withssb.go +++ b/web/handlers/auth/withssb.go @@ -60,8 +60,10 @@ const sessionLifetime = time.Hour * 24 type WithSSBHandler struct { render *render.Renderer - roomID refs.FeedRef - muxrpcHostAndPort string + // roomID refs.FeedRef + // muxrpcHostAndPort string + + netInfo network.ServerEndpointDetails membersdb roomdb.MembersService aliasesdb roomdb.AliasesService @@ -77,8 +79,7 @@ type WithSSBHandler struct { func NewWithSSBHandler( m *mux.Router, r *render.Renderer, - roomID refs.FeedRef, - muxrpcHostAndPort string, + netInfo network.ServerEndpointDetails, endpoints network.Endpoints, aliasDB roomdb.AliasesService, membersDB roomdb.MembersService, @@ -89,8 +90,7 @@ func NewWithSSBHandler( var ssb WithSSBHandler ssb.render = r - ssb.roomID = roomID - ssb.muxrpcHostAndPort = muxrpcHostAndPort + ssb.netInfo = netInfo ssb.aliasesdb = aliasDB ssb.membersdb = membersDB ssb.endpoints = endpoints @@ -261,7 +261,7 @@ func (h WithSSBHandler) clientInitiated(w http.ResponseWriter, req *http.Request queryParams := req.URL.Query() var payload signinwithssb.ClientPayload - payload.ServerID = h.roomID // fill in the server + payload.ServerID = h.netInfo.RoomID // fill in the server // validate and update client challenge cc := queryParams.Get("cc") @@ -345,11 +345,9 @@ func (h WithSSBHandler) serverInitiated() (templateData, error) { // https://ssb-ngi-pointer.github.io/ssb-http-auth-spec/#list-of-new-ssb-uris var queryParams = make(url.Values) queryParams.Set("action", "start-http-auth") - queryParams.Set("sid", h.roomID.Ref()) + queryParams.Set("sid", h.netInfo.RoomID.Ref()) queryParams.Set("sc", sc) - var roomPubKey = base64.StdEncoding.EncodeToString(h.roomID.PubKey()) - var msaddr = fmt.Sprintf("net:%s~shs:%s", h.muxrpcHostAndPort, roomPubKey) - queryParams.Set("multiserverAddress", msaddr) + queryParams.Set("multiserverAddress", h.netInfo.MultiserverAddress()) var startAuthURI url.URL startAuthURI.Scheme = "ssb" diff --git a/web/handlers/http.go b/web/handlers/http.go index 356563d..0ea0b1c 100644 --- a/web/handlers/http.go +++ b/web/handlers/http.go @@ -30,7 +30,6 @@ import ( "github.com/ssb-ngi-pointer/go-ssb-room/web/i18n" "github.com/ssb-ngi-pointer/go-ssb-room/web/members" "github.com/ssb-ngi-pointer/go-ssb-room/web/router" - refs "go.mindeco.de/ssb-refs" ) var HTMLTemplates = []string{ @@ -57,21 +56,11 @@ type Databases struct { PinnedNotices roomdb.PinnedNoticesService } -// NetworkInfo encapsulates the domain name of the room, it's ssb/secret-handshake public key and the HTTP and MUXRPC TCP ports. -type NetworkInfo struct { - PortMUXRPC uint - PortHTTPS uint // 0 assumes default (443) - - RoomID refs.FeedRef - - Domain string -} - // New initializes the whole web stack for rooms, with all the sub-modules and routing. func New( logger logging.Interface, repo repo.Interface, - netInfo NetworkInfo, + netInfo network.ServerEndpointDetails, roomState *roomstate.Manager, roomEndpoints network.Endpoints, bridge *signinwithssb.SignalBridge, @@ -236,8 +225,7 @@ func New( authWithSSB := roomsAuth.NewWithSSBHandler( m, r, - netInfo.RoomID, - muxrpcHostAndPort, + netInfo, roomEndpoints, dbs.Aliases, dbs.Members, @@ -306,8 +294,7 @@ func New( db: dbs.Aliases, - roomID: netInfo.RoomID, - muxrpcHostAndPort: muxrpcHostAndPort, + roomEndpoint: netInfo, } m.Get(router.CompleteAliasResolve).HandlerFunc(ah.resolve) diff --git a/web/handlers/setup_test.go b/web/handlers/setup_test.go index 68b287a..c9a59cf 100644 --- a/web/handlers/setup_test.go +++ b/web/handlers/setup_test.go @@ -17,6 +17,7 @@ import ( "go.mindeco.de/http/tester" "go.mindeco.de/logging/logtest" + "github.com/ssb-ngi-pointer/go-ssb-room/internal/network" "github.com/ssb-ngi-pointer/go-ssb-room/internal/network/mocked" "github.com/ssb-ngi-pointer/go-ssb-room/internal/repo" "github.com/ssb-ngi-pointer/go-ssb-room/internal/signinwithssb" @@ -49,7 +50,7 @@ type testSession struct { SignalBridge *signinwithssb.SignalBridge - NetworkInfo NetworkInfo + NetworkInfo network.ServerEndpointDetails } var testI18N = justTheKeys() @@ -85,7 +86,7 @@ func setup(t *testing.T) *testSession { ts.MockedEndpoints = new(mocked.FakeEndpoints) - ts.NetworkInfo = NetworkInfo{ + ts.NetworkInfo = network.ServerEndpointDetails{ Domain: "localhost", PortMUXRPC: 8008, PortHTTPS: 443,