parent
a78c039cc7
commit
52ec94e878
|
@ -50,6 +50,8 @@ var (
|
||||||
|
|
||||||
httpsDomain string
|
httpsDomain string
|
||||||
|
|
||||||
|
aliasesAsSubdomains bool
|
||||||
|
|
||||||
listenAddrDebug string
|
listenAddrDebug string
|
||||||
logToFile string
|
logToFile string
|
||||||
repoDir string
|
repoDir string
|
||||||
|
@ -114,6 +116,8 @@ func initFlags() {
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
flag.BoolVar(&aliasesAsSubdomains, "aliases-as-subdomains", true, "needs to be disabled if a wildcard certificate for the room is not available. (stub until we have the admin/settings page)")
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if logToFile != "" {
|
if logToFile != "" {
|
||||||
|
@ -153,7 +157,7 @@ func runroomsrv() error {
|
||||||
return fmt.Errorf("invalid muxrpc listener: %w", err)
|
return fmt.Errorf("invalid muxrpc listener: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
portMUXRPC, err := net.LookupPort("tcp", muxrpcPortStr)
|
_, err = net.LookupPort("tcp", muxrpcPortStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("invalid tcp port for muxrpc listener: %w", err)
|
return fmt.Errorf("invalid tcp port for muxrpc listener: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -180,7 +184,6 @@ func runroomsrv() error {
|
||||||
roomsrv.WithLogger(log),
|
roomsrv.WithLogger(log),
|
||||||
roomsrv.WithAppKey(ak),
|
roomsrv.WithAppKey(ak),
|
||||||
roomsrv.WithRepoPath(repoDir),
|
roomsrv.WithRepoPath(repoDir),
|
||||||
roomsrv.WithListenAddr(listenAddrShsMux),
|
|
||||||
roomsrv.WithUNIXSocket(!flagDisableUNIXSock),
|
roomsrv.WithUNIXSocket(!flagDisableUNIXSock),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,6 +217,23 @@ func runroomsrv() error {
|
||||||
|
|
||||||
r := repo.New(repoDir)
|
r := repo.New(repoDir)
|
||||||
|
|
||||||
|
keyPair, err := repo.DefaultKeyPair(r)
|
||||||
|
checkAndLog(err)
|
||||||
|
opts = append(opts, roomsrv.WithKeyPair(keyPair))
|
||||||
|
|
||||||
|
networkInfo := network.ServerEndpointDetails{
|
||||||
|
Development: development,
|
||||||
|
|
||||||
|
Domain: httpsDomain,
|
||||||
|
PortHTTPS: uint(portHTTP),
|
||||||
|
|
||||||
|
RoomID: keyPair.Feed,
|
||||||
|
|
||||||
|
ListenAddressMUXRPC: listenAddrShsMux,
|
||||||
|
|
||||||
|
UseSubdomainForAliases: aliasesAsSubdomains,
|
||||||
|
}
|
||||||
|
|
||||||
// open the sqlite version of the roomdb
|
// open the sqlite version of the roomdb
|
||||||
db, err := sqlite.Open(r)
|
db, err := sqlite.Open(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -234,7 +254,7 @@ func runroomsrv() error {
|
||||||
db.AuthWithSSB,
|
db.AuthWithSSB,
|
||||||
bridge,
|
bridge,
|
||||||
db.Config,
|
db.Config,
|
||||||
httpsDomain,
|
networkInfo,
|
||||||
opts...)
|
opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to instantiate ssb server: %w", err)
|
return fmt.Errorf("failed to instantiate ssb server: %w", err)
|
||||||
|
@ -268,14 +288,7 @@ func runroomsrv() error {
|
||||||
webHandler, err := handlers.New(
|
webHandler, err := handlers.New(
|
||||||
kitlog.With(log, "package", "web"),
|
kitlog.With(log, "package", "web"),
|
||||||
repo.New(repoDir),
|
repo.New(repoDir),
|
||||||
network.ServerEndpointDetails{
|
networkInfo,
|
||||||
Domain: httpsDomain,
|
|
||||||
PortHTTPS: uint(portHTTP),
|
|
||||||
PortMUXRPC: uint(portMUXRPC),
|
|
||||||
RoomID: roomsrv.Whoami(),
|
|
||||||
|
|
||||||
Development: development,
|
|
||||||
},
|
|
||||||
roomsrv.StateManager,
|
roomsrv.StateManager,
|
||||||
roomsrv.Network,
|
roomsrv.Network,
|
||||||
bridge,
|
bridge,
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.cryptoscope.co/muxrpc/v2"
|
"go.cryptoscope.co/muxrpc/v2"
|
||||||
|
@ -21,21 +22,52 @@ import (
|
||||||
// ServerEndpointDetails encapsulates the endpoint information.
|
// 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.
|
// Like domain name of the room, it's ssb/secret-handshake public key and the HTTP and MUXRPC TCP ports.
|
||||||
type ServerEndpointDetails struct {
|
type ServerEndpointDetails struct {
|
||||||
PortMUXRPC uint
|
|
||||||
PortHTTPS uint // 0 assumes default (443)
|
|
||||||
|
|
||||||
RoomID refs.FeedRef
|
RoomID refs.FeedRef
|
||||||
|
|
||||||
Domain string
|
ListenAddressMUXRPC string // defaults to ":8008"
|
||||||
|
|
||||||
|
// Domain sets the DNS name for all the HTTP(S) URLs.
|
||||||
|
Domain string
|
||||||
|
PortHTTPS uint // 0 assumes default (443)
|
||||||
|
|
||||||
|
// UseSubdomainForAliases controls wether urls for alias resolving
|
||||||
|
// are generated as https://$alias.$domain instead of https://$domain/alias/$alias
|
||||||
|
UseSubdomainForAliases bool
|
||||||
|
|
||||||
|
// Development instructs url building to happen with http and include the http port
|
||||||
Development bool
|
Development bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sed ServerEndpointDetails) URLForAlias(a string) string {
|
||||||
|
var u url.URL
|
||||||
|
|
||||||
|
if sed.Development {
|
||||||
|
u.Path = "/alias/" + a
|
||||||
|
u.Scheme = "http"
|
||||||
|
u.Host = fmt.Sprintf("localhost:%d", sed.PortHTTPS)
|
||||||
|
return u.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
u.Scheme = "https"
|
||||||
|
|
||||||
|
if sed.UseSubdomainForAliases {
|
||||||
|
u.Host = a + "." + sed.Domain
|
||||||
|
} else {
|
||||||
|
u.Path = "/alias/" + a
|
||||||
|
}
|
||||||
|
|
||||||
|
return u.String()
|
||||||
|
}
|
||||||
|
|
||||||
// MultiserverAddress returns net:domain:muxport~shs:roomPubKeyInBase64
|
// MultiserverAddress returns net:domain:muxport~shs:roomPubKeyInBase64
|
||||||
// ie: the room servers https://github.com/ssbc/multiserver-address
|
// ie: the room servers https://github.com/ssbc/multiserver-address
|
||||||
func (sed ServerEndpointDetails) MultiserverAddress() string {
|
func (sed ServerEndpointDetails) MultiserverAddress() string {
|
||||||
|
addr, err := net.ResolveTCPAddr("tcp", sed.ListenAddressMUXRPC)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
var roomPubKey = base64.StdEncoding.EncodeToString(sed.RoomID.PubKey())
|
var roomPubKey = base64.StdEncoding.EncodeToString(sed.RoomID.PubKey())
|
||||||
return fmt.Sprintf("net:%s:%d~shs:%s", sed.Domain, sed.PortMUXRPC, roomPubKey)
|
return fmt.Sprintf("net:%s:%d~shs:%s", sed.Domain, addr.Port, roomPubKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EndpointStat gives some information about a connected peer
|
// EndpointStat gives some information about a connected peer
|
||||||
|
|
|
@ -15,7 +15,7 @@ func TestMultiserverAddress(t *testing.T) {
|
||||||
|
|
||||||
var sed ServerEndpointDetails
|
var sed ServerEndpointDetails
|
||||||
sed.Domain = "the.ho.st"
|
sed.Domain = "the.ho.st"
|
||||||
sed.PortMUXRPC = 8008
|
sed.ListenAddressMUXRPC = ":8008"
|
||||||
|
|
||||||
sed.RoomID = refs.FeedRef{
|
sed.RoomID = refs.FeedRef{
|
||||||
ID: bytes.Repeat([]byte("ohai"), 8),
|
ID: bytes.Repeat([]byte("ohai"), 8),
|
||||||
|
|
|
@ -27,15 +27,17 @@ type Handler struct {
|
||||||
|
|
||||||
db roomdb.AliasesService
|
db roomdb.AliasesService
|
||||||
|
|
||||||
roomDomain string // the http(s) domain of the room to signal alias addresses
|
netInfo network.ServerEndpointDetails
|
||||||
|
|
||||||
|
// roomDomain string // the http(s) domain of the room to signal alias addresses
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a fresh alias muxrpc handler
|
// New returns a fresh alias muxrpc handler
|
||||||
func New(log kitlog.Logger, self refs.FeedRef, aliasesDB roomdb.AliasesService, roomDomain string) Handler {
|
func New(log kitlog.Logger, self refs.FeedRef, aliasesDB roomdb.AliasesService, netInfo network.ServerEndpointDetails) Handler {
|
||||||
|
|
||||||
var h Handler
|
var h Handler
|
||||||
h.self = self
|
h.self = self
|
||||||
h.roomDomain = roomDomain
|
h.netInfo = netInfo
|
||||||
h.logger = log
|
h.logger = log
|
||||||
h.db = aliasesDB
|
h.db = aliasesDB
|
||||||
|
|
||||||
|
@ -100,14 +102,7 @@ func (h Handler) Register(ctx context.Context, req *muxrpc.Request) (interface{}
|
||||||
return nil, fmt.Errorf("registerAlias: could not register alias: %w", err)
|
return nil, fmt.Errorf("registerAlias: could not register alias: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
resolveURL, err := httpRouter.Get(router.CompleteAliasResolve).URL("alias", confirmation.Alias)
|
return h.netInfo.URLForAlias(confirmation.Alias), nil
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
resolveURL.Host = h.roomDomain
|
|
||||||
resolveURL.Scheme = "https"
|
|
||||||
|
|
||||||
return resolveURL.String(), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Revoke checks that the alias is from that user before revoking the alias from the database.
|
// Revoke checks that the alias is from that user before revoking the alias from the database.
|
||||||
|
|
|
@ -79,7 +79,6 @@ func makeNamedTestBot(t testing.TB, name string, opts []roomsrv.Option) (roomdb.
|
||||||
botOptions := append(opts,
|
botOptions := append(opts,
|
||||||
roomsrv.WithLogger(log.With(mainLog, "bot", name)),
|
roomsrv.WithLogger(log.With(mainLog, "bot", name)),
|
||||||
roomsrv.WithRepoPath(testPath),
|
roomsrv.WithRepoPath(testPath),
|
||||||
roomsrv.WithListenAddr(":0"),
|
|
||||||
roomsrv.WithNetworkConnTracker(network.NewLastWinsTracker()),
|
roomsrv.WithNetworkConnTracker(network.NewLastWinsTracker()),
|
||||||
roomsrv.WithPostSecureConnWrapper(func(conn net.Conn) (net.Conn, error) {
|
roomsrv.WithPostSecureConnWrapper(func(conn net.Conn) (net.Conn, error) {
|
||||||
return debug.WrapDump(filepath.Join(testPath, "muxdump"), conn)
|
return debug.WrapDump(filepath.Join(testPath, "muxdump"), conn)
|
||||||
|
@ -98,8 +97,14 @@ func makeNamedTestBot(t testing.TB, name string, opts []roomsrv.Option) (roomdb.
|
||||||
err = db.Config.SetPrivacyMode(context.TODO(), roomdb.ModeRestricted)
|
err = db.Config.SetPrivacyMode(context.TODO(), roomdb.ModeRestricted)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
|
|
||||||
|
netInfo := network.ServerEndpointDetails{
|
||||||
|
Domain: name,
|
||||||
|
|
||||||
|
ListenAddressMUXRPC: ":0",
|
||||||
|
}
|
||||||
|
|
||||||
sb := signinwithssb.NewSignalBridge()
|
sb := signinwithssb.NewSignalBridge()
|
||||||
theBot, err := roomsrv.New(db.Members, db.DeniedKeys, db.Aliases, db.AuthWithSSB, sb, db.Config, name, botOptions...)
|
theBot, err := roomsrv.New(db.Members, db.DeniedKeys, db.Aliases, db.AuthWithSSB, sb, db.Config, netInfo, botOptions...)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
return db.Members, theBot
|
return db.Members, theBot
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,10 +96,15 @@ func (ts *testSession) startGoServer(
|
||||||
) *roomsrv.Server {
|
) *roomsrv.Server {
|
||||||
r := require.New(ts.t)
|
r := require.New(ts.t)
|
||||||
|
|
||||||
|
netInfo := network.ServerEndpointDetails{
|
||||||
|
Domain: "go.test.room.server",
|
||||||
|
|
||||||
|
ListenAddressMUXRPC: "localhost:0",
|
||||||
|
}
|
||||||
|
|
||||||
// prepend defaults
|
// prepend defaults
|
||||||
opts = append([]roomsrv.Option{
|
opts = append([]roomsrv.Option{
|
||||||
roomsrv.WithLogger(ts.info),
|
roomsrv.WithLogger(ts.info),
|
||||||
roomsrv.WithListenAddr("localhost:0"),
|
|
||||||
roomsrv.WithRepoPath(ts.repo),
|
roomsrv.WithRepoPath(ts.repo),
|
||||||
roomsrv.WithContext(ts.ctx),
|
roomsrv.WithContext(ts.ctx),
|
||||||
}, opts...)
|
}, opts...)
|
||||||
|
@ -126,7 +131,7 @@ func (ts *testSession) startGoServer(
|
||||||
fakeConfig := new(mockdb.FakeRoomConfig)
|
fakeConfig := new(mockdb.FakeRoomConfig)
|
||||||
deniedKeysDB := new(mockdb.FakeDeniedKeysService)
|
deniedKeysDB := new(mockdb.FakeDeniedKeysService)
|
||||||
|
|
||||||
srv, err := roomsrv.New(membersDB, deniedKeysDB, aliasDB, authSessionsDB, sb, fakeConfig, "go.test.room.server", opts...)
|
srv, err := roomsrv.New(membersDB, deniedKeysDB, aliasDB, authSessionsDB, sb, fakeConfig, netInfo, opts...)
|
||||||
r.NoError(err, "failed to init tees a server")
|
r.NoError(err, "failed to init tees a server")
|
||||||
ts.t.Logf("go server: %s", srv.Whoami().Ref())
|
ts.t.Logf("go server: %s", srv.Whoami().Ref())
|
||||||
ts.t.Cleanup(func() {
|
ts.t.Cleanup(func() {
|
||||||
|
|
|
@ -31,13 +31,13 @@ func (s *Server) initHandlers() {
|
||||||
kitlog.With(s.logger, "unit", "aliases"),
|
kitlog.With(s.logger, "unit", "aliases"),
|
||||||
s.Whoami(),
|
s.Whoami(),
|
||||||
s.Aliases,
|
s.Aliases,
|
||||||
s.domain,
|
s.netInfo,
|
||||||
)
|
)
|
||||||
|
|
||||||
siwssbHandler := signinwithssb.New(
|
siwssbHandler := signinwithssb.New(
|
||||||
kitlog.With(s.logger, "unit", "auth-with-ssb"),
|
kitlog.With(s.logger, "unit", "auth-with-ssb"),
|
||||||
s.Whoami(),
|
s.Whoami(),
|
||||||
s.domain,
|
s.netInfo.Domain,
|
||||||
s.Members,
|
s.Members,
|
||||||
s.authWithSSB,
|
s.authWithSSB,
|
||||||
s.authWithSSBBridge,
|
s.authWithSSBBridge,
|
||||||
|
|
|
@ -5,7 +5,6 @@ package roomsrv
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
kitlog "github.com/go-kit/kit/log"
|
kitlog "github.com/go-kit/kit/log"
|
||||||
|
@ -108,18 +107,6 @@ func WithNetworkConnTracker(ct network.ConnTracker) Option {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithListenAddr changes the muxrpc listener address. By default it listens to ':8008'.
|
|
||||||
func WithListenAddr(addr string) Option {
|
|
||||||
return func(s *Server) error {
|
|
||||||
var err error
|
|
||||||
s.listenAddr, err = net.ResolveTCPAddr("tcp", addr)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to parse tcp listen addr: %w", err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithPreSecureConnWrapper wrapps the connection after it is encrypted.
|
// WithPreSecureConnWrapper wrapps the connection after it is encrypted.
|
||||||
// Usefull for debugging and measuring traffic.
|
// Usefull for debugging and measuring traffic.
|
||||||
func WithPreSecureConnWrapper(cw netwrap.ConnWrapper) Option {
|
func WithPreSecureConnWrapper(cw netwrap.ConnWrapper) Option {
|
||||||
|
|
|
@ -46,7 +46,7 @@ type Server struct {
|
||||||
wsAddr string
|
wsAddr string
|
||||||
dialer netwrap.Dialer
|
dialer netwrap.Dialer
|
||||||
|
|
||||||
domain string // the DNS domain name of the room
|
netInfo network.ServerEndpointDetails
|
||||||
|
|
||||||
loadUnixSock bool
|
loadUnixSock bool
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ func New(
|
||||||
awsdb roomdb.AuthWithSSBService,
|
awsdb roomdb.AuthWithSSBService,
|
||||||
bridge *signinwithssb.SignalBridge,
|
bridge *signinwithssb.SignalBridge,
|
||||||
config roomdb.RoomConfig,
|
config roomdb.RoomConfig,
|
||||||
domainName string,
|
netInfo network.ServerEndpointDetails,
|
||||||
opts ...Option,
|
opts ...Option,
|
||||||
) (*Server, error) {
|
) (*Server, error) {
|
||||||
var s Server
|
var s Server
|
||||||
|
@ -99,7 +99,7 @@ func New(
|
||||||
s.authWithSSB = awsdb
|
s.authWithSSB = awsdb
|
||||||
s.authWithSSBBridge = bridge
|
s.authWithSSBBridge = bridge
|
||||||
|
|
||||||
s.domain = domainName
|
s.netInfo = netInfo
|
||||||
|
|
||||||
for i, opt := range opts {
|
for i, opt := range opts {
|
||||||
err := opt(&s)
|
err := opt(&s)
|
||||||
|
@ -129,8 +129,10 @@ func New(
|
||||||
s.dialer = netwrap.Dial
|
s.dialer = netwrap.Dial
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.listenAddr == nil {
|
var err error
|
||||||
s.listenAddr = &net.TCPAddr{Port: network.DefaultPort}
|
s.listenAddr, err = net.ResolveTCPAddr("tcp", s.netInfo.ListenAddressMUXRPC)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.logger == nil {
|
if s.logger == nil {
|
||||||
|
@ -152,7 +154,7 @@ func New(
|
||||||
var err error
|
var err error
|
||||||
s.keyPair, err = repo.DefaultKeyPair(s.repo)
|
s.keyPair, err = repo.DefaultKeyPair(s.repo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("sbot: failed to get keypair: %w", err)
|
return nil, fmt.Errorf("roomsrv: failed to get keypair: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,7 @@ func Handler(
|
||||||
r: r,
|
r: r,
|
||||||
flashes: fh,
|
flashes: fh,
|
||||||
urlTo: urlTo,
|
urlTo: urlTo,
|
||||||
|
netInfo: netInfo,
|
||||||
|
|
||||||
db: dbs.Members,
|
db: dbs.Members,
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,24 +5,27 @@ package admin
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"html/template"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"go.mindeco.de/http/render"
|
|
||||||
refs "go.mindeco.de/ssb-refs"
|
|
||||||
|
|
||||||
"github.com/gorilla/csrf"
|
"github.com/gorilla/csrf"
|
||||||
|
"go.mindeco.de/http/render"
|
||||||
|
|
||||||
|
"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/roomdb"
|
||||||
"github.com/ssb-ngi-pointer/go-ssb-room/web"
|
"github.com/ssb-ngi-pointer/go-ssb-room/web"
|
||||||
weberrors "github.com/ssb-ngi-pointer/go-ssb-room/web/errors"
|
weberrors "github.com/ssb-ngi-pointer/go-ssb-room/web/errors"
|
||||||
"github.com/ssb-ngi-pointer/go-ssb-room/web/members"
|
"github.com/ssb-ngi-pointer/go-ssb-room/web/members"
|
||||||
"github.com/ssb-ngi-pointer/go-ssb-room/web/router"
|
"github.com/ssb-ngi-pointer/go-ssb-room/web/router"
|
||||||
|
refs "go.mindeco.de/ssb-refs"
|
||||||
)
|
)
|
||||||
|
|
||||||
type membersHandler struct {
|
type membersHandler struct {
|
||||||
r *render.Renderer
|
r *render.Renderer
|
||||||
flashes *weberrors.FlashHelper
|
flashes *weberrors.FlashHelper
|
||||||
urlTo web.URLMaker
|
urlTo web.URLMaker
|
||||||
|
netInfo network.ServerEndpointDetails
|
||||||
|
|
||||||
db roomdb.MembersService
|
db roomdb.MembersService
|
||||||
}
|
}
|
||||||
|
@ -149,9 +152,15 @@ func (h membersHandler) details(rw http.ResponseWriter, req *http.Request) (inte
|
||||||
|
|
||||||
roles := []roomdb.Role{roomdb.RoleMember, roomdb.RoleModerator, roomdb.RoleAdmin}
|
roles := []roomdb.Role{roomdb.RoleMember, roomdb.RoleModerator, roomdb.RoleAdmin}
|
||||||
|
|
||||||
|
aliasURLs := make(map[string]template.URL)
|
||||||
|
for _, a := range member.Aliases {
|
||||||
|
aliasURLs[a.Name] = template.URL(h.netInfo.URLForAlias(a.Name))
|
||||||
|
}
|
||||||
|
|
||||||
return map[string]interface{}{
|
return map[string]interface{}{
|
||||||
"Member": member,
|
"Member": member,
|
||||||
"AllRoles": roles,
|
"AllRoles": roles,
|
||||||
|
"AliasURLs": aliasURLs,
|
||||||
csrf.TemplateTag: csrf.TemplateField(req),
|
csrf.TemplateTag: csrf.TemplateField(req),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package admin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -192,8 +193,9 @@ func TestMemberDetails(t *testing.T) {
|
||||||
// check for link to resolve 1st Alias
|
// check for link to resolve 1st Alias
|
||||||
aliasRobertLink, yes := aliasList.Eq(0).Attr("href")
|
aliasRobertLink, yes := aliasList.Eq(0).Attr("href")
|
||||||
a.True(yes, "a-tag has href attribute")
|
a.True(yes, "a-tag has href attribute")
|
||||||
// TODO: fix wildcard domain
|
|
||||||
a.Equal("/alias/robert", aliasRobertLink)
|
wantURL := fmt.Sprintf("https://robert.%s", ts.netInfo.Domain)
|
||||||
|
a.Equal(wantURL, aliasRobertLink)
|
||||||
|
|
||||||
// check for link to revoke 1st Alias
|
// check for link to revoke 1st Alias
|
||||||
revokeRobertLink, yes := aliasList.Eq(1).Attr("href")
|
revokeRobertLink, yes := aliasList.Eq(1).Attr("href")
|
||||||
|
@ -204,8 +206,8 @@ func TestMemberDetails(t *testing.T) {
|
||||||
// check for link to resolve 1st Alias
|
// check for link to resolve 1st Alias
|
||||||
aliasBobLink, yes := aliasList.Eq(2).Attr("href")
|
aliasBobLink, yes := aliasList.Eq(2).Attr("href")
|
||||||
a.True(yes, "a-tag has href attribute")
|
a.True(yes, "a-tag has href attribute")
|
||||||
// TODO: fix wildcard domain
|
wantURL = fmt.Sprintf("https://bob.%s", ts.netInfo.Domain)
|
||||||
a.Equal("/alias/bob", aliasBobLink)
|
a.Equal(wantURL, aliasBobLink)
|
||||||
|
|
||||||
// check for link to revoke 1st Alias
|
// check for link to revoke 1st Alias
|
||||||
revokeBobLink, yes := aliasList.Eq(3).Attr("href")
|
revokeBobLink, yes := aliasList.Eq(3).Attr("href")
|
||||||
|
|
|
@ -77,6 +77,8 @@ func newSession(t *testing.T) *testSession {
|
||||||
ts.netInfo = network.ServerEndpointDetails{
|
ts.netInfo = network.ServerEndpointDetails{
|
||||||
Domain: randutil.String(10),
|
Domain: randutil.String(10),
|
||||||
RoomID: refs.FeedRef{Algo: "ed25519", ID: bytes.Repeat([]byte{0}, 32)},
|
RoomID: refs.FeedRef{Algo: "ed25519", ID: bytes.Repeat([]byte{0}, 32)},
|
||||||
|
|
||||||
|
UseSubdomainForAliases: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
// instantiate the urlTo helper (constructs urls for us!)
|
// instantiate the urlTo helper (constructs urls for us!)
|
||||||
|
|
|
@ -83,9 +83,10 @@ func setup(t *testing.T) *testSession {
|
||||||
ts.MockedEndpoints = new(mocked.FakeEndpoints)
|
ts.MockedEndpoints = new(mocked.FakeEndpoints)
|
||||||
|
|
||||||
ts.NetworkInfo = network.ServerEndpointDetails{
|
ts.NetworkInfo = network.ServerEndpointDetails{
|
||||||
Domain: "localhost",
|
Domain: "localhost",
|
||||||
PortMUXRPC: 8008,
|
PortHTTPS: 443,
|
||||||
PortHTTPS: 443,
|
|
||||||
|
ListenAddressMUXRPC: ":8008",
|
||||||
|
|
||||||
RoomID: refs.FeedRef{
|
RoomID: refs.FeedRef{
|
||||||
ID: bytes.Repeat([]byte("test"), 8),
|
ID: bytes.Repeat([]byte("test"), 8),
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
{{range .Member.Aliases}}
|
{{range .Member.Aliases}}
|
||||||
<div class="flex flex-row items-center justify-start">
|
<div class="flex flex-row items-center justify-start">
|
||||||
<a
|
<a
|
||||||
href="/alias/{{.Name}}"
|
href="{{index $.AliasURLs .Name }}"
|
||||||
class="underline text-purple-800 bg-purple-100 rounded-lg px-2 py-1"
|
class="underline text-purple-800 bg-purple-100 rounded-lg px-2 py-1"
|
||||||
>{{.Name}}</a>
|
>{{.Name}}</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue