def get_new_doc(enc_json): doc = CouchDocument(doc_id=str(uuid.uuid4())) doc.content = { 'incoming': True, ENC_SCHEME_KEY: EncryptionSchemes.PUBKEY, ENC_JSON_KEY: enc_json } return doc
def _encrypt_message(self, pubkey, message): """ Given a public key and a message, it encrypts the message to that public key. The address is needed in order to build the OpenPGPKey object. :param pubkey: public key for the owner of the message :type pubkey: str :param message: message contents :type message: email.message.Message :return: doc to sync with Soledad or None, None if something went wrong. :rtype: CouchDocument """ if pubkey is None or len(pubkey) == 0: log.msg("_encrypt_message: Something went wrong, here's all " "I know: %r" % (pubkey,)) return None # find message's encoding message_as_string = message.as_string() doc = CouchDocument(doc_id=str(pyuuid.uuid4())) # store plain text if pubkey is not available data = {'incoming': True, 'content': message_as_string} if pubkey is None or len(pubkey) == 0: doc.content = { self.INCOMING_KEY: True, ENC_SCHEME_KEY: EncryptionSchemes.NONE, ENC_JSON_KEY: json.dumps(data, ensure_ascii=False) } return doc # otherwise, encrypt with openpgp.TempGPGWrapper(gpgbinary='/usr/bin/gpg') as gpg: gpg.import_keys(pubkey) key = gpg.list_keys().pop() # We don't care about the actual address, so we use a # dummy one, we just care about the import of the pubkey openpgp_key = openpgp._build_key_from_gpg("*****@*****.**", key, pubkey) # add X-Leap-Provenance header if message is not encrypted if message.get_content_type() != 'multipart/encrypted' and \ '-----BEGIN PGP MESSAGE-----' not in \ message_as_string: message.add_header( 'X-Leap-Provenance', email.utils.formatdate(), pubkey=openpgp_key.key_id) data = {'incoming': True, 'content': message.as_string()} doc.content = { self.INCOMING_KEY: True, ENC_SCHEME_KEY: EncryptionSchemes.PUBKEY, ENC_JSON_KEY: str(gpg.encrypt( json.dumps(data, ensure_ascii=False), openpgp_key.fingerprint, symmetric=False)) } return doc
def _encrypt_message(self, pubkey, message): """ Given a public key and a message, it encrypts the message to that public key. The address is needed in order to build the OpenPGPKey object. :param pubkey: public key for the owner of the message :type pubkey: str :param message: message contents :type message: email.message.Message :return: doc to sync with Soledad or None, None if something went wrong. :rtype: CouchDocument """ if pubkey is None or len(pubkey) == 0: log.msg("_encrypt_message: Something went wrong, here's all " "I know: %r" % (pubkey,)) return None # find message's encoding message_as_string = message.as_string() doc = CouchDocument(doc_id=str(pyuuid.uuid4())) # store plain text if pubkey is not available data = {'incoming': True, 'content': message_as_string} if pubkey is None or len(pubkey) == 0: doc.content = { self.INCOMING_KEY: True, self.ERROR_DECRYPTING_KEY: False, ENC_SCHEME_KEY: EncryptionSchemes.NONE, ENC_JSON_KEY: json.dumps(data, ensure_ascii=False) } return doc # otherwise, encrypt with openpgp.TempGPGWrapper(gpgbinary='/usr/bin/gpg') as gpg: gpg.import_keys(pubkey) key = gpg.list_keys().pop() # add X-Leap-Provenance header if message is not encrypted if message.get_content_type() != 'multipart/encrypted' and \ '-----BEGIN PGP MESSAGE-----' not in \ message_as_string: message.add_header( 'X-Leap-Provenance', email.utils.formatdate(), pubkey=key["keyid"]) data = {'incoming': True, 'content': message.as_string()} doc.content = { self.INCOMING_KEY: True, self.ERROR_DECRYPTING_KEY: False, ENC_SCHEME_KEY: EncryptionSchemes.PUBKEY, ENC_JSON_KEY: str(gpg.encrypt( json.dumps(data, ensure_ascii=False), key["fingerprint"], symmetric=False)) } return doc