From cb0db5de3e10f744666c3259b50aa8f40573f7b2 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 2 Dec 2019 10:49:27 +0100 Subject: [PATCH] S/MIME decrypt --- app/src/main/java/eu/faircode/email/Core.java | 11 +---- .../eu/faircode/email/FragmentMessages.java | 47 +++++++++++++++---- .../java/eu/faircode/email/MessageHelper.java | 13 +++++ 3 files changed, 54 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 36ca384f97..0dddf9ca83 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -1501,6 +1501,7 @@ class Core { message.size = parts.getBodySize(); message.total = helper.getSize(); message.content = false; + message.encrypt = parts.getEncryption(); message.received = helper.getReceived(); message.sent = helper.getSent(); message.seen = false; @@ -2084,6 +2085,7 @@ class Core { message.size = parts.getBodySize(); message.total = helper.getSize(); message.content = false; + message.encrypt = parts.getEncryption(); message.received = (account.use_date ? (sent == null ? 0 : sent) : helper.getReceived()); message.sent = sent; message.seen = seen; @@ -2147,15 +2149,6 @@ class Core { attachment.message = message.id; attachment.sequence = sequence++; attachment.id = db.attachment().insertAttachment(attachment); - - if (EntityAttachment.PGP_SIGNATURE.equals(attachment.encryption)) - db.message().setMessageEncrypt(message.id, EntityMessage.PGP_SIGNONLY); - else if (EntityAttachment.PGP_MESSAGE.equals(attachment.encryption)) - db.message().setMessageEncrypt(message.id, EntityMessage.PGP_SIGNENCRYPT); - else if (EntityAttachment.SMIME_SIGNATURE.equals(attachment.encryption)) - db.message().setMessageEncrypt(message.id, EntityMessage.SMIME_SIGNONLY); - else if (EntityAttachment.SMIME_MESSAGE.equals(attachment.encryption)) - db.message().setMessageEncrypt(message.id, EntityMessage.SMIME_SIGNENCRYPT); } runRules(context, imessage, message, rules); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index f07b3b6de2..e5598a3b7d 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -4270,6 +4270,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. } } + db.message().setMessageEncrypt(message.id, parts.getEncryption()); db.message().setMessageStored(message.id, new Date().getTime()); db.setTransactionSuccessful(); @@ -4372,17 +4373,47 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. Collection recipients = envelopedData.getRecipientInfos().getRecipients(); KeyTransRecipientInformation recipientInfo = (KeyTransRecipientInformation) recipients.iterator().next(); JceKeyTransRecipient recipient = new JceKeyTransEnvelopedRecipient(pk); + InputStream is = recipientInfo.getContentStream(recipient).getContentStream(); - byte[] result = recipientInfo.getContent(recipient); - File output = EntityMessage.getFile(context, id); - try (OutputStream os = new FileOutputStream(output)) { - os.write("
\r\n".getBytes());
-                    os.write(result);
-                    os.write("
\r\n".getBytes()); + // Decode message + Properties props = MessageHelper.getSessionProperties(); + Session isession = Session.getInstance(props, null); + MimeMessage imessage = new MimeMessage(isession, is); + MessageHelper helper = new MessageHelper(imessage); + MessageHelper.MessageParts parts = helper.getMessageParts(context); + + try { + db.beginTransaction(); + + // Write decrypted body + String html = parts.getHtml(context); + Helper.writeText(EntityMessage.getFile(context, id), html); + + // Remove existing attachments + db.attachment().deleteAttachments(id); + + // Add decrypted attachments + List remotes = parts.getAttachments(); + for (int index = 0; index < remotes.size(); index++) { + EntityAttachment remote = remotes.get(index); + remote.message = id; + remote.sequence = index + 1; + remote.id = db.attachment().insertAttachment(remote); + try { + parts.downloadAttachment(context, index, remote); + } catch (Throwable ex) { + Log.e(ex); + } + } + + db.message().setMessageEncrypt(id, parts.getEncryption()); + db.message().setMessageStored(id, new Date().getTime()); + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); } - db.message().setMessageStored(id, new Date().getTime()); - return true; } diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 63a308ea30..64ec08317e 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -1089,6 +1089,19 @@ public class MessageHelper { return result; } + Integer getEncryption() { + for (AttachmentPart apart : attachments) + if (EntityAttachment.PGP_SIGNATURE.equals(apart.attachment.encryption)) + return EntityMessage.PGP_SIGNONLY; + else if (EntityAttachment.PGP_MESSAGE.equals(apart.attachment.encryption)) + return EntityMessage.PGP_SIGNENCRYPT; + else if (EntityAttachment.SMIME_SIGNATURE.equals(apart.attachment.encryption)) + return EntityMessage.SMIME_SIGNONLY; + else if (EntityAttachment.SMIME_MESSAGE.equals(apart.attachment.encryption)) + return EntityMessage.SMIME_SIGNENCRYPT; + return null; + } + void downloadAttachment(Context context, EntityAttachment local) throws IOException, MessagingException { List remotes = getAttachments();