Exemplo n.º 1
0
 def test_build_key_from_dict(self):
     kdict = {
         'address': [ADDRESS],
         'key_id': KEY_FINGERPRINT[-16:],
         'fingerprint': KEY_FINGERPRINT,
         'key_data': PUBLIC_KEY,
         'private': False,
         'length': 4096,
         'expiry_date': 0,
         'last_audited_at': 0,
         'refreshed_at': 1311239602,
         'validation': str(ValidationLevels.Weak_Chain),
         'encr_used': False,
         'sign_used': True,
     }
     key = build_key_from_dict(OpenPGPKey, kdict)
     self.assertEqual(kdict['address'], key.address, 'Wrong data in key.')
     self.assertEqual(kdict['key_id'], key.key_id, 'Wrong data in key.')
     self.assertEqual(kdict['fingerprint'], key.fingerprint,
                      'Wrong data in key.')
     self.assertEqual(kdict['key_data'], key.key_data, 'Wrong data in key.')
     self.assertEqual(kdict['private'], key.private, 'Wrong data in key.')
     self.assertEqual(kdict['length'], key.length, 'Wrong data in key.')
     self.assertEqual(None, key.expiry_date, 'Wrong data in key.')
     self.assertEqual(None, key.last_audited_at, 'Wrong data in key.')
     self.assertEqual(datetime.fromtimestamp(kdict['refreshed_at']),
                      key.refreshed_at, 'Wrong data in key.')
     self.assertEqual(ValidationLevels.get(kdict['validation']),
                      key.validation, 'Wrong data in key.')
     self.assertEqual(kdict['encr_used'], key.encr_used,
                      'Wrong data in key.')
     self.assertEqual(kdict['sign_used'], key.sign_used,
                      'Wrong data in key.')
Exemplo n.º 2
0
 def build_key(doc):
     if doc is None:
         raise errors.KeyNotFound(address)
     leap_assert(address in doc.content[KEY_ADDRESS_KEY],
                 'Wrong address in key data.')
     key = build_key_from_dict(OpenPGPKey, doc.content)
     key._gpgbinary = self._gpgbinary
     return key
Exemplo n.º 3
0
 def build_key(doc):
     if doc is None:
         raise errors.KeyNotFound(address)
     leap_assert(
         address in doc.content[KEY_ADDRESS_KEY],
         'Wrong address in key data.')
     key = build_key_from_dict(OpenPGPKey, doc.content)
     key._gpgbinary = self._gpgbinary
     return key
Exemplo n.º 4
0
 def test_build_key_from_dict(self):
     kdict = {
         'uids': [ADDRESS],
         'fingerprint': KEY_FINGERPRINT,
         'key_data': PUBLIC_KEY,
         'private': False,
         'length': 4096,
         'expiry_date': 0,
         'refreshed_at': 1311239602,
     }
     adict = {
         'address': ADDRESS,
         'private': False,
         'last_audited_at': 0,
         'validation': str(ValidationLevels.Weak_Chain),
         'encr_used': False,
         'sign_used': True,
     }
     key = build_key_from_dict(OpenPGPKey, kdict, adict)
     self.assertEqual(
         kdict['uids'], key.uids,
         'Wrong data in key.')
     self.assertEqual(
         kdict['fingerprint'], key.fingerprint,
         'Wrong data in key.')
     self.assertEqual(
         kdict['key_data'], key.key_data,
         'Wrong data in key.')
     self.assertEqual(
         kdict['private'], key.private,
         'Wrong data in key.')
     self.assertEqual(
         kdict['length'], key.length,
         'Wrong data in key.')
     self.assertEqual(
         None, key.expiry_date,
         'Wrong data in key.')
     self.assertEqual(
         None, key.last_audited_at,
         'Wrong data in key.')
     self.assertEqual(
         datetime.fromtimestamp(kdict['refreshed_at']), key.refreshed_at,
         'Wrong data in key.')
     self.assertEqual(
         adict['address'], key.address,
         'Wrong data in key.')
     self.assertEqual(
         ValidationLevels.get(adict['validation']), key.validation,
         'Wrong data in key.')
     self.assertEqual(
         adict['encr_used'], key.encr_used,
         'Wrong data in key.')
     self.assertEqual(
         adict['sign_used'], key.sign_used,
         'Wrong data in key.')
