refactor config: do not use eval()

This commit is contained in:
Son NK 2021-03-05 17:26:42 +01:00
parent a65680b5ba
commit 3af98026e3
2 changed files with 40 additions and 32 deletions

View File

@ -3,6 +3,8 @@ import random
import socket import socket
import string import string
import subprocess import subprocess
from ast import literal_eval
from typing import Callable
from urllib.parse import urlparse from urllib.parse import urlparse
from dotenv import load_dotenv from dotenv import load_dotenv
@ -20,6 +22,21 @@ def get_abs_path(file_path: str):
return os.path.join(ROOT_DIR, file_path) return os.path.join(ROOT_DIR, file_path)
def sl_getenv(env_var: str, default_factory: Callable = None):
"""
Get env value, convert into Python object
Args:
env_var (str): env var, example: SL_DB
default_factory: returns value if this env var is not set.
"""
value = os.getenv(env_var)
if value is None:
return default_factory()
return literal_eval(value)
config_file = os.environ.get("CONFIG") config_file = os.environ.get("CONFIG")
if config_file: if config_file:
config_file = get_abs_path(config_file) config_file = get_abs_path(config_file)
@ -99,43 +116,30 @@ if "POSTFIX_PORT_FORWARD" in os.environ:
# Useful when calling Postfix from an external network # Useful when calling Postfix from an external network
POSTFIX_SUBMISSION_TLS = "POSTFIX_SUBMISSION_TLS" in os.environ POSTFIX_SUBMISSION_TLS = "POSTFIX_SUBMISSION_TLS" in os.environ
if "OTHER_ALIAS_DOMAINS" in os.environ: # ["domain1.com", "domain2.com"]
OTHER_ALIAS_DOMAINS = eval( OTHER_ALIAS_DOMAINS = sl_getenv("OTHER_ALIAS_DOMAINS", list)
os.environ["OTHER_ALIAS_DOMAINS"] OTHER_ALIAS_DOMAINS = [d.lower().strip() for d in OTHER_ALIAS_DOMAINS]
) # ["domain1.com", "domain2.com"]
else:
OTHER_ALIAS_DOMAINS = []
# List of domains user can use to create alias # List of domains user can use to create alias
if "ALIAS_DOMAINS" in os.environ: if "ALIAS_DOMAINS" in os.environ:
ALIAS_DOMAINS = eval(os.environ["ALIAS_DOMAINS"]) # ["domain1.com", "domain2.com"] ALIAS_DOMAINS = sl_getenv("ALIAS_DOMAINS") # ["domain1.com", "domain2.com"]
else: else:
ALIAS_DOMAINS = OTHER_ALIAS_DOMAINS + [EMAIL_DOMAIN] ALIAS_DOMAINS = OTHER_ALIAS_DOMAINS + [EMAIL_DOMAIN]
ALIAS_DOMAINS = [d.lower().strip() for d in ALIAS_DOMAINS] ALIAS_DOMAINS = [d.lower().strip() for d in ALIAS_DOMAINS]
if "PREMIUM_ALIAS_DOMAINS" in os.environ: # ["domain1.com", "domain2.com"]
PREMIUM_ALIAS_DOMAINS = eval( PREMIUM_ALIAS_DOMAINS = sl_getenv("PREMIUM_ALIAS_DOMAINS", list)
os.environ["PREMIUM_ALIAS_DOMAINS"]
) # ["domain1.com", "domain2.com"]
else:
PREMIUM_ALIAS_DOMAINS = []
PREMIUM_ALIAS_DOMAINS = [d.lower().strip() for d in PREMIUM_ALIAS_DOMAINS] PREMIUM_ALIAS_DOMAINS = [d.lower().strip() for d in PREMIUM_ALIAS_DOMAINS]
# the alias domain used when creating the first alias for user # the alias domain used when creating the first alias for user
FIRST_ALIAS_DOMAIN = os.environ.get("FIRST_ALIAS_DOMAIN") or EMAIL_DOMAIN FIRST_ALIAS_DOMAIN = os.environ.get("FIRST_ALIAS_DOMAIN") or EMAIL_DOMAIN
# list of (priority, email server) # list of (priority, email server)
EMAIL_SERVERS_WITH_PRIORITY = eval( # e.g. [(10, "mx1.hostname."), (10, "mx2.hostname.")]
os.environ["EMAIL_SERVERS_WITH_PRIORITY"] EMAIL_SERVERS_WITH_PRIORITY = sl_getenv("EMAIL_SERVERS_WITH_PRIORITY")
) # [(10, "email.hostname.")]
# these emails are ignored when computing stats # these emails are ignored when computing stats
if os.environ.get("IGNORED_EMAILS"): IGNORED_EMAILS = sl_getenv("IGNORED_EMAILS", list)
IGNORED_EMAILS = eval(os.environ.get("IGNORED_EMAILS"))
else:
IGNORED_EMAILS = []
# disable the alias suffix, i.e. the ".random_word" part # disable the alias suffix, i.e. the ".random_word" part
DISABLE_ALIAS_SUFFIX = "DISABLE_ALIAS_SUFFIX" in os.environ DISABLE_ALIAS_SUFFIX = "DISABLE_ALIAS_SUFFIX" in os.environ
@ -197,18 +201,10 @@ except (KeyError, ValueError):
PADDLE_YEARLY_PRODUCT_ID = -1 PADDLE_YEARLY_PRODUCT_ID = -1
# Other Paddle product IDS # Other Paddle product IDS
if "PADDLE_MONTHLY_PRODUCT_IDS" in os.environ: PADDLE_MONTHLY_PRODUCT_IDS = sl_getenv("PADDLE_MONTHLY_PRODUCT_IDS", list)
PADDLE_MONTHLY_PRODUCT_IDS = eval(os.environ["PADDLE_MONTHLY_PRODUCT_IDS"])
else:
PADDLE_MONTHLY_PRODUCT_IDS = []
PADDLE_MONTHLY_PRODUCT_IDS.append(PADDLE_MONTHLY_PRODUCT_ID) PADDLE_MONTHLY_PRODUCT_IDS.append(PADDLE_MONTHLY_PRODUCT_ID)
if "PADDLE_YEARLY_PRODUCT_IDS" in os.environ: PADDLE_YEARLY_PRODUCT_IDS = sl_getenv("PADDLE_YEARLY_PRODUCT_IDS", list)
PADDLE_YEARLY_PRODUCT_IDS = eval(os.environ["PADDLE_YEARLY_PRODUCT_IDS"])
else:
PADDLE_YEARLY_PRODUCT_IDS = []
PADDLE_YEARLY_PRODUCT_IDS.append(PADDLE_YEARLY_PRODUCT_ID) PADDLE_YEARLY_PRODUCT_IDS.append(PADDLE_YEARLY_PRODUCT_ID)
PADDLE_PUBLIC_KEY_PATH = get_abs_path( PADDLE_PUBLIC_KEY_PATH = get_abs_path(

12
tests/test_config.py Normal file
View File

@ -0,0 +1,12 @@
import pytest
from app.config import sl_getenv
def test_sl_getenv(monkeypatch):
monkeypatch.setenv("SL_KEY_1", '["domain_1"]')
assert sl_getenv("SL_KEY_1") == ["domain_1"]
assert sl_getenv("SL_KEY_2", default_factory=list) == []
with pytest.raises(TypeError):
sl_getenv("SL_KEY_3")