2022-05-27 17:50:38 +00:00
|
|
|
package memorystore
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/joho/godotenv"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
|
2022-05-30 06:24:16 +00:00
|
|
|
"github.com/authorizerdev/authorizer/server/cli"
|
2022-05-27 17:50:38 +00:00
|
|
|
"github.com/authorizerdev/authorizer/server/constants"
|
|
|
|
)
|
|
|
|
|
|
|
|
// RequiredEnv holds information about required envs
|
|
|
|
type RequiredEnv struct {
|
2022-05-31 07:41:54 +00:00
|
|
|
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"`
|
2022-05-27 17:50:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// RequiredEnvObj 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 through error if required env are not present
|
|
|
|
func InitRequiredEnv() error {
|
|
|
|
envPath := os.Getenv(constants.EnvKeyEnvPath)
|
|
|
|
|
|
|
|
if envPath == "" {
|
|
|
|
if envPath == "" {
|
|
|
|
envPath = `.env`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-30 06:24:16 +00:00
|
|
|
if cli.ARG_ENV_FILE != nil && *cli.ARG_ENV_FILE != "" {
|
|
|
|
envPath = *cli.ARG_ENV_FILE
|
2022-05-27 17:50:38 +00:00
|
|
|
}
|
|
|
|
log.Info("env path: ", envPath)
|
|
|
|
|
|
|
|
err := godotenv.Load(envPath)
|
|
|
|
if err != nil {
|
2022-05-31 02:44:03 +00:00
|
|
|
log.Infof("using OS env instead of %s file", envPath)
|
2022-05-27 17:50:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
2022-05-31 07:41:54 +00:00
|
|
|
disableRedisForEnv := os.Getenv(constants.EnvKeyDisableRedisForEnv) == "true"
|
2022-05-27 17:50:38 +00:00
|
|
|
|
2022-05-31 02:44:03 +00:00
|
|
|
if strings.TrimSpace(redisURL) == "" {
|
|
|
|
if cli.ARG_REDIS_URL != nil && *cli.ARG_REDIS_URL != "" {
|
|
|
|
redisURL = *cli.ARG_REDIS_URL
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-31 07:41:54 +00:00
|
|
|
// set default db name for non sql dbs
|
|
|
|
if dbName == "" {
|
|
|
|
dbName = "authorizer"
|
|
|
|
}
|
|
|
|
|
2022-05-27 17:50:38 +00:00
|
|
|
if strings.TrimSpace(dbType) == "" {
|
2022-05-30 06:24:16 +00:00
|
|
|
if cli.ARG_DB_TYPE != nil && *cli.ARG_DB_TYPE != "" {
|
|
|
|
dbType = strings.TrimSpace(*cli.ARG_DB_TYPE)
|
2022-05-27 17:50:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if dbType == "" {
|
|
|
|
log.Debug("DATABASE_TYPE is not set")
|
|
|
|
return errors.New("invalid database type. DATABASE_TYPE is empty")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-29 11:52:46 +00:00
|
|
|
if strings.TrimSpace(dbURL) == "" {
|
2022-05-30 06:24:16 +00:00
|
|
|
if cli.ARG_DB_URL != nil && *cli.ARG_DB_URL != "" {
|
|
|
|
dbURL = strings.TrimSpace(*cli.ARG_DB_URL)
|
2022-05-27 17:50:38 +00:00
|
|
|
}
|
|
|
|
|
2022-10-05 10:22:17 +00:00
|
|
|
// In dynamoDB these field are not always mandatory
|
|
|
|
if dbType != constants.DbTypeDynamoDB && dbURL == "" && dbPort == "" && dbHost == "" && dbUsername == "" && dbPassword == "" {
|
2022-05-27 17:50:38 +00:00
|
|
|
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{
|
2022-05-31 07:41:54 +00:00
|
|
|
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,
|
2022-05-27 17:50:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
RequiredEnvStoreObj = &RequiredEnvStore{
|
|
|
|
requiredEnv: requiredEnv,
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|