8000 support multiserverAddress in start-http-auth URI by staltz · Pull Request #106 · ssbc/go-ssb-room · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

support multiserverAddress in start-http-auth URI #106

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cmd/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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),
Expand Down
20 changes: 20 additions & 0 deletions internal/network/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ package network

import (
"context"
"encoding/base64"
"errors"
"fmt"
"io"
"net"
"net/http"
Expand All @@ -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
Expand Down
31 changes: 31 additions & 0 deletions internal/network/msaddr_test.go
Original file line number Diff line number Diff line change
@@ -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)

}
37 changes: 14 additions & 23 deletions web/handlers/aliases.go
6D47
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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
Expand All @@ -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 {
Expand All @@ -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),
Expand All @@ -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 {
Expand All @@ -133,23 +127,20 @@ 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) {

// 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{
Expand Down
14 changes: 9 additions & 5 deletions web/handlers/auth/withssb.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,10 @@ const sessionLifetime = time.Hour * 24
type WithSSBHandler struct {
render *render.Renderer

roomID refs.FeedRef
// roomID refs.FeedRef
// muxrpcHostAndPort string

netInfo network.ServerEndpointDetails

membersdb roomdb.MembersService
aliasesdb roomdb.AliasesService
Expand All @@ -76,7 +79,7 @@ type WithSSBHandler struct {
func NewWithSSBHandler(
m *mux.Router,
r *render.Renderer,
roomID refs.FeedRef,
netInfo network.ServerEndpointDetails,
endpoints network.Endpoints,
aliasDB roomdb.AliasesService,
membersDB roomdb.MembersService,
Expand All @@ -87,7 +90,7 @@ func NewWithSSBHandler(

var ssb WithSSBHandler
ssb.render = r
ssb.roomID = roomID
ssb.netInfo = netInfo
ssb.aliasesdb = aliasDB
ssb.membersdb = membersDB
ssb.endpoints = endpoints
Expand Down Expand Up @@ -258,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")
Expand Down Expand Up @@ -342,8 +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)
queryParams.Set("multiserverAddress", h.netInfo.MultiserverAddress())

var startAuthURI url.URL
startAuthURI.Scheme = "ssb"
Expand Down
2 changes: 2 additions & 0 deletions web/handlers/auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,8 @@ func TestAuthWithSSBServerInitHappyPath(t *testing.T) {
a.Equal("start-http-auth", qry.Get("action"))
a.Equal(serverChallenge, qry.Get("sc"))
a.Equal(ts.NetworkInfo.RoomID.Ref(), qry.Get("sid"))
var msaddr = fmt.Sprintf("net:%s:%d~shs:%s", ts.NetworkInfo.Domain, ts.NetworkInfo.PortMUXRPC, base64.StdEncoding.EncodeToString(ts.NetworkInfo.RoomID.PubKey()))
a.Equal(msaddr, qry.Get("multiserverAddress"))

qrCode, has := html.Find("#start-auth-qrcode").Attr("src")
a.True(has, "should have the inline image data")
Expand Down
21 changes: 5 additions & 16 deletions web/handlers/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand All @@ -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,
Expand Down Expand Up @@ -231,11 +220,12 @@ func New(
mainMux := &http.ServeMux{}

// start hooking up handlers to the router
var muxrpcHostAndPort = fmt.Sprintf("%s:%d", netInfo.Domain, netInfo.PortMUXRPC)

authWithSSB := roomsAuth.NewWithSSBHandler(
m,
r,
netInfo.RoomID,
netInfo,
roomEndpoints,
dbs.Aliases,
dbs.Members,
Expand Down Expand Up @@ -304,16 +294,15 @@ func New(

db: dbs.Aliases,

roomID: netInfo.RoomID,
muxrpcHostAndPort: fmt.Sprintf("%s:%d", netInfo.Domain, netInfo.PortMUXRPC),
roomEndpoint: netInfo,
}
m.Get(router.CompleteAliasResolve).HandlerFunc(ah.resolve)

var ih = inviteHandler{
invites: dbs.Invites,

roomPubKey: netInfo.RoomID.PubKey(),
muxrpcHostAndPort: fmt.Sprintf("%s:%d", netInfo.Domain, netInfo.PortMUXRPC),
muxrpcHostAndPort: muxrpcHostAndPort,
}
m.Get(router.CompleteInviteAccept).Handler(r.HTML("invite/accept.tmpl", ih.acceptForm))
m.Get(router.CompleteInviteConsume).Handler(r.HTML("invite/consumed.tmpl", ih.consume))
Expand Down
5 changes: 3 additions & 2 deletions web/handlers/setup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -49,7 +50,7 @@ type testSession struct {

SignalBridge *signinwithssb.SignalBridge

NetworkInfo NetworkInfo
NetworkInfo network.ServerEndpointDetails
}

var testI18N = justTheKeys()
Expand Down Expand Up @@ -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,
Expand Down
0