fix: arangodb get one queries

This commit is contained in:
Lakhan Samani 2021-12-20 17:33:11 +05:30
parent 1398762e1d
commit bedc3d0b50
17 changed files with 110 additions and 73 deletions

View File

@ -6,4 +6,4 @@ cmd:
clean: clean:
rm -rf build rm -rf build
test: test:
cd server && go test ./... cd server && go clean --testcache && go test ./...

View File

@ -3,6 +3,7 @@ package constants
var ( var (
ADMIN_SECRET = "" ADMIN_SECRET = ""
ENV = "" ENV = ""
ENV_PATH = ""
VERSION = "" VERSION = ""
DATABASE_TYPE = "" DATABASE_TYPE = ""
DATABASE_URL = "" DATABASE_URL = ""
@ -21,9 +22,9 @@ var (
IS_PROD = false IS_PROD = false
COOKIE_NAME = "" COOKIE_NAME = ""
RESET_PASSWORD_URL = "" RESET_PASSWORD_URL = ""
DISABLE_EMAIL_VERIFICATION = "false" DISABLE_EMAIL_VERIFICATION = false
DISABLE_BASIC_AUTHENTICATION = "false" DISABLE_BASIC_AUTHENTICATION = false
DISABLE_MAGIC_LOGIN = "false" DISABLE_MAGIC_LOGIN = false
// ROLES // ROLES
ROLES = []string{} ROLES = []string{}

View File

@ -148,7 +148,7 @@ func (mgr *manager) GetUserByEmail(email string) (User, error) {
} }
if IsArangoDB { 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{}{ bindVars := map[string]interface{}{
"email": email, "email": email,
} }
@ -160,10 +160,14 @@ func (mgr *manager) GetUserByEmail(email string) (User, error) {
defer cursor.Close() defer cursor.Close()
for { for {
_, err := cursor.ReadDocument(nil, &user) if !cursor.HasMore() {
if driver.IsNoMoreDocuments(err) { if user.Key == "" {
return user, fmt.Errorf("user not found")
}
break break
} else if err != nil { }
_, err := cursor.ReadDocument(nil, &user)
if err != nil {
return user, err return user, err
} }
} }
@ -201,10 +205,14 @@ func (mgr *manager) GetUserByID(id string) (User, error) {
} }
for { for {
_, err := cursor.ReadDocument(nil, &user) if !cursor.HasMore() {
if driver.IsNoMoreDocuments(err) { if user.Key == "" {
return user, fmt.Errorf("user not found")
}
break break
} else if err != nil { }
_, err := cursor.ReadDocument(nil, &user)
if err != nil {
return user, err return user, err
} }
} }

View File

@ -120,11 +120,14 @@ func (mgr *manager) GetVerificationByToken(token string) (VerificationRequest, e
defer cursor.Close() defer cursor.Close()
for { for {
_, err := cursor.ReadDocument(nil, &verification) if !cursor.HasMore() {
if verification.Key == "" {
if driver.IsNoMoreDocuments(err) { return verification, fmt.Errorf("verification request not found")
}
break break
} else if err != nil { }
_, err := cursor.ReadDocument(nil, &verification)
if err != nil {
return verification, err return verification, err
} }
} }
@ -157,14 +160,16 @@ func (mgr *manager) GetVerificationByEmail(email string) (VerificationRequest, e
defer cursor.Close() defer cursor.Close()
for { for {
_, err := cursor.ReadDocument(nil, &verification) if !cursor.HasMore() {
if verification.Key == "" {
if driver.IsNoMoreDocuments(err) { return verification, fmt.Errorf("verification request not found")
}
break break
} else if err != nil { }
_, err := cursor.ReadDocument(nil, &verification)
if err != nil {
return verification, err return verification, err
} }
} }
} }

View File

@ -1,4 +1,4 @@
package main package env
import ( import (
"flag" "flag"
@ -13,7 +13,7 @@ import (
// build variables // build variables
var ( var (
Version string VERSION string
ARG_DB_URL *string ARG_DB_URL *string
ARG_DB_TYPE *string ARG_DB_TYPE *string
ARG_AUTHORIZER_URL *string ARG_AUTHORIZER_URL *string
@ -22,7 +22,9 @@ var (
// InitEnv -> to initialize env and through error if required env are not present // InitEnv -> to initialize env and through error if required env are not present
func InitEnv() { func InitEnv() {
envPath := `.env` if constants.ENV_PATH == "" {
constants.ENV_PATH = `.env`
}
ARG_DB_URL = flag.String("database_url", "", "Database connection string") 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_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") ARG_AUTHORIZER_URL = flag.String("authorizer_url", "", "URL for authorizer instance, eg: https://xyz.herokuapp.com")
@ -30,15 +32,15 @@ func InitEnv() {
flag.Parse() flag.Parse()
if *ARG_ENV_FILE != "" { 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 { 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.ADMIN_SECRET = os.Getenv("ADMIN_SECRET")
constants.ENV = os.Getenv("ENV") constants.ENV = os.Getenv("ENV")
constants.DATABASE_TYPE = os.Getenv("DATABASE_TYPE") 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_ID = os.Getenv("TWITTER_CLIENT_ID")
constants.TWITTER_CLIENT_SECRET = os.Getenv("TWITTER_CLIENT_SECRET") constants.TWITTER_CLIENT_SECRET = os.Getenv("TWITTER_CLIENT_SECRET")
constants.RESET_PASSWORD_URL = strings.TrimPrefix(os.Getenv("RESET_PASSWORD_URL"), "/") constants.RESET_PASSWORD_URL = strings.TrimPrefix(os.Getenv("RESET_PASSWORD_URL"), "/")
constants.DISABLE_BASIC_AUTHENTICATION = os.Getenv("DISABLE_BASIC_AUTHENTICATION") constants.DISABLE_BASIC_AUTHENTICATION = os.Getenv("DISABLE_BASIC_AUTHENTICATION") == "true"
constants.DISABLE_EMAIL_VERIFICATION = os.Getenv("DISABLE_EMAIL_VERIFICATION") constants.DISABLE_EMAIL_VERIFICATION = os.Getenv("DISABLE_EMAIL_VERIFICATION") == "true"
constants.DISABLE_MAGIC_LOGIN = os.Getenv("DISABLE_MAGIC_LOGIN") constants.DISABLE_MAGIC_LOGIN = os.Getenv("DISABLE_MAGIC_LOGIN") == "true"
constants.JWT_ROLE_CLAIM = os.Getenv("JWT_ROLE_CLAIM") constants.JWT_ROLE_CLAIM = os.Getenv("JWT_ROLE_CLAIM")
if constants.ADMIN_SECRET == "" { if constants.ADMIN_SECRET == "" {
@ -128,21 +130,14 @@ func InitEnv() {
constants.COOKIE_NAME = "authorizer" 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 == "" { if constants.SMTP_HOST == "" || constants.SENDER_EMAIL == "" || constants.SENDER_PASSWORD == "" {
constants.DISABLE_EMAIL_VERIFICATION = "true" constants.DISABLE_EMAIL_VERIFICATION = true
} else if constants.DISABLE_EMAIL_VERIFICATION == "" { constants.DISABLE_MAGIC_LOGIN = true
constants.DISABLE_EMAIL_VERIFICATION = "false"
} }
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"), ",") rolesSplit := strings.Split(os.Getenv("ROLES"), ",")
roles := []string{} roles := []string{}

29
server/env/env_test.go vendored Normal file
View File

@ -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{"*"})
}

View File

@ -20,6 +20,7 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/robertkrimen/otto v0.0.0-20211024170158-b87d35c0b86f 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/ugorji/go v1.2.6 // indirect
github.com/vektah/gqlparser/v2 v2.1.0 github.com/vektah/gqlparser/v2 v2.1.0
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519

View File

@ -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/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.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.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/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.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=

View File

@ -6,6 +6,7 @@ import (
"github.com/authorizerdev/authorizer/server/constants" "github.com/authorizerdev/authorizer/server/constants"
"github.com/authorizerdev/authorizer/server/db" "github.com/authorizerdev/authorizer/server/db"
"github.com/authorizerdev/authorizer/server/env"
"github.com/authorizerdev/authorizer/server/handlers" "github.com/authorizerdev/authorizer/server/handlers"
"github.com/authorizerdev/authorizer/server/oauth" "github.com/authorizerdev/authorizer/server/oauth"
"github.com/authorizerdev/authorizer/server/session" "github.com/authorizerdev/authorizer/server/session"
@ -48,7 +49,7 @@ func CORSMiddleware() gin.HandlerFunc {
} }
func main() { func main() {
InitEnv() env.InitEnv()
db.InitDB() db.InitDB()
session.InitSession() session.InitSession()
oauth.InitOAuth() oauth.InitOAuth()

View File

@ -20,7 +20,7 @@ func ForgotPassword(ctx context.Context, params model.ForgotPasswordInput) (*mod
if err != nil { if err != nil {
return res, err 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`) return res, fmt.Errorf(`basic authentication is disabled for this instance`)
} }
host := gc.Request.Host host := gc.Request.Host

View File

@ -22,7 +22,7 @@ func Login(ctx context.Context, params model.LoginInput) (*model.AuthResponse, e
return res, err 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`) return res, fmt.Errorf(`basic authentication is disabled for this instance`)
} }

View File

@ -17,7 +17,7 @@ import (
func MagicLogin(ctx context.Context, params model.MagicLoginInput) (*model.Response, error) { func MagicLogin(ctx context.Context, params model.MagicLoginInput) (*model.Response, error) {
var res *model.Response 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`) 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 // insert verification request
verificationType := enum.MagicLink.String() verificationType := enum.MagicLink.String()
token, err := utils.CreateVerificationToken(params.Email, verificationType) token, err := utils.CreateVerificationToken(params.Email, verificationType)

View File

@ -14,7 +14,7 @@ import (
func ResetPassword(ctx context.Context, params model.ResetPasswordInput) (*model.Response, error) { func ResetPassword(ctx context.Context, params model.ResetPasswordInput) (*model.Response, error) {
var res *model.Response 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`) return res, fmt.Errorf(`basic authentication is disabled for this instance`)
} }

View File

@ -22,7 +22,7 @@ func Signup(ctx context.Context, params model.SignUpInput) (*model.AuthResponse,
return res, err 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`) return res, fmt.Errorf(`basic authentication is disabled for this instance`)
} }
if params.ConfirmPassword != params.Password { if params.ConfirmPassword != params.Password {
@ -76,7 +76,7 @@ func Signup(ctx context.Context, params model.SignUpInput) (*model.AuthResponse,
} }
user.SignupMethod = enum.BasicAuth.String() user.SignupMethod = enum.BasicAuth.String()
if constants.DISABLE_EMAIL_VERIFICATION == "true" { if constants.DISABLE_EMAIL_VERIFICATION {
user.EmailVerifiedAt = time.Now().Unix() user.EmailVerifiedAt = time.Now().Unix()
} }
user, err = db.Mgr.AddUser(user) user, err = db.Mgr.AddUser(user)
@ -98,7 +98,7 @@ func Signup(ctx context.Context, params model.SignUpInput) (*model.AuthResponse,
UpdatedAt: &user.UpdatedAt, UpdatedAt: &user.UpdatedAt,
} }
if constants.DISABLE_EMAIL_VERIFICATION != "true" { if !constants.DISABLE_EMAIL_VERIFICATION {
// insert verification request // insert verification request
verificationType := enum.BasicAuthSignup.String() verificationType := enum.BasicAuthSignup.String()
token, err := utils.CreateVerificationToken(params.Email, verificationType) token, err := utils.CreateVerificationToken(params.Email, verificationType)

View File

@ -14,8 +14,8 @@ func GetMetaInfo() model.Meta {
IsGithubLoginEnabled: constants.GITHUB_CLIENT_ID != "" && constants.GOOGLE_CLIENT_SECRET != "", IsGithubLoginEnabled: constants.GITHUB_CLIENT_ID != "" && constants.GOOGLE_CLIENT_SECRET != "",
IsFacebookLoginEnabled: constants.FACEBOOK_CLIENT_ID != "" && constants.FACEBOOK_CLIENT_SECRET != "", IsFacebookLoginEnabled: constants.FACEBOOK_CLIENT_ID != "" && constants.FACEBOOK_CLIENT_SECRET != "",
IsTwitterLoginEnabled: constants.TWITTER_CLIENT_ID != "" && constants.TWITTER_CLIENT_SECRET != "", IsTwitterLoginEnabled: constants.TWITTER_CLIENT_ID != "" && constants.TWITTER_CLIENT_SECRET != "",
IsBasicAuthenticationEnabled: constants.DISABLE_BASIC_AUTHENTICATION != "true", IsBasicAuthenticationEnabled: !constants.DISABLE_BASIC_AUTHENTICATION,
IsEmailVerificationEnabled: constants.DISABLE_EMAIL_VERIFICATION != "true", IsEmailVerificationEnabled: !constants.DISABLE_EMAIL_VERIFICATION,
IsMagicLoginEnabled: constants.DISABLE_MAGIC_LOGIN != "true" && constants.DISABLE_EMAIL_VERIFICATION != "true", IsMagicLoginEnabled: !constants.DISABLE_MAGIC_LOGIN,
} }
} }

View File

@ -1,6 +1,10 @@
package utils package utils
import "testing" import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestGetHostName(t *testing.T) { func TestGetHostName(t *testing.T) {
authorizer_url := "http://test.herokuapp.com" authorizer_url := "http://test.herokuapp.com"
@ -8,9 +12,7 @@ func TestGetHostName(t *testing.T) {
got := GetHostName(authorizer_url) got := GetHostName(authorizer_url)
want := "test.herokuapp.com" want := "test.herokuapp.com"
if got != want { assert.Equal(t, got, want, "hostname should be equal")
t.Errorf("GetHostName Test failed got %s, wanted %s", got, want)
}
} }
func TestGetDomainName(t *testing.T) { func TestGetDomainName(t *testing.T) {
@ -19,7 +21,5 @@ func TestGetDomainName(t *testing.T) {
got := GetDomainName(authorizer_url) got := GetDomainName(authorizer_url)
want := "herokuapp.com" want := "herokuapp.com"
if got != want { assert.Equal(t, got, want, "domain name should be equal")
t.Errorf("GetHostName Test failed got %q, wanted %q", got, want)
}
} }

View File

@ -1,21 +1,17 @@
package utils package utils
import "testing" import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestIsValidEmail(t *testing.T) { func TestIsValidEmail(t *testing.T) {
validEmail := "lakhan@gmail.com" validEmail := "lakhan@gmail.com"
invalidEmail1 := "lakhan" invalidEmail1 := "lakhan"
invalidEmail2 := "lakhan.me" invalidEmail2 := "lakhan.me"
if IsValidEmail(validEmail) != true { assert.True(t, IsValidEmail(validEmail), "it should be valid email")
t.Errorf("IsValidEmail Test failed got %t, wanted %t for %s", false, true, validEmail) assert.False(t, IsValidEmail(invalidEmail1), "it should be invalid email")
} assert.False(t, IsValidEmail(invalidEmail2), "it should be invalid email")
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)
}
} }