From c17f6be4446c67482da4cbb68e840e24caef016b Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 2 Mar 2021 13:52:52 +0100 Subject: [PATCH] p=p support for incoming messages --- FAQ.md | 5 +- .../eu/faircode/email/FragmentMessages.java | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/FAQ.md b/FAQ.md index bbda8c4c6d..b7ea4dd2ff 100644 --- a/FAQ.md +++ b/FAQ.md @@ -819,9 +819,8 @@ You can decode S/MIME signatures, etc, [here](https://lapo.it/asn1js/). *pretty Easy privacy* -pretty Easy privacy (p≡p) is not supported -because there is still [no approved standard](https://tools.ietf.org/id/draft-birk-pep-00.html) for this -and because hardly anyone uses this. +There is still [no approved standard](https://tools.ietf.org/id/draft-birk-pep-00.html) for pretty Easy privacy (p≡p) and hardly anyone uses this. +Nevertheless, FairEmail can properly decode incoming p≡p messages since version 1.1519.
diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 4873b473b8..2844346417 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -208,6 +208,7 @@ import java.util.concurrent.Future; import javax.mail.Address; import javax.mail.MessageRemovedException; import javax.mail.MessagingException; +import javax.mail.Part; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; @@ -6244,6 +6245,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. } } + checkPep(message, remotes, context); + db.message().setMessageEncrypt(message.id, parts.getEncryption()); db.message().setMessageStored(message.id, new Date().getTime()); db.message().setMessageFts(message.id, false); @@ -6875,6 +6878,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. Log.i("s/mime attachment=" + remote); } + checkPep(message, remotes, context); + db.message().setMessageEncrypt(message.id, parts.getEncryption()); db.message().setMessageStored(message.id, new Date().getTime()); db.message().setMessageFts(message.id, false); @@ -6916,6 +6921,47 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. }.execute(this, args, "decrypt:s/mime"); } + private static void checkPep(EntityMessage message, List remotes, Context context) throws IOException, MessagingException { + DB db = DB.getInstance(context); + for (EntityAttachment remote : remotes) + if ("message/rfc822".equals(remote.getMimeType())) { + Properties props = MessageHelper.getSessionProperties(); + Session isession = Session.getInstance(props, null); + + MimeMessage pep; + try (InputStream fis = new FileInputStream(remote.getFile(context))) { + pep = new MimeMessage(isession, fis); + } + + String[] xpep = pep.getHeader("X-pEp-Wrapped-Message-Info"); + if (xpep != null && xpep.length > 0 && "INNER".equals(xpep[0])) { + MessageHelper phelper = new MessageHelper(pep, context); + String spep = phelper.getSubject(); + if (!TextUtils.isEmpty(spep)) + db.message().setMessageSubject(message.id, spep); + + String shtml = phelper.getMessageParts().getHtml(context); + if (!TextUtils.isEmpty(shtml)) { + String html = Helper.readText(message.getFile(context)); + + if (!TextUtils.isEmpty(html)) { + EntityAttachment a = new EntityAttachment(); + a.message = message.id; + a.sequence = remotes.size(); + a.type = "text/html"; + a.disposition = Part.INLINE; + a.id = db.attachment().insertAttachment(a); + + Helper.writeText(a.getFile(context), html); + db.attachment().setDownloaded(a.id, (long) html.length()); + } + + Helper.writeText(message.getFile(context), shtml); + } + } + } + } + private void onDelete(long id) { Bundle args = new Bundle(); args.putLong("id", id);