From bedc3d0b50867841a12268b28217da70afbebddc Mon Sep 17 00:00:00 2001 From: Lakhan Samani Date: Mon, 20 Dec 2021 17:33:11 +0530 Subject: [PATCH] fix: arangodb get one queries --- Makefile | 2 +- server/constants/constants.go | 7 +++--- server/db/user.go | 22 +++++++++++------ server/db/verificationRequests.go | 23 +++++++++++------- server/{ => env}/env.go | 39 +++++++++++++----------------- server/env/env_test.go | 29 ++++++++++++++++++++++ server/go.mod | 1 + server/go.sum | 1 + server/main.go | 3 ++- server/resolvers/forgotPassword.go | 2 +- server/resolvers/login.go | 2 +- server/resolvers/magicLogin.go | 4 +-- server/resolvers/resetPassword.go | 2 +- server/resolvers/signup.go | 6 ++--- server/utils/meta.go | 6 ++--- server/utils/urls_test.go | 14 +++++------ server/utils/validator_test.go | 20 ++++++--------- 17 files changed, 110 insertions(+), 73 deletions(-) rename server/{ => env}/env.go (89%) create mode 100644 server/env/env_test.go diff --git a/Makefile b/Makefile index 926bfcb..0d7d38e 100644 --- a/Makefile +++ b/Makefile @@ -6,4 +6,4 @@ cmd: clean: rm -rf build test: - cd server && go test ./... \ No newline at end of file + cd server && go clean --testcache && go test ./... \ No newline at end of file diff --git a/server/constants/constants.go b/server/constants/constants.go index e5ad0aa..30b119c 100644 --- a/server/constants/constants.go +++ b/server/constants/constants.go @@ -3,6 +3,7 @@ package constants var ( ADMIN_SECRET = "" ENV = "" + ENV_PATH = "" VERSION = "" DATABASE_TYPE = "" DATABASE_URL = "" @@ -21,9 +22,9 @@ var ( IS_PROD = false COOKIE_NAME = "" RESET_PASSWORD_URL = "" - DISABLE_EMAIL_VERIFICATION = "false" - DISABLE_BASIC_AUTHENTICATION = "false" - DISABLE_MAGIC_LOGIN = "false" + DISABLE_EMAIL_VERIFICATION = false + DISABLE_BASIC_AUTHENTICATION = false + DISABLE_MAGIC_LOGIN = false // ROLES ROLES = []string{} diff --git a/server/db/user.go b/server/db/user.go index 549091c..606b54f 100644 --- a/server/db/user.go +++ b/server/db/user.go @@ -148,7 +148,7 @@ func (mgr *manager) GetUserByEmail(email string) (User, error) { } if IsArangoDB { - query := fmt.Sprintf("FOR d in %s FILTER d.email == @email LIMIT 1 RETURN d", Collections.User) + query := fmt.Sprintf("FOR d in %s FILTER d.email == @email RETURN d", Collections.User) bindVars := map[string]interface{}{ "email": email, } @@ -160,10 +160,14 @@ func (mgr *manager) GetUserByEmail(email string) (User, error) { defer cursor.Close() for { - _, err := cursor.ReadDocument(nil, &user) - if driver.IsNoMoreDocuments(err) { + if !cursor.HasMore() { + if user.Key == "" { + return user, fmt.Errorf("user not found") + } break - } else if err != nil { + } + _, err := cursor.ReadDocument(nil, &user) + if err != nil { return user, err } } @@ -201,10 +205,14 @@ func (mgr *manager) GetUserByID(id string) (User, error) { } for { - _, err := cursor.ReadDocument(nil, &user) - if driver.IsNoMoreDocuments(err) { + if !cursor.HasMore() { + if user.Key == "" { + return user, fmt.Errorf("user not found") + } break - } else if err != nil { + } + _, err := cursor.ReadDocument(nil, &user) + if err != nil { return user, err } } diff --git a/server/db/verificationRequests.go b/server/db/verificationRequests.go index 7ab957e..d43a24b 100644 --- a/server/db/verificationRequests.go +++ b/server/db/verificationRequests.go @@ -120,11 +120,14 @@ func (mgr *manager) GetVerificationByToken(token string) (VerificationRequest, e defer cursor.Close() for { - _, err := cursor.ReadDocument(nil, &verification) - - if driver.IsNoMoreDocuments(err) { + if !cursor.HasMore() { + if verification.Key == "" { + return verification, fmt.Errorf("verification request not found") + } break - } else if err != nil { + } + _, err := cursor.ReadDocument(nil, &verification) + if err != nil { return verification, err } } @@ -157,14 +160,16 @@ func (mgr *manager) GetVerificationByEmail(email string) (VerificationRequest, e defer cursor.Close() for { - _, err := cursor.ReadDocument(nil, &verification) - - if driver.IsNoMoreDocuments(err) { + if !cursor.HasMore() { + if verification.Key == "" { + return verification, fmt.Errorf("verification request not found") + } break - } else if err != nil { + } + _, err := cursor.ReadDocument(nil, &verification) + if err != nil { return verification, err } - } } diff --git a/server/env.go b/server/env/env.go similarity index 89% rename from server/env.go rename to server/env/env.go index 2a99e42..ffcd692 100644 --- a/server/env.go +++ b/server/env/env.go @@ -1,4 +1,4 @@ -package main +package env import ( "flag" @@ -13,7 +13,7 @@ import ( // build variables var ( - Version string + VERSION string ARG_DB_URL *string ARG_DB_TYPE *string ARG_AUTHORIZER_URL *string @@ -22,7 +22,9 @@ var ( // InitEnv -> to initialize env and through error if required env are not present func InitEnv() { - envPath := `.env` + if constants.ENV_PATH == "" { + constants.ENV_PATH = `.env` + } ARG_DB_URL = flag.String("database_url", "", "Database connection string") ARG_DB_TYPE = flag.String("database_type", "", "Database type, possible values are postgres,mysql,sqlite") ARG_AUTHORIZER_URL = flag.String("authorizer_url", "", "URL for authorizer instance, eg: https://xyz.herokuapp.com") @@ -30,15 +32,15 @@ func InitEnv() { flag.Parse() if *ARG_ENV_FILE != "" { - envPath = *ARG_ENV_FILE + constants.ENV_PATH = *ARG_ENV_FILE } - err := godotenv.Load(envPath) + err := godotenv.Load(constants.ENV_PATH) if err != nil { - log.Println("error loading .env file") + log.Printf("error loading %s file", constants.ENV_PATH) } - constants.VERSION = Version + constants.VERSION = VERSION constants.ADMIN_SECRET = os.Getenv("ADMIN_SECRET") constants.ENV = os.Getenv("ENV") constants.DATABASE_TYPE = os.Getenv("DATABASE_TYPE") @@ -63,9 +65,9 @@ func InitEnv() { constants.TWITTER_CLIENT_ID = os.Getenv("TWITTER_CLIENT_ID") constants.TWITTER_CLIENT_SECRET = os.Getenv("TWITTER_CLIENT_SECRET") constants.RESET_PASSWORD_URL = strings.TrimPrefix(os.Getenv("RESET_PASSWORD_URL"), "/") - constants.DISABLE_BASIC_AUTHENTICATION = os.Getenv("DISABLE_BASIC_AUTHENTICATION") - constants.DISABLE_EMAIL_VERIFICATION = os.Getenv("DISABLE_EMAIL_VERIFICATION") - constants.DISABLE_MAGIC_LOGIN = os.Getenv("DISABLE_MAGIC_LOGIN") + constants.DISABLE_BASIC_AUTHENTICATION = os.Getenv("DISABLE_BASIC_AUTHENTICATION") == "true" + constants.DISABLE_EMAIL_VERIFICATION = os.Getenv("DISABLE_EMAIL_VERIFICATION") == "true" + constants.DISABLE_MAGIC_LOGIN = os.Getenv("DISABLE_MAGIC_LOGIN") == "true" constants.JWT_ROLE_CLAIM = os.Getenv("JWT_ROLE_CLAIM") if constants.ADMIN_SECRET == "" { @@ -128,21 +130,14 @@ func InitEnv() { constants.COOKIE_NAME = "authorizer" } - if constants.DISABLE_BASIC_AUTHENTICATION == "" { - constants.DISABLE_BASIC_AUTHENTICATION = "false" - } - - if constants.DISABLE_MAGIC_LOGIN == "" { - constants.DISABLE_MAGIC_LOGIN = "false" - } - if constants.SMTP_HOST == "" || constants.SENDER_EMAIL == "" || constants.SENDER_PASSWORD == "" { - constants.DISABLE_EMAIL_VERIFICATION = "true" - } else if constants.DISABLE_EMAIL_VERIFICATION == "" { - constants.DISABLE_EMAIL_VERIFICATION = "false" + constants.DISABLE_EMAIL_VERIFICATION = true + constants.DISABLE_MAGIC_LOGIN = true } - log.Println("email verification disabled:", constants.DISABLE_EMAIL_VERIFICATION) + if constants.DISABLE_EMAIL_VERIFICATION { + constants.DISABLE_MAGIC_LOGIN = true + } rolesSplit := strings.Split(os.Getenv("ROLES"), ",") roles := []string{} diff --git a/server/env/env_test.go b/server/env/env_test.go new file mode 100644 index 0000000..fa72912 --- /dev/null +++ b/server/env/env_test.go @@ -0,0 +1,29 @@ +package env + +import ( + "testing" + + "github.com/authorizerdev/authorizer/server/constants" + "github.com/authorizerdev/authorizer/server/enum" + "github.com/stretchr/testify/assert" +) + +func TestEnvs(t *testing.T) { + constants.ENV_PATH = "../../.env.sample" + InitEnv() + + assert.Equal(t, constants.ADMIN_SECRET, "admin") + assert.Equal(t, constants.ENV, "production") + assert.Equal(t, constants.DATABASE_URL, "data.db") + assert.Equal(t, constants.DATABASE_TYPE, enum.Sqlite.String()) + assert.True(t, constants.DISABLE_EMAIL_VERIFICATION) + assert.True(t, constants.DISABLE_MAGIC_LOGIN) + assert.False(t, constants.DISABLE_BASIC_AUTHENTICATION) + assert.Equal(t, constants.JWT_TYPE, "HS256") + assert.Equal(t, constants.JWT_SECRET, "random_string") + assert.Equal(t, constants.JWT_ROLE_CLAIM, "role") + assert.EqualValues(t, constants.ROLES, []string{"user"}) + assert.EqualValues(t, constants.DEFAULT_ROLES, []string{"user"}) + assert.EqualValues(t, constants.PROTECTED_ROLES, []string{"admin"}) + assert.EqualValues(t, constants.ALLOWED_ORIGINS, []string{"*"}) +} diff --git a/server/go.mod b/server/go.mod index 0e15dfc..1275988 100644 --- a/server/go.mod +++ b/server/go.mod @@ -20,6 +20,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.1 // indirect github.com/robertkrimen/otto v0.0.0-20211024170158-b87d35c0b86f + github.com/stretchr/testify v1.7.0 // indirect github.com/ugorji/go v1.2.6 // indirect github.com/vektah/gqlparser/v2 v2.1.0 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 diff --git a/server/go.sum b/server/go.sum index 9d75dcd..9a86e48 100644 --- a/server/go.sum +++ b/server/go.sum @@ -321,6 +321,7 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= diff --git a/server/main.go b/server/main.go index 41874f0..a88c924 100644 --- a/server/main.go +++ b/server/main.go @@ -6,6 +6,7 @@ import ( "github.com/authorizerdev/authorizer/server/constants" "github.com/authorizerdev/authorizer/server/db" + "github.com/authorizerdev/authorizer/server/env" "github.com/authorizerdev/authorizer/server/handlers" "github.com/authorizerdev/authorizer/server/oauth" "github.com/authorizerdev/authorizer/server/session" @@ -48,7 +49,7 @@ func CORSMiddleware() gin.HandlerFunc { } func main() { - InitEnv() + env.InitEnv() db.InitDB() session.InitSession() oauth.InitOAuth() diff --git a/server/resolvers/forgotPassword.go b/server/resolvers/forgotPassword.go index 7485f10..fc5ba16 100644 --- a/server/resolvers/forgotPassword.go +++ b/server/resolvers/forgotPassword.go @@ -20,7 +20,7 @@ func ForgotPassword(ctx context.Context, params model.ForgotPasswordInput) (*mod if err != nil { return res, err } - if constants.DISABLE_BASIC_AUTHENTICATION == "true" { + if constants.DISABLE_BASIC_AUTHENTICATION { return res, fmt.Errorf(`basic authentication is disabled for this instance`) } host := gc.Request.Host diff --git a/server/resolvers/login.go b/server/resolvers/login.go index da32ef8..8d8912c 100644 --- a/server/resolvers/login.go +++ b/server/resolvers/login.go @@ -22,7 +22,7 @@ func Login(ctx context.Context, params model.LoginInput) (*model.AuthResponse, e return res, err } - if constants.DISABLE_BASIC_AUTHENTICATION == "true" { + if constants.DISABLE_BASIC_AUTHENTICATION { return res, fmt.Errorf(`basic authentication is disabled for this instance`) } diff --git a/server/resolvers/magicLogin.go b/server/resolvers/magicLogin.go index 09e6ea5..8d521d9 100644 --- a/server/resolvers/magicLogin.go +++ b/server/resolvers/magicLogin.go @@ -17,7 +17,7 @@ import ( func MagicLogin(ctx context.Context, params model.MagicLoginInput) (*model.Response, error) { var res *model.Response - if constants.DISABLE_MAGIC_LOGIN == "true" { + if constants.DISABLE_MAGIC_LOGIN { return res, fmt.Errorf(`magic link login is disabled for this instance`) } @@ -98,7 +98,7 @@ func MagicLogin(ctx context.Context, params model.MagicLoginInput) (*model.Respo } } - if constants.DISABLE_EMAIL_VERIFICATION != "true" { + if !constants.DISABLE_EMAIL_VERIFICATION { // insert verification request verificationType := enum.MagicLink.String() token, err := utils.CreateVerificationToken(params.Email, verificationType) diff --git a/server/resolvers/resetPassword.go b/server/resolvers/resetPassword.go index c4cb08c..0cc43de 100644 --- a/server/resolvers/resetPassword.go +++ b/server/resolvers/resetPassword.go @@ -14,7 +14,7 @@ import ( func ResetPassword(ctx context.Context, params model.ResetPasswordInput) (*model.Response, error) { var res *model.Response - if constants.DISABLE_BASIC_AUTHENTICATION == "true" { + if constants.DISABLE_BASIC_AUTHENTICATION { return res, fmt.Errorf(`basic authentication is disabled for this instance`) } diff --git a/server/resolvers/signup.go b/server/resolvers/signup.go index cc70bae..e39a7ca 100644 --- a/server/resolvers/signup.go +++ b/server/resolvers/signup.go @@ -22,7 +22,7 @@ func Signup(ctx context.Context, params model.SignUpInput) (*model.AuthResponse, return res, err } - if constants.DISABLE_BASIC_AUTHENTICATION == "true" { + if constants.DISABLE_BASIC_AUTHENTICATION { return res, fmt.Errorf(`basic authentication is disabled for this instance`) } if params.ConfirmPassword != params.Password { @@ -76,7 +76,7 @@ func Signup(ctx context.Context, params model.SignUpInput) (*model.AuthResponse, } user.SignupMethod = enum.BasicAuth.String() - if constants.DISABLE_EMAIL_VERIFICATION == "true" { + if constants.DISABLE_EMAIL_VERIFICATION { user.EmailVerifiedAt = time.Now().Unix() } user, err = db.Mgr.AddUser(user) @@ -98,7 +98,7 @@ func Signup(ctx context.Context, params model.SignUpInput) (*model.AuthResponse, UpdatedAt: &user.UpdatedAt, } - if constants.DISABLE_EMAIL_VERIFICATION != "true" { + if !constants.DISABLE_EMAIL_VERIFICATION { // insert verification request verificationType := enum.BasicAuthSignup.String() token, err := utils.CreateVerificationToken(params.Email, verificationType) diff --git a/server/utils/meta.go b/server/utils/meta.go index 52ef509..9aa06c1 100644 --- a/server/utils/meta.go +++ b/server/utils/meta.go @@ -14,8 +14,8 @@ func GetMetaInfo() model.Meta { IsGithubLoginEnabled: constants.GITHUB_CLIENT_ID != "" && constants.GOOGLE_CLIENT_SECRET != "", IsFacebookLoginEnabled: constants.FACEBOOK_CLIENT_ID != "" && constants.FACEBOOK_CLIENT_SECRET != "", IsTwitterLoginEnabled: constants.TWITTER_CLIENT_ID != "" && constants.TWITTER_CLIENT_SECRET != "", - IsBasicAuthenticationEnabled: constants.DISABLE_BASIC_AUTHENTICATION != "true", - IsEmailVerificationEnabled: constants.DISABLE_EMAIL_VERIFICATION != "true", - IsMagicLoginEnabled: constants.DISABLE_MAGIC_LOGIN != "true" && constants.DISABLE_EMAIL_VERIFICATION != "true", + IsBasicAuthenticationEnabled: !constants.DISABLE_BASIC_AUTHENTICATION, + IsEmailVerificationEnabled: !constants.DISABLE_EMAIL_VERIFICATION, + IsMagicLoginEnabled: !constants.DISABLE_MAGIC_LOGIN, } } diff --git a/server/utils/urls_test.go b/server/utils/urls_test.go index b76d59c..b54d386 100644 --- a/server/utils/urls_test.go +++ b/server/utils/urls_test.go @@ -1,6 +1,10 @@ package utils -import "testing" +import ( + "testing" + + "github.com/stretchr/testify/assert" +) func TestGetHostName(t *testing.T) { authorizer_url := "http://test.herokuapp.com" @@ -8,9 +12,7 @@ func TestGetHostName(t *testing.T) { got := GetHostName(authorizer_url) want := "test.herokuapp.com" - if got != want { - t.Errorf("GetHostName Test failed got %s, wanted %s", got, want) - } + assert.Equal(t, got, want, "hostname should be equal") } func TestGetDomainName(t *testing.T) { @@ -19,7 +21,5 @@ func TestGetDomainName(t *testing.T) { got := GetDomainName(authorizer_url) want := "herokuapp.com" - if got != want { - t.Errorf("GetHostName Test failed got %q, wanted %q", got, want) - } + assert.Equal(t, got, want, "domain name should be equal") } diff --git a/server/utils/validator_test.go b/server/utils/validator_test.go index 555ede7..1ecd269 100644 --- a/server/utils/validator_test.go +++ b/server/utils/validator_test.go @@ -1,21 +1,17 @@ package utils -import "testing" +import ( + "testing" + + "github.com/stretchr/testify/assert" +) func TestIsValidEmail(t *testing.T) { validEmail := "lakhan@gmail.com" invalidEmail1 := "lakhan" invalidEmail2 := "lakhan.me" - if IsValidEmail(validEmail) != true { - t.Errorf("IsValidEmail Test failed got %t, wanted %t for %s", false, true, validEmail) - } - - if IsValidEmail(invalidEmail1) != false { - t.Errorf("IsValidEmail Test failed got %t, wanted %t for %s", true, false, invalidEmail1) - } - - if IsValidEmail(invalidEmail2) != false { - t.Errorf("IsValidEmail Test failed got %t, wanted %t for %s", true, false, invalidEmail2) - } + assert.True(t, IsValidEmail(validEmail), "it should be valid email") + assert.False(t, IsValidEmail(invalidEmail1), "it should be invalid email") + assert.False(t, IsValidEmail(invalidEmail2), "it should be invalid email") }