From afad22a8cbed21780f367018bb0f102e23cf4dd3 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Fri, 9 Feb 2018 19:41:03 +0000 Subject: [PATCH] SusiMail: Better handling of no subject Better spacing display in text Recognize more re: and fwd: CSS wrap fix --- .../src/i2p/susi/util/EscapeHTMLWriter.java | 10 ++++++ .../src/src/i2p/susi/webmail/Mail.java | 24 +++++++------- .../src/src/i2p/susi/webmail/WebMail.java | 33 +++++++++++++------ .../themes/susimail/light/susimail.css | 2 +- 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/apps/susimail/src/src/i2p/susi/util/EscapeHTMLWriter.java b/apps/susimail/src/src/i2p/susi/util/EscapeHTMLWriter.java index c801db39e4..0ce73ab390 100644 --- a/apps/susimail/src/src/i2p/susi/util/EscapeHTMLWriter.java +++ b/apps/susimail/src/src/i2p/susi/util/EscapeHTMLWriter.java @@ -23,6 +23,8 @@ public class EscapeHTMLWriter extends FilterWriter { private static final String APOS = "'"; private static final String MDASH = "-"; private static final String BR = "<br>\n"; + private static final String EMSP = " "; + private static final String SP4 = " "; public EscapeHTMLWriter(Writer out) { @@ -50,6 +52,14 @@ public class EscapeHTMLWriter extends FilterWriter { case '-': out.write(MDASH); break; + case ' ': + // this should be breaking but non-collapsing + out.write(EMSP); + break; + case '\t': + // this should be breaking but non-collapsing + out.write(SP4); + break; case '\r': break; case '\n': diff --git a/apps/susimail/src/src/i2p/susi/webmail/Mail.java b/apps/susimail/src/src/i2p/susi/webmail/Mail.java index 894d63b5fc..26506a2912 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/Mail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/Mail.java @@ -74,13 +74,14 @@ class Mail { private int size; public String sender, // as received, trimmed only, not HTML escaped - reply, subject, dateString, + reply, + subject, // as received, trimmed only, not HTML escaped, non-null, default "" + dateString, //formattedSender, // address only, enclosed with <>, not HTML escaped - formattedSubject, formattedDate, // US Locale, UTC localFormattedDate, // Current Locale, local time zone shortSender, // Either name or address but not both, HTML escaped, double-quotes removed, truncated with hellip - shortSubject, // HTML escaped, truncated with hellip + shortSubject, // HTML escaped, truncated with hellip, non-null, default "" quotedDate; // Current Locale, local time zone, longer format public final String uidl; public Date date; @@ -98,12 +99,12 @@ class Mail { public Mail(String uidl) { this.uidl = uidl; //formattedSender = unknown; - formattedSubject = unknown; + subject = ""; formattedDate = unknown; localFormattedDate = unknown; - sender = unknown; + sender = ""; shortSender = unknown; - shortSubject = unknown; + shortSubject = ""; quotedDate = unknown; error = ""; } @@ -406,9 +407,9 @@ class Mail { shortSender = shortSender.substring(0, lt).trim(); else if (lt < 0 && shortSender.contains("@")) shortSender = '<' + shortSender + '>'; // add missing <> (but thunderbird doesn't...) - boolean trim = shortSender.length() > 35; + boolean trim = shortSender.length() > 45; if (trim) - shortSender = ServletUtil.truncate(shortSender, 32).trim(); + shortSender = ServletUtil.truncate(shortSender, 42).trim(); shortSender = html.encode( shortSender ); if (trim) shortSender += "…"; // must be after html encode @@ -421,11 +422,10 @@ class Mail { } else if (hlc.startsWith("subject:")) { subject = line.substring( 8 ).trim(); - formattedSubject = subject; - shortSubject = formattedSubject; - boolean trim = formattedSubject.length() > 65; + shortSubject = subject; + boolean trim = subject.length() > 75; if (trim) - shortSubject = ServletUtil.truncate(formattedSubject, 62).trim(); + shortSubject = ServletUtil.truncate(subject, 72).trim(); shortSubject = html.encode( shortSubject ); if (trim) shortSubject += "…"; // must be after html encode diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java index f6246af592..d91484548a 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java @@ -357,8 +357,8 @@ public class WebMail extends HttpServlet } protected int compare(Mail a, Mail b) { - String as = a.formattedSubject; - String bs = b.formattedSubject; + String as = a.subject; + String bs = b.subject; if (as.toLowerCase().startsWith("re:")) { as = as.substring(3).trim(); } else if (as.toLowerCase().startsWith("fwd:")) { @@ -760,6 +760,7 @@ public class WebMail extends HttpServlet type.startsWith("video/") || (type.startsWith("text/") && !type.equals("text/html")) || type.equals("application/zip") || type.equals("application/x-gtar") || + type.equals("application/x-zip-compressed") || type.equals("application/compress") || type.equals("application/gzip") || type.equals("application/x-7z-compressed") || type.equals("application/x-rar-compressed") || type.equals("application/x-tar") || type.equals("application/x-bzip2") || @@ -796,8 +797,8 @@ public class WebMail extends HttpServlet * * - quote html tags * - * @param line - * @return escaped string + * @param line, null OK + * @return escaped string or "" for null input */ static String quoteHTML( String line ) { @@ -1118,8 +1119,10 @@ public class WebMail extends HttpServlet sessionObject.replyTo = mail.reply; else if( mail.sender != null && Mail.validateAddress( mail.sender ) ) sessionObject.replyTo = mail.sender; - sessionObject.subject = mail.formattedSubject; + sessionObject.subject = mail.subject; if (!(sessionObject.subject.startsWith("Re:") || + sessionObject.subject.startsWith("re:") || + sessionObject.subject.startsWith("RE:") || sessionObject.subject.startsWith(_t("Re:")))) { sessionObject.subject = _t("Re:") + ' ' + sessionObject.subject; } @@ -1160,8 +1163,10 @@ public class WebMail extends HttpServlet sessionObject.replyCC = buf.toString(); } if( forward ) { - sessionObject.subject = mail.formattedSubject; + sessionObject.subject = mail.subject; if (!(sessionObject.subject.startsWith("Fwd:") || + sessionObject.subject.startsWith("fwd:") || + sessionObject.subject.startsWith("FWD:") || sessionObject.subject.startsWith(_t("Fwd:")))) { sessionObject.subject = _t("Fwd:") + ' ' + sessionObject.subject; } @@ -2189,7 +2194,7 @@ public class WebMail extends HttpServlet if(content == null) return false; String name; - if (mail.subject != null) + if (mail.subject.length() > 0) name = mail.subject.trim() + ".eml"; else name = "message.eml"; @@ -2570,6 +2575,9 @@ public class WebMail extends HttpServlet // ", markAll=" + sessionObject.markAll + // ", invert=" + sessionObject.invert + // ", clear=" + sessionObject.clear ); + String subj = mail.shortSubject; + if (subj.length() <= 0) + subj = "<i>" + _t("no subject") + "</i>"; out.println( "<tr class=\"list" + bg + "\">" + "<td><input type=\"checkbox\" class=\"optbox\" name=\"check" + b64UIDL + "\" value=\"1\"" + " onclick=\"deleteboxclicked();\" " + @@ -2578,7 +2586,7 @@ public class WebMail extends HttpServlet // mail.shortSender and mail.shortSubject already html encoded link + mail.shortSender + "</a></td><td " + jslink + ">" + (mail.hasAttachment() ? "<img src=\"/susimail/icons/attach.png\" alt=\"\" title=\"" + _t("Message has an attachment") + "\">" : " ") + "</td><td " + jslink + ">" + - link + mail.shortSubject + "</a></td><td " + jslink + ">" + + link + subj + "</a></td><td " + jslink + ">" + (mail.isSpam() ? "<img src=\"/susimail/icons/flag_red.png\" alt=\"\" title=\"" + _t("Message is spam") + "\">" : " ") + "</td><td " + jslink + ">" + // don't let date get split across lines mail.localFormattedDate.replace(" ", " ") + "</td><td " + jslink + "> </td><td align=\"right\" " + jslink + ">" + @@ -2671,7 +2679,7 @@ public class WebMail extends HttpServlet "</p>"); } Mail mail = sessionObject.mailCache.getMail(showUIDL, MailCache.FetchMode.ALL); - if(!RELEASE && mail != null && mail.hasBody()) { + if(!RELEASE && mail != null && mail.hasBody() && mail.getBody().getLength() < 4096) { out.println( "<!--" ); out.println( "Debug: Mail header and body follow"); Buffer body = mail.getBody(); @@ -2738,12 +2746,17 @@ public class WebMail extends HttpServlet // out.println(button( RELOAD, _t("Reload Config") ) + spacer); out.println( "<div id=\"viewmail\"><table id=\"message_full\" cellspacing=\"0\" cellpadding=\"5\">\n"); if (hasHeader) { + String subj = mail.subject; + if (subj.length() > 0) + subj = quoteHTML(subj); + else + subj = "<i>" + _t("no subject") + "</i>"; out.println("<tr><td colspan=\"2\"><table id=\"mailhead\">\n" + "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" + "<tr><td align=\"right\">" + _t("From") + ":</td><td align=\"left\">" + quoteHTML( mail.sender ) + "</td></tr>\n" + "<tr><td align=\"right\">" + _t("Subject") + - ":</td><td align=\"left\"><b>" + quoteHTML( mail.formattedSubject ) + "</b></td></tr>\n"); + ":</td><td align=\"left\"><b>" + subj + "</b></td></tr>\n"); if (mail.to != null) { out.println("<tr><td align=\"right\">" + _t("To") + ":</td><td align=\"left\">" + buildRecipientLine(mail.to) + "</td></tr>\n"); diff --git a/installer/resources/themes/susimail/light/susimail.css b/installer/resources/themes/susimail/light/susimail.css index 29be632b8c..5ea940b1c2 100644 --- a/installer/resources/themes/susimail/light/susimail.css +++ b/installer/resources/themes/susimail/light/susimail.css @@ -356,7 +356,7 @@ table#mailbox { #mailbox td:nth-child(5) { white-space: normal; - word-break: break-all; + word-break: normal; } #mailbox th:last-child, #mailbox td:nth-child(4) { -- GitLab