remove member nickname and alias suggestion
insert-user: remove nickname
This commit is contained in:
parent
d1d108b9b7
commit
377f3512a2
|
@ -30,13 +30,13 @@ func main() {
|
||||||
check(err)
|
check(err)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
name string
|
login string
|
||||||
pubKey *refs.FeedRef
|
pubKey *refs.FeedRef
|
||||||
role roomdb.Role = roomdb.RoleAdmin
|
role roomdb.Role = roomdb.RoleAdmin
|
||||||
repoPath string
|
repoPath string
|
||||||
)
|
)
|
||||||
|
|
||||||
flag.StringVar(&name, "name", "", "username (used when logging into the room's web ui)")
|
flag.StringVar(&login, "login", "", "username (used when logging into the room's web ui)")
|
||||||
flag.Func("key", "the public key of the user, format: @<base64-encoded public-key>.ed25519", func(val string) error {
|
flag.Func("key", "the public key of the user, format: @<base64-encoded public-key>.ed25519", func(val string) error {
|
||||||
if len(val) == 0 {
|
if len(val) == 0 {
|
||||||
return fmt.Errorf("the public key is required. if you are just testing things out, generate one by running 'cmd/insert-user/generate-fake-id.sh'\n")
|
return fmt.Errorf("the public key is required. if you are just testing things out, generate one by running 'cmd/insert-user/generate-fake-id.sh'\n")
|
||||||
|
@ -73,8 +73,8 @@ func main() {
|
||||||
cliMissingArguments("please provide the default arguments -name and -key")
|
cliMissingArguments("please provide the default arguments -name and -key")
|
||||||
}
|
}
|
||||||
|
|
||||||
if name == "" {
|
if login == "" {
|
||||||
cliMissingArguments("please provide a username with -name <username>")
|
cliMissingArguments("please provide a username with -login <username>")
|
||||||
}
|
}
|
||||||
|
|
||||||
if pubKey == nil {
|
if pubKey == nil {
|
||||||
|
@ -101,13 +101,13 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
mid, err := db.Members.Add(ctx, name, *pubKey, role)
|
mid, err := db.Members.Add(ctx, *pubKey, role)
|
||||||
check(err)
|
check(err)
|
||||||
|
|
||||||
err = db.AuthFallback.Create(ctx, mid, name, bytePassword)
|
err = db.AuthFallback.Create(ctx, mid, login, bytePassword)
|
||||||
check(err)
|
check(err)
|
||||||
|
|
||||||
fmt.Fprintf(os.Stderr, "Created member %s (%s) with ID %d\n", name, role, mid)
|
fmt.Fprintf(os.Stderr, "Created member %s (%s) with ID %d\n", login, role, mid)
|
||||||
}
|
}
|
||||||
|
|
||||||
func cliMissingArguments(message string) {
|
func cliMissingArguments(message string) {
|
||||||
|
|
|
@ -68,12 +68,12 @@ func TestAliasRegister(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
// adds
|
// adds
|
||||||
_, err = srvMembers.Add(ctx, "bob", bob.Whoami(), roomdb.RoleMember)
|
_, err = srvMembers.Add(ctx, bob.Whoami(), roomdb.RoleMember)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
|
|
||||||
// allow bots to dial the remote
|
// allow bots to dial the remote
|
||||||
// side-effect of re-using a room-server as the client
|
// side-effect of re-using a room-server as the client
|
||||||
_, err = bobsMembers.Add(ctx, "the-room", serv.Whoami(), roomdb.RoleMember)
|
_, err = bobsMembers.Add(ctx, serv.Whoami(), roomdb.RoleMember)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
|
|
||||||
// should work (we allowed A)
|
// should work (we allowed A)
|
||||||
|
|
|
@ -83,12 +83,12 @@ func TestTunnelServerSimple(t *testing.T) {
|
||||||
botB := theBots[2].Server
|
botB := theBots[2].Server
|
||||||
|
|
||||||
// allow both clients
|
// allow both clients
|
||||||
theBots[0].Members.Add(ctx, "botA", botA.Whoami(), roomdb.RoleMember)
|
theBots[0].Members.Add(ctx, botA.Whoami(), roomdb.RoleMember)
|
||||||
theBots[0].Members.Add(ctx, "botB", botB.Whoami(), roomdb.RoleMember)
|
theBots[0].Members.Add(ctx, botB.Whoami(), roomdb.RoleMember)
|
||||||
|
|
||||||
// allow bots to dial the remote
|
// allow bots to dial the remote
|
||||||
theBots[1].Members.Add(ctx, "srv", serv.Whoami(), roomdb.RoleMember)
|
theBots[1].Members.Add(ctx, serv.Whoami(), roomdb.RoleMember)
|
||||||
theBots[2].Members.Add(ctx, "srv", serv.Whoami(), roomdb.RoleMember)
|
theBots[2].Members.Add(ctx, serv.Whoami(), roomdb.RoleMember)
|
||||||
|
|
||||||
// dial up B->A and C->A
|
// dial up B->A and C->A
|
||||||
|
|
||||||
|
@ -154,12 +154,12 @@ func TestRoomAnnounce(t *testing.T) {
|
||||||
botB := theBots[2].Server
|
botB := theBots[2].Server
|
||||||
|
|
||||||
// allow both clients
|
// allow both clients
|
||||||
theBots[0].Members.Add(ctx, "botA", botA.Whoami(), roomdb.RoleMember)
|
theBots[0].Members.Add(ctx, botA.Whoami(), roomdb.RoleMember)
|
||||||
theBots[0].Members.Add(ctx, "botB", botB.Whoami(), roomdb.RoleMember)
|
theBots[0].Members.Add(ctx, botB.Whoami(), roomdb.RoleMember)
|
||||||
|
|
||||||
// allow bots to dial the remote
|
// allow bots to dial the remote
|
||||||
theBots[1].Members.Add(ctx, "srv", serv.Whoami(), roomdb.RoleMember)
|
theBots[1].Members.Add(ctx, serv.Whoami(), roomdb.RoleMember)
|
||||||
theBots[2].Members.Add(ctx, "srv", serv.Whoami(), roomdb.RoleMember)
|
theBots[2].Members.Add(ctx, serv.Whoami(), roomdb.RoleMember)
|
||||||
|
|
||||||
// should work (we allowed A)
|
// should work (we allowed A)
|
||||||
err := botA.Network.Connect(ctx, serv.Network.GetListenAddr())
|
err := botA.Network.Connect(ctx, serv.Network.GetListenAddr())
|
||||||
|
|
|
@ -23,7 +23,7 @@ func TestGoServerJSClientAliases(t *testing.T) {
|
||||||
var aliasesDB = &mockdb.FakeAliasesService{}
|
var aliasesDB = &mockdb.FakeAliasesService{}
|
||||||
srv := ts.startGoServer(membersDB, aliasesDB)
|
srv := ts.startGoServer(membersDB, aliasesDB)
|
||||||
// allow all peers (there arent any we dont want to allow)
|
// allow all peers (there arent any we dont want to allow)
|
||||||
membersDB.GetByFeedReturns(roomdb.Member{Nickname: "free4all"}, nil)
|
membersDB.GetByFeedReturns(roomdb.Member{ID: 1234}, nil)
|
||||||
|
|
||||||
// setup mocks for this test
|
// setup mocks for this test
|
||||||
aliasesDB.RegisterReturns(nil)
|
aliasesDB.RegisterReturns(nil)
|
||||||
|
|
|
@ -73,7 +73,7 @@ func TestGoServerLegacyJSClient(t *testing.T) {
|
||||||
var aliases = &mockdb.FakeAliasesService{}
|
var aliases = &mockdb.FakeAliasesService{}
|
||||||
srv := ts.startGoServer(membersDB, aliases)
|
srv := ts.startGoServer(membersDB, aliases)
|
||||||
// allow all peers (there arent any we dont want to allow)
|
// allow all peers (there arent any we dont want to allow)
|
||||||
membersDB.GetByFeedReturns(roomdb.Member{Nickname: "free4all"}, nil)
|
membersDB.GetByFeedReturns(roomdb.Member{ID: 1234}, nil)
|
||||||
|
|
||||||
alice := ts.startJSClient("alice", "./testscripts/legacy_client.js",
|
alice := ts.startJSClient("alice", "./testscripts/legacy_client.js",
|
||||||
srv.Network.GetListenAddr(),
|
srv.Network.GetListenAddr(),
|
||||||
|
@ -110,7 +110,7 @@ func TestModernJSClient(t *testing.T) {
|
||||||
var membersDB = &mockdb.FakeMembersService{}
|
var membersDB = &mockdb.FakeMembersService{}
|
||||||
var aliasesDB = &mockdb.FakeAliasesService{}
|
var aliasesDB = &mockdb.FakeAliasesService{}
|
||||||
srv := ts.startGoServer(membersDB, aliasesDB)
|
srv := ts.startGoServer(membersDB, aliasesDB)
|
||||||
membersDB.GetByFeedReturns(roomdb.Member{Nickname: "free4all"}, nil)
|
membersDB.GetByFeedReturns(roomdb.Member{ID: 1234}, nil)
|
||||||
|
|
||||||
// allow all peers (there arent any we dont want to allow in this test)
|
// allow all peers (there arent any we dont want to allow in this test)
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ type AuthWithSSBService interface {
|
||||||
// MembersService stores and retreives the list of internal users (members, mods and admins).
|
// MembersService stores and retreives the list of internal users (members, mods and admins).
|
||||||
type MembersService interface {
|
type MembersService interface {
|
||||||
// Add adds a new member
|
// Add adds a new member
|
||||||
Add(_ context.Context, nickName string, pubKey refs.FeedRef, r Role) (int64, error)
|
Add(_ context.Context, pubKey refs.FeedRef, r Role) (int64, error)
|
||||||
|
|
||||||
// GetByID returns the member if it exists
|
// GetByID returns the member if it exists
|
||||||
GetByID(context.Context, int64) (Member, error)
|
GetByID(context.Context, int64) (Member, error)
|
||||||
|
@ -125,7 +125,7 @@ type InvitesService interface {
|
||||||
// Create creates a new invite for a new member. It returns the token or an error.
|
// Create creates a new invite for a new member. It returns the token or an error.
|
||||||
// createdBy is user ID of the admin or moderator who created it.
|
// createdBy is user ID of the admin or moderator who created it.
|
||||||
// aliasSuggestion is optional (empty string is fine) but can be used to disambiguate open invites. (See https://github.com/ssb-ngi-pointer/rooms2/issues/21)
|
// aliasSuggestion is optional (empty string is fine) but can be used to disambiguate open invites. (See https://github.com/ssb-ngi-pointer/rooms2/issues/21)
|
||||||
Create(ctx context.Context, createdBy int64, aliasSuggestion string) (string, error)
|
Create(ctx context.Context, createdBy int64) (string, error)
|
||||||
|
|
||||||
// Consume checks if the passed token is still valid.
|
// Consume checks if the passed token is still valid.
|
||||||
// If it is it adds newMember to the members of the room and invalidates the token.
|
// If it is it adds newMember to the members of the room and invalidates the token.
|
||||||
|
|
|
@ -25,12 +25,11 @@ type FakeInvitesService struct {
|
||||||
result1 roomdb.Invite
|
result1 roomdb.Invite
|
||||||
result2 error
|
result2 error
|
||||||
}
|
}
|
||||||
CreateStub func(context.Context, int64, string) (string, error)
|
CreateStub func(context.Context, int64) (string, error)
|
||||||
createMutex sync.RWMutex
|
createMutex sync.RWMutex
|
||||||
createArgsForCall []struct {
|
createArgsForCall []struct {
|
||||||
arg1 context.Context
|
arg1 context.Context
|
||||||
arg2 int64
|
arg2 int64
|
||||||
arg3 string
|
|
||||||
}
|
}
|
||||||
createReturns struct {
|
createReturns struct {
|
||||||
result1 string
|
result1 string
|
||||||
|
@ -163,20 +162,19 @@ func (fake *FakeInvitesService) ConsumeReturnsOnCall(i int, result1 roomdb.Invit
|
||||||
}{result1, result2}
|
}{result1, result2}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *FakeInvitesService) Create(arg1 context.Context, arg2 int64, arg3 string) (string, error) {
|
func (fake *FakeInvitesService) Create(arg1 context.Context, arg2 int64) (string, error) {
|
||||||
fake.createMutex.Lock()
|
fake.createMutex.Lock()
|
||||||
ret, specificReturn := fake.createReturnsOnCall[len(fake.createArgsForCall)]
|
ret, specificReturn := fake.createReturnsOnCall[len(fake.createArgsForCall)]
|
||||||
fake.createArgsForCall = append(fake.createArgsForCall, struct {
|
fake.createArgsForCall = append(fake.createArgsForCall, struct {
|
||||||
arg1 context.Context
|
arg1 context.Context
|
||||||
arg2 int64
|
arg2 int64
|
||||||
arg3 string
|
}{arg1, arg2})
|
||||||
}{arg1, arg2, arg3})
|
|
||||||
stub := fake.CreateStub
|
stub := fake.CreateStub
|
||||||
fakeReturns := fake.createReturns
|
fakeReturns := fake.createReturns
|
||||||
fake.recordInvocation("Create", []interface{}{arg1, arg2, arg3})
|
fake.recordInvocation("Create", []interface{}{arg1, arg2})
|
||||||
fake.createMutex.Unlock()
|
fake.createMutex.Unlock()
|
||||||
if stub != nil {
|
if stub != nil {
|
||||||
return stub(arg1, arg2, arg3)
|
return stub(arg1, arg2)
|
||||||
}
|
}
|
||||||
if specificReturn {
|
if specificReturn {
|
||||||
return ret.result1, ret.result2
|
return ret.result1, ret.result2
|
||||||
|
@ -190,17 +188,17 @@ func (fake *FakeInvitesService) CreateCallCount() int {
|
||||||
return len(fake.createArgsForCall)
|
return len(fake.createArgsForCall)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *FakeInvitesService) CreateCalls(stub func(context.Context, int64, string) (string, error)) {
|
func (fake *FakeInvitesService) CreateCalls(stub func(context.Context, int64) (string, error)) {
|
||||||
fake.createMutex.Lock()
|
fake.createMutex.Lock()
|
||||||
defer fake.createMutex.Unlock()
|
defer fake.createMutex.Unlock()
|
||||||
fake.CreateStub = stub
|
fake.CreateStub = stub
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *FakeInvitesService) CreateArgsForCall(i int) (context.Context, int64, string) {
|
func (fake *FakeInvitesService) CreateArgsForCall(i int) (context.Context, int64) {
|
||||||
fake.createMutex.RLock()
|
fake.createMutex.RLock()
|
||||||
defer fake.createMutex.RUnlock()
|
defer fake.createMutex.RUnlock()
|
||||||
argsForCall := fake.createArgsForCall[i]
|
argsForCall := fake.createArgsForCall[i]
|
||||||
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3
|
return argsForCall.arg1, argsForCall.arg2
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *FakeInvitesService) CreateReturns(result1 string, result2 error) {
|
func (fake *FakeInvitesService) CreateReturns(result1 string, result2 error) {
|
||||||
|
|
|
@ -10,13 +10,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type FakeMembersService struct {
|
type FakeMembersService struct {
|
||||||
AddStub func(context.Context, string, refs.FeedRef, roomdb.Role) (int64, error)
|
AddStub func(context.Context, refs.FeedRef, roomdb.Role) (int64, error)
|
||||||
addMutex sync.RWMutex
|
addMutex sync.RWMutex
|
||||||
addArgsForCall []struct {
|
addArgsForCall []struct {
|
||||||
arg1 context.Context
|
arg1 context.Context
|
||||||
arg2 string
|
arg2 refs.FeedRef
|
||||||
arg3 refs.FeedRef
|
arg3 roomdb.Role
|
||||||
arg4 roomdb.Role
|
|
||||||
}
|
}
|
||||||
addReturns struct {
|
addReturns struct {
|
||||||
result1 int64
|
result1 int64
|
||||||
|
@ -108,21 +107,20 @@ type FakeMembersService struct {
|
||||||
invocationsMutex sync.RWMutex
|
invocationsMutex sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *FakeMembersService) Add(arg1 context.Context, arg2 string, arg3 refs.FeedRef, arg4 roomdb.Role) (int64, error) {
|
func (fake *FakeMembersService) Add(arg1 context.Context, arg2 refs.FeedRef, arg3 roomdb.Role) (int64, error) {
|
||||||
fake.addMutex.Lock()
|
fake.addMutex.Lock()
|
||||||
ret, specificReturn := fake.addReturnsOnCall[len(fake.addArgsForCall)]
|
ret, specificReturn := fake.addReturnsOnCall[len(fake.addArgsForCall)]
|
||||||
fake.addArgsForCall = append(fake.addArgsForCall, struct {
|
fake.addArgsForCall = append(fake.addArgsForCall, struct {
|
||||||
arg1 context.Context
|
arg1 context.Context
|
||||||
arg2 string
|
arg2 refs.FeedRef
|
||||||
arg3 refs.FeedRef
|
arg3 roomdb.Role
|
||||||
arg4 roomdb.Role
|
}{arg1, arg2, arg3})
|
||||||
}{arg1, arg2, arg3, arg4})
|
|
||||||
stub := fake.AddStub
|
stub := fake.AddStub
|
||||||
fakeReturns := fake.addReturns
|
fakeReturns := fake.addReturns
|
||||||
fake.recordInvocation("Add", []interface{}{arg1, arg2, arg3, arg4})
|
fake.recordInvocation("Add", []interface{}{arg1, arg2, arg3})
|
||||||
fake.addMutex.Unlock()
|
fake.addMutex.Unlock()
|
||||||
if stub != nil {
|
if stub != nil {
|
||||||
return stub(arg1, arg2, arg3, arg4)
|
return stub(arg1, arg2, arg3)
|
||||||
}
|
}
|
||||||
if specificReturn {
|
if specificReturn {
|
||||||
return ret.result1, ret.result2
|
return ret.result1, ret.result2
|
||||||
|
@ -136,17 +134,17 @@ func (fake *FakeMembersService) AddCallCount() int {
|
||||||
return len(fake.addArgsForCall)
|
return len(fake.addArgsForCall)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *FakeMembersService) AddCalls(stub func(context.Context, string, refs.FeedRef, roomdb.Role) (int64, error)) {
|
func (fake *FakeMembersService) AddCalls(stub func(context.Context, refs.FeedRef, roomdb.Role) (int64, error)) {
|
||||||
fake.addMutex.Lock()
|
fake.addMutex.Lock()
|
||||||
defer fake.addMutex.Unlock()
|
defer fake.addMutex.Unlock()
|
||||||
fake.AddStub = stub
|
fake.AddStub = stub
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *FakeMembersService) AddArgsForCall(i int) (context.Context, string, refs.FeedRef, roomdb.Role) {
|
func (fake *FakeMembersService) AddArgsForCall(i int) (context.Context, refs.FeedRef, roomdb.Role) {
|
||||||
fake.addMutex.RLock()
|
fake.addMutex.RLock()
|
||||||
defer fake.addMutex.RUnlock()
|
defer fake.addMutex.RUnlock()
|
||||||
argsForCall := fake.addArgsForCall[i]
|
argsForCall := fake.addArgsForCall[i]
|
||||||
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4
|
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *FakeMembersService) AddReturns(result1 int64, result2 error) {
|
func (fake *FakeMembersService) AddReturns(result1 int64, result2 error) {
|
||||||
|
|
|
@ -65,7 +65,7 @@ func TestAliases(t *testing.T) {
|
||||||
r.Error(err)
|
r.Error(err)
|
||||||
|
|
||||||
// allow the member
|
// allow the member
|
||||||
_, err = db.Members.Add(ctx, "flaky's nick", newMember, roomdb.RoleMember)
|
_, err = db.Members.Add(ctx, newMember, roomdb.RoleMember)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
|
|
||||||
err = db.Aliases.Register(ctx, testName, newMember, testSig)
|
err = db.Aliases.Register(ctx, testName, newMember, testSig)
|
||||||
|
|
|
@ -34,10 +34,9 @@ type Invites struct {
|
||||||
// createdBy is user ID of the admin or moderator who created it.
|
// createdBy is user ID of the admin or moderator who created it.
|
||||||
// aliasSuggestion is optional (empty string is fine) but can be used to disambiguate open invites. (See https://github.com/ssb-ngi-pointer/rooms2/issues/21)
|
// aliasSuggestion is optional (empty string is fine) but can be used to disambiguate open invites. (See https://github.com/ssb-ngi-pointer/rooms2/issues/21)
|
||||||
// The returned token is base64 URL encoded and has inviteTokenLength when decoded.
|
// The returned token is base64 URL encoded and has inviteTokenLength when decoded.
|
||||||
func (i Invites) Create(ctx context.Context, createdBy int64, aliasSuggestion string) (string, error) {
|
func (i Invites) Create(ctx context.Context, createdBy int64) (string, error) {
|
||||||
var newInvite = models.Invite{
|
var newInvite = models.Invite{
|
||||||
CreatedBy: createdBy,
|
CreatedBy: createdBy,
|
||||||
AliasSuggestion: aliasSuggestion,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenBytes := make([]byte, inviteTokenLength)
|
tokenBytes := make([]byte, inviteTokenLength)
|
||||||
|
@ -106,12 +105,7 @@ func (i Invites) Consume(ctx context.Context, token string, newMember refs.FeedR
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
memberNick := time.Now().Format("new-member 2006-01-02")
|
_, err = i.members.add(ctx, tx, newMember, roomdb.RoleMember)
|
||||||
memberNick += "(invited by:" + entry.R.CreatedByMember.Nick + ")"
|
|
||||||
if entry.AliasSuggestion != "" {
|
|
||||||
memberNick = entry.AliasSuggestion
|
|
||||||
}
|
|
||||||
_, err = i.members.add(ctx, tx, memberNick, newMember, roomdb.RoleMember)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -125,10 +119,8 @@ func (i Invites) Consume(ctx context.Context, token string, newMember refs.FeedR
|
||||||
|
|
||||||
inv.ID = entry.ID
|
inv.ID = entry.ID
|
||||||
inv.CreatedAt = entry.CreatedAt
|
inv.CreatedAt = entry.CreatedAt
|
||||||
inv.AliasSuggestion = entry.AliasSuggestion
|
|
||||||
inv.CreatedBy.ID = entry.R.CreatedByMember.ID
|
inv.CreatedBy.ID = entry.R.CreatedByMember.ID
|
||||||
inv.CreatedBy.Role = roomdb.Role(entry.R.CreatedByMember.Role)
|
inv.CreatedBy.Role = roomdb.Role(entry.R.CreatedByMember.Role)
|
||||||
inv.CreatedBy.Nickname = entry.R.CreatedByMember.Nick
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -174,10 +166,8 @@ func (i Invites) GetByToken(ctx context.Context, token string) (roomdb.Invite, e
|
||||||
|
|
||||||
inv.ID = entry.ID
|
inv.ID = entry.ID
|
||||||
inv.CreatedAt = entry.CreatedAt
|
inv.CreatedAt = entry.CreatedAt
|
||||||
inv.AliasSuggestion = entry.AliasSuggestion
|
|
||||||
inv.CreatedBy.ID = entry.R.CreatedByMember.ID
|
inv.CreatedBy.ID = entry.R.CreatedByMember.ID
|
||||||
inv.CreatedBy.Role = roomdb.Role(entry.R.CreatedByMember.Role)
|
inv.CreatedBy.Role = roomdb.Role(entry.R.CreatedByMember.Role)
|
||||||
inv.CreatedBy.Nickname = entry.R.CreatedByMember.Nick
|
|
||||||
|
|
||||||
return inv, nil
|
return inv, nil
|
||||||
}
|
}
|
||||||
|
@ -198,10 +188,8 @@ func (i Invites) GetByID(ctx context.Context, id int64) (roomdb.Invite, error) {
|
||||||
|
|
||||||
inv.ID = entry.ID
|
inv.ID = entry.ID
|
||||||
inv.CreatedAt = entry.CreatedAt
|
inv.CreatedAt = entry.CreatedAt
|
||||||
inv.AliasSuggestion = entry.AliasSuggestion
|
|
||||||
inv.CreatedBy.ID = entry.R.CreatedByMember.ID
|
inv.CreatedBy.ID = entry.R.CreatedByMember.ID
|
||||||
inv.CreatedBy.Role = roomdb.Role(entry.R.CreatedByMember.Role)
|
inv.CreatedBy.Role = roomdb.Role(entry.R.CreatedByMember.Role)
|
||||||
inv.CreatedBy.Nickname = entry.R.CreatedByMember.Nick
|
|
||||||
|
|
||||||
return inv, nil
|
return inv, nil
|
||||||
}
|
}
|
||||||
|
@ -224,9 +212,7 @@ func (i Invites) List(ctx context.Context) ([]roomdb.Invite, error) {
|
||||||
var inv roomdb.Invite
|
var inv roomdb.Invite
|
||||||
inv.ID = e.ID
|
inv.ID = e.ID
|
||||||
inv.CreatedAt = e.CreatedAt
|
inv.CreatedAt = e.CreatedAt
|
||||||
inv.AliasSuggestion = e.AliasSuggestion
|
|
||||||
inv.CreatedBy.ID = e.R.CreatedByMember.ID
|
inv.CreatedBy.ID = e.R.CreatedByMember.ID
|
||||||
inv.CreatedBy.Nickname = e.R.CreatedByMember.Nick
|
|
||||||
|
|
||||||
invs[idx] = inv
|
invs[idx] = inv
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,13 +47,12 @@ func TestInvites(t *testing.T) {
|
||||||
t.Run("user needs to exist", func(t *testing.T) {
|
t.Run("user needs to exist", func(t *testing.T) {
|
||||||
r := require.New(t)
|
r := require.New(t)
|
||||||
|
|
||||||
_, err := db.Invites.Create(ctx, 666, "")
|
_, err := db.Invites.Create(ctx, 666)
|
||||||
r.Error(err, "can't create invite for invalid user")
|
r.Error(err, "can't create invite for invalid user")
|
||||||
})
|
})
|
||||||
|
|
||||||
testMemberNick := "test-user"
|
|
||||||
invitingMember := refs.FeedRef{ID: bytes.Repeat([]byte("ohai"), 8), Algo: refs.RefAlgoFeedSSB1}
|
invitingMember := refs.FeedRef{ID: bytes.Repeat([]byte("ohai"), 8), Algo: refs.RefAlgoFeedSSB1}
|
||||||
mid, err := db.Members.Add(ctx, testMemberNick, invitingMember, roomdb.RoleModerator)
|
mid, err := db.Members.Add(ctx, invitingMember, roomdb.RoleModerator)
|
||||||
require.NoError(t, err, "failed to create test user")
|
require.NoError(t, err, "failed to create test user")
|
||||||
|
|
||||||
t.Run("simple create and consume", func(t *testing.T) {
|
t.Run("simple create and consume", func(t *testing.T) {
|
||||||
|
@ -62,7 +61,7 @@ func TestInvites(t *testing.T) {
|
||||||
// i really don't want to do a mocked time functions and rather solve the comment in migration 6 instead
|
// i really don't want to do a mocked time functions and rather solve the comment in migration 6 instead
|
||||||
before := time.Now()
|
before := time.Now()
|
||||||
|
|
||||||
tok, err := db.Invites.Create(ctx, mid, "bestie")
|
tok, err := db.Invites.Create(ctx, mid)
|
||||||
r.NoError(err, "failed to create invite token")
|
r.NoError(err, "failed to create invite token")
|
||||||
|
|
||||||
_, err = base64.URLEncoding.DecodeString(tok)
|
_, err = base64.URLEncoding.DecodeString(tok)
|
||||||
|
@ -72,8 +71,6 @@ func TestInvites(t *testing.T) {
|
||||||
r.NoError(err, "failed to get list of tokens")
|
r.NoError(err, "failed to get list of tokens")
|
||||||
r.Len(lst, 1, "expected 1 invite")
|
r.Len(lst, 1, "expected 1 invite")
|
||||||
|
|
||||||
r.Equal("bestie", lst[0].AliasSuggestion)
|
|
||||||
r.Equal(testMemberNick, lst[0].CreatedBy.Nickname)
|
|
||||||
r.True(lst[0].CreatedAt.After(before), "expected CreatedAt to be after the start marker")
|
r.True(lst[0].CreatedAt.After(before), "expected CreatedAt to be after the start marker")
|
||||||
|
|
||||||
_, nope := db.Members.GetByFeed(ctx, newMember)
|
_, nope := db.Members.GetByFeed(ctx, newMember)
|
||||||
|
@ -85,7 +82,6 @@ func TestInvites(t *testing.T) {
|
||||||
|
|
||||||
inv, err := db.Invites.Consume(ctx, tok, newMember)
|
inv, err := db.Invites.Consume(ctx, tok, newMember)
|
||||||
r.NoError(err, "failed to consume the invite")
|
r.NoError(err, "failed to consume the invite")
|
||||||
r.Equal(testMemberNick, inv.CreatedBy.Nickname)
|
|
||||||
r.NotEqualValues(0, inv.ID, "invite ID unset")
|
r.NotEqualValues(0, inv.ID, "invite ID unset")
|
||||||
r.True(inv.CreatedAt.After(before), "expected CreatedAt to be after the start marker")
|
r.True(inv.CreatedAt.After(before), "expected CreatedAt to be after the start marker")
|
||||||
|
|
||||||
|
@ -106,16 +102,13 @@ func TestInvites(t *testing.T) {
|
||||||
t.Run("simple create but revoke before use", func(t *testing.T) {
|
t.Run("simple create but revoke before use", func(t *testing.T) {
|
||||||
r := require.New(t)
|
r := require.New(t)
|
||||||
|
|
||||||
tok, err := db.Invites.Create(ctx, mid, "bestie")
|
tok, err := db.Invites.Create(ctx, mid)
|
||||||
r.NoError(err, "failed to create invite token")
|
r.NoError(err, "failed to create invite token")
|
||||||
|
|
||||||
lst, err := db.Invites.List(ctx)
|
lst, err := db.Invites.List(ctx)
|
||||||
r.NoError(err, "failed to get list of tokens")
|
r.NoError(err, "failed to get list of tokens")
|
||||||
r.Len(lst, 1, "expected 1 invite")
|
r.Len(lst, 1, "expected 1 invite")
|
||||||
|
|
||||||
r.Equal("bestie", lst[0].AliasSuggestion)
|
|
||||||
r.Equal(testMemberNick, lst[0].CreatedBy.Nickname)
|
|
||||||
|
|
||||||
err = db.Invites.Revoke(ctx, lst[0].ID)
|
err = db.Invites.Revoke(ctx, lst[0].ID)
|
||||||
r.NoError(err, "failed to consume the invite")
|
r.NoError(err, "failed to consume the invite")
|
||||||
|
|
||||||
|
|
|
@ -20,11 +20,11 @@ type Members struct {
|
||||||
db *sql.DB
|
db *sql.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m Members) Add(ctx context.Context, nick string, pubKey refs.FeedRef, role roomdb.Role) (int64, error) {
|
func (m Members) Add(ctx context.Context, pubKey refs.FeedRef, role roomdb.Role) (int64, error) {
|
||||||
var newID int64
|
var newID int64
|
||||||
err := transact(m.db, func(tx *sql.Tx) error {
|
err := transact(m.db, func(tx *sql.Tx) error {
|
||||||
var err error
|
var err error
|
||||||
newID, err = m.add(ctx, tx, nick, pubKey, role)
|
newID, err = m.add(ctx, tx, pubKey, role)
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -34,7 +34,7 @@ func (m Members) Add(ctx context.Context, nick string, pubKey refs.FeedRef, role
|
||||||
}
|
}
|
||||||
|
|
||||||
// no receiver name because it needs to use the passed transaction
|
// no receiver name because it needs to use the passed transaction
|
||||||
func (Members) add(ctx context.Context, tx *sql.Tx, nick string, pubKey refs.FeedRef, role roomdb.Role) (int64, error) {
|
func (Members) add(ctx context.Context, tx *sql.Tx, pubKey refs.FeedRef, role roomdb.Role) (int64, error) {
|
||||||
if err := role.IsValid(); err != nil {
|
if err := role.IsValid(); err != nil {
|
||||||
return -1, err
|
return -1, err
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,6 @@ func (Members) add(ctx context.Context, tx *sql.Tx, nick string, pubKey refs.Fee
|
||||||
}
|
}
|
||||||
|
|
||||||
var newMember models.Member
|
var newMember models.Member
|
||||||
newMember.Nick = nick
|
|
||||||
newMember.PubKey = roomdb.DBFeedRef{FeedRef: pubKey}
|
newMember.PubKey = roomdb.DBFeedRef{FeedRef: pubKey}
|
||||||
newMember.Role = int64(role)
|
newMember.Role = int64(role)
|
||||||
|
|
||||||
|
@ -64,7 +63,6 @@ func (m Members) GetByID(ctx context.Context, mid int64) (roomdb.Member, error)
|
||||||
return roomdb.Member{
|
return roomdb.Member{
|
||||||
ID: entry.ID,
|
ID: entry.ID,
|
||||||
Role: roomdb.Role(entry.Role),
|
Role: roomdb.Role(entry.Role),
|
||||||
Nickname: entry.Nick,
|
|
||||||
PubKey: entry.PubKey.FeedRef,
|
PubKey: entry.PubKey.FeedRef,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@ -78,7 +76,6 @@ func (m Members) GetByFeed(ctx context.Context, h refs.FeedRef) (roomdb.Member,
|
||||||
return roomdb.Member{
|
return roomdb.Member{
|
||||||
ID: entry.ID,
|
ID: entry.ID,
|
||||||
Role: roomdb.Role(entry.Role),
|
Role: roomdb.Role(entry.Role),
|
||||||
Nickname: entry.Nick,
|
|
||||||
PubKey: entry.PubKey.FeedRef,
|
PubKey: entry.PubKey.FeedRef,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@ -93,7 +90,6 @@ func (m Members) List(ctx context.Context) ([]roomdb.Member, error) {
|
||||||
var members = make([]roomdb.Member, len(all))
|
var members = make([]roomdb.Member, len(all))
|
||||||
for i, listEntry := range all {
|
for i, listEntry := range all {
|
||||||
members[i].ID = listEntry.ID
|
members[i].ID = listEntry.ID
|
||||||
members[i].Nickname = listEntry.Nick
|
|
||||||
members[i].Role = roomdb.Role(listEntry.Role)
|
members[i].Role = roomdb.Role(listEntry.Role)
|
||||||
members[i].PubKey = listEntry.PubKey.FeedRef
|
members[i].PubKey = listEntry.PubKey.FeedRef
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,12 +28,12 @@ func TestMembers(t *testing.T) {
|
||||||
|
|
||||||
// broken feed (unknown algo)
|
// broken feed (unknown algo)
|
||||||
tf := refs.FeedRef{ID: bytes.Repeat([]byte("fooo"), 8), Algo: "nope"}
|
tf := refs.FeedRef{ID: bytes.Repeat([]byte("fooo"), 8), Algo: "nope"}
|
||||||
_, err = db.Members.Add(ctx, "dont-add-me", tf, roomdb.RoleMember)
|
_, err = db.Members.Add(ctx, tf, roomdb.RoleMember)
|
||||||
r.Error(err)
|
r.Error(err)
|
||||||
|
|
||||||
// looks ok at least
|
// looks ok at least
|
||||||
okFeed := refs.FeedRef{ID: bytes.Repeat([]byte("acab"), 8), Algo: refs.RefAlgoFeedSSB1}
|
okFeed := refs.FeedRef{ID: bytes.Repeat([]byte("acab"), 8), Algo: refs.RefAlgoFeedSSB1}
|
||||||
mid, err := db.Members.Add(ctx, "should-add-me", okFeed, roomdb.RoleMember)
|
mid, err := db.Members.Add(ctx, okFeed, roomdb.RoleMember)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
|
|
||||||
sqlDB := db.Members.db
|
sqlDB := db.Members.db
|
||||||
|
@ -51,7 +51,6 @@ func TestMembers(t *testing.T) {
|
||||||
okMember, err := db.Members.GetByFeed(ctx, okFeed)
|
okMember, err := db.Members.GetByFeed(ctx, okFeed)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
r.Equal(okMember.ID, mid)
|
r.Equal(okMember.ID, mid)
|
||||||
r.Equal(okMember.Nickname, "should-add-me")
|
|
||||||
r.Equal(okMember.Role, roomdb.RoleMember)
|
r.Equal(okMember.Role, roomdb.RoleMember)
|
||||||
r.True(okMember.PubKey.Equal(&okFeed))
|
r.True(okMember.PubKey.Equal(&okFeed))
|
||||||
|
|
||||||
|
@ -88,10 +87,10 @@ func TestMembersUnique(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
feedA := refs.FeedRef{ID: bytes.Repeat([]byte("1312"), 8), Algo: refs.RefAlgoFeedSSB1}
|
feedA := refs.FeedRef{ID: bytes.Repeat([]byte("1312"), 8), Algo: refs.RefAlgoFeedSSB1}
|
||||||
_, err = db.Members.Add(ctx, "add-me-first", feedA, roomdb.RoleMember)
|
_, err = db.Members.Add(ctx, feedA, roomdb.RoleMember)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
|
|
||||||
_, err = db.Members.Add(ctx, "dont-add-me-twice", feedA, roomdb.RoleMember)
|
_, err = db.Members.Add(ctx, feedA, roomdb.RoleMember)
|
||||||
r.Error(err)
|
r.Error(err)
|
||||||
|
|
||||||
lst, err := db.Members.List(ctx)
|
lst, err := db.Members.List(ctx)
|
||||||
|
@ -114,7 +113,7 @@ func TestMembersByID(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
feedA := refs.FeedRef{ID: bytes.Repeat([]byte("1312"), 8), Algo: refs.RefAlgoFeedSSB1}
|
feedA := refs.FeedRef{ID: bytes.Repeat([]byte("1312"), 8), Algo: refs.RefAlgoFeedSSB1}
|
||||||
_, err = db.Members.Add(ctx, "add-me", feedA, roomdb.RoleMember)
|
_, err = db.Members.Add(ctx, feedA, roomdb.RoleMember)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
|
|
||||||
lst, err := db.Members.List(ctx)
|
lst, err := db.Members.List(ctx)
|
||||||
|
@ -154,12 +153,12 @@ func TestMembersSetRole(t *testing.T) {
|
||||||
|
|
||||||
// create two users
|
// create two users
|
||||||
feedA := refs.FeedRef{ID: bytes.Repeat([]byte("1"), 32), Algo: refs.RefAlgoFeedSSB1}
|
feedA := refs.FeedRef{ID: bytes.Repeat([]byte("1"), 32), Algo: refs.RefAlgoFeedSSB1}
|
||||||
idA, err := db.Members.Add(ctx, "user-a", feedA, roomdb.RoleAdmin)
|
idA, err := db.Members.Add(ctx, feedA, roomdb.RoleAdmin)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
t.Log("member A:", idA)
|
t.Log("member A:", idA)
|
||||||
|
|
||||||
feedB := refs.FeedRef{ID: bytes.Repeat([]byte("2"), 32), Algo: refs.RefAlgoFeedSSB1}
|
feedB := refs.FeedRef{ID: bytes.Repeat([]byte("2"), 32), Algo: refs.RefAlgoFeedSSB1}
|
||||||
idB, err := db.Members.Add(ctx, "user-b", feedB, roomdb.RoleModerator)
|
idB, err := db.Members.Add(ctx, feedB, roomdb.RoleModerator)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
t.Log("member B:", idB)
|
t.Log("member B:", idB)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
CREATE TABLE members (
|
CREATE TABLE members (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
role INTEGER NOT NULL, -- member, moderator or admin
|
role INTEGER NOT NULL, -- member, moderator or admin
|
||||||
nick TEXT NOT NULL, -- a nick name for the user (not an alias)
|
|
||||||
pub_key TEXT NOT NULL UNIQUE,
|
pub_key TEXT NOT NULL UNIQUE,
|
||||||
|
|
||||||
CHECK(role > 0)
|
CHECK(role > 0)
|
||||||
|
@ -29,7 +28,6 @@ CREATE TABLE invites (
|
||||||
created_by INTEGER NOT NULL,
|
created_by INTEGER NOT NULL,
|
||||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|
||||||
alias_suggestion TEXT NOT NULL DEFAULT "", -- optional
|
|
||||||
active boolean NOT NULL DEFAULT TRUE,
|
active boolean NOT NULL DEFAULT TRUE,
|
||||||
|
|
||||||
FOREIGN KEY ( created_by ) REFERENCES members( "id" ) ON DELETE CASCADE
|
FOREIGN KEY ( created_by ) REFERENCES members( "id" ) ON DELETE CASCADE
|
||||||
|
|
|
@ -26,7 +26,6 @@ type Invite struct {
|
||||||
HashedToken string `boil:"hashed_token" json:"hashed_token" toml:"hashed_token" yaml:"hashed_token"`
|
HashedToken string `boil:"hashed_token" json:"hashed_token" toml:"hashed_token" yaml:"hashed_token"`
|
||||||
CreatedBy int64 `boil:"created_by" json:"created_by" toml:"created_by" yaml:"created_by"`
|
CreatedBy int64 `boil:"created_by" json:"created_by" toml:"created_by" yaml:"created_by"`
|
||||||
CreatedAt time.Time `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"`
|
CreatedAt time.Time `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"`
|
||||||
AliasSuggestion string `boil:"alias_suggestion" json:"alias_suggestion" toml:"alias_suggestion" yaml:"alias_suggestion"`
|
|
||||||
Active bool `boil:"active" json:"active" toml:"active" yaml:"active"`
|
Active bool `boil:"active" json:"active" toml:"active" yaml:"active"`
|
||||||
|
|
||||||
R *inviteR `boil:"-" json:"-" toml:"-" yaml:"-"`
|
R *inviteR `boil:"-" json:"-" toml:"-" yaml:"-"`
|
||||||
|
@ -38,14 +37,12 @@ var InviteColumns = struct {
|
||||||
HashedToken string
|
HashedToken string
|
||||||
CreatedBy string
|
CreatedBy string
|
||||||
CreatedAt string
|
CreatedAt string
|
||||||
AliasSuggestion string
|
|
||||||
Active string
|
Active string
|
||||||
}{
|
}{
|
||||||
ID: "id",
|
ID: "id",
|
||||||
HashedToken: "hashed_token",
|
HashedToken: "hashed_token",
|
||||||
CreatedBy: "created_by",
|
CreatedBy: "created_by",
|
||||||
CreatedAt: "created_at",
|
CreatedAt: "created_at",
|
||||||
AliasSuggestion: "alias_suggestion",
|
|
||||||
Active: "active",
|
Active: "active",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,14 +62,12 @@ var InviteWhere = struct {
|
||||||
HashedToken whereHelperstring
|
HashedToken whereHelperstring
|
||||||
CreatedBy whereHelperint64
|
CreatedBy whereHelperint64
|
||||||
CreatedAt whereHelpertime_Time
|
CreatedAt whereHelpertime_Time
|
||||||
AliasSuggestion whereHelperstring
|
|
||||||
Active whereHelperbool
|
Active whereHelperbool
|
||||||
}{
|
}{
|
||||||
ID: whereHelperint64{field: "\"invites\".\"id\""},
|
ID: whereHelperint64{field: "\"invites\".\"id\""},
|
||||||
HashedToken: whereHelperstring{field: "\"invites\".\"hashed_token\""},
|
HashedToken: whereHelperstring{field: "\"invites\".\"hashed_token\""},
|
||||||
CreatedBy: whereHelperint64{field: "\"invites\".\"created_by\""},
|
CreatedBy: whereHelperint64{field: "\"invites\".\"created_by\""},
|
||||||
CreatedAt: whereHelpertime_Time{field: "\"invites\".\"created_at\""},
|
CreatedAt: whereHelpertime_Time{field: "\"invites\".\"created_at\""},
|
||||||
AliasSuggestion: whereHelperstring{field: "\"invites\".\"alias_suggestion\""},
|
|
||||||
Active: whereHelperbool{field: "\"invites\".\"active\""},
|
Active: whereHelperbool{field: "\"invites\".\"active\""},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,9 +92,9 @@ func (*inviteR) NewStruct() *inviteR {
|
||||||
type inviteL struct{}
|
type inviteL struct{}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
inviteAllColumns = []string{"id", "hashed_token", "created_by", "created_at", "alias_suggestion", "active"}
|
inviteAllColumns = []string{"id", "hashed_token", "created_by", "created_at", "active"}
|
||||||
inviteColumnsWithoutDefault = []string{}
|
inviteColumnsWithoutDefault = []string{}
|
||||||
inviteColumnsWithDefault = []string{"id", "hashed_token", "created_by", "created_at", "alias_suggestion", "active"}
|
inviteColumnsWithDefault = []string{"id", "hashed_token", "created_by", "created_at", "active"}
|
||||||
invitePrimaryKeyColumns = []string{"id"}
|
invitePrimaryKeyColumns = []string{"id"}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ import (
|
||||||
type Member struct {
|
type Member struct {
|
||||||
ID int64 `boil:"id" json:"id" toml:"id" yaml:"id"`
|
ID int64 `boil:"id" json:"id" toml:"id" yaml:"id"`
|
||||||
Role int64 `boil:"role" json:"role" toml:"role" yaml:"role"`
|
Role int64 `boil:"role" json:"role" toml:"role" yaml:"role"`
|
||||||
Nick string `boil:"nick" json:"nick" toml:"nick" yaml:"nick"`
|
|
||||||
PubKey roomdb.DBFeedRef `boil:"pub_key" json:"pub_key" toml:"pub_key" yaml:"pub_key"`
|
PubKey roomdb.DBFeedRef `boil:"pub_key" json:"pub_key" toml:"pub_key" yaml:"pub_key"`
|
||||||
|
|
||||||
R *memberR `boil:"-" json:"-" toml:"-" yaml:"-"`
|
R *memberR `boil:"-" json:"-" toml:"-" yaml:"-"`
|
||||||
|
@ -35,12 +34,10 @@ type Member struct {
|
||||||
var MemberColumns = struct {
|
var MemberColumns = struct {
|
||||||
ID string
|
ID string
|
||||||
Role string
|
Role string
|
||||||
Nick string
|
|
||||||
PubKey string
|
PubKey string
|
||||||
}{
|
}{
|
||||||
ID: "id",
|
ID: "id",
|
||||||
Role: "role",
|
Role: "role",
|
||||||
Nick: "nick",
|
|
||||||
PubKey: "pub_key",
|
PubKey: "pub_key",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,12 +46,10 @@ var MemberColumns = struct {
|
||||||
var MemberWhere = struct {
|
var MemberWhere = struct {
|
||||||
ID whereHelperint64
|
ID whereHelperint64
|
||||||
Role whereHelperint64
|
Role whereHelperint64
|
||||||
Nick whereHelperstring
|
|
||||||
PubKey whereHelperroomdb_DBFeedRef
|
PubKey whereHelperroomdb_DBFeedRef
|
||||||
}{
|
}{
|
||||||
ID: whereHelperint64{field: "\"members\".\"id\""},
|
ID: whereHelperint64{field: "\"members\".\"id\""},
|
||||||
Role: whereHelperint64{field: "\"members\".\"role\""},
|
Role: whereHelperint64{field: "\"members\".\"role\""},
|
||||||
Nick: whereHelperstring{field: "\"members\".\"nick\""},
|
|
||||||
PubKey: whereHelperroomdb_DBFeedRef{field: "\"members\".\"pub_key\""},
|
PubKey: whereHelperroomdb_DBFeedRef{field: "\"members\".\"pub_key\""},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,9 +83,9 @@ func (*memberR) NewStruct() *memberR {
|
||||||
type memberL struct{}
|
type memberL struct{}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
memberAllColumns = []string{"id", "role", "nick", "pub_key"}
|
memberAllColumns = []string{"id", "role", "pub_key"}
|
||||||
memberColumnsWithoutDefault = []string{}
|
memberColumnsWithoutDefault = []string{}
|
||||||
memberColumnsWithDefault = []string{"id", "role", "nick", "pub_key"}
|
memberColumnsWithDefault = []string{"id", "role", "pub_key"}
|
||||||
memberPrimaryKeyColumns = []string{"id"}
|
memberPrimaryKeyColumns = []string{"id"}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ func TestBasic(t *testing.T) {
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
feedA := refs.FeedRef{ID: bytes.Repeat([]byte("1312"), 8), Algo: refs.RefAlgoFeedSSB1}
|
feedA := refs.FeedRef{ID: bytes.Repeat([]byte("1312"), 8), Algo: refs.RefAlgoFeedSSB1}
|
||||||
memberID, err := db.Members.Add(ctx, "testNick", feedA, roomdb.RoleMember)
|
memberID, err := db.Members.Add(ctx, feedA, roomdb.RoleMember)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotEqual(t, 0, memberID)
|
require.NotEqual(t, 0, memberID)
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,6 @@ type Alias struct {
|
||||||
// Member holds all the information an internal user of the room has.
|
// Member holds all the information an internal user of the room has.
|
||||||
type Member struct {
|
type Member struct {
|
||||||
ID int64
|
ID int64
|
||||||
Nickname string // a common handle for the user (no-one want's to remember public keys)
|
|
||||||
Role Role
|
Role Role
|
||||||
PubKey refs.FeedRef
|
PubKey refs.FeedRef
|
||||||
}
|
}
|
||||||
|
@ -93,8 +92,6 @@ type Invite struct {
|
||||||
|
|
||||||
CreatedBy Member
|
CreatedBy Member
|
||||||
CreatedAt time.Time
|
CreatedAt time.Time
|
||||||
|
|
||||||
AliasSuggestion string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListEntry values are returned by the DenyListServices
|
// ListEntry values are returned by the DenyListServices
|
||||||
|
|
|
@ -59,9 +59,7 @@ func (h invitesHandler) create(w http.ResponseWriter, req *http.Request) (interf
|
||||||
return nil, fmt.Errorf("warning: no user session for elevated access request")
|
return nil, fmt.Errorf("warning: no user session for elevated access request")
|
||||||
}
|
}
|
||||||
|
|
||||||
aliasSuggestion := req.Form.Get("alias_suggestion")
|
token, err := h.db.Create(req.Context(), member.ID)
|
||||||
|
|
||||||
token, err := h.db.Create(req.Context(), member.ID, aliasSuggestion)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -73,8 +71,6 @@ func (h invitesHandler) create(w http.ResponseWriter, req *http.Request) (interf
|
||||||
|
|
||||||
return map[string]interface{}{
|
return map[string]interface{}{
|
||||||
"FacadeURL": facadeURL.String(),
|
"FacadeURL": facadeURL.String(),
|
||||||
|
|
||||||
"AliasSuggestion": aliasSuggestion,
|
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,9 +22,9 @@ func TestInvitesOverview(t *testing.T) {
|
||||||
testUser := roomdb.Member{ID: 23}
|
testUser := roomdb.Member{ID: 23}
|
||||||
|
|
||||||
lst := []roomdb.Invite{
|
lst := []roomdb.Invite{
|
||||||
{ID: 1, CreatedBy: testUser, AliasSuggestion: "foo"},
|
{ID: 1, CreatedBy: testUser},
|
||||||
{ID: 2, CreatedBy: testUser, AliasSuggestion: "bar"},
|
{ID: 2, CreatedBy: testUser},
|
||||||
{ID: 3, CreatedBy: testUser, AliasSuggestion: "baz"},
|
{ID: 3, CreatedBy: testUser},
|
||||||
}
|
}
|
||||||
ts.InvitesDB.ListReturns(lst, nil)
|
ts.InvitesDB.ListReturns(lst, nil)
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ func TestInvitesOverview(t *testing.T) {
|
||||||
a.EqualValues(3, html.Find(trSelector).Length()/2, "wrong number of entries on the table (plural)")
|
a.EqualValues(3, html.Find(trSelector).Length()/2, "wrong number of entries on the table (plural)")
|
||||||
|
|
||||||
lst = []roomdb.Invite{
|
lst = []roomdb.Invite{
|
||||||
{ID: 666, CreatedBy: testUser, AliasSuggestion: "single entry"},
|
{ID: 666, CreatedBy: testUser},
|
||||||
}
|
}
|
||||||
ts.InvitesDB.ListReturns(lst, nil)
|
ts.InvitesDB.ListReturns(lst, nil)
|
||||||
|
|
||||||
|
@ -110,15 +110,12 @@ func TestInvitesCreate(t *testing.T) {
|
||||||
testInvite := "your-fake-test-invite"
|
testInvite := "your-fake-test-invite"
|
||||||
ts.InvitesDB.CreateReturns(testInvite, nil)
|
ts.InvitesDB.CreateReturns(testInvite, nil)
|
||||||
|
|
||||||
rec := ts.Client.PostForm(urlRemove.String(), url.Values{
|
rec := ts.Client.PostForm(urlRemove.String(), url.Values{})
|
||||||
"alias_suggestion": []string{"jerry"},
|
|
||||||
})
|
|
||||||
a.Equal(http.StatusOK, rec.Code)
|
a.Equal(http.StatusOK, rec.Code)
|
||||||
|
|
||||||
r.Equal(1, ts.InvitesDB.CreateCallCount(), "expected one invites.Create call")
|
r.Equal(1, ts.InvitesDB.CreateCallCount(), "expected one invites.Create call")
|
||||||
_, userID, aliasSuggestion := ts.InvitesDB.CreateArgsForCall(0)
|
_, userID := ts.InvitesDB.CreateArgsForCall(0)
|
||||||
a.EqualValues(ts.User.ID, userID)
|
a.EqualValues(ts.User.ID, userID)
|
||||||
a.EqualValues("jerry", aliasSuggestion)
|
|
||||||
|
|
||||||
doc, err := goquery.NewDocumentFromReader(rec.Body)
|
doc, err := goquery.NewDocumentFromReader(rec.Body)
|
||||||
require.NoError(t, err, "failed to parse response")
|
require.NoError(t, err, "failed to parse response")
|
||||||
|
|
|
@ -38,13 +38,6 @@ func (h membersHandler) add(w http.ResponseWriter, req *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
memberNick := req.Form.Get("nick")
|
|
||||||
if memberNick == "" {
|
|
||||||
// TODO: proper error type
|
|
||||||
h.r.Error(w, req, http.StatusBadRequest, fmt.Errorf("bad nick: %q", memberNick))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
newEntry := req.Form.Get("pub_key")
|
newEntry := req.Form.Get("pub_key")
|
||||||
newEntryParsed, err := refs.ParseFeedRef(newEntry)
|
newEntryParsed, err := refs.ParseFeedRef(newEntry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -53,7 +46,7 @@ func (h membersHandler) add(w http.ResponseWriter, req *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = h.db.Add(req.Context(), memberNick, *newEntryParsed, roomdb.RoleMember)
|
_, err = h.db.Add(req.Context(), *newEntryParsed, roomdb.RoleMember)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
code := http.StatusInternalServerError
|
code := http.StatusInternalServerError
|
||||||
var aa roomdb.ErrAlreadyAdded
|
var aa roomdb.ErrAlreadyAdded
|
||||||
|
|
|
@ -63,22 +63,19 @@ func TestMembersAdd(t *testing.T) {
|
||||||
|
|
||||||
webassert.ElementsInForm(t, formSelection, []webassert.FormElement{
|
webassert.ElementsInForm(t, formSelection, []webassert.FormElement{
|
||||||
{Name: "pub_key", Type: "text"},
|
{Name: "pub_key", Type: "text"},
|
||||||
{Name: "nick", Type: "text"},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
newKey := "@x7iOLUcq3o+sjGeAnipvWeGzfuYgrXl8L4LYlxIhwDc=.ed25519"
|
newKey := "@x7iOLUcq3o+sjGeAnipvWeGzfuYgrXl8L4LYlxIhwDc=.ed25519"
|
||||||
addVals := url.Values{
|
addVals := url.Values{
|
||||||
// just any key that looks valid
|
// just any key that looks valid
|
||||||
"pub_key": []string{newKey},
|
"pub_key": []string{newKey},
|
||||||
"nick": []string{"test-member"},
|
|
||||||
}
|
}
|
||||||
rec := ts.Client.PostForm(addURL.String(), addVals)
|
rec := ts.Client.PostForm(addURL.String(), addVals)
|
||||||
a.Equal(http.StatusFound, rec.Code)
|
a.Equal(http.StatusFound, rec.Code)
|
||||||
|
|
||||||
a.Equal(1, ts.MembersDB.AddCallCount())
|
a.Equal(1, ts.MembersDB.AddCallCount())
|
||||||
_, addedNick, addedPubKey, addedRole := ts.MembersDB.AddArgsForCall(0)
|
_, addedPubKey, addedRole := ts.MembersDB.AddArgsForCall(0)
|
||||||
a.Equal(newKey, addedPubKey.Ref())
|
a.Equal(newKey, addedPubKey.Ref())
|
||||||
a.Equal("test-member", addedNick)
|
|
||||||
a.Equal(roomdb.RoleMember, addedRole)
|
a.Equal(roomdb.RoleMember, addedRole)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -116,9 +113,9 @@ func TestMembers(t *testing.T) {
|
||||||
a := assert.New(t)
|
a := assert.New(t)
|
||||||
|
|
||||||
lst := []roomdb.Member{
|
lst := []roomdb.Member{
|
||||||
{ID: 1, Nickname: "one", Role: roomdb.RoleMember, PubKey: refs.FeedRef{ID: bytes.Repeat([]byte{0}, 32), Algo: "fake"}},
|
{ID: 1, Role: roomdb.RoleMember, PubKey: refs.FeedRef{ID: bytes.Repeat([]byte{0}, 32), Algo: "fake"}},
|
||||||
{ID: 2, Nickname: "two", Role: roomdb.RoleModerator, PubKey: refs.FeedRef{ID: bytes.Repeat([]byte("1312"), 8), Algo: "test"}},
|
{ID: 2, Role: roomdb.RoleModerator, PubKey: refs.FeedRef{ID: bytes.Repeat([]byte("1312"), 8), Algo: "test"}},
|
||||||
{ID: 3, Nickname: "three", Role: roomdb.RoleAdmin, PubKey: refs.FeedRef{ID: bytes.Repeat([]byte("acab"), 8), Algo: "true"}},
|
{ID: 3, Role: roomdb.RoleAdmin, PubKey: refs.FeedRef{ID: bytes.Repeat([]byte("acab"), 8), Algo: "true"}},
|
||||||
}
|
}
|
||||||
ts.MembersDB.ListReturns(lst, nil)
|
ts.MembersDB.ListReturns(lst, nil)
|
||||||
|
|
||||||
|
@ -134,7 +131,7 @@ func TestMembers(t *testing.T) {
|
||||||
a.EqualValues(html.Find("#theList li").Length(), 3)
|
a.EqualValues(html.Find("#theList li").Length(), 3)
|
||||||
|
|
||||||
lst = []roomdb.Member{
|
lst = []roomdb.Member{
|
||||||
{ID: 666, Nickname: "four", Role: roomdb.RoleAdmin, PubKey: refs.FeedRef{ID: bytes.Repeat([]byte{1}, 32), Algo: "one"}},
|
{ID: 666, Role: roomdb.RoleAdmin, PubKey: refs.FeedRef{ID: bytes.Repeat([]byte{1}, 32), Algo: "one"}},
|
||||||
}
|
}
|
||||||
ts.MembersDB.ListReturns(lst, nil)
|
ts.MembersDB.ListReturns(lst, nil)
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,6 @@ func newSession(t *testing.T) *testSession {
|
||||||
// fake user
|
// fake user
|
||||||
ts.User = roomdb.Member{
|
ts.User = roomdb.Member{
|
||||||
ID: 1234,
|
ID: 1234,
|
||||||
Nickname: "room mate",
|
|
||||||
Role: roomdb.RoleModerator,
|
Role: roomdb.RoleModerator,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -189,7 +189,7 @@ func TestAuthWithSSBClientInitNotConnected(t *testing.T) {
|
||||||
a, r := assert.New(t), require.New(t)
|
a, r := assert.New(t), require.New(t)
|
||||||
|
|
||||||
// the client is a member but not connected right now
|
// the client is a member but not connected right now
|
||||||
ts.MembersDB.GetByFeedReturns(roomdb.Member{ID: 1234, Nickname: "test-member"}, nil)
|
ts.MembersDB.GetByFeedReturns(roomdb.Member{ID: 1234}, nil)
|
||||||
ts.MockedEndpoints.GetEndpointForReturns(nil, false)
|
ts.MockedEndpoints.GetEndpointForReturns(nil, false)
|
||||||
|
|
||||||
client, err := keys.NewKeyPair(nil)
|
client, err := keys.NewKeyPair(nil)
|
||||||
|
@ -259,7 +259,7 @@ func TestAuthWithSSBClientInitHasClient(t *testing.T) {
|
||||||
payload.ServerID = ts.NetworkInfo.RoomID
|
payload.ServerID = ts.NetworkInfo.RoomID
|
||||||
|
|
||||||
// the keypair for our client
|
// the keypair for our client
|
||||||
testMember := roomdb.Member{ID: 1234, Nickname: "test-member"}
|
testMember := roomdb.Member{ID: 1234}
|
||||||
client, err := keys.NewKeyPair(nil)
|
client, err := keys.NewKeyPair(nil)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
testMember.PubKey = client.Feed
|
testMember.PubKey = client.Feed
|
||||||
|
@ -385,7 +385,7 @@ func TestAuthWithSSBServerInitHappyPath(t *testing.T) {
|
||||||
a, r := assert.New(t), require.New(t)
|
a, r := assert.New(t), require.New(t)
|
||||||
|
|
||||||
// the keypair for our client
|
// the keypair for our client
|
||||||
testMember := roomdb.Member{ID: 1234, Nickname: "test-member"}
|
testMember := roomdb.Member{ID: 1234}
|
||||||
client, err := keys.NewKeyPair(nil)
|
client, err := keys.NewKeyPair(nil)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
testMember.PubKey = client.Feed
|
testMember.PubKey = client.Feed
|
||||||
|
@ -512,7 +512,7 @@ func TestAuthWithSSBServerInitWrongSolution(t *testing.T) {
|
||||||
a, r := assert.New(t), require.New(t)
|
a, r := assert.New(t), require.New(t)
|
||||||
|
|
||||||
// the keypair for our client
|
// the keypair for our client
|
||||||
testMember := roomdb.Member{ID: 1234, Nickname: "test-member"}
|
testMember := roomdb.Member{ID: 1234}
|
||||||
client, err := keys.NewKeyPair(nil)
|
client, err := keys.NewKeyPair(nil)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
testMember.PubKey = client.Feed
|
testMember.PubKey = client.Feed
|
||||||
|
|
|
@ -69,10 +69,7 @@ func TestInviteShowAcceptForm(t *testing.T) {
|
||||||
r.NotNil(validAcceptURL)
|
r.NotNil(validAcceptURL)
|
||||||
|
|
||||||
// prep the mocked db for http:200
|
// prep the mocked db for http:200
|
||||||
fakeExistingInvite := roomdb.Invite{
|
fakeExistingInvite := roomdb.Invite{ID: 1234}
|
||||||
ID: 1234,
|
|
||||||
AliasSuggestion: "bestie",
|
|
||||||
}
|
|
||||||
ts.InvitesDB.GetByTokenReturns(fakeExistingInvite, nil)
|
ts.InvitesDB.GetByTokenReturns(fakeExistingInvite, nil)
|
||||||
|
|
||||||
// request the form
|
// request the form
|
||||||
|
@ -247,8 +244,6 @@ func TestInviteConsumeInviteJSON(t *testing.T) {
|
||||||
testToken := "existing-test-token-2"
|
testToken := "existing-test-token-2"
|
||||||
validAcceptURL := urlTo(router.CompleteInviteFacade, "token", testToken)
|
validAcceptURL := urlTo(router.CompleteInviteFacade, "token", testToken)
|
||||||
r.NotNil(validAcceptURL)
|
r.NotNil(validAcceptURL)
|
||||||
validAcceptURL.Host = "localhost"
|
|
||||||
validAcceptURL.Scheme = "https"
|
|
||||||
|
|
||||||
testInvite := roomdb.Invite{ID: 4321}
|
testInvite := roomdb.Invite{ID: 4321}
|
||||||
ts.InvitesDB.GetByTokenReturns(testInvite, nil)
|
ts.InvitesDB.GetByTokenReturns(testInvite, nil)
|
||||||
|
@ -264,10 +259,8 @@ func TestInviteConsumeInviteJSON(t *testing.T) {
|
||||||
consume.ID = testNewMember
|
consume.ID = testNewMember
|
||||||
|
|
||||||
// construct the consume endpoint url
|
// construct the consume endpoint url
|
||||||
consumeInviteURL, err := ts.Router.Get(router.CompleteInviteConsume).URL()
|
consumeInviteURL := urlTo(router.CompleteInviteConsume)
|
||||||
r.Nil(err)
|
r.NotNil(consumeInviteURL)
|
||||||
consumeInviteURL.Host = "localhost"
|
|
||||||
consumeInviteURL.Scheme = "https"
|
|
||||||
|
|
||||||
// prepare the mock
|
// prepare the mock
|
||||||
ts.InvitesDB.ConsumeReturns(testInvite, nil)
|
ts.InvitesDB.ConsumeReturns(testInvite, nil)
|
||||||
|
@ -283,7 +276,7 @@ func TestInviteConsumeInviteJSON(t *testing.T) {
|
||||||
a.True(newMemberRef.Equal(&testNewMember))
|
a.True(newMemberRef.Equal(&testNewMember))
|
||||||
|
|
||||||
var jsonConsumeResp inviteConsumeJSONResponse
|
var jsonConsumeResp inviteConsumeJSONResponse
|
||||||
err = json.NewDecoder(resp.Body).Decode(&jsonConsumeResp)
|
err := json.NewDecoder(resp.Body).Decode(&jsonConsumeResp)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
|
|
||||||
a.Equal("successful", jsonConsumeResp.Status)
|
a.Equal("successful", jsonConsumeResp.Status)
|
||||||
|
|
|
@ -121,10 +121,7 @@ func TestNoticesEditButtonVisible(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// have the database return okay for any user
|
// have the database return okay for any user
|
||||||
testUser := roomdb.Member{
|
testUser := roomdb.Member{ID: 23}
|
||||||
ID: 23,
|
|
||||||
Nickname: "test admin",
|
|
||||||
}
|
|
||||||
ts.AuthFallbackDB.CheckReturns(testUser.ID, nil)
|
ts.AuthFallbackDB.CheckReturns(testUser.ID, nil)
|
||||||
ts.MembersDB.GetByIDReturns(testUser, nil)
|
ts.MembersDB.GetByIDReturns(testUser, nil)
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,5 @@
|
||||||
>{{i18n "AdminInviteCreatedWelcome"}}</span>
|
>{{i18n "AdminInviteCreatedWelcome"}}</span>
|
||||||
|
|
||||||
<pre id="invite-facade-link">{{.FacadeURL}}</pre>
|
<pre id="invite-facade-link">{{.FacadeURL}}</pre>
|
||||||
|
|
||||||
{{if ne .AliasSuggestion ""}}
|
|
||||||
<!-- https://github.com/ssb-ngi-pointer/go-ssb-room/issues/60 -->
|
|
||||||
<p>{{i18n "AdminInviteSuggestedAliasIs"}} {{.AliasSuggestion}}</p>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
|
@ -42,7 +42,6 @@
|
||||||
<tr class="hidden sm:table-row h-8 uppercase text-sm text-gray-400">
|
<tr class="hidden sm:table-row h-8 uppercase text-sm text-gray-400">
|
||||||
<th class="w-10 text-center pl-3 pr-6">{{i18n "AdminInvitesCreatedAtColumn"}}</th>
|
<th class="w-10 text-center pl-3 pr-6">{{i18n "AdminInvitesCreatedAtColumn"}}</th>
|
||||||
<th class="w-1/2 text-left px-6">{{i18n "AdminInvitesCreatorColumn"}}</th>
|
<th class="w-1/2 text-left px-6">{{i18n "AdminInvitesCreatorColumn"}}</th>
|
||||||
<th class="w-1/2 text-left px-6">{{i18n "AdminInvitesAliasColumn"}}</th>
|
|
||||||
<th class="w-0"></th>
|
<th class="w-0"></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -55,8 +54,6 @@
|
||||||
<span class="tooltip">{{.CreatedAt.Format "2006-01-02T15:04:05.00"}}</span>
|
<span class="tooltip">{{.CreatedAt.Format "2006-01-02T15:04:05.00"}}</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6">{{.CreatedBy.Nickname}}</td>
|
|
||||||
<td class="px-6">{{if ne .AliasSuggestion ""}}{{.AliasSuggestion}}{{end}}</td>
|
|
||||||
<td class="pl-2 pr-3">
|
<td class="pl-2 pr-3">
|
||||||
<a
|
<a
|
||||||
href="{{urlTo "admin:invites:revoke:confirm" "id" .ID}}"
|
href="{{urlTo "admin:invites:revoke:confirm" "id" .ID}}"
|
||||||
|
@ -66,7 +63,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="h-12 table-row sm:hidden">
|
<tr class="h-12 table-row sm:hidden">
|
||||||
<td class="flex flex-row items-center" colspan="4">
|
<td class="flex flex-row items-center" colspan="4">
|
||||||
<span class="flex-1">{{i18n "AdminInvitesSummaryFrom"}} <b>{{.CreatedBy.Nickname}}</b> {{i18n "AdminInvitesSummaryTo"}} <b>{{if ne .AliasSuggestion ""}}{{.AliasSuggestion}}{{else}}?{{end}}</b></span>
|
<span class="flex-1">{{i18n "AdminInvitesSummaryFrom"}} <b>{{.CreatedBy.PubKey.Ref }}</b> {{i18n "AdminInvitesSummaryTo"}}</span>
|
||||||
<a
|
<a
|
||||||
href="{{urlTo "admin:invites:revoke:confirm" "id" .ID}}"
|
href="{{urlTo "admin:invites:revoke:confirm" "id" .ID}}"
|
||||||
class="pl-4 w-20 py-2 text-center text-gray-400 hover:text-red-600 font-bold cursor-pointer"
|
class="pl-4 w-20 py-2 text-center text-gray-400 hover:text-red-600 font-bold cursor-pointer"
|
||||||
|
|
|
@ -19,12 +19,6 @@
|
||||||
>
|
>
|
||||||
{{ .csrfField }}
|
{{ .csrfField }}
|
||||||
<div class="flex flex-row items-center h-12">
|
<div class="flex flex-row items-center h-12">
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
name="nick"
|
|
||||||
placeholder="member nickname"
|
|
||||||
class="font-mono truncate w-1/2 tracking-wider h-12 text-gray-900 focus:outline-none focus:ring-1 focus:ring-green-500 focus:border-transparent placeholder-gray-300"
|
|
||||||
>
|
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="pub_key"
|
name="pub_key"
|
||||||
|
@ -40,9 +34,6 @@
|
||||||
</form>
|
</form>
|
||||||
{{range $index, $member := .Entries}}
|
{{range $index, $member := .Entries}}
|
||||||
<li class="flex flex-row items-center h-12">
|
<li class="flex flex-row items-center h-12">
|
||||||
<span
|
|
||||||
class="font-mono truncate flex-auto text-gray-600 tracking-wider w-1/3"
|
|
||||||
>{{$member.Nickname}}</span>
|
|
||||||
|
|
||||||
<form
|
<form
|
||||||
class="change-member-role"
|
class="change-member-role"
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
<svg class="text-green-500 w-4 h-4 mr-1" viewBox="0 0 24 24">
|
<svg class="text-green-500 w-4 h-4 mr-1" viewBox="0 0 24 24">
|
||||||
<path fill="currentColor" d="M22,18V22H18V19H15V16H12L9.74,13.74C9.19,13.91 8.61,14 8,14A6,6 0 0,1 2,8A6,6 0 0,1 8,2A6,6 0 0,1 14,8C14,8.61 13.91,9.19 13.74,9.74L22,18M7,5A2,2 0 0,0 5,7A2,2 0 0,0 7,9A2,2 0 0,0 9,7A2,2 0 0,0 7,5Z" />
|
<path fill="currentColor" d="M22,18V22H18V19H15V16H12L9.74,13.74C9.19,13.91 8.61,14 8,14A6,6 0 0,1 2,8A6,6 0 0,1 8,2A6,6 0 0,1 14,8C14,8.61 13.91,9.19 13.74,9.74L22,18M7,5A2,2 0 0,0 5,7A2,2 0 0,0 7,9A2,2 0 0,0 9,7A2,2 0 0,0 7,5Z" />
|
||||||
</svg>
|
</svg>
|
||||||
<span class="text-green-500 text-sm truncate w-32">{{$user.Nickname}} {{$user.PubKey.Ref}}</span>
|
<span class="text-green-500 text-sm truncate w-32">{{$user.PubKey.Ref}}</span>
|
||||||
</div>
|
</div>
|
||||||
<a
|
<a
|
||||||
href="{{urlTo "auth:logout"}}"
|
href="{{urlTo "auth:logout"}}"
|
||||||
|
|
Loading…
Reference in New Issue