authorizer/server/env/env.go

285 lines
10 KiB
Go
Raw Normal View History

2021-12-20 12:03:11 +00:00
package env
2021-07-28 06:23:37 +00:00
import (
"log"
"os"
"strings"
"github.com/authorizerdev/authorizer/server/constants"
2022-01-17 06:02:13 +00:00
"github.com/authorizerdev/authorizer/server/envstore"
"github.com/authorizerdev/authorizer/server/utils"
2021-12-31 08:22:10 +00:00
"github.com/google/uuid"
2021-07-28 06:23:37 +00:00
"github.com/joho/godotenv"
)
2022-01-17 06:02:13 +00:00
// TODO move this to env store
2021-10-09 18:19:20 +00:00
var (
2022-01-17 06:02:13 +00:00
// ARG_DB_URL is the cli arg variable for the database url
ARG_DB_URL *string
// ARG_DB_TYPE is the cli arg variable for the database type
ARG_DB_TYPE *string
// ARG_ENV_FILE is the cli arg variable for the env file
ARG_ENV_FILE *string
2021-10-09 18:19:20 +00:00
)
2021-07-28 06:23:37 +00:00
2022-01-17 06:02:13 +00:00
// InitEnv to initialize EnvData and through error if required env are not present
2021-07-28 06:23:37 +00:00
func InitEnv() {
2022-01-17 06:02:13 +00:00
// get clone of current store
envData := envstore.EnvInMemoryStoreObj.GetEnvStoreClone()
if envData[constants.EnvKeyEnv] == nil || envData[constants.EnvKeyEnv] == "" {
envData[constants.EnvKeyEnv] = os.Getenv("ENV")
if envData[constants.EnvKeyEnv] == "" {
envData[constants.EnvKeyEnv] = "production"
}
if envData[constants.EnvKeyEnv] == "production" {
envData[constants.EnvKeyIsProd] = true
os.Setenv("GIN_MODE", "release")
} else {
envData[constants.EnvKeyIsProd] = false
}
}
// set authorizer url to empty string so that fresh url is obtained with every server start
envData[constants.EnvKeyAuthorizerURL] = ""
if envData[constants.EnvKeyAppURL] == nil || envData[constants.EnvKeyAppURL] == "" {
envData[constants.EnvKeyAppURL] = os.Getenv(constants.EnvKeyAppURL)
}
if envData[constants.EnvKeyEnvPath] == nil || envData[constants.EnvKeyEnvPath].(string) == "" {
envData[constants.EnvKeyEnvPath] = `.env`
2021-12-20 12:03:11 +00:00
}
2021-10-09 18:19:20 +00:00
if ARG_ENV_FILE != nil && *ARG_ENV_FILE != "" {
2022-01-17 06:02:13 +00:00
envData[constants.EnvKeyEnvPath] = *ARG_ENV_FILE
}
2021-10-09 18:19:20 +00:00
2022-01-17 06:02:13 +00:00
err := godotenv.Load(envData[constants.EnvKeyEnvPath].(string))
2021-07-28 06:23:37 +00:00
if err != nil {
2022-01-17 06:02:13 +00:00
log.Printf("error loading %s file", envData[constants.EnvKeyEnvPath])
2021-07-28 06:23:37 +00:00
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyPort] == nil || envData[constants.EnvKeyPort].(string) == "" {
envData[constants.EnvKeyPort] = os.Getenv("PORT")
if envData[constants.EnvKeyPort].(string) == "" {
envData[constants.EnvKeyPort] = "8080"
}
2021-07-28 06:23:37 +00:00
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyAdminSecret] == nil || envData[constants.EnvKeyAdminSecret].(string) == "" {
envData[constants.EnvKeyAdminSecret] = os.Getenv("ADMIN_SECRET")
}
if envData[constants.EnvKeyDatabaseType] == nil || envData[constants.EnvKeyDatabaseType].(string) == "" {
envData[constants.EnvKeyDatabaseType] = os.Getenv("DATABASE_TYPE")
log.Println(envData[constants.EnvKeyDatabaseType].(string))
if ARG_DB_TYPE != nil && *ARG_DB_TYPE != "" {
2022-01-17 06:02:13 +00:00
envData[constants.EnvKeyDatabaseType] = *ARG_DB_TYPE
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyDatabaseType].(string) == "" {
panic("DATABASE_TYPE is required")
}
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyDatabaseURL] == nil || envData[constants.EnvKeyDatabaseURL].(string) == "" {
envData[constants.EnvKeyDatabaseURL] = os.Getenv("DATABASE_URL")
if ARG_DB_URL != nil && *ARG_DB_URL != "" {
2022-01-17 06:02:13 +00:00
envData[constants.EnvKeyDatabaseURL] = *ARG_DB_URL
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyDatabaseURL] == "" {
panic("DATABASE_URL is required")
}
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyDatabaseName] == nil || envData[constants.EnvKeyDatabaseName].(string) == "" {
envData[constants.EnvKeyDatabaseName] = os.Getenv("DATABASE_NAME")
if envData[constants.EnvKeyDatabaseName].(string) == "" {
envData[constants.EnvKeyDatabaseName] = "authorizer"
}
2021-07-28 06:23:37 +00:00
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeySmtpHost] == nil || envData[constants.EnvKeySmtpHost].(string) == "" {
envData[constants.EnvKeySmtpHost] = os.Getenv("SMTP_HOST")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeySmtpPort] == nil || envData[constants.EnvKeySmtpPort].(string) == "" {
envData[constants.EnvKeySmtpPort] = os.Getenv("SMTP_PORT")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeySmtpUsername] == nil || envData[constants.EnvKeySmtpUsername].(string) == "" {
envData[constants.EnvKeySmtpUsername] = os.Getenv("SMTP_USERNAME")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeySmtpPassword] == nil || envData[constants.EnvKeySmtpPassword].(string) == "" {
envData[constants.EnvKeySmtpPassword] = os.Getenv("SMTP_PASSWORD")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeySenderEmail] == nil || envData[constants.EnvKeySenderEmail].(string) == "" {
envData[constants.EnvKeySenderEmail] = os.Getenv("SENDER_EMAIL")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyJwtSecret] == nil || envData[constants.EnvKeyJwtSecret].(string) == "" {
envData[constants.EnvKeyJwtSecret] = os.Getenv("JWT_SECRET")
if envData[constants.EnvKeyJwtSecret].(string) == "" {
envData[constants.EnvKeyJwtSecret] = uuid.New().String()
2021-12-31 08:22:10 +00:00
}
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyJwtType] == nil || envData[constants.EnvKeyJwtType].(string) == "" {
envData[constants.EnvKeyJwtType] = os.Getenv("JWT_TYPE")
if envData[constants.EnvKeyJwtType].(string) == "" {
envData[constants.EnvKeyJwtType] = "HS256"
2021-12-31 08:22:10 +00:00
}
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyJwtRoleClaim] == nil || envData[constants.EnvKeyJwtRoleClaim].(string) == "" {
envData[constants.EnvKeyJwtRoleClaim] = os.Getenv("JWT_ROLE_CLAIM")
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyJwtRoleClaim].(string) == "" {
envData[constants.EnvKeyJwtRoleClaim] = "role"
}
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyRedisURL] == nil || envData[constants.EnvKeyRedisURL].(string) == "" {
envData[constants.EnvKeyRedisURL] = os.Getenv("REDIS_URL")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyCookieName] == nil || envData[constants.EnvKeyCookieName].(string) == "" {
envData[constants.EnvKeyCookieName] = os.Getenv("COOKIE_NAME")
if envData[constants.EnvKeyCookieName].(string) == "" {
envData[constants.EnvKeyCookieName] = "authorizer"
}
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyGoogleClientID] == nil || envData[constants.EnvKeyGoogleClientID].(string) == "" {
envData[constants.EnvKeyGoogleClientID] = os.Getenv("GOOGLE_CLIENT_ID")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyGoogleClientSecret] == nil || envData[constants.EnvKeyGoogleClientSecret].(string) == "" {
envData[constants.EnvKeyGoogleClientSecret] = os.Getenv("GOOGLE_CLIENT_SECRET")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyGithubClientID] == nil || envData[constants.EnvKeyGithubClientID].(string) == "" {
envData[constants.EnvKeyGithubClientID] = os.Getenv("GITHUB_CLIENT_ID")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyGithubClientSecret] == nil || envData[constants.EnvKeyGithubClientSecret].(string) == "" {
envData[constants.EnvKeyGithubClientSecret] = os.Getenv("GITHUB_CLIENT_SECRET")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyFacebookClientID] == nil || envData[constants.EnvKeyFacebookClientID].(string) == "" {
envData[constants.EnvKeyFacebookClientID] = os.Getenv("FACEBOOK_CLIENT_ID")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyFacebookClientSecret] == nil || envData[constants.EnvKeyFacebookClientSecret].(string) == "" {
envData[constants.EnvKeyFacebookClientSecret] = os.Getenv("FACEBOOK_CLIENT_SECRET")
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyResetPasswordURL] == nil || envData[constants.EnvKeyResetPasswordURL].(string) == "" {
envData[constants.EnvKeyResetPasswordURL] = strings.TrimPrefix(os.Getenv("RESET_PASSWORD_URL"), "/")
}
2022-01-17 06:02:13 +00:00
envData[constants.EnvKeyDisableBasicAuthentication] = os.Getenv("DISABLE_BASIC_AUTHENTICATION") == "true"
envData[constants.EnvKeyDisableEmailVerification] = os.Getenv("DISABLE_EMAIL_VERIFICATION") == "true"
envData[constants.EnvKeyDisableMagicLinkLogin] = os.Getenv("DISABLE_MAGIC_LINK_LOGIN") == "true"
envData[constants.EnvKeyDisableLoginPage] = os.Getenv("DISABLE_LOGIN_PAGE") == "true"
2022-01-17 06:02:13 +00:00
// no need to add nil check as its already done above
if envData[constants.EnvKeySmtpHost].(string) == "" || envData[constants.EnvKeySmtpUsername].(string) == "" || envData[constants.EnvKeySmtpPassword].(string) == "" || envData[constants.EnvKeySenderEmail].(string) == "" {
envData[constants.EnvKeyDisableEmailVerification] = true
envData[constants.EnvKeyDisableMagicLinkLogin] = true
}
2022-01-17 06:02:13 +00:00
if envData[constants.EnvKeyDisableEmailVerification].(bool) {
envData[constants.EnvKeyDisableMagicLinkLogin] = true
2021-07-28 06:23:37 +00:00
}
allowedOriginsSplit := strings.Split(os.Getenv("ALLOWED_ORIGINS"), ",")
allowedOrigins := []string{}
hasWildCard := false
for _, val := range allowedOriginsSplit {
trimVal := strings.TrimSpace(val)
if trimVal != "" {
if trimVal != "*" {
host, port := utils.GetHostParts(trimVal)
allowedOrigins = append(allowedOrigins, host+":"+port)
} else {
hasWildCard = true
allowedOrigins = append(allowedOrigins, trimVal)
break
}
}
}
if len(allowedOrigins) > 1 && hasWildCard {
allowedOrigins = []string{"*"}
}
if len(allowedOrigins) == 0 {
allowedOrigins = []string{"*"}
}
2022-01-17 06:02:13 +00:00
envData[constants.EnvKeyAllowedOrigins] = allowedOrigins
2021-11-14 22:42:28 +00:00
2021-12-24 13:12:32 +00:00
rolesEnv := strings.TrimSpace(os.Getenv("ROLES"))
rolesSplit := strings.Split(rolesEnv, ",")
roles := []string{}
2021-12-24 13:12:32 +00:00
if len(rolesEnv) == 0 {
roles = []string{"user"}
}
2021-12-24 13:12:32 +00:00
defaultRolesEnv := strings.TrimSpace(os.Getenv("DEFAULT_ROLES"))
defaultRoleSplit := strings.Split(defaultRolesEnv, ",")
defaultRoles := []string{}
2021-12-24 13:12:32 +00:00
if len(defaultRolesEnv) == 0 {
defaultRoles = []string{"user"}
}
2021-12-24 13:12:32 +00:00
protectedRolesEnv := strings.TrimSpace(os.Getenv("PROTECTED_ROLES"))
protectedRolesSplit := strings.Split(protectedRolesEnv, ",")
protectedRoles := []string{}
2021-12-24 13:12:32 +00:00
if len(protectedRolesEnv) > 0 {
for _, val := range protectedRolesSplit {
trimVal := strings.TrimSpace(val)
protectedRoles = append(protectedRoles, trimVal)
}
}
for _, val := range rolesSplit {
trimVal := strings.TrimSpace(val)
if trimVal != "" {
roles = append(roles, trimVal)
}
2021-10-19 07:27:59 +00:00
if utils.StringSliceContains(defaultRoleSplit, trimVal) {
defaultRoles = append(defaultRoles, trimVal)
}
}
2021-12-31 08:22:10 +00:00
if len(roles) > 0 && len(defaultRoles) == 0 && len(defaultRolesEnv) > 0 {
panic(`Invalid DEFAULT_ROLE environment variable. It can be one from give ROLES environment variable value`)
}
2022-01-17 06:02:13 +00:00
envData[constants.EnvKeyRoles] = roles
envData[constants.EnvKeyDefaultRoles] = defaultRoles
envData[constants.EnvKeyProtectedRoles] = protectedRoles
if os.Getenv("ORGANIZATION_NAME") != "" {
2022-01-17 06:02:13 +00:00
envData[constants.EnvKeyOrganizationName] = os.Getenv("ORGANIZATION_NAME")
}
if os.Getenv("ORGANIZATION_LOGO") != "" {
2022-01-17 06:02:13 +00:00
envData[constants.EnvKeyOrganizationLogo] = os.Getenv("ORGANIZATION_LOGO")
}
2022-01-17 06:02:13 +00:00
envstore.EnvInMemoryStoreObj.UpdateEnvStore(envData)
2021-07-28 06:23:37 +00:00
}