Native DKIM improvements

pull/212/head
M66B 3 years ago
parent 9dbd02bdc6
commit bf91c80b7e

@ -102,6 +102,7 @@ import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.Hashtable;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -1992,6 +1993,7 @@ public class MessageHelper {
if (!(imessage instanceof IMAPMessage)) if (!(imessage instanceof IMAPMessage))
return null; return null;
// Workaround reformatted headers
Properties props = MessageHelper.getSessionProperties(true); Properties props = MessageHelper.getSessionProperties(true);
Session isession = Session.getInstance(props, null); Session isession = Session.getInstance(props, null);
MimeMessage amessage = new MimeMessage(isession, ((IMAPMessage) imessage).getMimeStream()); MimeMessage amessage = new MimeMessage(isession, ((IMAPMessage) imessage).getMimeStream());
@ -2031,58 +2033,66 @@ public class MessageHelper {
String[] c = kv.get("c").split("/"); String[] c = kv.get("c").split("/");
StringBuilder head = new StringBuilder(); StringBuilder head = new StringBuilder();
// TODO: check presence from
Log.i("DKIM headers=" + kv.get("h")); String hs = kv.get("h");
Log.i("DKIM headers=" + hs);
boolean from = false;
List<String> _h = new ArrayList<>(); List<String> _h = new ArrayList<>();
_h.addAll(Arrays.asList(kv.get("h").split(":"))); for (String key : hs.split(":")) {
_h.add(key.trim());
from = (from || "from".equalsIgnoreCase(key.trim()));
}
if (!from)
throw new IllegalArgumentException("from missing: " + hs);
_h.add("DKIM-Signature"); _h.add("DKIM-Signature");
List<String> processed = new ArrayList<>();
Map<String, Integer> index = new Hashtable<>();
for (String n : _h) { for (String n : _h) {
n = n.trim(); // https://datatracker.ietf.org/doc/html/rfc6376/#section-5.4.2
if (processed.contains(n)) { String _n = n.toLowerCase(Locale.ROOT);
Log.i("DKIM duplicate header='" + n + "'"); Integer idx = index.get(_n);
continue; idx = (idx == null ? 1 : idx + 1);
} index.put(_n, idx);
processed.add(n);
String[] h = ("DKIM-Signature".equals(n) ? new String[]{header} : amessage.getHeader(n)); String[] h = ("DKIM-Signature".equals(n) ? new String[]{header} : amessage.getHeader(n));
if (h == null) { if (h == null || idx > h.length) {
Log.i("DKIM missing header='" + n + "'"); // https://datatracker.ietf.org/doc/html/rfc6376/#section-5.4
Log.i("DKIM missing header=" + n + "[" + idx + "/" + (h == null ? null : h.length) + "]");
continue; continue;
} }
for (int i = h.length - 1; i >= 0; i--) { String v = h[h.length - idx];
String v = h[i]; if ("DKIM-Signature".equals(n)) {
if ("DKIM-Signature".equals(n)) { int b = v.lastIndexOf("b=");
int b = v.lastIndexOf("b="); int s = v.indexOf(";", b + 2);
int s = v.indexOf(";", b + 2); v = v.substring(0, b + 2) + (s < 0 ? "" : v.substring(s));
v = v.substring(0, b + 2) + (s < 0 ? "" : v.substring(s)); } else
} else Log.i("DKIM " + n + "=" + v.replaceAll("\\r?\\n", "|"));
Log.i("DKIM " + n + "=" + v.replaceAll("\\r?\\n", "|"));
if ("simple".equals(c[0])) {
if ("simple".equals(c[0])) { if ("DKIM-Signature".equals(n))
if ("DKIM-Signature".equals(n)) head.append(n).append(": ").append(v);
head.append(n).append(": ").append(v); else {
else { // Find original header/name
// Find original header/name Enumeration<Header> oheaders = amessage.getAllHeaders();
Enumeration<Header> oheaders = amessage.getAllHeaders(); while (oheaders.hasMoreElements()) {
while (oheaders.hasMoreElements()) { Header oheader = oheaders.nextElement();
Header oheader = oheaders.nextElement(); if (n.equalsIgnoreCase(oheader.getName()))
if (n.equalsIgnoreCase(oheader.getName())) head.append(oheader.getName()).append(": ")
head.append(oheader.getName()).append(": ") .append(oheader.getValue());
.append(oheader.getValue());
}
} }
} else if ("relaxed".equals(c[0])) { }
v = MimeUtility.unfold(v); } else if ("relaxed".equals(c[0])) {
head.append(n.trim().toLowerCase()).append(':') v = MimeUtility.unfold(v);
.append(v.replaceAll("\\s+", " ").trim()); head.append(_n).append(':')
} else .append(v.replaceAll("\\s+", " ").trim());
throw new IllegalArgumentException(c[0]); } else
throw new IllegalArgumentException(c[0]);
if (!"DKIM-Signature".equals(n))
head.append("\r\n"); if (!"DKIM-Signature".equals(n))
} head.append("\r\n");
} }
Log.i("DKIM head=" + head.toString().replace("\r\n", "|")); Log.i("DKIM head=" + head.toString().replace("\r\n", "|"));
@ -2137,7 +2147,6 @@ public class MessageHelper {
boolean verified = sig.verify(signature); boolean verified = sig.verify(signature);
Log.i("DKIM valid=" + verified + Log.i("DKIM valid=" + verified +
" dns=" + dns + " dns=" + dns +
" results=" + getAuthentication("dkim", getAuthentication()) +
" from=" + formatAddresses(getFrom())); " from=" + formatAddresses(getFrom()));
if (verified) if (verified)

Loading…
Cancel
Save