def __init__(self): """Initialize this instance.""" self.service = SecretService()
class Keyring(object): """A Keyring for a given application name.""" def __init__(self): """Initialize this instance.""" self.service = SecretService() @inlineCallbacks def _find_keyring_item(self, app_name, attr=None): """Return the keyring item or None if not found.""" if attr is None: attr = self._get_keyring_attr(app_name) logger.debug("Finding all items for app_name %r.", app_name) items = yield self.service.search_items(attr) if len(items) == 0: # if no items found, return None logger.debug("No items found!") returnValue(None) logger.debug("Returning first item found.") returnValue(items[0]) def _get_keyring_attr(self, app_name): """Build the keyring attributes for this credentials.""" attr = {"key-type": "Ubuntu SSO credentials", "token-name": get_token_name(app_name)} return attr @inlineCallbacks def set_credentials(self, app_name, cred): """Set the credentials of the Ubuntu SSO item.""" # Creates the secret from the credentials secret = urlencode(cred) attr = self._get_keyring_attr(app_name) # Add our SSO credentials to the keyring yield self.service.open_session() collection = yield self.service.get_default_collection() yield collection.create_item(app_name, attr, secret, True) @inlineCallbacks def _migrate_old_token_name(self, app_name): """Migrate credentials with old name, store them with new name.""" logger.debug("Migrating old token name.") attr = self._get_keyring_attr(app_name) attr['token-name'] = get_old_token_name(app_name) item = yield self._find_keyring_item(app_name, attr=attr) if item is not None: yield self.set_credentials(app_name, dict(parse_qsl(item.secret))) yield item.delete() result = yield self._find_keyring_item(app_name) returnValue(result) @inlineCallbacks def get_credentials(self, app_name): """A deferred with the secret of the SSO item in a dictionary.""" # If we have no attributes, return None logger.debug("Getting credentials for %r.", app_name) yield self.service.open_session() item = yield self._find_keyring_item(app_name) if item is None: item = yield self._migrate_old_token_name(app_name) if item is not None: logger.debug("Parsing secret.") secret = yield item.get_value() returnValue(dict(parse_qsl(secret))) else: # if no item found, try getting the old credentials if app_name == U1_APP_NAME: logger.debug("Trying old credentials for %r.", app_name) old_creds = yield try_old_credentials(app_name) returnValue(old_creds) # nothing was found returnValue(None) @inlineCallbacks def delete_credentials(self, app_name): """Delete a set of credentials from the keyring.""" attr = self._get_keyring_attr(app_name) # Add our SSO credentials to the keyring yield self.service.open_session() collection = yield self.service.get_default_collection() yield collection.create_item(app_name, attr, "secret!", True) item = yield self._find_keyring_item(app_name) if item is not None: yield item.delete()