2021-10-08 12:39:31 +00:00
|
|
|
// SPDX-FileCopyrightText: 2021 The NGI Pointer Secure-Scuttlebutt Team of 2020/2021
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
2021-03-02 16:14:02 +00:00
|
|
|
package sqlite
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"context"
|
|
|
|
"encoding/base64"
|
|
|
|
"math/rand"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"testing"
|
2021-03-16 16:13:01 +00:00
|
|
|
"time"
|
2021-03-02 16:14:02 +00:00
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
2021-03-10 15:44:46 +00:00
|
|
|
|
2022-11-07 09:18:13 +00:00
|
|
|
refs "github.com/ssbc/go-ssb-refs"
|
|
|
|
"github.com/ssbc/go-ssb-room/v2/internal/repo"
|
|
|
|
"github.com/ssbc/go-ssb-room/v2/roomdb"
|
2021-03-02 16:14:02 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestInvites(t *testing.T) {
|
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
testRepo := filepath.Join("testrun", t.Name())
|
|
|
|
os.RemoveAll(testRepo)
|
|
|
|
tr := repo.New(testRepo)
|
|
|
|
|
|
|
|
// fake feed for testing, looks ok at least
|
2022-11-07 09:18:13 +00:00
|
|
|
newMember, err := refs.NewFeedRefFromBytes(bytes.Repeat([]byte("acab"), 8), refs.RefAlgoFeedSSB1)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
2021-03-02 16:14:02 +00:00
|
|
|
|
|
|
|
db, err := Open(tr)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
t.Run("try to consume invalid token", func(t *testing.T) {
|
|
|
|
r := require.New(t)
|
|
|
|
|
|
|
|
lst, err := db.Invites.List(ctx)
|
|
|
|
r.NoError(err, "failed to get empty list of tokens")
|
|
|
|
r.Len(lst, 0, "expected no active invites")
|
|
|
|
|
|
|
|
randToken := make([]byte, 32)
|
|
|
|
rand.Read(randToken)
|
|
|
|
|
|
|
|
_, err = db.Invites.Consume(ctx, string(randToken), newMember)
|
|
|
|
r.Error(err, "expected error for inactive invite")
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("user needs to exist", func(t *testing.T) {
|
|
|
|
r := require.New(t)
|
|
|
|
|
2021-03-29 08:23:03 +00:00
|
|
|
_, err := db.Invites.Create(ctx, 666)
|
2021-03-02 16:14:02 +00:00
|
|
|
r.Error(err, "can't create invite for invalid user")
|
|
|
|
})
|
|
|
|
|
2022-11-07 09:18:13 +00:00
|
|
|
invitingMember, err := refs.NewFeedRefFromBytes(bytes.Repeat([]byte("ohai"), 8), refs.RefAlgoFeedSSB1)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
2021-03-29 08:23:03 +00:00
|
|
|
mid, err := db.Members.Add(ctx, invitingMember, roomdb.RoleModerator)
|
2021-03-02 16:14:02 +00:00
|
|
|
require.NoError(t, err, "failed to create test user")
|
|
|
|
|
2021-11-11 20:08:28 +00:00
|
|
|
aliasString := "alias"
|
|
|
|
|
|
|
|
err = db.Aliases.Register(ctx, aliasString, invitingMember, []byte("signature"))
|
|
|
|
require.NoError(t, err, "failed to create an alias for the test user")
|
|
|
|
|
2021-03-02 16:14:02 +00:00
|
|
|
t.Run("simple create and consume", func(t *testing.T) {
|
|
|
|
r := require.New(t)
|
|
|
|
|
2021-03-16 16:13:01 +00:00
|
|
|
// i really don't want to do a mocked time functions and rather solve the comment in migration 6 instead
|
|
|
|
before := time.Now()
|
|
|
|
|
2021-03-29 08:23:03 +00:00
|
|
|
tok, err := db.Invites.Create(ctx, mid)
|
2021-03-02 16:14:02 +00:00
|
|
|
r.NoError(err, "failed to create invite token")
|
|
|
|
|
|
|
|
_, err = base64.URLEncoding.DecodeString(tok)
|
|
|
|
r.NoError(err, "not a valid base64 string")
|
|
|
|
|
|
|
|
lst, err := db.Invites.List(ctx)
|
|
|
|
r.NoError(err, "failed to get list of tokens")
|
|
|
|
r.Len(lst, 1, "expected 1 invite")
|
|
|
|
|
2021-03-16 16:13:01 +00:00
|
|
|
r.True(lst[0].CreatedAt.After(before), "expected CreatedAt to be after the start marker")
|
2021-11-11 20:08:28 +00:00
|
|
|
r.NotEmpty(lst[0].CreatedBy.Aliases, "expected aliases of the user to be populated")
|
|
|
|
r.Equal(aliasString, lst[0].CreatedBy.Aliases[0].Name, "alias name should be populated")
|
2021-03-02 16:14:02 +00:00
|
|
|
|
2021-03-19 09:32:04 +00:00
|
|
|
_, nope := db.Members.GetByFeed(ctx, newMember)
|
|
|
|
r.Error(nope, "expected feed to not yet be on the allow list")
|
2021-03-08 13:06:45 +00:00
|
|
|
|
2021-03-26 19:08:13 +00:00
|
|
|
gotInv, err := db.Invites.GetByToken(ctx, tok)
|
|
|
|
r.NoError(err)
|
|
|
|
r.Equal(lst[0].ID, gotInv.ID)
|
|
|
|
|
2021-03-02 16:14:02 +00:00
|
|
|
inv, err := db.Invites.Consume(ctx, tok, newMember)
|
|
|
|
r.NoError(err, "failed to consume the invite")
|
|
|
|
r.NotEqualValues(0, inv.ID, "invite ID unset")
|
2021-03-16 16:13:01 +00:00
|
|
|
r.True(inv.CreatedAt.After(before), "expected CreatedAt to be after the start marker")
|
2021-03-02 16:14:02 +00:00
|
|
|
|
2021-03-08 13:06:45 +00:00
|
|
|
// consume also adds it to the allow list
|
2021-03-19 09:32:04 +00:00
|
|
|
_, yes := db.Members.GetByFeed(ctx, newMember)
|
|
|
|
r.NoError(yes, "expected feed on the allow list")
|
2021-03-08 13:06:45 +00:00
|
|
|
|
2021-03-02 16:14:02 +00:00
|
|
|
lst, err = db.Invites.List(ctx)
|
|
|
|
r.NoError(err, "failed to get list of tokens post consume")
|
|
|
|
r.Len(lst, 0, "expected no active invites")
|
|
|
|
|
|
|
|
// can't use twice
|
|
|
|
_, err = db.Invites.Consume(ctx, tok, newMember)
|
|
|
|
r.Error(err, "failed to consume the invite")
|
2021-03-08 13:06:45 +00:00
|
|
|
|
2021-03-02 16:14:02 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("simple create but revoke before use", func(t *testing.T) {
|
|
|
|
r := require.New(t)
|
|
|
|
|
2021-03-29 08:23:03 +00:00
|
|
|
tok, err := db.Invites.Create(ctx, mid)
|
2021-03-02 16:14:02 +00:00
|
|
|
r.NoError(err, "failed to create invite token")
|
|
|
|
|
|
|
|
lst, err := db.Invites.List(ctx)
|
|
|
|
r.NoError(err, "failed to get list of tokens")
|
|
|
|
r.Len(lst, 1, "expected 1 invite")
|
|
|
|
|
|
|
|
err = db.Invites.Revoke(ctx, lst[0].ID)
|
|
|
|
r.NoError(err, "failed to consume the invite")
|
|
|
|
|
|
|
|
lst, err = db.Invites.List(ctx)
|
|
|
|
r.NoError(err, "failed to get list of tokens post consume")
|
|
|
|
r.Len(lst, 0, "expected no active invites")
|
|
|
|
|
|
|
|
// can't use twice
|
|
|
|
_, err = db.Invites.Consume(ctx, tok, newMember)
|
|
|
|
r.Error(err, "failed to consume the invite")
|
|
|
|
})
|
|
|
|
|
2022-03-28 10:48:00 +00:00
|
|
|
t.Run("invite member again", func(t *testing.T) {
|
|
|
|
r := require.New(t)
|
|
|
|
|
|
|
|
tok, err := db.Invites.Create(ctx, mid)
|
|
|
|
r.NoError(err, "failed to create invite token")
|
|
|
|
|
|
|
|
lst, err := db.Invites.List(ctx)
|
|
|
|
r.NoError(err, "failed to get list of tokens")
|
|
|
|
r.Len(lst, 1, "expected 1 invite")
|
|
|
|
|
|
|
|
_, err = db.Invites.Consume(ctx, tok, newMember)
|
|
|
|
r.NoError(err, "failed to consume the invite")
|
|
|
|
|
|
|
|
lst, err = db.Invites.List(ctx)
|
|
|
|
r.NoError(err, "failed to get list of tokens post consume")
|
|
|
|
r.Len(lst, 0, "expected no active invites")
|
|
|
|
})
|
2021-03-02 16:14:02 +00:00
|
|
|
}
|