Exemplo n.º 5
0
 def build_key((keydoc, activedoc)):
     if keydoc is None:
         raise errors.KeyNotFound(address)
     leap_assert(
         address in keydoc.content[KEY_UIDS_KEY],
         'Wrong address in key %s. Expected %s, found %s.'
         % (keydoc.content[KEY_FINGERPRINT_KEY], address,
            keydoc.content[KEY_UIDS_KEY]))
     key = build_key_from_dict(OpenPGPKey, keydoc.content,
                               activedoc.content)
     key._gpgbinary = self._gpgbinary
     return key
Exemplo n.º 6
0
        def merge_and_put((keydoc, activedoc)):
            if not keydoc:
                return put_new_key(activedoc)

            active_content = None
            if activedoc:
                active_content = activedoc.content
            oldkey = build_key_from_dict(OpenPGPKey, keydoc.content,
                                         active_content)

            key.merge(oldkey)
            keydoc.set_json(key.get_json())
            d = self._soledad.put_doc(keydoc)
            d.addCallback(put_active, activedoc)
            return d
Exemplo n.º 7
0
    def get_all_keys_in_local_db(self, private=False):
        """
        Return all keys stored in local database.

        :return: A list with all keys in local db.
        :rtype: list
        """
        return map(
            lambda doc: build_key_from_dict(
                self._key_class_from_type(doc.content['type']),
                doc.content['address'],
                doc.content),
            self._soledad.get_from_index(
                TAGS_PRIVATE_INDEX,
                KEYMANAGER_KEY_TAG,
                '1' if private else '0'))
Exemplo n.º 8
0
    def get_key(self, address, private=False):
        """
        Get key bound to C{address} from local storage.

        :param address: The address bound to the key.
        :type address: str
        :param private: Look for a private key instead of a public one?
        :type private: bool

        :return: The key bound to C{address}.
        :rtype: OpenPGPKey
        @raise KeyNotFound: If the key was not found on local storage.
        """
        leap_assert(is_address(address), 'Not an user address: %s' % address)
        doc = self._get_key_doc(address, private)
        if doc is None:
            raise errors.KeyNotFound(address)
        return build_key_from_dict(OpenPGPKey, address, doc.content)
Exemplo n.º 9
0
 def test_build_key_from_dict(self):
     kdict = {
         'address': ADDRESS,
         'key_id': 'key_id',
         'fingerprint': 'fingerprint',
         'key_data': 'key_data',
         'private': 'private',
         'length': 'length',
         'expiry_date': 'expiry_date',
         'first_seen_at': 'first_seen_at',
         'last_audited_at': 'last_audited_at',
         'validation': 'validation',
     }
     key = build_key_from_dict(OpenPGPKey, ADDRESS, kdict)
     self.assertEqual(
         kdict['address'], key.address,
         'Wrong data in key.')
     self.assertEqual(
         kdict['key_id'], key.key_id,
         'Wrong data in key.')
     self.assertEqual(
         kdict['fingerprint'], key.fingerprint,
         'Wrong data in key.')
     self.assertEqual(
         kdict['key_data'], key.key_data,
         'Wrong data in key.')
     self.assertEqual(
         kdict['private'], key.private,
         'Wrong data in key.')
     self.assertEqual(
         kdict['length'], key.length,
         'Wrong data in key.')
     self.assertEqual(
         kdict['expiry_date'], key.expiry_date,
         'Wrong data in key.')
     self.assertEqual(
         kdict['first_seen_at'], key.first_seen_at,
         'Wrong data in key.')
     self.assertEqual(
         kdict['last_audited_at'], key.last_audited_at,
         'Wrong data in key.')
     self.assertEqual(
         kdict['validation'], key.validation,
         'Wrong data in key.')
