From 7fdd3b9b3ef766e1a4eadff5b41bf3b06b8ad767 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 14 Feb 2023 09:36:35 +0100 Subject: [PATCH] Native DKIM for POP3 --- app/src/main/java/eu/faircode/email/Core.java | 7 +++++++ .../java/eu/faircode/email/MessageHelper.java | 15 +++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 7a1e848682..cce3f8ebda 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -2933,6 +2933,7 @@ class Core { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean sync_quick_pop = prefs.getBoolean("sync_quick_pop", true); boolean notify_known = prefs.getBoolean("notify_known", false); + boolean native_dkim = prefs.getBoolean("native_dkim", false); boolean download_eml = prefs.getBoolean("download_eml", false); boolean download_plain = prefs.getBoolean("download_plain", false); boolean check_blocklist = prefs.getBoolean("check_blocklist", false); @@ -3166,6 +3167,12 @@ class Core { message.receipt_request = helper.getReceiptRequested(); message.receipt_to = helper.getReceiptTo(); message.bimi_selector = helper.getBimiSelector(); + + if (native_dkim) { + List signers = helper.verifyDKIM(context); + message.signedby = (signers.size() == 0 ? null : TextUtils.join(",", signers)); + } + message.tls = helper.getTLS(); message.dkim = MessageHelper.getAuthentication("dkim", authentication); if (Boolean.TRUE.equals(message.dkim)) diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 26dfe0520f..932b8f2665 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -54,6 +54,7 @@ import com.sun.mail.util.BASE64DecoderStream; import com.sun.mail.util.DecodingException; import com.sun.mail.util.FolderClosedIOException; import com.sun.mail.util.MessageRemovedIOException; +import com.sun.mail.util.ReadableMime; import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveException; @@ -1994,13 +1995,11 @@ public class MessageHelper { List signers = new ArrayList<>(); try { - // Workaround reformatted headers - Properties props = MessageHelper.getSessionProperties(true); - Session isession = Session.getInstance(props, null); - MimeMessage amessage = new MimeMessage(isession, ((IMAPMessage) imessage).getMimeStream()); + // Workaround reformatted headers (Content-Type) + InternetHeaders ih = new InternetHeaders(((ReadableMime) imessage).getMimeStream(), true); // https://datatracker.ietf.org/doc/html/rfc6376/ - String[] headers = amessage.getHeader("DKIM-Signature"); + String[] headers = ih.getHeader("DKIM-Signature"); if (headers == null || headers.length < 1) return signers; @@ -2065,7 +2064,7 @@ public class MessageHelper { String[] values = ("DKIM-Signature".equals(key) ? new String[]{header} - : amessage.getHeader(key)); + : ih.getHeader(key)); if (values == null || idx > values.length) { // https://datatracker.ietf.org/doc/html/rfc6376/#section-5.4 Log.i("DKIM missing header=" + @@ -2086,7 +2085,7 @@ public class MessageHelper { head.append(key).append(": ").append(value); else { // Find original header/name - Enumeration
oheaders = amessage.getAllHeaders(); + Enumeration
oheaders = ih.getAllHeaders(); while (oheaders.hasMoreElements()) { Header oheader = oheaders.nextElement(); if (key.equalsIgnoreCase(oheader.getName())) @@ -2107,7 +2106,7 @@ public class MessageHelper { Log.i("DKIM head=" + head.toString().replace("\r\n", "|")); ByteArrayOutputStream bos = new ByteArrayOutputStream(); - Helper.copy(amessage.getRawInputStream(), bos); + Helper.copy(imessage.getRawInputStream(), bos); String body = bos.toString(); // TODO: charset? if ("simple".equals(c[c.length > 1 ? 1 : 0])) { if (TextUtils.isEmpty(body))