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() def _get_keyring_attr(self, app_name): """Build the keyring attributes for this credentials.""" attr = {"key-type": "%s credentials" % NAME, "token-name": get_token_name(app_name)} return attr @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]) @inlineCallbacks def set_credentials(self, app_name, cred): """Set the credentials.""" # Creates the secret from the credentials secret = urlencode(cred) attr = self._get_keyring_attr(app_name) # Add our 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 get_credentials(self, app_name): """A deferred with the secret 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 not None: logger.debug("Parsing secret.") secret = yield item.get_value() returnValue(dict(parse_qsl(secret))) # 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 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()