parent
ae1fd47ad9
commit
7c75b27c8d
|
@ -7,6 +7,7 @@ import (
|
|||
"context"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
|
@ -99,6 +100,10 @@ func (h Handler) Register(ctx context.Context, req *muxrpc.Request) (interface{}
|
|||
|
||||
err = h.db.Register(ctx, confirmation.Alias, confirmation.UserID, confirmation.Signature)
|
||||
if err != nil {
|
||||
var takenErr roomdb.ErrAliasTaken
|
||||
if errors.As(err, &takenErr) {
|
||||
return nil, takenErr
|
||||
}
|
||||
return nil, fmt.Errorf("registerAlias: could not register alias: %w", err)
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"context"
|
||||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"net/url"
|
||||
"testing"
|
||||
"time"
|
||||
|
@ -105,6 +106,14 @@ func TestAliasRegister(t *testing.T) {
|
|||
|
||||
t.Log("alias stored")
|
||||
|
||||
// check taken error
|
||||
err = clientForServer.Async(ctx, ®isterResponse, muxrpc.TypeString, muxrpc.Method{"room", "registerAlias"}, "bob", sig)
|
||||
r.Error(err)
|
||||
|
||||
var callErr *muxrpc.CallError
|
||||
r.True(errors.As(err, &callErr), "expected a call error: %T", err)
|
||||
r.Equal(`alias ("bob") is already taken`, callErr.Message)
|
||||
|
||||
for _, bot := range theBots {
|
||||
bot.srv.Shutdown()
|
||||
r.NoError(bot.srv.Close())
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"database/sql"
|
||||
|
||||
"github.com/friendsofgo/errors"
|
||||
"github.com/mattn/go-sqlite3"
|
||||
"github.com/volatiletech/sqlboiler/v4/boil"
|
||||
"github.com/volatiletech/sqlboiler/v4/queries/qm"
|
||||
|
||||
|
@ -93,7 +94,10 @@ func (a Aliases) Register(ctx context.Context, alias string, userFeed refs.FeedR
|
|||
newEntry.Signature = signature
|
||||
|
||||
err = newEntry.Insert(ctx, tx, boil.Infer())
|
||||
|
||||
var sqlErr sqlite3.Error
|
||||
if errors.As(err, &sqlErr) && sqlErr.ExtendedCode == sqlite3.ErrConstraintUnique {
|
||||
return roomdb.ErrAliasTaken{Name: alias}
|
||||
}
|
||||
return err
|
||||
})
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ func TestAliases(t *testing.T) {
|
|||
err = db.Aliases.Register(ctx, testName, newMember, testSig)
|
||||
r.NoError(err)
|
||||
|
||||
// should have one member now
|
||||
// should have one alias now
|
||||
lst, err := db.Aliases.List(ctx)
|
||||
r.NoError(err)
|
||||
r.Len(lst, 1)
|
||||
|
@ -97,3 +97,42 @@ func TestAliases(t *testing.T) {
|
|||
r.EqualError(err, roomdb.ErrNotFound.Error())
|
||||
})
|
||||
}
|
||||
|
||||
func TestAliasesUniqueError(t *testing.T) {
|
||||
r := require.New(t)
|
||||
ctx := context.Background()
|
||||
|
||||
testRepo := filepath.Join("testrun", t.Name())
|
||||
os.RemoveAll(testRepo)
|
||||
tr := repo.New(testRepo)
|
||||
|
||||
db, err := Open(tr)
|
||||
r.NoError(err)
|
||||
|
||||
// fake feed for testing, looks ok at least
|
||||
newMember := refs.FeedRef{ID: bytes.Repeat([]byte("acab"), 8), Algo: refs.RefAlgoFeedSSB1}
|
||||
|
||||
// 64 bytes of random for testing (validation is handled by the handlers)
|
||||
testSig := make([]byte, 64)
|
||||
rand.Read(testSig)
|
||||
|
||||
testName := "thealias"
|
||||
|
||||
// allow the member
|
||||
_, err = db.Members.Add(ctx, newMember, roomdb.RoleMember)
|
||||
r.NoError(err)
|
||||
|
||||
err = db.Aliases.Register(ctx, testName, newMember, testSig)
|
||||
r.NoError(err)
|
||||
|
||||
// should have one alias now
|
||||
lst, err := db.Aliases.List(ctx)
|
||||
r.NoError(err)
|
||||
r.Len(lst, 1)
|
||||
|
||||
err = db.Aliases.Register(ctx, testName, newMember, testSig)
|
||||
r.Error(err)
|
||||
var takenErr roomdb.ErrAliasTaken
|
||||
r.True(errors.As(err, &takenErr), "expected a special error value")
|
||||
r.Equal(testName, takenErr.Name)
|
||||
}
|
||||
|
|
|
@ -26,6 +26,14 @@ type Alias struct {
|
|||
Signature []byte
|
||||
}
|
||||
|
||||
type ErrAliasTaken struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
func (e ErrAliasTaken) Error() string {
|
||||
return fmt.Sprintf("alias (%q) is already taken", e.Name)
|
||||
}
|
||||
|
||||
// Member holds all the information an internal user of the room has.
|
||||
type Member struct {
|
||||
ID int64
|
||||
|
|
Loading…
Reference in New Issue