implement Email as username
This commit is contained in:
@@ -24,9 +24,9 @@ func testCustomerValidKeyEntry(t *testing.T) {
|
|||||||
mockSvgInterface := make(SvgIdInterface, kp.TotalAttrs())
|
mockSvgInterface := make(SvgIdInterface, kp.TotalAttrs())
|
||||||
userInterface, err := NewUserInterface(&kp, mockSvgInterface)
|
userInterface, err := NewUserInterface(&kp, mockSvgInterface)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
username := Username("testing123")
|
userEmail := "testing@example.com"
|
||||||
passcodeIdx := []int{0, 1, 2, 3}
|
passcodeIdx := []int{0, 1, 2, 3}
|
||||||
user, err := NewUser(*customer, username, passcodeIdx, *userInterface, kp)
|
user, err := NewUser(*customer, userEmail, passcodeIdx, *userInterface, kp)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
userLoginInterface, err := user.GetLoginInterface()
|
userLoginInterface, err := user.GetLoginInterface()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
@@ -48,9 +48,9 @@ func testCustomerIsValidNKode(t *testing.T) {
|
|||||||
mockSvgInterface := make(SvgIdInterface, kp.TotalAttrs())
|
mockSvgInterface := make(SvgIdInterface, kp.TotalAttrs())
|
||||||
userInterface, err := NewUserInterface(&kp, mockSvgInterface)
|
userInterface, err := NewUserInterface(&kp, mockSvgInterface)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
username := Username("testing123")
|
userEmail := "testing123@example.com"
|
||||||
passcodeIdx := []int{0, 1, 2, 3}
|
passcodeIdx := []int{0, 1, 2, 3}
|
||||||
user, err := NewUser(*customer, username, passcodeIdx, *userInterface, kp)
|
user, err := NewUser(*customer, userEmail, passcodeIdx, *userInterface, kp)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
err = customer.IsValidNKode(user.Kp, passcodeIdx)
|
err = customer.IsValidNKode(user.Kp, passcodeIdx)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func (db *InMemoryDb) GetCustomer(id CustomerId) (*Customer, error) {
|
|||||||
return &customer, nil
|
return &customer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *InMemoryDb) GetUser(username Username, customerId CustomerId) (*User, error) {
|
func (db *InMemoryDb) GetUser(username Email, customerId CustomerId) (*User, error) {
|
||||||
key := userIdKey(customerId, username)
|
key := userIdKey(customerId, username)
|
||||||
userId, exists := db.userIdMap[key]
|
userId, exists := db.userIdMap[key]
|
||||||
if !exists {
|
if !exists {
|
||||||
@@ -53,14 +53,14 @@ func (db *InMemoryDb) WriteNewCustomer(customer Customer) error {
|
|||||||
func (db *InMemoryDb) WriteNewUser(user User) error {
|
func (db *InMemoryDb) WriteNewUser(user User) error {
|
||||||
_, exists := db.Customers[user.CustomerId]
|
_, exists := db.Customers[user.CustomerId]
|
||||||
if !exists {
|
if !exists {
|
||||||
return errors.New(fmt.Sprintf("can't add user %s to customer %s: customer dne", user.Username, user.CustomerId))
|
return errors.New(fmt.Sprintf("can't add user %s to customer %s: customer dne", user.Email, user.CustomerId))
|
||||||
}
|
}
|
||||||
userExists, _ := db.GetUser(user.Username, user.CustomerId)
|
userExists, _ := db.GetUser(user.Email, user.CustomerId)
|
||||||
|
|
||||||
if userExists != nil {
|
if userExists != nil {
|
||||||
return errors.New(fmt.Sprintf("can't write new user %s, alread exists", user.Username))
|
return errors.New(fmt.Sprintf("can't write new user %s, alread exists", user.Email))
|
||||||
}
|
}
|
||||||
key := userIdKey(user.CustomerId, user.Username)
|
key := userIdKey(user.CustomerId, user.Email)
|
||||||
db.userIdMap[key] = user.Id
|
db.userIdMap[key] = user.Id
|
||||||
db.Users[user.Id] = user
|
db.Users[user.Id] = user
|
||||||
return nil
|
return nil
|
||||||
@@ -125,7 +125,7 @@ func (db *InMemoryDb) GetSvgStringInterface(idxs SvgIdInterface) ([]string, erro
|
|||||||
return make([]string, len(idxs)), nil
|
return make([]string, len(idxs)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func userIdKey(customerId CustomerId, username Username) string {
|
func userIdKey(customerId CustomerId, username Email) string {
|
||||||
key := fmt.Sprintf("%s:%s", customerId, username)
|
key := fmt.Sprintf("%s:%s", customerId, username)
|
||||||
return key
|
return key
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,12 +34,12 @@ func (n *NKodeAPI) CreateNewCustomer(nkodePolicy NKodePolicy, id *CustomerId) (*
|
|||||||
return &newCustomer.Id, nil
|
return &newCustomer.Id, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *NKodeAPI) GenerateSignupInterface(username Username, customerId CustomerId, kp KeypadDimension) (*GenerateSignupInterfaceResp, error) {
|
func (n *NKodeAPI) GenerateSignupInterface(userEmail Email, customerId CustomerId, kp KeypadDimension) (*GenerateSignupInterfaceResp, error) {
|
||||||
svgIdxInterface, err := n.Db.RandomSvgIdxInterface(kp)
|
svgIdxInterface, err := n.Db.RandomSvgIdxInterface(kp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
signupSession, err := NewSignupSession(username, kp, customerId, svgIdxInterface)
|
signupSession, err := NewSignupSession(userEmail, kp, customerId, svgIdxInterface)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ func (n *NKodeAPI) ConfirmNKode(customerId CustomerId, sessionId SessionId, keyS
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
user, err := NewUser(*customer, session.Username, passcode, session.LoginUserInterface, session.Kp)
|
user, err := NewUser(*customer, string(session.UserEmail), passcode, session.LoginUserInterface, session.Kp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -100,8 +100,8 @@ func (n *NKodeAPI) ConfirmNKode(customerId CustomerId, sessionId SessionId, keyS
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *NKodeAPI) GetLoginInterface(username Username, customerId CustomerId) (*GetLoginInterfaceResp, error) {
|
func (n *NKodeAPI) GetLoginInterface(userEmail Email, customerId CustomerId) (*GetLoginInterfaceResp, error) {
|
||||||
user, err := n.Db.GetUser(username, customerId)
|
user, err := n.Db.GetUser(userEmail, customerId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -126,14 +126,14 @@ func (n *NKodeAPI) GetLoginInterface(username Username, customerId CustomerId) (
|
|||||||
return &resp, nil
|
return &resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *NKodeAPI) Login(customerId CustomerId, username Username, keySelection KeySelection) (*JwtTokens, error) {
|
func (n *NKodeAPI) Login(customerId CustomerId, userEmail Email, keySelection KeySelection) (*JwtTokens, error) {
|
||||||
customer, err := n.Db.GetCustomer(customerId)
|
customer, err := n.Db.GetCustomer(customerId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
user, err := n.Db.GetUser(username, customerId)
|
user, err := n.Db.GetUser(userEmail, customerId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New(fmt.Sprintf("user dne %s", username))
|
return nil, errors.New(fmt.Sprintf("user dne %s", userEmail))
|
||||||
}
|
}
|
||||||
passcode, err := ValidKeyEntry(*user, *customer, keySelection)
|
passcode, err := ValidKeyEntry(*user, *customer, keySelection)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -146,7 +146,7 @@ func (n *NKodeAPI) Login(customerId CustomerId, username Username, keySelection
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
jwtToken, err := NewJwtTokens(string(user.Username))
|
jwtToken, err := NewJwtTokens(string(user.Email))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -169,8 +169,8 @@ func (n *NKodeAPI) GetSvgStringInterface(svgId SvgIdInterface) ([]string, error)
|
|||||||
return n.Db.GetSvgStringInterface(svgId)
|
return n.Db.GetSvgStringInterface(svgId)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *NKodeAPI) RefreshToken(username Username, customerId CustomerId, refreshToken string) (string, error) {
|
func (n *NKodeAPI) RefreshToken(userEmail Email, customerId CustomerId, refreshToken string) (string, error) {
|
||||||
user, err := n.Db.GetUser(username, customerId)
|
user, err := n.Db.GetUser(userEmail, customerId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -184,6 +184,6 @@ func (n *NKodeAPI) RefreshToken(username Username, customerId CustomerId, refres
|
|||||||
if err = ClaimExpired(*refreshClaims); err != nil {
|
if err = ClaimExpired(*refreshClaims); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
newAccessClaims := NewAccessClaim(string(username))
|
newAccessClaims := NewAccessClaim(string(userEmail))
|
||||||
return EncodeAndSignClaims(newAccessClaims)
|
return EncodeAndSignClaims(newAccessClaims)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,14 +28,14 @@ func testNKodeAPI(t *testing.T, db DbAccessor) {
|
|||||||
attrsPerKey := 5
|
attrsPerKey := 5
|
||||||
numbOfKeys := 4
|
numbOfKeys := 4
|
||||||
for idx := 0; idx < 1; idx++ {
|
for idx := 0; idx < 1; idx++ {
|
||||||
username := Username("test_username" + util.GenerateRandomString(12))
|
userEmail := Email("test_username" + util.GenerateRandomString(12) + "@example.com")
|
||||||
passcodeLen := 4
|
passcodeLen := 4
|
||||||
nkodePolicy := NewDefaultNKodePolicy()
|
nkodePolicy := NewDefaultNKodePolicy()
|
||||||
keypadSize := KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys}
|
keypadSize := KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys}
|
||||||
nkodeApi := NewNKodeAPI(db)
|
nkodeApi := NewNKodeAPI(db)
|
||||||
customerId, err := nkodeApi.CreateNewCustomer(nkodePolicy, nil)
|
customerId, err := nkodeApi.CreateNewCustomer(nkodePolicy, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
signupResponse, err := nkodeApi.GenerateSignupInterface(username, *customerId, keypadSize)
|
signupResponse, err := nkodeApi.GenerateSignupInterface(userEmail, *customerId, keypadSize)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
setInterface := signupResponse.UserIdxInterface
|
setInterface := signupResponse.UserIdxInterface
|
||||||
sessionIdStr := signupResponse.SessionId
|
sessionIdStr := signupResponse.SessionId
|
||||||
@@ -52,21 +52,21 @@ func testNKodeAPI(t *testing.T, db DbAccessor) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
keypadSize = KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys}
|
keypadSize = KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys}
|
||||||
loginInterface, err := nkodeApi.GetLoginInterface(username, *customerId)
|
loginInterface, err := nkodeApi.GetLoginInterface(userEmail, *customerId)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
loginKeySelection, err := SelectKeyByAttrIdx(loginInterface.UserIdxInterface, userPasscode, keypadSize)
|
loginKeySelection, err := SelectKeyByAttrIdx(loginInterface.UserIdxInterface, userPasscode, keypadSize)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
_, err = nkodeApi.Login(*customerId, username, loginKeySelection)
|
_, err = nkodeApi.Login(*customerId, userEmail, loginKeySelection)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
err = nkodeApi.RenewAttributes(*customerId)
|
err = nkodeApi.RenewAttributes(*customerId)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
loginInterface, err = nkodeApi.GetLoginInterface(username, *customerId)
|
loginInterface, err = nkodeApi.GetLoginInterface(userEmail, *customerId)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
loginKeySelection, err = SelectKeyByAttrIdx(loginInterface.UserIdxInterface, userPasscode, keypadSize)
|
loginKeySelection, err = SelectKeyByAttrIdx(loginInterface.UserIdxInterface, userPasscode, keypadSize)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
_, err = nkodeApi.Login(*customerId, username, loginKeySelection)
|
_, err = nkodeApi.Login(*customerId, userEmail, loginKeySelection)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,7 +118,8 @@ func (h *NKodeHandler) GenerateSignupInterfaceHandler(w http.ResponseWriter, r *
|
|||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
resp, err := h.Api.GenerateSignupInterface(signupPost.Username, CustomerId(customerId), kp)
|
userEmail, err := ParseEmail(signupPost.UserEmail)
|
||||||
|
resp, err := h.Api.GenerateSignupInterface(userEmail, CustomerId(customerId), kp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
internalServerErrorHandler(w)
|
internalServerErrorHandler(w)
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
@@ -244,7 +245,8 @@ func (h *NKodeHandler) GetLoginInterfaceHandler(w http.ResponseWriter, r *http.R
|
|||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
loginInterface, err := h.Api.GetLoginInterface(loginInterfacePost.Username, CustomerId(customerId))
|
userEmail, err := ParseEmail(loginInterfacePost.UserEmail)
|
||||||
|
loginInterface, err := h.Api.GetLoginInterface(userEmail, CustomerId(customerId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
internalServerErrorHandler(w)
|
internalServerErrorHandler(w)
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
@@ -286,7 +288,8 @@ func (h *NKodeHandler) LoginHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
jwtTokens, err := h.Api.Login(CustomerId(customerId), loginPost.Username, loginPost.KeySelection)
|
userEmail, err := ParseEmail(loginPost.UserEmail)
|
||||||
|
jwtTokens, err := h.Api.Login(CustomerId(customerId), userEmail, loginPost.KeySelection)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
internalServerErrorHandler(w)
|
internalServerErrorHandler(w)
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
@@ -384,7 +387,13 @@ func (h *NKodeHandler) RefreshTokenHandler(w http.ResponseWriter, r *http.Reques
|
|||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
accessToken, err := h.Api.RefreshToken(Username(refreshTokenPost.Username), CustomerId(customerId), refreshTokenPost.RefreshToken)
|
userEmail, err := ParseEmail(refreshTokenPost.UserEmail)
|
||||||
|
if err != nil {
|
||||||
|
internalServerErrorHandler(w)
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
accessToken, err := h.Api.RefreshToken(userEmail, CustomerId(customerId), refreshTokenPost.RefreshToken)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
internalServerErrorHandler(w)
|
internalServerErrorHandler(w)
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ VALUES (?,?,?,?,?,?,?,?,?)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *SqliteDB) WriteNewUser(u User) error {
|
func (d *SqliteDB) WriteNewUser(u User) error {
|
||||||
|
|
||||||
tx, err := d.db.Begin()
|
tx, err := d.db.Begin()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -82,7 +83,7 @@ VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
|||||||
} else {
|
} else {
|
||||||
renew = 0
|
renew = 0
|
||||||
}
|
}
|
||||||
_, err = tx.Exec(insertUser, uuid.UUID(u.Id), u.Username, renew, u.RefreshToken, uuid.UUID(u.CustomerId), u.EncipheredPasscode.Code, u.EncipheredPasscode.Mask, u.Kp.AttrsPerKey, u.Kp.NumbOfKeys, util.Uint64ArrToByteArr(u.CipherKeys.AlphaKey), util.Uint64ArrToByteArr(u.CipherKeys.SetKey), util.Uint64ArrToByteArr(u.CipherKeys.PassKey), util.Uint64ArrToByteArr(u.CipherKeys.MaskKey), u.CipherKeys.Salt, u.CipherKeys.MaxNKodeLen, util.IntArrToByteArr(u.Interface.IdxInterface), util.IntArrToByteArr(u.Interface.SvgId))
|
_, err = tx.Exec(insertUser, uuid.UUID(u.Id), u.Email, renew, u.RefreshToken, uuid.UUID(u.CustomerId), u.EncipheredPasscode.Code, u.EncipheredPasscode.Mask, u.Kp.AttrsPerKey, u.Kp.NumbOfKeys, util.Uint64ArrToByteArr(u.CipherKeys.AlphaKey), util.Uint64ArrToByteArr(u.CipherKeys.SetKey), util.Uint64ArrToByteArr(u.CipherKeys.PassKey), util.Uint64ArrToByteArr(u.CipherKeys.MaskKey), u.CipherKeys.Salt, u.CipherKeys.MaxNKodeLen, util.IntArrToByteArr(u.Interface.IdxInterface), util.IntArrToByteArr(u.Interface.SvgId))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -134,7 +135,7 @@ func (d *SqliteDB) GetCustomer(id CustomerId) (*Customer, error) {
|
|||||||
return &customer, nil
|
return &customer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *SqliteDB) GetUser(username Username, customerId CustomerId) (*User, error) {
|
func (d *SqliteDB) GetUser(username Email, customerId CustomerId) (*User, error) {
|
||||||
userSelect := `
|
userSelect := `
|
||||||
SELECT id, renew, refresh_token, code, mask, attributes_per_key, number_of_keys, alpha_key, set_key, pass_key, mask_key, salt, max_nkode_len, idx_interface, svg_id_interface FROM user
|
SELECT id, renew, refresh_token, code, mask, attributes_per_key, number_of_keys, alpha_key, set_key, pass_key, mask_key, salt, max_nkode_len, idx_interface, svg_id_interface FROM user
|
||||||
WHERE user.username = ? AND user.customer_id = ?
|
WHERE user.username = ? AND user.customer_id = ?
|
||||||
@@ -178,7 +179,7 @@ WHERE user.username = ? AND user.customer_id = ?
|
|||||||
user := User{
|
user := User{
|
||||||
Id: UserId(userId),
|
Id: UserId(userId),
|
||||||
CustomerId: customerId,
|
CustomerId: customerId,
|
||||||
Username: username,
|
Email: username,
|
||||||
EncipheredPasscode: EncipheredNKode{
|
EncipheredPasscode: EncipheredNKode{
|
||||||
Code: code,
|
Code: code,
|
||||||
Mask: mask,
|
Mask: mask,
|
||||||
@@ -259,7 +260,7 @@ SELECT id, alpha_key, set_key, attributes_per_key, number_of_keys FROM user WHER
|
|||||||
user := User{
|
user := User{
|
||||||
Id: UserId{},
|
Id: UserId{},
|
||||||
CustomerId: CustomerId{},
|
CustomerId: CustomerId{},
|
||||||
Username: "",
|
Email: "",
|
||||||
EncipheredPasscode: EncipheredNKode{},
|
EncipheredPasscode: EncipheredNKode{},
|
||||||
Kp: KeypadDimension{
|
Kp: KeypadDimension{
|
||||||
AttrsPerKey: attrsPerKey,
|
AttrsPerKey: attrsPerKey,
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func testSignupLoginRenew(t *testing.T, db DbAccessor) {
|
|||||||
customer, err := db.GetCustomer(customerOrig.Id)
|
customer, err := db.GetCustomer(customerOrig.Id)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, customerOrig, customer)
|
assert.Equal(t, customerOrig, customer)
|
||||||
username := Username("test_user")
|
username := "test_user@example.com"
|
||||||
kp := KeypadDefault
|
kp := KeypadDefault
|
||||||
passcodeIdx := []int{0, 1, 2, 3}
|
passcodeIdx := []int{0, 1, 2, 3}
|
||||||
mockSvgInterface := make(SvgIdInterface, kp.TotalAttrs())
|
mockSvgInterface := make(SvgIdInterface, kp.TotalAttrs())
|
||||||
@@ -40,7 +40,7 @@ func testSignupLoginRenew(t *testing.T, db DbAccessor) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
err = db.WriteNewUser(*userOrig)
|
err = db.WriteNewUser(*userOrig)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
user, err := db.GetUser(username, customer.Id)
|
user, err := db.GetUser(Email(username), customer.Id)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, userOrig, user)
|
assert.Equal(t, userOrig, user)
|
||||||
|
|
||||||
|
|||||||
31
core/type.go
31
core/type.go
@@ -2,6 +2,7 @@ package core
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
"net/mail"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SetNKodeResp struct {
|
type SetNKodeResp struct {
|
||||||
@@ -21,10 +22,10 @@ type NewCustomerPost struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type GenerateSignupInterfacePost struct {
|
type GenerateSignupInterfacePost struct {
|
||||||
CustomerId string `json:"customer_id"`
|
CustomerId string `json:"customer_id"`
|
||||||
AttrsPerKey int `json:"attrs_per_key"`
|
AttrsPerKey int `json:"attrs_per_key"`
|
||||||
NumbOfKeys int `json:"numb_of_keys"`
|
NumbOfKeys int `json:"numb_of_keys"`
|
||||||
Username Username `json:"username"`
|
UserEmail string `json:"email"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SetNKodePost struct {
|
type SetNKodePost struct {
|
||||||
@@ -40,13 +41,13 @@ type ConfirmNKodePost struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type GetLoginInterfacePost struct {
|
type GetLoginInterfacePost struct {
|
||||||
Username Username `json:"username"`
|
UserEmail string `json:"email"`
|
||||||
CustomerId string `json:"customer_id"`
|
CustomerId string `json:"customer_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type LoginPost struct {
|
type LoginPost struct {
|
||||||
CustomerId string `json:"customer_id"`
|
CustomerId string `json:"customer_id"`
|
||||||
Username Username `json:"username"`
|
UserEmail string `json:"email"`
|
||||||
KeySelection KeySelection `json:"key_selection"`
|
KeySelection KeySelection `json:"key_selection"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +56,7 @@ type RenewAttributesPost struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RefreshTokenPost struct {
|
type RefreshTokenPost struct {
|
||||||
Username string `json:"username"`
|
UserEmail string `json:"username"`
|
||||||
CustomerId string `json:"customer_id"`
|
CustomerId string `json:"customer_id"`
|
||||||
RefreshToken string `json:"refresh_token"`
|
RefreshToken string `json:"refresh_token"`
|
||||||
}
|
}
|
||||||
@@ -82,7 +83,17 @@ type CustomerId uuid.UUID
|
|||||||
type SessionId uuid.UUID
|
type SessionId uuid.UUID
|
||||||
type UserId uuid.UUID
|
type UserId uuid.UUID
|
||||||
|
|
||||||
type Username string
|
type Email string
|
||||||
|
|
||||||
|
func ParseEmail(email string) (Email, error) {
|
||||||
|
_, err := mail.ParseAddress(email)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return Email(email), err
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
type IdxInterface []int
|
type IdxInterface []int
|
||||||
type SvgIdInterface []int
|
type SvgIdInterface []int
|
||||||
|
|
||||||
@@ -102,7 +113,7 @@ type EncipheredNKode struct {
|
|||||||
|
|
||||||
type DbAccessor interface {
|
type DbAccessor interface {
|
||||||
GetCustomer(CustomerId) (*Customer, error)
|
GetCustomer(CustomerId) (*Customer, error)
|
||||||
GetUser(Username, CustomerId) (*User, error)
|
GetUser(Email, CustomerId) (*User, error)
|
||||||
WriteNewCustomer(Customer) error
|
WriteNewCustomer(Customer) error
|
||||||
WriteNewUser(User) error
|
WriteNewUser(User) error
|
||||||
UpdateUserInterface(UserId, UserInterface) error
|
UpdateUserInterface(UserId, UserInterface) error
|
||||||
|
|||||||
10
core/user.go
10
core/user.go
@@ -10,7 +10,7 @@ import (
|
|||||||
type User struct {
|
type User struct {
|
||||||
Id UserId
|
Id UserId
|
||||||
CustomerId CustomerId
|
CustomerId CustomerId
|
||||||
Username Username
|
Email Email
|
||||||
EncipheredPasscode EncipheredNKode
|
EncipheredPasscode EncipheredNKode
|
||||||
Kp KeypadDimension
|
Kp KeypadDimension
|
||||||
CipherKeys UserCipherKeys
|
CipherKeys UserCipherKeys
|
||||||
@@ -117,7 +117,11 @@ func ValidKeyEntry(user User, customer Customer, selectedKeys []int) ([]int, err
|
|||||||
return presumedAttrIdxVals, nil
|
return presumedAttrIdxVals, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUser(customer Customer, username Username, passcodeIdx []int, ui UserInterface, kp KeypadDimension) (*User, error) {
|
func NewUser(customer Customer, userEmail string, passcodeIdx []int, ui UserInterface, kp KeypadDimension) (*User, error) {
|
||||||
|
_, err := ParseEmail(userEmail)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
setVals, err := customer.Attributes.SetValsForKp(kp)
|
setVals, err := customer.Attributes.SetValsForKp(kp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -132,7 +136,7 @@ func NewUser(customer Customer, username Username, passcodeIdx []int, ui UserInt
|
|||||||
}
|
}
|
||||||
newUser := User{
|
newUser := User{
|
||||||
Id: UserId(uuid.New()),
|
Id: UserId(uuid.New()),
|
||||||
Username: username,
|
Email: Email(userEmail),
|
||||||
EncipheredPasscode: *encipheredNKode,
|
EncipheredPasscode: *encipheredNKode,
|
||||||
CipherKeys: *newKeys,
|
CipherKeys: *newKeys,
|
||||||
Interface: ui,
|
Interface: ui,
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ type UserSignSession struct {
|
|||||||
SetIdxInterface IdxInterface
|
SetIdxInterface IdxInterface
|
||||||
ConfirmIdxInterface IdxInterface
|
ConfirmIdxInterface IdxInterface
|
||||||
SetKeySelection KeySelection
|
SetKeySelection KeySelection
|
||||||
Username Username
|
UserEmail Email
|
||||||
Expire int
|
Expire int
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSignupSession(username Username, kp KeypadDimension, customerId CustomerId, svgInterface SvgIdInterface) (*UserSignSession, error) {
|
func NewSignupSession(userEmail Email, kp KeypadDimension, customerId CustomerId, svgInterface SvgIdInterface) (*UserSignSession, error) {
|
||||||
loginInterface, err := NewUserInterface(&kp, svgInterface)
|
loginInterface, err := NewUserInterface(&kp, svgInterface)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -37,7 +37,7 @@ func NewSignupSession(username Username, kp KeypadDimension, customerId Customer
|
|||||||
SetIdxInterface: signupInterface.IdxInterface,
|
SetIdxInterface: signupInterface.IdxInterface,
|
||||||
ConfirmIdxInterface: nil,
|
ConfirmIdxInterface: nil,
|
||||||
SetKeySelection: nil,
|
SetKeySelection: nil,
|
||||||
Username: username,
|
UserEmail: userEmail,
|
||||||
Kp: kp,
|
Kp: kp,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ func (s *UserSignSession) DeducePasscode(confirmKeyEntry KeySelection) ([]int, e
|
|||||||
return nil, errors.New("signup session set key entry is nil")
|
return nil, errors.New("signup session set key entry is nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.Username == "" {
|
if s.UserEmail == "" {
|
||||||
return nil, errors.New("signup session username is nil")
|
return nil, errors.New("signup session username is nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
18
main_test.go
18
main_test.go
@@ -22,12 +22,12 @@ func TestApi(t *testing.T) {
|
|||||||
var customerResp core.CreateNewCustomerResp
|
var customerResp core.CreateNewCustomerResp
|
||||||
testApiPost(t, base+core.CreateNewCustomer, newCustomerBody, &customerResp)
|
testApiPost(t, base+core.CreateNewCustomer, newCustomerBody, &customerResp)
|
||||||
|
|
||||||
username := core.Username("test_username")
|
username := "test_username@example.com"
|
||||||
signupInterfaceBody := core.GenerateSignupInterfacePost{
|
signupInterfaceBody := core.GenerateSignupInterfacePost{
|
||||||
CustomerId: customerResp.CustomerId,
|
CustomerId: customerResp.CustomerId,
|
||||||
AttrsPerKey: kp.AttrsPerKey,
|
AttrsPerKey: kp.AttrsPerKey,
|
||||||
NumbOfKeys: kp.NumbOfKeys,
|
NumbOfKeys: kp.NumbOfKeys,
|
||||||
Username: username,
|
UserEmail: username,
|
||||||
}
|
}
|
||||||
var signupInterfaceResp core.GenerateSignupInterfaceResp
|
var signupInterfaceResp core.GenerateSignupInterfaceResp
|
||||||
testApiPost(t, base+core.GenerateSignupInterface, signupInterfaceBody, &signupInterfaceResp)
|
testApiPost(t, base+core.GenerateSignupInterface, signupInterfaceBody, &signupInterfaceResp)
|
||||||
@@ -57,7 +57,7 @@ func TestApi(t *testing.T) {
|
|||||||
|
|
||||||
loginInterfaceBody := core.GetLoginInterfacePost{
|
loginInterfaceBody := core.GetLoginInterfacePost{
|
||||||
CustomerId: customerResp.CustomerId,
|
CustomerId: customerResp.CustomerId,
|
||||||
Username: username,
|
UserEmail: username,
|
||||||
}
|
}
|
||||||
|
|
||||||
var loginInterfaceResp core.GetLoginInterfaceResp
|
var loginInterfaceResp core.GetLoginInterfaceResp
|
||||||
@@ -68,15 +68,15 @@ func TestApi(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
loginBody := core.LoginPost{
|
loginBody := core.LoginPost{
|
||||||
CustomerId: customerResp.CustomerId,
|
CustomerId: customerResp.CustomerId,
|
||||||
Username: username,
|
UserEmail: username,
|
||||||
KeySelection: loginKeySelection,
|
KeySelection: loginKeySelection,
|
||||||
}
|
}
|
||||||
var jwtTokens core.JwtTokens
|
var jwtTokens core.JwtTokens
|
||||||
testApiPost(t, base+core.Login, loginBody, &jwtTokens)
|
testApiPost(t, base+core.Login, loginBody, &jwtTokens)
|
||||||
refreshClaims, err := core.ParseRefreshToken(jwtTokens.RefreshToken)
|
refreshClaims, err := core.ParseRefreshToken(jwtTokens.RefreshToken)
|
||||||
assert.Equal(t, refreshClaims.Subject, string(username))
|
assert.Equal(t, refreshClaims.Subject, username)
|
||||||
accessClaims, err := core.ParseRefreshToken(jwtTokens.AccessToken)
|
accessClaims, err := core.ParseRefreshToken(jwtTokens.AccessToken)
|
||||||
assert.Equal(t, accessClaims.Subject, string(username))
|
assert.Equal(t, accessClaims.Subject, username)
|
||||||
renewBody := core.RenewAttributesPost{CustomerId: customerResp.CustomerId}
|
renewBody := core.RenewAttributesPost{CustomerId: customerResp.CustomerId}
|
||||||
testApiPost(t, base+core.RenewAttributes, renewBody, nil)
|
testApiPost(t, base+core.RenewAttributes, renewBody, nil)
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ func TestApi(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
loginBody = core.LoginPost{
|
loginBody = core.LoginPost{
|
||||||
CustomerId: customerResp.CustomerId,
|
CustomerId: customerResp.CustomerId,
|
||||||
Username: username,
|
UserEmail: username,
|
||||||
KeySelection: loginKeySelection,
|
KeySelection: loginKeySelection,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ func TestApi(t *testing.T) {
|
|||||||
assert.Equal(t, core.KeypadMax.TotalAttrs(), len(randomSvgInterfaceResp.Svgs))
|
assert.Equal(t, core.KeypadMax.TotalAttrs(), len(randomSvgInterfaceResp.Svgs))
|
||||||
|
|
||||||
refreshBody := core.RefreshTokenPost{
|
refreshBody := core.RefreshTokenPost{
|
||||||
Username: string(username),
|
UserEmail: username,
|
||||||
CustomerId: customerResp.CustomerId,
|
CustomerId: customerResp.CustomerId,
|
||||||
RefreshToken: jwtTokens.RefreshToken,
|
RefreshToken: jwtTokens.RefreshToken,
|
||||||
}
|
}
|
||||||
@@ -104,7 +104,7 @@ func TestApi(t *testing.T) {
|
|||||||
testApiPost(t, base+core.RefreshToken, refreshBody, &refreshTokenResp)
|
testApiPost(t, base+core.RefreshToken, refreshBody, &refreshTokenResp)
|
||||||
accessClaims, err = core.ParseAccessToken(refreshTokenResp.AccessToken)
|
accessClaims, err = core.ParseAccessToken(refreshTokenResp.AccessToken)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, accessClaims.Subject, string(username))
|
assert.Equal(t, accessClaims.Subject, username)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Unmarshal(t *testing.T, resp *http.Response, data any) {
|
func Unmarshal(t *testing.T, resp *http.Response, data any) {
|
||||||
|
|||||||
Reference in New Issue
Block a user