Skip to content

Commit 9a6f1a6

Browse files
committed
Allow empty email
1 parent 4bddbde commit 9a6f1a6

25 files changed

+65
-56
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ test-all-db:
4646
docker run -d --name dynamodb-local-test -p 8000:8000 amazon/dynamodb-local:latest
4747
docker run -d --name couchbase-local-test -p 8091-8097:8091-8097 -p 11210:11210 -p 11207:11207 -p 18091-18095:18091-18095 -p 18096:18096 -p 18097:18097 couchbase:latest
4848
sh scripts/couchbase-test.sh
49-
cd server && go clean --testcache && TEST_DBS="sqlite,mongodb,arangodb,scylladb,dynamodb" go test -p 1 -v ./test
49+
cd server && go clean --testcache && TEST_DBS="sqlite,mongodb,arangodb,scylladb,dynamodb,couchbase" go test -p 1 -v ./test
5050
docker rm -vf authorizer_scylla_db
5151
docker rm -vf authorizer_mongodb_db
5252
docker rm -vf authorizer_arangodb

server/db/models/user.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type User struct {
1515
Key string `json:"_key,omitempty" bson:"_key,omitempty" cql:"_key,omitempty" dynamo:"key,omitempty"` // for arangodb
1616
ID string `gorm:"primaryKey;type:char(36)" json:"_id" bson:"_id" cql:"id" dynamo:"id,hash"`
1717

18-
Email string `gorm:"unique" json:"email" bson:"email" cql:"email" dynamo:"email" index:"email,hash"`
18+
Email *string `gorm:"unique" json:"email" bson:"email" cql:"email" dynamo:"email" index:"email,hash"`
1919
EmailVerifiedAt *int64 `json:"email_verified_at" bson:"email_verified_at" cql:"email_verified_at" dynamo:"email_verified_at"`
2020
Password *string `json:"password" bson:"password" cql:"password" dynamo:"password"`
2121
SignupMethods string `json:"signup_methods" bson:"signup_methods" cql:"signup_methods" dynamo:"signup_methods"`
@@ -54,7 +54,7 @@ func (user *User) AsAPIUser() *model.User {
5454
FamilyName: user.FamilyName,
5555
MiddleName: user.MiddleName,
5656
Nickname: user.Nickname,
57-
PreferredUsername: refs.NewStringRef(user.Email),
57+
PreferredUsername: user.Email,
5858
Gender: user.Gender,
5959
Birthdate: user.Birthdate,
6060
PhoneNumber: user.PhoneNumber,

server/db/providers/couchbase/user.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func (p *provider) DeleteUser(ctx context.Context, user *models.User) error {
6969
func (p *provider) ListUsers(ctx context.Context, pagination *model.Pagination) (*model.Users, error) {
7070
users := []*model.User{}
7171
paginationClone := pagination
72-
userQuery := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, created_at, updated_at FROM %s.%s ORDER BY id OFFSET $1 LIMIT $2", p.scopeName, models.Collections.User)
72+
userQuery := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, app_data, created_at, updated_at FROM %s.%s ORDER BY id OFFSET $1 LIMIT $2", p.scopeName, models.Collections.User)
7373
queryResult, err := p.db.Query(userQuery, &gocb.QueryOptions{
7474
ScanConsistency: gocb.QueryScanConsistencyRequestPlus,
7575
Context: ctx,
@@ -103,7 +103,7 @@ func (p *provider) ListUsers(ctx context.Context, pagination *model.Pagination)
103103
// GetUserByEmail to get user information from database using email address
104104
func (p *provider) GetUserByEmail(ctx context.Context, email string) (*models.User, error) {
105105
var user *models.User
106-
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, created_at, updated_at FROM %s.%s WHERE email = $1 LIMIT 1", p.scopeName, models.Collections.User)
106+
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, app_data, created_at, updated_at FROM %s.%s WHERE email = $1 LIMIT 1", p.scopeName, models.Collections.User)
107107
q, err := p.db.Query(query, &gocb.QueryOptions{
108108
ScanConsistency: gocb.QueryScanConsistencyRequestPlus,
109109
Context: ctx,
@@ -122,7 +122,7 @@ func (p *provider) GetUserByEmail(ctx context.Context, email string) (*models.Us
122122
// GetUserByID to get user information from database using user ID
123123
func (p *provider) GetUserByID(ctx context.Context, id string) (*models.User, error) {
124124
var user *models.User
125-
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, created_at, updated_at FROM %s.%s WHERE _id = $1 LIMIT 1", p.scopeName, models.Collections.User)
125+
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, app_data, created_at, updated_at FROM %s.%s WHERE _id = $1 LIMIT 1", p.scopeName, models.Collections.User)
126126
q, err := p.db.Query(query, &gocb.QueryOptions{
127127
ScanConsistency: gocb.QueryScanConsistencyRequestPlus,
128128
Context: ctx,
@@ -175,7 +175,7 @@ func (p *provider) UpdateUsers(ctx context.Context, data map[string]interface{},
175175
// GetUserByPhoneNumber to get user information from database using phone number
176176
func (p *provider) GetUserByPhoneNumber(ctx context.Context, phoneNumber string) (*models.User, error) {
177177
var user *models.User
178-
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, created_at, updated_at FROM %s.%s WHERE phone_number = $1 LIMIT 1", p.scopeName, models.Collections.User)
178+
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, app_data, created_at, updated_at FROM %s.%s WHERE phone_number = $1 LIMIT 1", p.scopeName, models.Collections.User)
179179
q, err := p.db.Query(query, &gocb.QueryOptions{
180180
ScanConsistency: gocb.QueryScanConsistencyRequestPlus,
181181
Context: ctx,

server/db/providers/dynamodb/user.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (p *provider) GetUserByID(ctx context.Context, id string) (*models.User, er
136136
var user *models.User
137137
err := collection.Get("id", id).OneWithContext(ctx, &user)
138138
if err != nil {
139-
if user.Email == "" {
139+
if refs.StringValue(user.Email) == "" {
140140
return user, errors.New("no documets found")
141141
} else {
142142
return user, nil

server/db/providers/mongodb/provider.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,13 @@ func NewProvider() (*provider, error) {
4747
Keys: bson.M{"email": 1},
4848
Options: options.Index().SetUnique(true).SetSparse(true),
4949
},
50-
}, options.CreateIndexes())
51-
userCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{
5250
{
5351
Keys: bson.M{"phone_number": 1},
5452
Options: options.Index().SetUnique(true).SetSparse(true).SetPartialFilterExpression(map[string]interface{}{
5553
"phone_number": map[string]string{"$type": "string"},
5654
}),
5755
},
5856
}, options.CreateIndexes())
59-
6057
mongodb.CreateCollection(ctx, models.Collections.VerificationRequest, options.CreateCollection())
6158
verificationRequestCollection := mongodb.Collection(models.Collections.VerificationRequest, options.Collection())
6259
verificationRequestCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{

server/graph/generated/generated.go

Lines changed: 4 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/graph/model/models_gen.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/graph/schema.graphqls

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ type Meta {
3232

3333
type User {
3434
id: ID!
35-
email: String!
35+
# email or phone_number is always present
36+
email: String
3637
email_verified: Boolean!
3738
signup_methods: String!
3839
given_name: String

server/handlers/oauth_callback.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/authorizerdev/authorizer/server/db/models"
2424
"github.com/authorizerdev/authorizer/server/memorystore"
2525
"github.com/authorizerdev/authorizer/server/oauth"
26+
"github.com/authorizerdev/authorizer/server/refs"
2627
"github.com/authorizerdev/authorizer/server/token"
2728
"github.com/authorizerdev/authorizer/server/utils"
2829
)
@@ -85,7 +86,7 @@ func OAuthCallbackHandler() gin.HandlerFunc {
8586
return
8687
}
8788

88-
existingUser, err := db.Provider.GetUserByEmail(ctx, user.Email)
89+
existingUser, err := db.Provider.GetUserByEmail(ctx, refs.StringValue(user.Email))
8990
log := log.WithField("user", user.Email)
9091
isSignUp := false
9192

@@ -415,7 +416,7 @@ func processGithubUserInfo(ctx context.Context, code string) (*models.User, erro
415416
GivenName: &firstName,
416417
FamilyName: &lastName,
417418
Picture: &picture,
418-
Email: email,
419+
Email: &email,
419420
}
420421

421422
return user, nil
@@ -466,7 +467,7 @@ func processFacebookUserInfo(ctx context.Context, code string) (*models.User, er
466467
GivenName: &firstName,
467468
FamilyName: &lastName,
468469
Picture: &picture,
469-
Email: email,
470+
Email: &email,
470471
}
471472

472473
return user, nil
@@ -548,7 +549,7 @@ func processLinkedInUserInfo(ctx context.Context, code string) (*models.User, er
548549
GivenName: &firstName,
549550
FamilyName: &lastName,
550551
Picture: &profilePicture,
551-
Email: emailAddress,
552+
Email: &emailAddress,
552553
}
553554

554555
return user, nil
@@ -588,7 +589,8 @@ func processAppleUserInfo(ctx context.Context, code string) (*models.User, error
588589
log.Debug("Failed to extract email from claims.")
589590
return user, fmt.Errorf("unable to extract email, please check the scopes enabled for your app. It needs `email`, `name` scopes")
590591
} else {
591-
user.Email = val.(string)
592+
email := val.(string)
593+
user.Email = &email
592594
}
593595

594596
if val, ok := claims["name"]; ok {

server/resolvers/delete_user.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/authorizerdev/authorizer/server/db"
1111
"github.com/authorizerdev/authorizer/server/graph/model"
1212
"github.com/authorizerdev/authorizer/server/memorystore"
13+
"github.com/authorizerdev/authorizer/server/refs"
1314
"github.com/authorizerdev/authorizer/server/token"
1415
"github.com/authorizerdev/authorizer/server/utils"
1516
)
@@ -51,28 +52,41 @@ func DeleteUserResolver(ctx context.Context, params model.DeleteUserInput) (*mod
5152

5253
go func() {
5354
// delete otp for given email
54-
otp, err := db.Provider.GetOTPByEmail(ctx, user.Email)
55+
otp, err := db.Provider.GetOTPByEmail(ctx, refs.StringValue(user.Email))
5556
if err != nil {
5657
log.Infof("No OTP found for email (%s): %v", user.Email, err)
5758
// continue
5859
} else {
5960
err := db.Provider.DeleteOTP(ctx, otp)
6061
if err != nil {
61-
log.Debugf("Failed to delete otp for given email (%s): %v", user.Email, err)
62+
log.Debugf("Failed to delete otp for given email (%s): %v", refs.StringValue(user.Email), err)
63+
// continue
64+
}
65+
}
66+
67+
// delete otp for given phone number
68+
otp, err = db.Provider.GetOTPByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber))
69+
if err != nil {
70+
log.Infof("No OTP found for email (%s): %v", refs.StringValue(user.Email), err)
71+
// continue
72+
} else {
73+
err := db.Provider.DeleteOTP(ctx, otp)
74+
if err != nil {
75+
log.Debugf("Failed to delete otp for given phone (%s): %v", refs.StringValue(user.PhoneNumber), err)
6276
// continue
6377
}
6478
}
6579

6680
// delete verification requests for given email
6781
for _, vt := range constants.VerificationTypes {
68-
verificationRequest, err := db.Provider.GetVerificationRequestByEmail(ctx, user.Email, vt)
82+
verificationRequest, err := db.Provider.GetVerificationRequestByEmail(ctx, refs.StringValue(user.Email), vt)
6983
if err != nil {
70-
log.Infof("No verification verification request found for email: %s, verification_request_type: %s. %v", user.Email, vt, err)
84+
log.Infof("No verification verification request found for email: %s, verification_request_type: %s. %v", refs.StringValue(user.Email), vt, err)
7185
// continue
7286
} else {
7387
err := db.Provider.DeleteVerificationRequest(ctx, verificationRequest)
7488
if err != nil {
75-
log.Debugf("Failed to DeleteVerificationRequest for email: %s, verification_request_type: %s. %v", user.Email, vt, err)
89+
log.Debugf("Failed to DeleteVerificationRequest for email: %s, verification_request_type: %s. %v", refs.StringValue(user.Email), vt, err)
7690
// continue
7791
}
7892
}

0 commit comments

Comments
 (0)