You've already forked Mailu
mirror of
https://github.com/Mailu/Mailu.git
synced 2025-07-15 01:24:34 +02:00
ConfigManager should not replace app.config
Updated ConfigManager to only modify app.config and not replace it. Swagger does not play well, when app.config is not a real dict and it is not necessary to keep ConfigManager around after init. Also added "API" flag to config (default: disabled).
This commit is contained in:
@ -51,6 +51,7 @@ DEFAULT_CONFIG = {
|
||||
'WEBMAIL': 'none',
|
||||
'RECAPTCHA_PUBLIC_KEY': '',
|
||||
'RECAPTCHA_PRIVATE_KEY': '',
|
||||
'API': False,
|
||||
# Advanced settings
|
||||
'PASSWORD_SCHEME': 'PBKDF2',
|
||||
'LOG_LEVEL': 'WARNING',
|
||||
@ -71,7 +72,7 @@ DEFAULT_CONFIG = {
|
||||
'POD_ADDRESS_RANGE': None
|
||||
}
|
||||
|
||||
class ConfigManager(dict):
|
||||
class ConfigManager:
|
||||
""" Naive configuration manager that uses environment only
|
||||
"""
|
||||
|
||||
@ -86,19 +87,16 @@ class ConfigManager(dict):
|
||||
|
||||
def get_host_address(self, name):
|
||||
# if MYSERVICE_ADDRESS is defined, use this
|
||||
if '{}_ADDRESS'.format(name) in os.environ:
|
||||
return os.environ.get('{}_ADDRESS'.format(name))
|
||||
if f'{name}_ADDRESS' in os.environ:
|
||||
return os.environ.get(f'{name}_ADDRESS')
|
||||
# otherwise use the host name and resolve it
|
||||
return system.resolve_address(self.config['HOST_{}'.format(name)])
|
||||
return system.resolve_address(self.config[f'HOST_{name}'])
|
||||
|
||||
def resolve_hosts(self):
|
||||
self.config["IMAP_ADDRESS"] = self.get_host_address("IMAP")
|
||||
self.config["POP3_ADDRESS"] = self.get_host_address("POP3")
|
||||
self.config["AUTHSMTP_ADDRESS"] = self.get_host_address("AUTHSMTP")
|
||||
self.config["SMTP_ADDRESS"] = self.get_host_address("SMTP")
|
||||
self.config["REDIS_ADDRESS"] = self.get_host_address("REDIS")
|
||||
if self.config["WEBMAIL"] != "none":
|
||||
self.config["WEBMAIL_ADDRESS"] = self.get_host_address("WEBMAIL")
|
||||
for key in ['IMAP', 'POP3', 'AUTHSMTP', 'SMTP', 'REDIS']:
|
||||
self.config[f'{key}_ADDRESS'] = self.get_host_address(key)
|
||||
if self.config['WEBMAIL'] != 'none':
|
||||
self.config['WEBMAIL_ADDRESS'] = self.get_host_address('WEBMAIL')
|
||||
|
||||
def __coerce_value(self, value):
|
||||
if isinstance(value, str) and value.lower() in ('true','yes'):
|
||||
@ -108,6 +106,7 @@ class ConfigManager(dict):
|
||||
return value
|
||||
|
||||
def init_app(self, app):
|
||||
# get current app config
|
||||
self.config.update(app.config)
|
||||
# get environment variables
|
||||
self.config.update({
|
||||
@ -121,27 +120,8 @@ class ConfigManager(dict):
|
||||
template = self.DB_TEMPLATES[self.config['DB_FLAVOR']]
|
||||
self.config['SQLALCHEMY_DATABASE_URI'] = template.format(**self.config)
|
||||
|
||||
self.config['RATELIMIT_STORAGE_URL'] = 'redis://{0}/2'.format(self.config['REDIS_ADDRESS'])
|
||||
self.config['QUOTA_STORAGE_URL'] = 'redis://{0}/1'.format(self.config['REDIS_ADDRESS'])
|
||||
# update the app config itself
|
||||
app.config = self
|
||||
self.config['RATELIMIT_STORAGE_URL'] = f'redis://{self.config["REDIS_ADDRESS"]}/2'
|
||||
self.config['QUOTA_STORAGE_URL'] = f'redis://{self.config["REDIS_ADDRESS"]}/1'
|
||||
|
||||
def setdefault(self, key, value):
|
||||
if key not in self.config:
|
||||
self.config[key] = value
|
||||
return self.config[key]
|
||||
|
||||
def get(self, *args):
|
||||
return self.config.get(*args)
|
||||
|
||||
def keys(self):
|
||||
return self.config.keys()
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.config.get(key)
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
self.config[key] = value
|
||||
|
||||
def __contains__(self, key):
|
||||
return key in self.config
|
||||
# update the app config
|
||||
app.config.update(self.config)
|
||||
|
Reference in New Issue
Block a user