from werkzeug.middleware.proxy_fix import ProxyFix import os import logging class Config: ''' ### Flask ### ''' SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string' ''' ### Flask-Mail ### ''' MAIL_SERVER = os.environ.get('MAIL_SERVER') MAIL_PORT = int(os.environ.get('MAIL_PORT')) MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS').lower() == 'true' MAIL_USERNAME = os.environ.get('MAIL_USERNAME') MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') ''' ### Flask-SQLAlchemy ### ''' SQLALCHEMY_DATABASE_URI = 'postgresql://{}:{}@db/{}'.format( os.environ.get('POSTGRES_USER'), os.environ.get('POSTGRES_PASSWORD'), os.environ.get('POSTGRES_DB_NAME')) SQLALCHEMY_RECORD_QUERIES = True SQLALCHEMY_TRACK_MODIFICATIONS = False ''' ### nopaque ### ''' NOPAQUE_ADMIN = os.environ.get('NOPAQUE_ADMIN') NOPAQUE_CONTACT = os.environ.get('NOPAQUE_CONTACT') NOPAQUE_MAIL_SENDER = os.environ.get('NOPAQUE_MAIL_SENDER') NOPAQUE_MAIL_SUBJECT_PREFIX = '[nopaque]' NOPAQUE_PROTOCOL = os.environ.get('NOPAQUE_PROTOCOL') NOPAQUE_STORAGE = os.environ.get('NOPAQUE_STORAGE') os.makedirs('logs', exist_ok=True) logging.basicConfig(filename='logs/nopaque.log', format='[%(asctime)s] %(levelname)s in ' '%(pathname)s:%(lineno)d - %(message)s', datefmt='%Y-%m-%d %H:%M:%S', filemode='w') ''' ### Security enhancements ### ''' if NOPAQUE_PROTOCOL == 'https': ''' ### Flask ### ''' SESSION_COOKIE_SECURE = True ''' ### Flask-Login ### ''' REMEMBER_COOKIE_HTTPONLY = True REMEMBER_COOKIE_SECURE = True @staticmethod def init_app(app): proxy_fix_kwargs = {'x_for': 1, 'x_host': 1, 'x_port': 1, 'x_proto': 1} app.wsgi_app = ProxyFix(app.wsgi_app, **proxy_fix_kwargs) class DevelopmentConfig(Config): ''' ### Flask ### ''' DEBUG = True ''' ### nopaque ### ''' NOPAQUE_LOG_LEVEL = os.environ.get('NOPAQUE_LOG_LEVEL') or 'DEBUG' logging.basicConfig(level=NOPAQUE_LOG_LEVEL) class TestingConfig(Config): ''' ### Flask ### ''' TESTING = True ''' ### Flask-SQLAlchemy ### ''' SQLALCHEMY_DATABASE_URI = 'sqlite://' ''' ### Flask-WTF ### ''' WTF_CSRF_ENABLED = False class ProductionConfig(Config): ''' ### nopaque ### ''' NOPAQUE_LOG_LEVEL = os.environ.get('NOPAQUE_LOG_LEVEL') or 'ERROR' logging.basicConfig(level=NOPAQUE_LOG_LEVEL) config = { 'development': DevelopmentConfig, 'testing': TestingConfig, 'production': ProductionConfig, 'default': DevelopmentConfig, }