change isRoom to have metadata

fixes #58
This commit is contained in:
Henry 2021-05-17 09:11:29 +02:00 committed by Henry
parent 81c05a663d
commit 27fc5713cc
8 changed files with 80 additions and 23 deletions

View File

@ -7,9 +7,9 @@ import (
"go.cryptoscope.co/muxrpc/v2"
"go.cryptoscope.co/muxrpc/v2/typemux"
"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/roomstate"
refs "go.mindeco.de/ssb-refs"
)
/* manifest:
@ -23,9 +23,9 @@ import (
}
*/
func New(log kitlog.Logger, self refs.FeedRef, m *roomstate.Manager, members roomdb.MembersService, config roomdb.RoomConfig) *Handler {
func New(log kitlog.Logger, netInfo network.ServerEndpointDetails, m *roomstate.Manager, members roomdb.MembersService, config roomdb.RoomConfig) *Handler {
var h = new(Handler)
h.self = self
h.netInfo = netInfo
h.logger = log
h.state = m
h.members = members
@ -35,7 +35,7 @@ func New(log kitlog.Logger, self refs.FeedRef, m *roomstate.Manager, members roo
}
func (h *Handler) Register(mux typemux.HandlerMux, namespace muxrpc.Method) {
mux.RegisterAsync(append(namespace, "isRoom"), typemux.AsyncFunc(h.isRoom))
mux.RegisterAsync(append(namespace, "isRoom"), typemux.AsyncFunc(h.metadata))
mux.RegisterAsync(append(namespace, "ping"), typemux.AsyncFunc(h.ping))
mux.RegisterAsync(append(namespace, "announce"), typemux.AsyncFunc(h.announce))
@ -45,7 +45,7 @@ func (h *Handler) Register(mux typemux.HandlerMux, namespace muxrpc.Method) {
mux.RegisterDuplex(append(namespace, "connect"), connectHandler{
logger: h.logger,
self: h.self,
self: h.netInfo.RoomID,
state: h.state,
})
}

View File

@ -5,6 +5,7 @@ package server
import (
"context"
"encoding/json"
"errors"
"fmt"
"sync"
"time"
@ -12,7 +13,6 @@ import (
"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/roomstate"
refs "go.mindeco.de/ssb-refs"
kitlog "github.com/go-kit/kit/log"
"go.cryptoscope.co/muxrpc/v2"
@ -20,15 +20,61 @@ import (
type Handler struct {
logger kitlog.Logger
self refs.FeedRef
netInfo network.ServerEndpointDetails
state *roomstate.Manager
members roomdb.MembersService
config roomdb.RoomConfig
}
func (h *Handler) isRoom(context.Context, *muxrpc.Request) (interface{}, error) {
return true, nil
type MetadataReply struct {
Name string `json:"name"`
Membership bool `json:"membership"`
Features []string `json:"features"`
}
func (h *Handler) metadata(ctx context.Context, req *muxrpc.Request) (interface{}, error) {
ref, err := network.GetFeedRefFromAddr(req.RemoteAddr())
if err != nil {
return nil, err
}
pm, err := h.config.GetPrivacyMode(ctx)
if err != nil {
return nil, err
}
var reply MetadataReply
reply.Name = h.netInfo.Domain
// check if caller is a member
if _, err := h.members.GetByFeed(ctx, *ref); err != nil {
if !errors.Is(err, roomdb.ErrNotFound) {
return nil, err
}
// already initialized as false, just to be clear
reply.Membership = false
} else {
reply.Membership = true
}
// always-on features
reply.Features = []string{
"tunnel",
"httpAuth",
"httpInvite",
// TODO: add "room2" once implemented
}
if pm == roomdb.ModeOpen {
reply.Features = append(reply.Features, "room1")
}
if pm == roomdb.ModeOpen || pm == roomdb.ModeCommunity {
reply.Features = append(reply.Features, "alias")
}
return reply, nil
}
func (h *Handler) ping(context.Context, *muxrpc.Request) (interface{}, error) {

View File

@ -83,6 +83,7 @@ func TestStaleMembers(t *testing.T) {
err = srh.Async(ctx, &ok, muxrpc.TypeJSON, muxrpc.Method{"room", "announce"})
r.NoError(err)
r.True(ok)
t.Log("announced srh again")
testKexReply := []byte("fake kex reply")
@ -105,7 +106,10 @@ func TestStaleMembers(t *testing.T) {
panic(fmt.Errorf("expected source for duplex call: %s", err))
}
src.Next(ctx)
if !src.Next(ctx) {
err = fmt.Errorf("did not get message from source: %v", src.Err())
panic(err)
}
gotKexMsg, err := src.Bytes()
if err != nil {

View File

@ -11,6 +11,7 @@ import (
"github.com/stretchr/testify/require"
"go.cryptoscope.co/muxrpc/v2"
tunserv "github.com/ssb-ngi-pointer/go-ssb-room/muxrpc/handlers/tunnel/server"
"github.com/ssb-ngi-pointer/go-ssb-room/roomdb"
refs "go.mindeco.de/ssb-refs"
)
@ -78,10 +79,11 @@ func TestTunnelServerSimple(t *testing.T) {
a.True(serv.Whoami().Equal(&srvWho.ID))
// start testing basic room stuff
var yes bool
err = endpointA.Async(ctx, &yes, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "isRoom"})
var meta tunserv.MetadataReply
err = endpointA.Async(ctx, &meta, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "isRoom"})
r.NoError(err)
a.True(yes, "srv is not a room?!")
r.Equal("srv", meta.Name)
r.True(meta.Membership, "not a member?")
var ts int
err = endpointA.Async(ctx, &ts, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "ping"})

View File

@ -31,6 +31,7 @@ import (
"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/muxrpc/handlers/tunnel/server"
"github.com/ssb-ngi-pointer/go-ssb-room/roomdb"
"github.com/ssb-ngi-pointer/go-ssb-room/roomdb/sqlite"
"github.com/ssb-ngi-pointer/go-ssb-room/roomsrv"
@ -205,10 +206,11 @@ func (ts *testSession) makeTestClient(name string) testClient {
})
// check we are talking to a room
var yup bool
err = wsEndpoint.Async(ts.ctx, &yup, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "isRoom"})
var meta server.MetadataReply
err = wsEndpoint.Async(ts.ctx, &meta, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "isRoom"})
r.NoError(err)
r.True(yup, "server is not a room?")
r.Equal("server", meta.Name)
r.True(meta.Membership, "not a member?")
return testClient{
feed: client.Feed,

View File

@ -12,16 +12,16 @@ import (
"testing"
"time"
"go.cryptoscope.co/muxrpc/v2/debug"
"go.mindeco.de/encodedTime"
"github.com/gorilla/websocket"
"github.com/stretchr/testify/require"
"go.cryptoscope.co/muxrpc/v2"
"go.cryptoscope.co/muxrpc/v2/debug"
"go.cryptoscope.co/secretstream"
"go.mindeco.de/encodedTime"
"github.com/ssb-ngi-pointer/go-ssb-room/internal/maybemod/keys"
"github.com/ssb-ngi-pointer/go-ssb-room/internal/network"
tunserv "github.com/ssb-ngi-pointer/go-ssb-room/muxrpc/handlers/tunnel/server"
"github.com/ssb-ngi-pointer/go-ssb-room/roomdb"
)
@ -103,10 +103,11 @@ func TestWebsocketDialing(t *testing.T) {
}()
// check we are talking to a room
var yup bool
err = wsEndpoint.Async(ctx, &yup, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "isRoom"})
var meta tunserv.MetadataReply
err = wsEndpoint.Async(ctx, &meta, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "isRoom"})
r.NoError(err)
r.True(yup, "server is not a room?")
r.Equal("server", meta.Name)
r.True(meta.Membership, "not a member?")
// open the gossip.ping channel
src, snk, err := wsEndpoint.Duplex(ctx, muxrpc.TypeJSON, muxrpc.Method{"gossip", "ping"})

View File

@ -21,7 +21,7 @@ func (s *Server) initHandlers() {
tunnelHandler := server.New(
kitlog.With(s.logger, "unit", "tunnel"),
s.Whoami(),
s.netInfo,
s.StateManager,
s.Members,
s.Config,

View File

@ -156,6 +156,8 @@ func New(
}
}
s.netInfo.RoomID = s.keyPair.Feed
s.StateManager = roomstate.NewManager(s.logger)
s.initHandlers()