From 79985f494b012635178cca859136a19ea4abbfac Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 24 Dec 2021 15:21:16 +0100 Subject: [PATCH] Refactoring --- .../java/eu/faircode/email/MessageHelper.java | 107 ++++++++++-------- 1 file changed, 60 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 62dd864b2b..5da817404f 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -2582,53 +2582,10 @@ public class MessageHelper { } } } else if (h.isDSN()) { - String action = null; - String diag = null; - String status = null; - - StringBuilder report = new StringBuilder(); - report.append("
"); - for (String line : result.split("\\r?\\n")) - if (line.length() == 0) - report.append("
"); - else if (Character.isWhitespace(line.charAt(0))) - report.append(line).append("
"); - else { - int colon = line.indexOf(':'); - if (colon < 0) - report.append(line); - else { - String name = line.substring(0, colon).trim(); - String value = line.substring(colon + 1).trim(); - value = decodeMime(value); - report - .append("") - .append(TextUtils.htmlEncode(name)) - .append("") - .append(": ") - .append(TextUtils.htmlEncode(value)) - .append("
"); - - // https://datatracker.ietf.org/doc/html/rfc3464#section-2.3 - switch (name) { - case "Action": - action = value; - break; - case "Status": - status = value; - break; - case "Diagnostic-Code": - diag = value; - break; - } - } - } - report.append("
"); - result = report.toString(); - - if (diag != null && - ("failed".equals(action) || "delayed".equals(action))) - warnings.add(diag + (status == null ? "" : " (" + status + ")")); + DeliveryReport report = new DeliveryReport(result); + result = report.html; + if (report.isNonDelivery() && report.diag != null) + warnings.add(report.diag); } else Log.w("Unexpected content type=" + h.contentType); @@ -3756,4 +3713,60 @@ public class MessageHelper { return className; } } + + static class DeliveryReport { + String action; + String status; + String diag; + String html; + + DeliveryReport(String content) { + StringBuilder report = new StringBuilder(); + report.append("
"); + content = content.replaceAll("(\\r?\\n)+", "\n"); + ByteArrayInputStream bis = new ByteArrayInputStream(content.getBytes()); + try { + Enumeration
headers = new InternetHeaders(bis).getAllHeaders(); + while (headers.hasMoreElements()) { + Header header = headers.nextElement(); + String name = header.getName(); + String value = header.getValue(); + value = decodeMime(value); + report + .append("") + .append(TextUtils.htmlEncode(name)) + .append("") + .append(": ") + .append(TextUtils.htmlEncode(value)) + .append("
"); + + // https://datatracker.ietf.org/doc/html/rfc3464#section-2.3 + switch (name) { + case "Action": + this.action = value; + break; + case "Status": + this.status = value; + break; + case "Diagnostic-Code": + this.diag = value; + break; + } + } + } catch (Throwable ex) { + Log.e(ex); + report.append(TextUtils.htmlEncode(ex.toString())); + } + report.append("
"); + this.html = report.toString(); + } + + boolean isDelivery() { + return ("delivered".equals(action) || "relayed".equals(action) || "expanded".equals(action)); + } + + boolean isNonDelivery() { + return ("failed".equals(action) || "delayed".equals(action)); + } + } }