""" Django settings for talerbank. For more information on this file, see https://docs.djangoproject.com/en/1.9/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.9/ref/settings/ """ import base64 import logging import os import re import sys import urllib.parse from .talerconfig import TalerConfig, ConfigurationError LOGGER = logging.getLogger(__name__) LOGGER.info("DJANGO_SETTINGS_MODULE: %s" \ % os.environ.get("DJANGO_SETTINGS_MODULE")) TC = TalerConfig.from_file(os.environ.get("TALER_CONFIG_FILE")) # Build paths inside the project like this: # os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname( os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ SECRET_KEY = os.environ.get("TALER_BANK_SECRET_KEY", None) if not SECRET_KEY: LOGGER.info("secret key not configured in" " TALER_BANK_SECRET_KEY env variable," " generating random secret") SECRET_KEY = base64.b64encode(os.urandom(32)).decode('utf-8') # SECURITY WARNING: don't run with debug turned on in production! if "demo" == os.environ.get("TALER_ENV_NAME"): DEBUG = False else: DEBUG = True ADMIN_ENABLED = False ALLOWED_HOSTS = ["*"] LOGIN_URL = "login" LOGIN_REDIRECT_URL = "index" # Application definition INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'talerbank.app' ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'talerbank.app.middleware.ExceptionMiddleware', ] TEMPLATES = [ {'BACKEND': 'django.template.backends.jinja2.Jinja2', 'DIRS': [os.path.join(BASE_DIR, "talerbank/app/static/web-common/"), os.path.join(BASE_DIR, "talerbank/app/templates")], 'OPTIONS': { 'environment': 'talerbank.jinja2.environment'}}] # Disable those, since they don't work with # jinja2 anyways. TEMPLATE_CONTEXT_PROCESSORS = [] WSGI_APPLICATION = 'talerbank.wsgi.application' # Database # https://docs.djangoproject.com/en/1.9/ref/settings/#databases DATABASES = {} DBNAME = TC.value_string("bank", "database", required=True) DBNAME = os.environ.get("TALER_BANK_ALTDB", DBNAME) if not DBNAME: raise Exception("DB not specified (neither in config or as" \ "cli argument)") LOGGER.info("dbname: %s" % DBNAME) CHECK_DBSTRING_FORMAT = re.search( r"[a-z]+:///[a-z]+([\?][a-z]+=[a-z/]+)?", DBNAME) if not CHECK_DBSTRING_FORMAT: LOGGER.error("Bad db string given '%s', respect the format" \ "'dbtype:///dbname'" % DBNAME) sys.exit(2) DBCONFIG = {} # Maybe trust the parsing from urlparse? DB_URL = urllib.parse.urlparse(DBNAME) if DB_URL.scheme not in ("postgres") or DB_URL.scheme == "": LOGGER.error("DB '%s' is not supported" % DB_URL.scheme) sys.exit(1) if DB_URL.scheme == "postgres": DBCONFIG["ENGINE"] = 'django.db.backends.postgresql_psycopg2' DBCONFIG["NAME"] = DB_URL.path.lstrip("/") if not DB_URL.netloc: P = urllib.parse.parse_qs(DB_URL.query) if ("host" not in P) or P["host"] == "": HOST = None else: HOST = P["host"][0] else: HOST = DB_URL.netloc if HOST: DBCONFIG["HOST"] = HOST # Sockets directory. DATABASES["default"] = DBCONFIG # Password validation # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ {'NAME': 'django.contrib.auth.password_validation' \ '.UserAttributeSimilarityValidator'}, {'NAME': 'django.contrib.auth.password_validation' \ '.MinimumLengthValidator'}, {'NAME': 'django.contrib.auth.password_validation' \ '.CommonPasswordValidator'}, {'NAME': 'django.contrib.auth.password_validation' \ '.NumericPasswordValidator'}] # Internationalization # https://docs.djangoproject.com/en/1.9/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True ## # Set to False to silence this error: # https://stackoverflow.com/questions/18622007/runtimewarning-datetimefield-received-a-naive-datetime USE_TZ = False # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.9/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, "talerbank/app/static"), os.path.join(BASE_DIR, "talerbank/app/static/web-common"), ] STATIC_ROOT = '/tmp/talerbankstatic/' ROOT_URLCONF = "talerbank.app.urls" try: TALER_CURRENCY = TC.value_string( "taler", "currency", required=True) except ConfigurationError as exc: LOGGER.error(exc) sys.exit(3) TALER_MAX_DEBT = TC.value_string( "bank", "MAX_DEBT", default="%s:50.0" % TALER_CURRENCY) TALER_MAX_DEBT_BANK = TC.value_string( "bank", "MAX_DEBT_BANK", default="%s:0.0" % TALER_CURRENCY) TALER_DIGITS = TC.value_int( "bank", "NDIGITS", default=2) # Order matters TALER_PREDEFINED_ACCOUNTS = [ 'Bank', 'Exchange', 'Tor', 'GNUnet', 'Taler', 'FSF', 'Tutorial', 'Survey'] TALER_EXPECTS_DONATIONS = [ 'Tor', 'GNUnet', 'Taler', 'FSF'] TALER_SUGGESTED_EXCHANGE = TC.value_string( "bank", "suggested_exchange")