parent
81c05a663d
commit
27fc5713cc
|
@ -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,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"})
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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"})
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -156,6 +156,8 @@ func New(
|
|||
}
|
||||
}
|
||||
|
||||
s.netInfo.RoomID = s.keyPair.Feed
|
||||
|
||||
s.StateManager = roomstate.NewManager(s.logger)
|
||||
|
||||
s.initHandlers()
|
||||
|
|
Loading…
Reference in New Issue