gpgme_ctx = gpgme.Context()
gpgme_ctx.armor = True
- add_gpg_keys(email_text, gpgme_ctx)
-
- plaintext, keys = email_decode_flatten(email_text, gpgme_ctx)
+ plaintext, keys = email_decode_flatten(email_text, gpgme_ctx, False)
encrypt_to_key = choose_reply_encryption_key(keys)
reply_message = generate_reply(plaintext, email_from, \
print(reply_message)
-def email_decode_flatten (email_text, gpgme_ctx):
+def email_decode_flatten (email_text, gpgme_ctx, from_decryption):
body = ""
keys = []
keys += add_gpg_keys(payload, gpgme_ctx)
elif content_type == "text/plain":
- body += payload + "\n"
+ if from_decryption == True:
+ body += payload + "\n"
+
+ else:
+ plaintext, more_keys = decrypt_text(payload, gpgme_ctx)
+
+ body += plaintext
+ keys += more_keys
- else:
- body += payload + "\n"
+ keys += add_gpg_keys(payload, gpgme_ctx)
return body, keys
def add_gpg_keys (text, gpgme_ctx):
- keys = scan_and_grab(text,
- '-----BEGIN PGP PUBLIC KEY BLOCK-----',
- '-----END PGP PUBLIC KEY BLOCK-----')
+ key_blocks = scan_and_grab(text,
+ '-----BEGIN PGP PUBLIC KEY BLOCK-----',
+ '-----END PGP PUBLIC KEY BLOCK-----')
- fps = []
- for key in keys:
- fp = io.BytesIO(key.encode('ascii'))
+ keys = []
+ for key_block in key_blocks:
+ fp = io.BytesIO(key_block.encode('ascii'))
result = gpgme_ctx.import_(fp)
+ imports = result.imports
- fingerprint = result.imports[0][0]
- debug("added gpg key: " + fingerprint)
+ if imports != []:
+ fingerprint = imports[0][0]
+ keys += [gpgme_ctx.get_key(fingerprint)]
- fps += fingerprint
+ debug("added gpg key: " + fingerprint)
- return fps
+ return keys
def decrypt_text (gpg_text, gpgme_ctx):
body = ""
keys = []
- gpg_chunks = scan_and_grab(gpg_text,
+ msg_blocks = scan_and_grab(gpg_text,
'-----BEGIN PGP MESSAGE-----',
'-----END PGP MESSAGE-----')
- plaintext_and_sigs_chunks = decrypt_chunks(gpg_chunks, gpgme_ctx)
+ plaintexts_and_sigs = decrypt_blocks(msg_blocks, gpgme_ctx)
- for chunk in plaintext_and_sigs_chunks:
- plaintext = chunk[0]
- sigs = chunk[1]
+ for pair in plaintexts_and_sigs:
+ plaintext = pair[0]
+ sigs = pair[1]
for sig in sigs:
- key = get_pub_key(sig, gpgme_ctx)
- keys += [key]
+ keys += [gpgme_ctx.get_key(sig.fpr)]
# recursive for nested layers of mime and/or gpg
- plaintext, more_keys = email_decode_flatten(plaintext, gpgme_ctx)
+ plaintext, more_keys = email_decode_flatten(plaintext, gpgme_ctx, True)
body += plaintext
keys += more_keys
return body, keys
-def get_pub_key (sig, gpgme_ctx):
-
- fingerprint = sig.fpr
- key = gpgme_ctx.get_key(fingerprint)
-
- return key
-
-
def scan_and_grab (text, start_text, end_text):
matches = re.search('(' + start_text + '.*' + end_text + ')',
return match_tuple
-def decrypt_chunks (gpg_chunks, gpgme_ctx):
+def decrypt_blocks (msg_blocks, gpgme_ctx):
- return [decrypt_chunk(chunk, gpgme_ctx) for chunk in gpg_chunks]
+ return [decrypt_block(block, gpgme_ctx) for block in msg_blocks]
-def decrypt_chunk (gpg_chunk, gpgme_ctx):
+def decrypt_block (msg_block, gpgme_ctx):
- chunk_b = io.BytesIO(gpg_chunk.encode('ascii'))
+ block_b = io.BytesIO(msg_block.encode('ascii'))
plain_b = io.BytesIO()
- sigs = gpgme_ctx.decrypt_verify(chunk_b, plain_b)
+ try:
+ sigs = gpgme_ctx.decrypt_verify(block_b, plain_b)
+ except:
+ return ("",[])
plaintext = plain_b.getvalue().decode('utf-8')
return (plaintext, sigs)