def test_is_address(self): self.assertTrue(is_address('*****@*****.**'), 'Incorrect address detection.') self.assertFalse(is_address('userleap.se'), 'Incorrect address detection.') self.assertFalse(is_address('user@'), 'Incorrect address detection.') self.assertFalse(is_address('@leap.se'), 'Incorrect address detection.')
def test_is_address(self): self.assertTrue( is_address('*****@*****.**'), 'Incorrect address detection.') self.assertFalse( is_address('userleap.se'), 'Incorrect address detection.') self.assertFalse( is_address('user@'), 'Incorrect address detection.') self.assertFalse( is_address('@leap.se'), 'Incorrect address detection.')
def gen_key(self, address): """ Generate an OpenPGP keypair bound to C{address}. :param address: The address bound to the key. :type address: str :return: The key bound to C{address}. :rtype: OpenPGPKey @raise KeyAlreadyExists: If key already exists in local database. """ # make sure the key does not already exist leap_assert(is_address(address), 'Not an user address: %s' % address) try: self.get_key(address) raise errors.KeyAlreadyExists(address) except errors.KeyNotFound: logger.debug('Key for %s not found' % (address,)) with self._temporary_gpgwrapper() as gpg: # TODO: inspect result, or use decorator params = gpg.gen_key_input( key_type='RSA', key_length=4096, name_real=address, name_email=address, name_comment='Generated by LEAP Key Manager.') logger.info("About to generate keys... This might take SOME time.") gpg.gen_key(params) logger.info("Keys for %s have been successfully " "generated." % (address,)) pubkeys = gpg.list_keys() # assert for new key characteristics # XXX This exception is not properly catched by the soledad # bootstrapping, so if we do not finish generating the keys # we end with a blocked thread -- kali leap_assert( len(pubkeys) is 1, # a unitary keyring! 'Keyring has wrong number of keys: %d.' % len(pubkeys)) key = gpg.list_keys(secret=True).pop() leap_assert( len(key['uids']) is 1, # with just one uid! 'Wrong number of uids for key: %d.' % len(key['uids'])) leap_assert( re.match('.*<%s>$' % address, key['uids'][0]) is not None, 'Key not correctly bound to address.') # insert both public and private keys in storage for secret in [True, False]: key = gpg.list_keys(secret=secret).pop() openpgp_key = _build_key_from_gpg( address, key, gpg.export_keys(key['fingerprint'], secret=secret)) self.put_key(openpgp_key) return self.get_key(address, private=True)
def gen_key(self, address): """ Generate an OpenPGP keypair bound to C{address}. :param address: The address bound to the key. :type address: str :return: The key bound to C{address}. :rtype: OpenPGPKey @raise KeyAlreadyExists: If key already exists in local database. """ # make sure the key does not already exist leap_assert(is_address(address), 'Not an user address: %s' % address) try: self.get_key(address) raise errors.KeyAlreadyExists(address) except errors.KeyNotFound: pass def _gen_key(gpg): params = gpg.gen_key_input( key_type='RSA', key_length=4096, name_real=address, name_email=address, name_comment='Generated by LEAP Key Manager.') gpg.gen_key(params) pubkeys = gpg.list_keys() # assert for new key characteristics leap_assert( len(pubkeys) is 1, # a unitary keyring! 'Keyring has wrong number of keys: %d.' % len(pubkeys)) key = gpg.list_keys(secret=True).pop() leap_assert( len(key['uids']) is 1, # with just one uid! 'Wrong number of uids for key: %d.' % len(key['uids'])) leap_assert( re.match('.*<%s>$' % address, key['uids'][0]) is not None, 'Key not correctly bound to address.') # insert both public and private keys in storage for secret in [True, False]: key = gpg.list_keys(secret=secret).pop() openpgp_key = _build_key_from_gpg( address, key, gpg.export_keys(key['fingerprint'], secret=secret)) self.put_key(openpgp_key) with temporary_gpgwrapper() as gpg: # TODO: inspect result, or use decorator _gen_key(gpg) return self.get_key(address, private=True)
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)
def gen_key(self, address): """ Generate an OpenPGP keypair bound to C{address}. :param address: The address bound to the key. :type address: str :return: A Deferred which fires with the key bound to address, or fails with KeyAlreadyExists if key already exists in local database. :rtype: Deferred """ # make sure the key does not already exist leap_assert(is_address(address), 'Not an user address: %s' % address) @defer.inlineCallbacks def _gen_key(_): with TempGPGWrapper(gpgbinary=self._gpgbinary) as gpg: # TODO: inspect result, or use decorator params = gpg.gen_key_input( key_type='RSA', key_length=4096, name_real=address, name_email=address, name_comment='') logger.info("About to generate keys... " "This might take SOME time.") yield from_thread(gpg.gen_key, params) logger.info("Keys for %s have been successfully " "generated." % (address,)) pubkeys = gpg.list_keys() # assert for new key characteristics leap_assert( len(pubkeys) is 1, # a unitary keyring! 'Keyring has wrong number of keys: %d.' % len(pubkeys)) key = gpg.list_keys(secret=True).pop() leap_assert( len(key['uids']) is 1, # with just one uid! 'Wrong number of uids for key: %d.' % len(key['uids'])) uid_match = False for uid in key['uids']: if re.match('.*<%s>$' % address, uid) is not None: uid_match = True break leap_assert(uid_match, 'Key not correctly bound to address.') # insert both public and private keys in storage deferreds = [] for secret in [True, False]: key = gpg.list_keys(secret=secret).pop() openpgp_key = self._build_key_from_gpg( key, gpg.export_keys(key['fingerprint'], secret=secret), address) d = self.put_key(openpgp_key) deferreds.append(d) yield defer.gatherResults(deferreds) def key_already_exists(_): raise errors.KeyAlreadyExists(address) d = self.get_key(address) d.addCallbacks(key_already_exists, _gen_key) d.addCallback(lambda _: self.get_key(address, private=True)) return d
def gen_key(self, address): """ Generate an OpenPGP keypair bound to C{address}. :param address: The address bound to the key. :type address: str :return: A Deferred which fires with the key bound to address, or fails with KeyAlreadyExists if key already exists in local database. :rtype: Deferred """ # make sure the key does not already exist leap_assert(is_address(address), 'Not an user address: %s' % address) def _gen_key(_): with self._temporary_gpgwrapper() as gpg: # TODO: inspect result, or use decorator params = gpg.gen_key_input(key_type='RSA', key_length=4096, name_real=address, name_email=address, name_comment='') logger.info("About to generate keys... " "This might take SOME time.") gpg.gen_key(params) logger.info("Keys for %s have been successfully " "generated." % (address, )) pubkeys = gpg.list_keys() # assert for new key characteristics leap_assert( len(pubkeys) is 1, # a unitary keyring! 'Keyring has wrong number of keys: %d.' % len(pubkeys)) key = gpg.list_keys(secret=True).pop() leap_assert( len(key['uids']) is 1, # with just one uid! 'Wrong number of uids for key: %d.' % len(key['uids'])) uid_match = False for uid in key['uids']: if re.match('.*<%s>$' % address, uid) is not None: uid_match = True break leap_assert(uid_match, 'Key not correctly bound to address.') # insert both public and private keys in storage deferreds = [] for secret in [True, False]: key = gpg.list_keys(secret=secret).pop() openpgp_key = self._build_key_from_gpg( key, gpg.export_keys(key['fingerprint'], secret=secret)) d = self.put_key(openpgp_key, address) deferreds.append(d) return defer.gatherResults(deferreds) def key_already_exists(_): raise errors.KeyAlreadyExists(address) d = self.get_key(address) d.addCallbacks(key_already_exists, _gen_key) d.addCallback(lambda _: self.get_key(address, private=True)) return d