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 = "&apos;";
     private static final String MDASH = "&#45;";
     private static final String BR = "<br>\n";
+    private static final String EMSP = "&emsp;";
+    private static final String SP4 = "&nbsp;&nbsp;&nbsp; ";
 
 
     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 += "&hellip;";  // 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 += "&hellip;";  // 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") + "\">" : "&nbsp;") + "</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") + "\">" : "&nbsp;") + "</td><td " + jslink + ">" +
 					// don't let date get split across lines
 					mail.localFormattedDate.replace(" ", "&nbsp;") + "</td><td " + jslink + ">&nbsp;</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