diff --git a/opentech/settings/base.py b/opentech/settings/base.py index a4263ea3152afeef632d93dc7fd199545c0adc7f..fe9ac09d111841c91408a2e6d9314b0a31286658 100644 --- a/opentech/settings/base.py +++ b/opentech/settings/base.py @@ -18,6 +18,45 @@ BASE_DIR = os.path.dirname(PROJECT_DIR) APP_NAME = env.get('APP_NAME', 'opentech') +DEBUG = False + + +if 'SECRET_KEY' in env: + SECRET_KEY = env['SECRET_KEY'] + +if 'ALLOWED_HOSTS' in env: + ALLOWED_HOSTS = env['ALLOWED_HOSTS'].split(',') + + +# Email settings +if 'EMAIL_HOST' in env: + EMAIL_HOST = env['EMAIL_HOST'] + +if 'EMAIL_PORT' in env: + try: + EMAIL_PORT = int(env['EMAIL_PORT']) + except ValueError: + pass + +if 'EMAIL_HOST_USER' in env: + EMAIL_HOST_USER = env['EMAIL_HOST_USER'] + +if 'EMAIL_HOST_PASSWORD' in env: + EMAIL_HOST_PASSWORD = env['EMAIL_HOST_PASSWORD'] + +if env.get('EMAIL_USE_TLS', 'false').lower().strip() == 'true': + EMAIL_USE_TLS = True + +if env.get('EMAIL_USE_SSL', 'false').lower().strip() == 'true': + EMAIL_USE_SSL = True + +if 'EMAIL_SUBJECT_PREFIX' in env: + EMAIL_SUBJECT_PREFIX = env['EMAIL_SUBJECT_PREFIX'] + +if 'SERVER_EMAIL' in env: + SERVER_EMAIL = DEFAULT_FROM_EMAIL = env['SERVER_EMAIL'] + + # Application definition INSTALLED_APPS = [ @@ -148,14 +187,28 @@ DATABASES = { # Cache -# Use database cache as the cache backend - -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', - 'LOCATION': 'database_cache', +if 'REDIS_URL' in env: + CACHES = { + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": env['REDIS_URL'], + } } -} +else: + CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', + 'LOCATION': 'database_cache', + } + } + + +# Set s-max-age header that is used by reverse proxy/front end cache. See +# urls.py +try: + CACHE_CONTROL_S_MAXAGE = int(env.get('CACHE_CONTROL_S_MAXAGE', 600)) +except ValueError: + pass # Search @@ -326,8 +379,8 @@ SOCIAL_AUTH_URL_NAMESPACE = 'social' # Make sure the Google+ API is enabled for your API project STAFF_EMAIL_DOMAINS = ['opentech.fund'] SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS = STAFF_EMAIL_DOMAINS -SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '' -SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '' +SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = env.get('SOCIAL_AUTH_GOOGLE_OAUTH2_KEY', '') +SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = env.get('SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET', '') SOCIAL_AUTH_LOGIN_ERROR_URL = 'users_public:login' SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = 'users:account' @@ -450,3 +503,60 @@ if 'SENTRY_DSN' in env: RAVEN_CONFIG['release'] = env['GIT_REV'] except KeyError: pass + + +# Basic auth settings +if env.get('BASIC_AUTH_ENABLED', 'false').lower().strip() == 'true': + MIDDLEWARE.insert(0, 'baipw.middleware.BasicAuthIPWhitelistMiddleware') + BASIC_AUTH_LOGIN = env['BASIC_AUTH_LOGIN'] + BASIC_AUTH_PASSWORD = env['BASIC_AUTH_PASSWORD'] + if 'BASIC_AUTH_WHITELISTED_HTTP_HOSTS' in env: + BASIC_AUTH_WHITELISTED_HTTP_HOSTS = ( + env['BASIC_AUTH_WHITELISTED_HTTP_HOSTS'].split(',') + ) + + +# Cloudflare cache +if 'CLOUDFLARE_API_TOKEN' in env: + INSTALLED_APPS += ('wagtail.contrib.frontend_cache', ) # noqa + WAGTAILFRONTENDCACHE = { + 'cloudflare': { + 'BACKEND': 'wagtail.contrib.frontend_cache.backends.CloudflareBackend', + 'EMAIL': env['CLOUDFLARE_API_EMAIL'], + 'TOKEN': env['CLOUDFLARE_API_TOKEN'], + 'ZONEID': env['CLOUDFLARE_API_ZONEID'], + }, + } + + +if 'PRIMARY_HOST' in env: + # This is used by Wagtail's email notifications for constructing absolute + # URLs. + BASE_URL = 'https://{}'.format(env['PRIMARY_HOST']) + + +# Security configuration +# https://docs.djangoproject.com/en/stable/ref/middleware/#module-django.middleware.security + +if env.get('SECURE_SSL_REDIRECT', 'true').strip().lower() == 'true': + SECURE_SSL_REDIRECT = True + +SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') + +if 'SECURE_HSTS_SECONDS' in env: + try: + SECURE_HSTS_SECONDS = int(env['SECURE_HSTS_SECONDS']) + pass + +if env.get('SECURE_BROWSER_XSS_FILTER', 'true').lower().strip() == 'true': + SECURE_BROWSER_XSS_FILTER = True + +if env.get('SECURE_CONTENT_TYPE_NOSNIFF', 'true').lower().strip() == 'true': + SECURE_CONTENT_TYPE_NOSNIFF = True + + +# Referrer-policy header settings +# https://django-referrer-policy.readthedocs.io/en/1.0/ + +REFERRER_POLICY = env.get('SECURE_REFERRER_POLICY', + 'no-referrer-when-downgrade').strip() diff --git a/opentech/settings/dev.py b/opentech/settings/dev.py index 200b3d77d3e34e27ebd475e9052c256b490be5b0..b6277f0661144779c4d316f69c257a2e8844d341 100644 --- a/opentech/settings/dev.py +++ b/opentech/settings/dev.py @@ -20,6 +20,8 @@ INSTALLED_APPS = INSTALLED_APPS + [ 'wagtail.contrib.styleguide', ] +SECURE_SSL_REDIRECT = False + try: from .local import * # noqa except ImportError: diff --git a/opentech/settings/production.py b/opentech/settings/production.py index 837650ecb04bd5f13f2c377bd122c5ec52255059..0ecfc47c70ee824a187c76a54da64c150750719a 100644 --- a/opentech/settings/production.py +++ b/opentech/settings/production.py @@ -1,54 +1,19 @@ import os -import dj_database_url # import raven import django_heroku from .base import * # noqa -# Do not set SECRET_KEY, Postgres or LDAP password or any other sensitive data here. -# Instead, use environment variables or create a local.py file on the server. - # Disable debug mode DEBUG = False -# Cache everything for 10 minutes -# This only applies to pages that do not have a more specific cache-control -# setting. See urls.py -CACHE_CONTROL_MAX_AGE = 600 - - # Configuration from environment variables # Alternatively, you can set these in a local.py file on the server env = os.environ.copy() # Basic configuration -if env.get('SECURE_SSL_REDIRECT', 'true') == 'true': - SECURE_SSL_REDIRECT = True -SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') -# enable HSTS only once the site is working properly on https with the actual live domain name -# SECURE_HSTS_SECONDS = 31536000 # 1 year - -if 'SECRET_KEY' in env: - SECRET_KEY = env['SECRET_KEY'] - -if 'ALLOWED_HOSTS' in env: - ALLOWED_HOSTS = env['ALLOWED_HOSTS'].split(',') - -if 'PRIMARY_HOST' in env: - BASE_URL = 'https://%s/' % env['PRIMARY_HOST'] - - -# Email config - -if 'SERVER_EMAIL' in env: - SERVER_EMAIL = env['SERVER_EMAIL'] - DEFAULT_FROM_EMAIL = env['SERVER_EMAIL'] - -if 'EMAIL_HOST' in env: - EMAIL_HOST = env['EMAIL_HOST'] - if 'MAILGUN_API_KEY' in env: EMAIL_BACKEND = 'anymail.backends.mailgun.EmailBackend' ANYMAIL = { @@ -57,41 +22,6 @@ if 'MAILGUN_API_KEY' in env: "WEBHOOK_SECRET": env.get('ANYMAIL_WEBHOOK_SECRET', None) } -# Social Auth - -if 'SOCIAL_AUTH_GOOGLE_OAUTH2_KEY' in env: - SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = env['SOCIAL_AUTH_GOOGLE_OAUTH2_KEY'] - -if 'SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET' in env: - SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = env['SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET'] - -# Basic auth to stop access to other than primary hosts. - -MIDDLEWARE += [ - 'baipw.middleware.BasicAuthIPWhitelistMiddleware' -] - -if 'BASIC_AUTH_LOGIN' in env: - BASIC_AUTH_LOGIN = env['BASIC_AUTH_LOGIN'] - -if 'BASIC_AUTH_PASSWORD' in env: - BASIC_AUTH_PASSWORD = env['BASIC_AUTH_PASSWORD'] - -if 'BASIC_AUTH_WHITELISTED_HTTP_HOSTS' in env: - BASIC_AUTH_WHITELISTED_HTTP_HOSTS = env['BASIC_AUTH_WHITELISTED_HTTP_HOSTS'].split(',') - -# Cloudflare cache - -if 'CLOUDFLARE_API_TOKEN' in env: - INSTALLED_APPS += ('wagtail.contrib.frontend_cache', ) # noqa - WAGTAILFRONTENDCACHE = { - 'cloudflare': { - 'BACKEND': 'wagtail.contrib.frontend_cache.backends.CloudflareBackend', - 'EMAIL': env['CLOUDFLARE_API_EMAIL'], - 'TOKEN': env['CLOUDFLARE_API_TOKEN'], - 'ZONEID': env['CLOUDFLARE_API_ZONEID'], - }, - } django_heroku.settings(locals())