move NetworkInfo to network package

... and implement MultiserverAddress() there.
This commit is contained in:
Henry 2021-03-29 12:23:11 +02:00
parent 52e8ad078d
commit 921626b829
7 changed files with 82 additions and 53 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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