This commit is contained in:
@@ -5,6 +5,8 @@ from dataclasses import dataclass
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from cryptography.fernet import Fernet
|
||||
|
||||
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
||||
DB_PATH = BASE_DIR / 'data' / 'linklog.db'
|
||||
@@ -20,6 +22,7 @@ def normalize_public_url(value: str) -> str:
|
||||
|
||||
@dataclass
|
||||
class Settings:
|
||||
app_env: str = os.getenv('APP_ENV', 'development').lower()
|
||||
app_name: str = os.getenv('LINKLOG_APP_NAME', 'LinkLog')
|
||||
version: str = os.getenv('LINKLOG_VERSION', '0.1.0')
|
||||
database_url: str = os.getenv('LINKLOG_DATABASE_URL', f'sqlite:///{DB_PATH}')
|
||||
@@ -59,3 +62,19 @@ class Settings:
|
||||
|
||||
|
||||
settings = Settings()
|
||||
|
||||
|
||||
def validate_configuration(values: Settings) -> None:
|
||||
if values.app_env == 'production':
|
||||
if not values.secret_key or values.secret_key == 'dev-secret-key-change-me':
|
||||
raise RuntimeError('LINKLOG_SECRET_KEY must be configured in production')
|
||||
if len(values.secret_key) < 32 or len(set(values.secret_key)) < 12:
|
||||
raise RuntimeError('LINKLOG_SECRET_KEY must be at least 32 characters with sufficient entropy')
|
||||
if not values.data_encryption_key:
|
||||
raise RuntimeError('LINKLOG_DATA_ENCRYPTION_KEY must be configured in production')
|
||||
|
||||
if values.data_encryption_key:
|
||||
try:
|
||||
Fernet(values.data_encryption_key.encode('ascii'))
|
||||
except (ValueError, UnicodeEncodeError) as error:
|
||||
raise RuntimeError('LINKLOG_DATA_ENCRYPTION_KEY must be a valid Fernet key') from error
|
||||
|
||||
Reference in New Issue
Block a user