import os from datetime import timedelta class Config: """Base configuration""" SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key-change-in-production') # JWT Configuration JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY', 'jwt-secret-key-change-in-production') JWT_ACCESS_TOKEN_EXPIRES = timedelta(days=2) JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=7) # SQLAlchemy Configuration SQLALCHEMY_TRACK_MODIFICATIONS = False # Celery Configuration CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://localhost:6379/0') CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://localhost:6379/1') # File Storage UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', 'uploads') REPORTS_FOLDER = os.environ.get('REPORTS_FOLDER', 'reports') SCAN_DATA_FOLDER = os.environ.get('SCAN_DATA_FOLDER', 'uploads/scan_data') MAX_CONTENT_LENGTH = 50 * 1024 * 1024 # 50MB max file size for CloudShell scan uploads # Encryption key for sensitive data ENCRYPTION_KEY = os.environ.get('ENCRYPTION_KEY', 'encryption-key-change-in-production') class DevelopmentConfig(Config): """Development configuration""" DEBUG = True SQLALCHEMY_DATABASE_URI = os.environ.get( 'DATABASE_URL', 'sqlite:///dev.db' ) class TestingConfig(Config): """Testing configuration""" TESTING = True DEBUG = True SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' # Use shorter token expiry for testing JWT_ACCESS_TOKEN_EXPIRES = timedelta(minutes=5) class ProductionConfig(Config): """Production configuration""" DEBUG = False SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') # Ensure these are set in production @classmethod def init_app(cls, app): Config.init_app(app) # Validate required environment variables required_vars = ['SECRET_KEY', 'JWT_SECRET_KEY', 'DATABASE_URL', 'ENCRYPTION_KEY'] missing = [var for var in required_vars if not os.environ.get(var)] if missing: raise ValueError(f"Missing required environment variables: {', '.join(missing)}") config = { 'development': DevelopmentConfig, 'testing': TestingConfig, 'production': ProductionConfig, 'default': DevelopmentConfig }