From 029198c213e83ba75e6fb73e483071b398b62955 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Fri, 18 Apr 2014 16:43:07 +0000
Subject: [PATCH]  * SusiMail:    - Don't force reconnection on folder view
 (ticket #1253)    - Only show logout button on folder view    - Switch
 subject and date headers on message view    - Button theme tweaks    - Debug
 logging    - Fix NPE when RELEASE=false    - Synch tweaks    - hellip    -
 Footer tweak

---
 .../src/src/i2p/susi/webmail/Mail.java        |  4 +-
 .../src/src/i2p/susi/webmail/MailCache.java   |  9 ++--
 .../src/src/i2p/susi/webmail/WebMail.java     | 49 ++++++++++++++-----
 .../themes/susimail/light/susimail.css        | 24 ++++-----
 4 files changed, 53 insertions(+), 33 deletions(-)

diff --git a/apps/susimail/src/src/i2p/susi/webmail/Mail.java b/apps/susimail/src/src/i2p/susi/webmail/Mail.java
index 03c595f668..b73fd134ec 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/Mail.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/Mail.java
@@ -203,7 +203,7 @@ public class Mail {
 							formattedSender = getAddress( sender );
 							shortSender = formattedSender.trim();
 							if( shortSender.length() > 40 ) {
-								shortSender = shortSender.substring( 0, 37 ).trim() + "...";
+								shortSender = shortSender.substring( 0, 37 ).trim() + "&hellip;";
 							}
 							shortSender = html.encode( shortSender );
 						}
@@ -226,7 +226,7 @@ public class Mail {
 							formattedSubject = subject;
 							shortSubject = formattedSubject;
 							if( formattedSubject.length() > 60 )
-								shortSubject = formattedSubject.substring( 0, 57 ).trim() + "...";
+								shortSubject = formattedSubject.substring( 0, 57 ).trim() + "&hellip;";
 							shortSubject = html.encode( shortSubject );
 						}
 						else if( line.toLowerCase(Locale.US).startsWith( "reply-to:" ) ) {
diff --git a/apps/susimail/src/src/i2p/susi/webmail/MailCache.java b/apps/susimail/src/src/i2p/susi/webmail/MailCache.java
index dc3fb8cf3b..f61a1698f8 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/MailCache.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/MailCache.java
@@ -37,19 +37,18 @@ public class MailCache {
 	
 	private final POP3MailBox mailbox;
 	private final Hashtable<String, Mail> mails;
-	private final Object synchronizer;
 	
 	MailCache( POP3MailBox mailbox ) {
 		this.mailbox = mailbox;
 		mails = new Hashtable<String, Mail>();
-		synchronizer = new Object();
 	}
+
 	/**
 	 * Fetch any needed data from pop3 server.
 	 * 
 	 * @param uidl message id to get
 	 * @param headerOnly fetch only header lines?
-	 * @return An e-mail
+	 * @return An e-mail or null
 	 */
 	public Mail getMail( String uidl, boolean headerOnly ) {
 		
@@ -59,10 +58,8 @@ public class MailCache {
 			/*
 			 * synchronize update to hashtable
 			 */
-			synchronized( synchronizer ) {
-
+			synchronized(mails) {
 				mail = mails.get( uidl );
-			
 				if( mail == null ) {
 					newMail = new Mail();
 					mails.put( uidl, newMail );
diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
index 05bfd816d9..aaaef423fd 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
@@ -47,6 +47,7 @@ import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.Locale;
@@ -635,11 +636,13 @@ public class WebMail extends HttpServlet
 						sessionObject.folder.addSorter( SORT_SIZE, new SizeSorter( sessionObject.mailCache ) );
 						sessionObject.folder.setSortingDirection( Folder.DOWN );
 						sessionObject.reallyDelete = false;
+						Debug.debug(Debug.DEBUG, "CONNECTED, YAY");
 					}
 					else {
 						sessionObject.error += sessionObject.mailbox.lastError();
 						sessionObject.mailbox.close();
 						sessionObject.mailbox = null;
+						Debug.debug(Debug.DEBUG, "NOT CONNECTED, BOO");
 					}
 				}
 			}
@@ -653,6 +656,7 @@ public class WebMail extends HttpServlet
 	private static void processLogout( SessionObject sessionObject, RequestWrapper request )
 	{
 		if( buttonPressed( request, LOGOUT ) ) {
+			Debug.debug(Debug.DEBUG, "REMOVING SESSION");
 			HttpSession session = request.getSession();
 			session.removeAttribute( "sessionObject" );
 			session.invalidate();
@@ -1181,6 +1185,10 @@ public class WebMail extends HttpServlet
 		if( sessionObject == null ) {
 			sessionObject = new SessionObject();
 			httpSession.setAttribute( "sessionObject", sessionObject );
+			Debug.debug(Debug.DEBUG, "NEW session " + httpSession.getId() + " state = " + sessionObject.state);
+		} else {
+			Debug.debug(Debug.DEBUG, "Existing session " + httpSession.getId() + " state = " + sessionObject.state +
+				" created " + new Date(httpSession.getCreationTime()));
 		}
 		return sessionObject;
 	}
@@ -1267,7 +1275,18 @@ public class WebMail extends HttpServlet
 			sessionObject.imgPath = sessionObject.themePath + "images/";
 			sessionObject.isMobile = isMobile;
 			
+			int oldState = sessionObject.state;
 			processStateChangeButtons( sessionObject, request );
+			int newState = sessionObject.state;
+			if (oldState != newState)
+				Debug.debug(Debug.DEBUG, "STATE CHANGE from " + oldState + " to " + newState);
+			if (oldState == STATE_AUTH && newState != STATE_AUTH) {
+				// this isn't working in web.xml, so try setting it here
+				int oldIdle = httpSession.getMaxInactiveInterval();
+				httpSession.setMaxInactiveInterval(60*60*24);  // seconds
+				int newIdle = httpSession.getMaxInactiveInterval();
+				Debug.debug(Debug.DEBUG, "Changed idle from " + oldIdle + " to " + newIdle);
+			}
 			
 			if( sessionObject.state != STATE_AUTH )
 				processGenericButtons( sessionObject, request );
@@ -1315,9 +1334,12 @@ public class WebMail extends HttpServlet
 				 */
 				if( sessionObject.state == STATE_AUTH )
 					subtitle = _("Login");
-				else if( sessionObject.state == STATE_LIST )
-					subtitle = ngettext("1 Message", "{0} Messages", sessionObject.mailbox.getNumMails());
-				else if( sessionObject.state == STATE_SHOW )
+				else if( sessionObject.state == STATE_LIST ) {
+					// mailbox.getNumMails() forces a connection, don't use it
+					// Not only does it slow things down, but a failure causes all our messages to "vanish"
+					//subtitle = ngettext("1 Message", "{0} Messages", sessionObject.mailbox.getNumMails());
+					subtitle = ngettext("1 Message", "{0} Messages", sessionObject.folder.getSize());
+				} else if( sessionObject.state == STATE_SHOW )
 					subtitle = _("Show Message");
 
 				response.setContentType( "text/html" );
@@ -1359,7 +1381,8 @@ public class WebMail extends HttpServlet
 				else if( sessionObject.state == STATE_NEW )
 					showCompose( out, sessionObject, request );
 				
-				out.println( "</form><div id=\"footer\"><hr><p class=\"footer\">susimail v0." + version +" " + ( RELEASE ? "release" : "development" ) + " &copy; 2004-2005 <a href=\"mailto:susi23@mail.i2p\">susi</a></div></div></body>\n</html>");				
+				//out.println( "</form><div id=\"footer\"><hr><p class=\"footer\">susimail v0." + version +" " + ( RELEASE ? "release" : "development" ) + " &copy; 2004-2005 <a href=\"mailto:susi23@mail.i2p\">susi</a></div></div></body>\n</html>");				
+				out.println( "</form><div id=\"footer\"><hr><p class=\"footer\">susimail &copy; 2004-2005 susi</div></div></body>\n</html>");				
 				out.flush();
 			}
 		}
@@ -1582,9 +1605,9 @@ public class WebMail extends HttpServlet
 		out.println( button( SEND, _("Send") ) +
 				button( CANCEL, _("Cancel") ) + spacer +
 				(sessionObject.attachments != null && (!sessionObject.attachments.isEmpty()) ? button( DELETE_ATTACHMENT, _("Delete Attachment") ) : button2( DELETE_ATTACHMENT, _("Delete Attachment") ) ) + spacer);
-		if (Config.hasConfigFile())
-			out.println(button( RELOAD, _("Reload Config") ) + spacer);
-		out.println(button( LOGOUT, _("Logout") ) );
+		//if (Config.hasConfigFile())
+		//	out.println(button( RELOAD, _("Reload Config") ) + spacer);
+		//out.println(button( LOGOUT, _("Logout") ) );
 
 		String from = request.getParameter( NEW_FROM );
 		String fixed = Config.getProperty( CONFIG_SENDER_FIXED, "true" );
@@ -1749,7 +1772,7 @@ public class WebMail extends HttpServlet
 			mail.part = new MailPart();
 			mail.part.parse( mail.body );
 		}
-		if( !RELEASE ) {
+		if(!RELEASE && mail != null && mail.body != null) {
 			out.println( "<!--" );
 			// FIXME encoding, escaping --, etc... but disabled.
 			out.println( quoteHTML( new String( mail.body.content, mail.body.offset, mail.body.length ) ) );
@@ -1763,18 +1786,18 @@ public class WebMail extends HttpServlet
 			( sessionObject.folder.isFirstElement( sessionObject.showUIDL ) ? button2( PREV, _("Previous") ) : button( PREV, _("Previous") ) ) +
 			( sessionObject.folder.isLastElement( sessionObject.showUIDL ) ? button2( NEXT, _("Next") ) : button( NEXT, _("Next") ) ) + spacer +
 			button( LIST, _("Back to Folder") ) + spacer);
-		if (Config.hasConfigFile())
-			out.println(button( RELOAD, _("Reload Config") ) + spacer);
-		out.println(button( LOGOUT, _("Logout") ) );
+		//if (Config.hasConfigFile())
+		//	out.println(button( RELOAD, _("Reload Config") ) + spacer);
+		//out.println(button( LOGOUT, _("Logout") ) );
 		if( mail != null ) {
 			out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
 					"<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
 					"<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("From:") +
 					"</td><td align=\"left\">" + quoteHTML( mail.sender ) + "</td></tr>\n" +
-					"<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("Date:") +
-					"</td><td align=\"left\">" + mail.quotedDate + "</td></tr>\n" +
 					"<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("Subject:") +
 					"</td><td align=\"left\">" + quoteHTML( mail.formattedSubject ) + "</td></tr>\n" +
+					"<tr class=\"mailhead\"><td align=\"right\" valign=\"top\">" + _("Date:") +
+					"</td><td align=\"left\">" + mail.quotedDate + "</td></tr>\n" +
 					"<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>" );
 			if( mail.body != null ) {
 				showPart( out, mail.part, 0, SHOW_HTML );
diff --git a/installer/resources/themes/susimail/light/susimail.css b/installer/resources/themes/susimail/light/susimail.css
index 4c3822c9ac..83dc9bc881 100644
--- a/installer/resources/themes/susimail/light/susimail.css
+++ b/installer/resources/themes/susimail/light/susimail.css
@@ -164,60 +164,60 @@ form {
 
 input.cancel, input.clearselection, input.logout {
      background: #ddf url('/themes/console/images/cancel.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     padding: 2px 3px 2px 24px;
      min-height: 22px;
 }
 
 input.delete, input.delete_attachment, input.really_delete {
      background: #ddf url('/themes/console/images/delete.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     padding: 2px 3px 2px 24px;
      min-height: 22px;
 }
 
 input.download, input.lastpage {
      background: #ddf url('/themes/console/images/arrow_down.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     padding: 2px 3px 2px 24px;
      min-height: 22px;
 }
 
 input.firstpage, input.list {
-     background: #ddf url('/themes/console/images/arrow_up.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     background: #ddf url('/themes/console/images/arrow_up.png') no-repeat 1px center;
+     padding: 2px 3px 2px 19px;
      min-height: 22px;
 }
 
 input.forward, input.login, input.nextpage, input.send, input.next {
      background: #ddf url('/themes/console/images/arrow_right.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     padding: 2px 3px 2px 24px;
      min-height: 22px;
 }
 
 input.invertselection, input.reload, input.refresh {
      background: #ddf url('/themes/console/images/arrow_refresh.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     padding: 2px 3px 2px 24px;
      min-height: 22px;
 }
 
 input.markall, input.show {
      background: #ddf url('/themes/console/images/tick.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     padding: 2px 3px 2px 24px;
      min-height: 22px;
 }
 
 input.new, input.reply, input.replyall {
-     background: #ddf url('/themes/console/images/email.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     background: #ddf url('/themes/console/images/email.png') no-repeat 0px center;
+     padding: 2px 3px 2px 36px;
      min-height: 22px;
 }
 
 input.prevpage, input.prev {
      background: #ddf url('/themes/console/images/arrow_left.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     padding: 2px 3px 2px 24px;
      min-height: 22px;
 }
 
 input.send, input.setpagesize {
      background: #ddf url('/themes/console/images/accept.png') no-repeat 4px center;
-     padding: 2px 3px 2px 21px;
+     padding: 2px 3px 2px 24px;
      min-height: 22px;
 }
-- 
GitLab