diff --git a/apps/susimail/src/src/i2p/susi/util/Config.java b/apps/susimail/src/src/i2p/susi/util/Config.java
index ff1a9a51c..9752f05a4 100644
--- a/apps/susimail/src/src/i2p/susi/util/Config.java
+++ b/apps/susimail/src/src/i2p/susi/util/Config.java
@@ -31,14 +31,18 @@ import java.io.IOException;
import java.util.Properties;
import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
/**
+ * Warning - static - not for use by multiple applications or prefixes
+ *
* @author susi
*/
public class Config {
private static Properties properties, config;
private static String configPrefix;
+
/**
*
* @param name
@@ -59,10 +63,11 @@ public class Config {
if( result != null )
return result;
- result = config.getProperty( name );
-
- if( result != null )
- return result;
+ if( config != null ) {
+ result = config.getProperty( name );
+ if( result != null )
+ return result;
+ }
result = properties.getProperty( name );
@@ -84,25 +89,24 @@ public class Config {
*/
public static void reloadConfiguration()
{
+ // DEBUG level logging won't work here since we haven't loaded the config yet...
properties = new Properties();
- config = new Properties();
try {
properties.load( Config.class.getResourceAsStream( "/susimail.properties" ) );
} catch (Exception e) {
- Debug.debug( Debug.DEBUG, "Could not open WEB-INF/classes/susimail.properties (possibly in jar), reason: " + e.getMessage() );
+ Debug.debug(Debug.ERROR, "Could not open WEB-INF/classes/susimail.properties (possibly in jar), reason: " + e);
}
- FileInputStream fis = null;
try {
File cfg = new File(I2PAppContext.getGlobalContext().getConfigDir(), "susimail.config");
- fis = new FileInputStream(cfg);
- config.load( fis );
+ if (cfg.exists()) {
+ config = new Properties();
+ DataHelper.loadProps(config, cfg);
+ }
} catch (Exception e) {
- Debug.debug( Debug.DEBUG, "Could not open susimail.config, reason: " + e.getMessage() );
- } finally {
- if (fis != null)
- try { fis.close(); } catch (IOException ioe) {}
+ Debug.debug(Debug.ERROR, "Could not open susimail.config, reason: " + e);
}
}
+
/**
*
* @param name
@@ -134,8 +138,9 @@ public class Config {
}
return result;
}
+
/**
- *
+ * Static! Not for use by multiple applications!
* @param prefix
*/
public static void setPrefix( String prefix )
diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
index cfa227d68..5f47fea23 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
@@ -59,6 +59,8 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionBindingListener;
import net.i2p.I2PAppContext;
import net.i2p.data.DataHelper;
@@ -71,7 +73,7 @@ public class WebMail extends HttpServlet
/*
* set to true, if its a release build
*/
- private static final boolean RELEASE = true;
+ private static final boolean RELEASE;
/*
* increase version number for every release
*/
@@ -168,6 +170,7 @@ public class WebMail extends HttpServlet
private static final String CONFIG_COMPOSER_ROWS = "composer.rows";
private static final String CONFIG_BCC_TO_SELF = "composer.bcc.to.self";
+ private static final String CONFIG_DEBUG = "debug";
private static final String RC_PROP_THEME = "routerconsole.theme";
private static final String RC_PROP_UNIVERSAL_THEMING = "routerconsole.universal.theme";
@@ -177,6 +180,12 @@ public class WebMail extends HttpServlet
private static final String spacer = " ";
private static final String thSpacer = "
| \n";
+
+ static {
+ Config.setPrefix( "susimail" );
+ RELEASE = !Boolean.parseBoolean(Config.getProperty(CONFIG_DEBUG));
+ Debug.setLevel( RELEASE ? Debug.ERROR : Debug.DEBUG );
+ }
/**
* sorts Mail objects by id field
@@ -313,7 +322,7 @@ public class WebMail extends HttpServlet
* data structure to hold any persistent data (to store them in session dictionary)
* @author susi
*/
- private static class SessionObject {
+ private static class SessionObject implements HttpSessionBindingListener {
boolean pageChanged, markAll, clear, invert;
int state, smtpPort;
POP3MailBox mailbox;
@@ -335,11 +344,22 @@ public class WebMail extends HttpServlet
state = STATE_AUTH;
bccToSelf = Boolean.parseBoolean(Config.getProperty( CONFIG_BCC_TO_SELF, "true" ));
}
- }
-
- static {
- Debug.setLevel( RELEASE ? Debug.ERROR : Debug.DEBUG );
- Config.setPrefix( "susimail" );
+
+ /** @since 0.9.13 */
+ public void valueBound(HttpSessionBindingEvent event) {}
+
+ /**
+ * Close the POP3 socket if still open
+ * @since 0.9.13
+ */
+ public void valueUnbound(HttpSessionBindingEvent event) {
+ Debug.debug(Debug.DEBUG, "Session unbound: " + event.getSession().getId());
+ POP3MailBox mbox = mailbox;
+ if (mbox != null) {
+ mbox.close();
+ mailbox = null;
+ }
+ }
}
/**
@@ -351,8 +371,15 @@ public class WebMail extends HttpServlet
*/
private static String button( String name, String label )
{
- return "";
+ StringBuilder buf = new StringBuilder(128);
+ buf.append("');
+ return buf.toString();
}
+
/**
* returns html string of a disabled form button with name and label
*
@@ -624,16 +651,17 @@ public class WebMail extends HttpServlet
}
}
if( doContinue ) {
- sessionObject.mailbox = new POP3MailBox( host, pop3PortNo, user, pass );
- if( sessionObject.mailbox.isConnected() ) {
+ POP3MailBox mailbox = new POP3MailBox( host, pop3PortNo, user, pass );
+ if (mailbox.isConnected() ) {
+ sessionObject.mailbox = mailbox;
sessionObject.user = user;
sessionObject.pass = pass;
sessionObject.host = host;
sessionObject.smtpPort = smtpPortNo;
sessionObject.state = STATE_LIST;
- sessionObject.mailCache = new MailCache( sessionObject.mailbox );
+ sessionObject.mailCache = new MailCache(mailbox);
sessionObject.folder = new Folder();
- sessionObject.folder.setElements( sessionObject.mailbox.getUIDLs() );
+ sessionObject.folder.setElements(mailbox.getUIDLs() );
sessionObject.folder.addSorter( SORT_ID, new IDSorter( sessionObject.mailCache ) );
sessionObject.folder.addSorter( SORT_SENDER, new SenderSorter( sessionObject.mailCache ) );
sessionObject.folder.addSorter( SORT_SUBJECT, new SubjectSorter( sessionObject.mailCache ) );
@@ -645,8 +673,8 @@ public class WebMail extends HttpServlet
Debug.debug(Debug.DEBUG, "CONNECTED, YAY");
}
else {
- sessionObject.error += sessionObject.mailbox.lastError();
- sessionObject.mailbox.close();
+ sessionObject.error += mailbox.lastError();
+ mailbox.close();
sessionObject.mailbox = null;
Debug.debug(Debug.DEBUG, "NOT CONNECTED, BOO");
}
@@ -666,8 +694,9 @@ public class WebMail extends HttpServlet
HttpSession session = request.getSession();
session.removeAttribute( "sessionObject" );
session.invalidate();
- if( sessionObject.mailbox != null ) {
- sessionObject.mailbox.close();
+ POP3MailBox mailbox = sessionObject.mailbox;
+ if (mailbox != null) {
+ mailbox.close();
sessionObject.mailbox = null;
}
sessionObject.info += _("User logged out.") + "
";
@@ -699,12 +728,39 @@ public class WebMail extends HttpServlet
* compose dialog
*/
if( sessionObject.state == STATE_NEW ) {
- if (buttonPressed( request, CANCEL ) ||
- buttonPressed( request, LIST )) { // LIST button not shown but we could be lost
- sessionObject.state = STATE_LIST;
- } else if( buttonPressed( request, SEND ) ) {
+ // We have to make sure to get the state right even if
+ // the user hit the back button previously
+ if( buttonPressed( request, SEND ) ) {
if( sendMail( sessionObject, request ) )
sessionObject.state = STATE_LIST;
+ } else if (buttonPressed( request, CANCEL ) ||
+ buttonPressed( request, SHOW ) || // A param, not a button, but we could be lost
+ buttonPressed( request, PREVPAGE ) || // All these buttons are not shown but we could be lost
+ buttonPressed( request, NEXTPAGE ) ||
+ buttonPressed( request, FIRSTPAGE ) ||
+ buttonPressed( request, LASTPAGE ) ||
+ buttonPressed( request, SETPAGESIZE ) ||
+ buttonPressed( request, MARKALL ) ||
+ buttonPressed( request, CLEAR ) ||
+ buttonPressed( request, INVERT ) ||
+ buttonPressed( request, SORT_ID ) ||
+ buttonPressed( request, SORT_SENDER ) ||
+ buttonPressed( request, SORT_SUBJECT ) ||
+ buttonPressed( request, SORT_DATE ) ||
+ buttonPressed( request, SORT_SIZE ) ||
+ buttonPressed( request, REFRESH ) ||
+ buttonPressed( request, LIST )) {
+ sessionObject.state = STATE_LIST;
+ sessionObject.sentMail = null;
+ if( sessionObject.attachments != null )
+ sessionObject.attachments.clear();
+ } else if (buttonPressed( request, PREV ) || // All these buttons are not shown but we could be lost
+ buttonPressed( request, NEXT ) ||
+ buttonPressed( request, DELETE )) {
+ sessionObject.state = STATE_SHOW;
+ sessionObject.sentMail = null;
+ if( sessionObject.attachments != null )
+ sessionObject.attachments.clear();
}
}
/*
@@ -1358,13 +1414,25 @@ public class WebMail extends HttpServlet
out.println( "\n\n" +
"\n" +
"\n" +
- "susimail - " + subtitle + "\n" +
+ "" + _("SusiMail") + " - " + subtitle + "\n" +
"\n" );
if (sessionObject.isMobile ) {
out.println( "\n" +
"\n" );
}
- // TODO javascript here
+ if (sessionObject.state == STATE_NEW) {
+ // TODO cancel if to and body are empty
+ out.println(
+ ""
+ );
+ }
out.println( "\n\n" +
"
\n" +
"