
* fix: * removed hasReversedValue in playground * feat: * added totp methods in db's providers * adding totp in login method * feat: * added toggle in dashboard * fixing issue with env set * feat: * integrated totp * feat: * encrypted userid * added totp_verified column in user table * started test for totp * feat: * test cases totp * test-cases: * completed test cases * tested for all dbs * fixes: * return variable to snake case * import refactoring * feat: * created seperate folder for authenticator with totp subfolder * refactored code * created new table for authenticators * added recovery code for totp * feat: * adding functions to different db providers * feat: * added authenticators method for all db * feat: * added logic for updating mfa in user_profile update * fix: * merge conflict * fix: * resolved mongodb, dynamodb and arangodb test case bug * added new condition for checking first time totp user or not * feat: * changes in all respective db with authenticator * fix: * PR suggested changes * fix(cassandra): list users * Update verify otp * fix totp login api --------- Co-authored-by: lemonScaletech <anand.panigrahi@scaletech.xyz>
172 lines
5.3 KiB
Go
172 lines
5.3 KiB
Go
package memorystore
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/joho/godotenv"
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/authorizerdev/authorizer/server/cli"
|
|
"github.com/authorizerdev/authorizer/server/constants"
|
|
)
|
|
|
|
// RequiredEnv holds information about required envs
|
|
type RequiredEnv struct {
|
|
EnvPath string `json:"ENV_PATH"`
|
|
DatabaseURL string `json:"DATABASE_URL"`
|
|
DatabaseType string `json:"DATABASE_TYPE"`
|
|
DatabaseName string `json:"DATABASE_NAME"`
|
|
DatabaseHost string `json:"DATABASE_HOST"`
|
|
DatabasePort string `json:"DATABASE_PORT"`
|
|
DatabaseUsername string `json:"DATABASE_USERNAME"`
|
|
DatabasePassword string `json:"DATABASE_PASSWORD"`
|
|
DatabaseCert string `json:"DATABASE_CERT"`
|
|
DatabaseCertKey string `json:"DATABASE_CERT_KEY"`
|
|
DatabaseCACert string `json:"DATABASE_CA_CERT"`
|
|
RedisURL string `json:"REDIS_URL"`
|
|
DisableRedisForEnv bool `json:"DISABLE_REDIS_FOR_ENV"`
|
|
// AWS Related Envs
|
|
AwsRegion string `json:"AWS_REGION"`
|
|
AwsAccessKeyID string `json:"AWS_ACCESS_KEY_ID"`
|
|
AwsSecretAccessKey string `json:"AWS_SECRET_ACCESS_KEY"`
|
|
// Couchbase related envs
|
|
CouchbaseBucket string `json:"COUCHBASE_BUCKET"`
|
|
CouchbaseScope string `json:"COUCHBASE_SCOPE"`
|
|
CouchbaseBucketRAMQuotaMB string `json:"COUCHBASE_BUCKET_RAM_QUOTA"`
|
|
}
|
|
|
|
// RequiredEnvStore is a simple in-memory store for sessions.
|
|
type RequiredEnvStore struct {
|
|
mutex sync.Mutex
|
|
requiredEnv RequiredEnv
|
|
}
|
|
|
|
// GetRequiredEnv to get required env
|
|
func (r *RequiredEnvStore) GetRequiredEnv() RequiredEnv {
|
|
r.mutex.Lock()
|
|
defer r.mutex.Unlock()
|
|
|
|
return r.requiredEnv
|
|
}
|
|
|
|
// SetRequiredEnv to set required env
|
|
func (r *RequiredEnvStore) SetRequiredEnv(requiredEnv RequiredEnv) {
|
|
r.mutex.Lock()
|
|
defer r.mutex.Unlock()
|
|
r.requiredEnv = requiredEnv
|
|
}
|
|
|
|
var RequiredEnvStoreObj *RequiredEnvStore
|
|
|
|
// InitRequiredEnv to initialize EnvData and throw error if required env are not present
|
|
// This includes env that only configurable via env vars and not the ui
|
|
func InitRequiredEnv() error {
|
|
envPath := os.Getenv(constants.EnvKeyEnvPath)
|
|
|
|
if envPath == "" {
|
|
if envPath == "" {
|
|
envPath = `.env`
|
|
}
|
|
}
|
|
|
|
if cli.ARG_ENV_FILE != nil && *cli.ARG_ENV_FILE != "" {
|
|
envPath = *cli.ARG_ENV_FILE
|
|
}
|
|
log.Info("env path: ", envPath)
|
|
|
|
err := godotenv.Load(envPath)
|
|
if err != nil {
|
|
log.Infof("using OS env instead of %s file", envPath)
|
|
}
|
|
|
|
dbURL := os.Getenv(constants.EnvKeyDatabaseURL)
|
|
dbType := os.Getenv(constants.EnvKeyDatabaseType)
|
|
dbName := os.Getenv(constants.EnvKeyDatabaseName)
|
|
dbPort := os.Getenv(constants.EnvKeyDatabasePort)
|
|
dbHost := os.Getenv(constants.EnvKeyDatabaseHost)
|
|
dbUsername := os.Getenv(constants.EnvKeyDatabaseUsername)
|
|
dbPassword := os.Getenv(constants.EnvKeyDatabasePassword)
|
|
dbCert := os.Getenv(constants.EnvKeyDatabaseCert)
|
|
dbCertKey := os.Getenv(constants.EnvKeyDatabaseCertKey)
|
|
dbCACert := os.Getenv(constants.EnvKeyDatabaseCACert)
|
|
redisURL := os.Getenv(constants.EnvKeyRedisURL)
|
|
disableRedisForEnv := os.Getenv(constants.EnvKeyDisableRedisForEnv) == "true"
|
|
awsRegion := os.Getenv(constants.EnvAwsRegion)
|
|
awsAccessKeyID := os.Getenv(constants.EnvAwsAccessKeyID)
|
|
awsSecretAccessKey := os.Getenv(constants.EnvAwsSecretAccessKey)
|
|
couchbaseBucket := os.Getenv(constants.EnvCouchbaseBucket)
|
|
couchbaseScope := os.Getenv(constants.EnvCouchbaseScope)
|
|
couchbaseBucketRAMQuotaMB := os.Getenv(constants.EnvCouchbaseBucketRAMQuotaMB)
|
|
|
|
if strings.TrimSpace(redisURL) == "" {
|
|
if cli.ARG_REDIS_URL != nil && *cli.ARG_REDIS_URL != "" {
|
|
redisURL = *cli.ARG_REDIS_URL
|
|
}
|
|
}
|
|
|
|
// set default db name for non sql dbs
|
|
if dbName == "" {
|
|
dbName = "authorizer"
|
|
}
|
|
|
|
if strings.TrimSpace(dbType) == "" {
|
|
if cli.ARG_DB_TYPE != nil && *cli.ARG_DB_TYPE != "" {
|
|
dbType = strings.TrimSpace(*cli.ARG_DB_TYPE)
|
|
}
|
|
|
|
if dbType == "" {
|
|
log.Debug("DATABASE_TYPE is not set")
|
|
return errors.New("invalid database type. DATABASE_TYPE is empty")
|
|
}
|
|
}
|
|
|
|
if strings.TrimSpace(dbURL) == "" {
|
|
if cli.ARG_DB_URL != nil && *cli.ARG_DB_URL != "" {
|
|
dbURL = strings.TrimSpace(*cli.ARG_DB_URL)
|
|
}
|
|
|
|
// In dynamoDB these field are not always mandatory
|
|
if dbType != constants.DbTypeDynamoDB && dbURL == "" && dbPort == "" && dbHost == "" && dbUsername == "" && dbPassword == "" {
|
|
log.Debug("DATABASE_URL is not set")
|
|
return errors.New("invalid database url. DATABASE_URL is required")
|
|
}
|
|
}
|
|
|
|
if dbName == "" {
|
|
if dbName == "" {
|
|
dbName = "authorizer"
|
|
}
|
|
}
|
|
|
|
requiredEnv := RequiredEnv{
|
|
EnvPath: envPath,
|
|
DatabaseURL: dbURL,
|
|
DatabaseType: dbType,
|
|
DatabaseName: dbName,
|
|
DatabaseHost: dbHost,
|
|
DatabasePort: dbPort,
|
|
DatabaseUsername: dbUsername,
|
|
DatabasePassword: dbPassword,
|
|
DatabaseCert: dbCert,
|
|
DatabaseCertKey: dbCertKey,
|
|
DatabaseCACert: dbCACert,
|
|
RedisURL: redisURL,
|
|
DisableRedisForEnv: disableRedisForEnv,
|
|
AwsRegion: awsRegion,
|
|
AwsAccessKeyID: awsAccessKeyID,
|
|
AwsSecretAccessKey: awsSecretAccessKey,
|
|
CouchbaseBucket: couchbaseBucket,
|
|
CouchbaseScope: couchbaseScope,
|
|
CouchbaseBucketRAMQuotaMB: couchbaseBucketRAMQuotaMB,
|
|
}
|
|
|
|
RequiredEnvStoreObj = &RequiredEnvStore{
|
|
requiredEnv: requiredEnv,
|
|
}
|
|
|
|
return nil
|
|
}
|