Example #1
0
 def __init__(self):
     """Initialize this instance."""
     self.service = SecretService()
Example #2
0
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()