have a clear error on taken aliases

fixes #194
This commit is contained in:
Henry 2021-05-10 13:51:05 +02:00 committed by GitHub
parent ae1fd47ad9
commit 7c75b27c8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 67 additions and 2 deletions

View File

@ -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)
}

View File

@ -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, &registerResponse, 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())

View File

@ -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
})
}

View File

@ -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)
}

View File

@ -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