@ -88,7 +88,7 @@ DEFAULT_CONFIG = {
' POD_ADDRESS_RANGE ' : None
}
class ConfigManager (dict ) :
class ConfigManager :
""" Naive configuration manager that uses environment only
"""
@ -103,19 +103,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 __get_env ( self , key , value ) :
key_file = key + " _FILE "
@ -134,6 +131,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 ( {
@ -147,9 +145,9 @@ 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 ' ] )
self . config [ ' SESSION_STORAGE_URL ' ] = ' redis:// { 0}/3 ' . format ( self . config [ ' REDIS_ADDRESS ' ] )
self . config [ ' RATELIMIT_STORAGE_URL ' ] = f ' redis:// { self . config [ " REDIS_ADDRESS " ] } /2 '
self . config [ ' QUOTA_STORAGE_URL ' ] = f ' redis:// { self . config [ " REDIS_ADDRESS " ] } /1 '
self . config [ ' SESSION_STORAGE_URL ' ] = f ' redis:// { self . config [ " REDIS_ADDRESS " ] } /3 '
self . config [ ' SESSION_COOKIE_SAMESITE ' ] = ' Strict '
self . config [ ' SESSION_COOKIE_HTTPONLY ' ] = True
self . config [ ' PERMANENT_SESSION_LIFETIME ' ] = timedelta ( hours = int ( self . config [ ' SESSION_LIFETIME ' ] ) )
@ -157,25 +155,7 @@ class ConfigManager(dict):
self . config [ ' AUTH_RATELIMIT_EXEMPTION ' ] = set ( ipaddress . ip_network ( cidr , False ) for cidr in ( cidr . strip ( ) for cidr in self . config [ ' AUTH_RATELIMIT_EXEMPTION ' ] . split ( ' , ' ) ) if cidr )
self . config [ ' HOSTNAMES ' ] = ' , ' . join ( hostnames )
self . config [ ' HOSTNAME ' ] = hostnames [ 0 ]
# update the app config itself
app . config = self
def setdefault ( self , key , value ) :
if key not in self . config :
self . config [ key ] = value
return self . config [ key ]
# update the app config
app . config . update ( self . config )
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