Fixed bug that prevented user-defined keyring being used.

This commit is contained in:
facetoe 2015-02-16 21:09:59 +08:00
parent c051e01959
commit cb8f4225bd

View File

@ -62,7 +62,7 @@ class SettingsBase:
sm = KeyConstraintDict(settings, self.required) sm = KeyConstraintDict(settings, self.required)
settings_source = get_argument_dict(args, kwargs) settings_source = get_argument_dict(args, kwargs)
protected = self.get_protected_settings() protected = self.get_protected_settings(settings_source)
settings_source.update(protected) settings_source.update(protected)
try: try:
@ -80,34 +80,43 @@ class SettingsBase:
self.logger.setLevel(self.log_level) self.logger.setLevel(self.log_level)
self.init() self.init()
def get_protected_settings(self): def get_protected_settings(self, settings_source):
"""
Attempt to retrieve protected settings from keyring if they are not already set.
"""
user_backend = settings_source.get('keyring_backend')
found_settings = dict() found_settings = dict()
for setting_name in self.__PROTECTED_SETTINGS: for setting_name in self.__PROTECTED_SETTINGS:
setting = None # Nothing to do if the setting is already defined.
if hasattr(self, 'required') and setting_name in getattr(self, 'required'): if settings_source.get(setting_name):
setting = self.get_protected_setting("%s.%s" % (self.__name__, setting_name)) continue
elif hasattr(self, setting_name) and not getattr(self, setting_name):
setting = self.get_protected_setting("%s.%s" % (self.__name__, setting_name)) setting = None
if setting: identifier = "%s.%s" % (self.__name__, setting_name)
found_settings.update({setting_name: setting}) if hasattr(self, 'required') and setting_name in getattr(self, 'required'):
setting = self.get_setting_from_keyring(identifier, user_backend)
elif hasattr(self, setting_name):
setting = self.get_setting_from_keyring(identifier, user_backend)
if setting:
found_settings.update({setting_name: setting})
return found_settings return found_settings
def get_protected_setting(self, setting_name): def get_setting_from_keyring(self, setting_identifier, keyring_backend=None):
""" """
Retrieves a protected setting from keyring Retrieves a protected setting from keyring
:param setting_name: setting_name must be in the format package.module.Class.setting :param setting_identifier: must be in the format package.module.Class.setting
""" """
# If a custom keyring backend has been defined, use it. # If a custom keyring backend has been defined, use it.
if hasattr(self, 'keyring_backend') and self.keyring_backend: if keyring_backend:
return self.keyring_backend.get_password(setting_name, getpass.getuser()) return keyring_backend.get_password(setting_identifier, getpass.getuser())
# Otherwise try and use defualt keyring. # Otherwise try and use default keyring.
try: try:
import keyring import keyring
except ImportError: except ImportError:
pass pass
else: else:
return keyring.get_password(setting_name, getpass.getuser()) return keyring.get_password(setting_identifier, getpass.getuser())
def init(self): def init(self):
"""Convenience method which is called after all settings are set """Convenience method which is called after all settings are set