diff --git a/src/pretix/helpers/config.py b/src/pretix/helpers/config.py index 4f0e67a39..596d4ea30 100644 --- a/src/pretix/helpers/config.py +++ b/src/pretix/helpers/config.py @@ -29,36 +29,61 @@ class EnvOrParserConfig: self.cp = configparser def _envkey(self, section, option): - section = re.sub('[^a-zA-Z0-9]', '_', section.upper()) - option = re.sub('[^a-zA-Z0-9]', '_', option.upper()) - return f'PRETIX_{section}_{option}' + section = re.sub("[^a-zA-Z0-9]", "_", section.upper()) + option = re.sub("[^a-zA-Z0-9]", "_", option.upper()) + return f"PRETIX_{section}_{option}" + + def _file_envkey(self, section, option): + section = re.sub("[^a-zA-Z0-9]", "_", section.upper()) + option = re.sub("[^a-zA-Z0-9]", "_", option.upper()) + return f"FILE__PRETIX_{section}_{option}" def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET): + if self._file_envkey(section, option) in os.environ: + with open(os.environ[self._file_envkey(section, option)], "r") as f: + return f.read().strip() if self._envkey(section, option) in os.environ: return os.environ[self._envkey(section, option)] return self.cp.get(section, option, raw=raw, vars=vars, fallback=fallback) def getint(self, section, option, *, raw=False, vars=None, fallback=_UNSET): + if self._file_envkey(section, option) in os.environ: + with open(os.environ[self._file_envkey(section, option)], "r") as f: + return int(f.read().strip()) if self._envkey(section, option) in os.environ: return int(os.environ[self._envkey(section, option)]) return self.cp.getint(section, option, raw=raw, vars=vars, fallback=fallback) def getfloat(self, section, option, *, raw=False, vars=None, fallback=_UNSET): + if self._file_envkey(section, option) in os.environ: + with open(os.environ[self._file_envkey(section, option)], "r") as f: + return float(f.read().strip()) if self._envkey(section, option) in os.environ: return float(os.environ[self._envkey(section, option)]) return self.cp.getfloat(section, option, raw=raw, vars=vars, fallback=fallback) def getboolean(self, section, option, *, raw=False, vars=None, fallback=_UNSET): + if self._file_envkey(section, option) in os.environ: + with open(os.environ[self._file_envkey(section, option)], "r") as f: + return self.cp._convert_to_boolean(f.read().strip()) if self._envkey(section, option) in os.environ: - return self.cp._convert_to_boolean(os.environ[self._envkey(section, option)]) - return self.cp.getboolean(section, option, raw=raw, vars=vars, fallback=fallback) + return self.cp._convert_to_boolean( + os.environ[self._envkey(section, option)] + ) + return self.cp.getboolean( + section, option, raw=raw, vars=vars, fallback=fallback + ) def has_section(self, section): - if any(k.startswith(self._envkey(section, '')) for k in os.environ): + if any(k.startswith(self._file_envkey(section, "")) for k in os.environ): + return True + if any(k.startswith(self._envkey(section, "")) for k in os.environ): return True return self.cp.has_section(section) def has_option(self, section, option): + if self._file_envkey(section, option) in os.environ: + return True if self._envkey(section, option) in os.environ: return True return self.cp.has_option(section, option) diff --git a/src/pretix/settings.py b/src/pretix/settings.py index 42d9e1e45..2b49ef69e 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -100,6 +100,11 @@ SECRET_KEY_FALLBACKS = [] for i in range(10): if config.has_option('django', f'secret_fallback{i}'): SECRET_KEY_FALLBACKS.append(config.get('django', f'secret_fallback{i}')) +fallback_secret_file_key = config._file_envkey('django', 'secret_fallbacks') # FILE__PRETIX_DJANGO_SECRET_FALLBACKS +if fallback_secret_file_key in os.environ and os.path.exists(os.environ[fallback_secret_file_key]): + with open(os.environ[fallback_secret_file_key], 'r') as f: + for line in f: + SECRET_KEY_FALLBACKS.append(line.strip()) # Adjustable settings