Exemplo n.º 10
0
    def get_key(self, address, private=False):
        """
        Get key bound to C{address} from local storage.

        :param address: The address bound to the key.
        :type address: str
        :param private: Look for a private key instead of a public one?
        :type private: bool

        :return: The key bound to C{address}.
        :rtype: OpenPGPKey
        @raise KeyNotFound: If the key was not found on local storage.
        """
        # Remove the identity suffix after the '+' until the '@'
        # e.g.: [email protected] becomes [email protected]
        # since the key belongs to the identity without the '+' suffix.
        address = re.sub(r'\+.*\@', '@', address)

        doc = self._get_key_doc(address, private)
        if doc is None:
            raise errors.KeyNotFound(address)
        return build_key_from_dict(OpenPGPKey, address, doc.content)
Exemplo n.º 11
0
 def check_and_put(docs, key):
     if len(docs) == 1:
         doc = docs.pop()
         oldkey = build_key_from_dict(OpenPGPKey, doc.content)
         if key.fingerprint == oldkey.fingerprint:
             # in case of an update of the key merge them with gnupg
             with self._temporary_gpgwrapper() as gpg:
                 gpg.import_keys(oldkey.key_data)
                 gpg.import_keys(key.key_data)
                 gpgkey = gpg.list_keys(secret=key.private).pop()
                 mergedkey = self._build_key_from_gpg(
                     gpgkey,
                     gpg.export_keys(gpgkey['fingerprint'],
                                     secret=key.private))
             mergedkey.validation = max(
                 [key.validation, oldkey.validation])
             mergedkey.last_audited_at = oldkey.last_audited_at
             mergedkey.refreshed_at = key.refreshed_at
             mergedkey.encr_used = key.encr_used or oldkey.encr_used
             mergedkey.sign_used = key.sign_used or oldkey.sign_used
             doc.set_json(mergedkey.get_json())
             d = self._soledad.put_doc(doc)
         else:
             logger.critical(
                 "Can't put a key whith the same key_id and different "
                 "fingerprint: %s, %s"
                 % (key.fingerprint, oldkey.fingerprint))
             d = defer.fail(
                 errors.KeyFingerprintMismatch(key.fingerprint))
     elif len(docs) > 1:
         logger.critical(
             "There is more than one key with the same key_id %s"
             % (key.key_id,))
         d = defer.fail(errors.KeyAttributesDiffer(key.key_id))
     else:
         d = self._soledad.create_doc_from_json(key.get_json())
     return d
Exemplo n.º 12
0
 def check_and_put(docs, key):
     if len(docs) == 1:
         doc = docs.pop()
         oldkey = build_key_from_dict(OpenPGPKey, doc.content)
         if key.fingerprint == oldkey.fingerprint:
             # in case of an update of the key merge them with gnupg
             with self._temporary_gpgwrapper() as gpg:
                 gpg.import_keys(oldkey.key_data)
                 gpg.import_keys(key.key_data)
                 gpgkey = gpg.list_keys(secret=key.private).pop()
                 mergedkey = self._build_key_from_gpg(
                     gpgkey,
                     gpg.export_keys(gpgkey['fingerprint'],
                                     secret=key.private))
             mergedkey.validation = max(
                 [key.validation, oldkey.validation])
             mergedkey.last_audited_at = oldkey.last_audited_at
             mergedkey.refreshed_at = key.refreshed_at
             mergedkey.encr_used = key.encr_used or oldkey.encr_used
             mergedkey.sign_used = key.sign_used or oldkey.sign_used
             doc.set_json(mergedkey.get_json())
             d = self._soledad.put_doc(doc)
         else:
             logger.critical(
                 "Can't put a key whith the same key_id and different "
                 "fingerprint: %s, %s" %
                 (key.fingerprint, oldkey.fingerprint))
             d = defer.fail(
                 errors.KeyFingerprintMismatch(key.fingerprint))
     elif len(docs) > 1:
         logger.critical(
             "There is more than one key with the same key_id %s" %
             (key.key_id, ))
         d = defer.fail(errors.KeyAttributesDiffer(key.key_id))
     else:
         d = self._soledad.create_doc_from_json(key.get_json())
     return d
Exemplo n.º 13
0
 def build_keys(docs):
     return map(
         lambda doc: build_key_from_dict(
             self._key_class_from_type(doc.content['type']),
             doc.content),
         docs)
Exemplo n.º 14
0
 def build_keys(docs):
     return map(
         lambda doc: build_key_from_dict(
             self._key_class_from_type(doc.content['type']), doc.content
         ), docs)