Changeset 3b2e5bd


Ignore:
Timestamp:
Apr 20, 2014 3:19:30 PM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
b4a0ffd
Parents:
67eb3cc
Message:
  • SusiMail?:
    • Don't store encoding class names in config
    • New susimail.debug setting in config
    • Use DataHelper? to load config file
    • Close any open POP3 socket when session is unbound
    • Don't keep returning user to compose page (ticket #1252)
    • Add javascript capture of back button from compose page
Location:
apps/susimail/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/util/Config.java

    r67eb3cc r3b2e5bd  
    3232
    3333import net.i2p.I2PAppContext;
     34import net.i2p.data.DataHelper;
    3435
    3536/**
     37 * Warning - static - not for use by multiple applications or prefixes
     38 *
    3639 * @author susi
    3740 */
     
    4043        private static Properties properties, config;
    4144        private static String configPrefix;
     45
    4246        /**
    4347         *
     
    6064                        return result;
    6165               
    62                 result = config.getProperty( name );
    63 
    64                 if( result != null )
    65                         return result;
     66                if( config != null ) {
     67                        result = config.getProperty( name );
     68                        if( result != null )
     69                                return result;
     70                }
    6671               
    6772                result = properties.getProperty( name );
     
    8590        public static void reloadConfiguration()
    8691        {
     92                // DEBUG level logging won't work here since we haven't loaded the config yet...
    8793                properties = new Properties();
    88                 config = new Properties();
    8994                try {
    9095                        properties.load( Config.class.getResourceAsStream( "/susimail.properties" ) );
    9196                } catch (Exception e) {
    92                         Debug.debug( Debug.DEBUG, "Could not open WEB-INF/classes/susimail.properties (possibly in jar), reason: " + e.getMessage() );
     97                        Debug.debug(Debug.ERROR, "Could not open WEB-INF/classes/susimail.properties (possibly in jar), reason: " + e);
    9398                }
    94                 FileInputStream fis = null;
    9599                try {
    96100                        File cfg = new File(I2PAppContext.getGlobalContext().getConfigDir(), "susimail.config");
    97                         fis = new FileInputStream(cfg);
    98                         config.load( fis );
     101                        if (cfg.exists()) {
     102                                config = new Properties();
     103                                DataHelper.loadProps(config, cfg);
     104                        }
    99105                } catch (Exception e) {
    100                         Debug.debug( Debug.DEBUG, "Could not open susimail.config, reason: " + e.getMessage() );
    101                 } finally {
    102                         if (fis != null)
    103                                 try { fis.close(); } catch (IOException ioe) {}
     106                        Debug.debug(Debug.ERROR, "Could not open susimail.config, reason: " + e);
    104107                }
    105108        }
     109
    106110        /**
    107111         *
     
    135139                return result;
    136140        }
     141
    137142        /**
    138          *
     143         * Static! Not for use by multiple applications!
    139144         * @param prefix
    140145         */
  • apps/susimail/src/src/i2p/susi/webmail/WebMail.java

    r67eb3cc r3b2e5bd  
    6060import javax.servlet.http.HttpServletResponse;
    6161import javax.servlet.http.HttpSession;
     62import javax.servlet.http.HttpSessionBindingEvent;
     63import javax.servlet.http.HttpSessionBindingListener;
    6264
    6365import net.i2p.I2PAppContext;
     
    7274         * set to true, if its a release build
    7375         */
    74         private static final boolean RELEASE = true;
     76        private static final boolean RELEASE;
    7577        /*
    7678         * increase version number for every release
     
    169171
    170172        private static final String CONFIG_BCC_TO_SELF = "composer.bcc.to.self";
     173        private static final String CONFIG_DEBUG = "debug";
    171174
    172175        private static final String RC_PROP_THEME = "routerconsole.theme";
     
    178181        private static final String spacer = "&nbsp;&nbsp;&nbsp;";
    179182        private static final String thSpacer = "<th>&nbsp;</th>\n";
     183       
     184        static {
     185                Config.setPrefix( "susimail" );
     186                RELEASE = !Boolean.parseBoolean(Config.getProperty(CONFIG_DEBUG));
     187                Debug.setLevel( RELEASE ? Debug.ERROR : Debug.DEBUG );
     188        }
    180189
    181190        /**
     
    314323         * @author susi
    315324         */
    316         private static class SessionObject {
     325        private static class SessionObject implements HttpSessionBindingListener {
    317326                boolean pageChanged, markAll, clear, invert;
    318327                int state, smtpPort;
     
    336345                        bccToSelf = Boolean.parseBoolean(Config.getProperty( CONFIG_BCC_TO_SELF, "true" ));
    337346                }
    338         }
    339        
    340         static {
    341                         Debug.setLevel( RELEASE ? Debug.ERROR : Debug.DEBUG );
    342                         Config.setPrefix( "susimail" );
     347
     348                /** @since 0.9.13 */
     349                public void valueBound(HttpSessionBindingEvent event) {}
     350
     351                /**
     352                 * Close the POP3 socket if still open
     353                 * @since 0.9.13
     354                 */
     355                public void valueUnbound(HttpSessionBindingEvent event) {
     356                        Debug.debug(Debug.DEBUG, "Session unbound: " + event.getSession().getId());
     357                        POP3MailBox mbox = mailbox;
     358                        if (mbox != null) {
     359                                mbox.close();
     360                                mailbox = null;
     361                        }
     362                }
    343363        }
    344364
     
    352372        private static String button( String name, String label )
    353373        {
    354                 return "<input type=\"submit\" class=\"" + name + "\" name=\"" + name + "\" value=\"" + label + "\">";
    355         }
     374                StringBuilder buf = new StringBuilder(128);
     375                buf.append("<input type=\"submit\" class=\"").append(name).append("\" name=\"")
     376                   .append(name).append("\" value=\"").append(label).append('"');
     377                if (name.equals(SEND) || name.equals(CANCEL) || name.equals(DELETE_ATTACHMENT))
     378                        buf.append(" onclick=\"cancelPopup()\"");
     379                buf.append('>');
     380                return buf.toString();
     381        }
     382
    356383        /**
    357384         * returns html string of a disabled form button with name and label
     
    625652                                }
    626653                                if( doContinue ) {
    627                                         sessionObject.mailbox = new POP3MailBox( host, pop3PortNo, user, pass );
    628                                         if( sessionObject.mailbox.isConnected() ) {
     654                                        POP3MailBox mailbox = new POP3MailBox( host, pop3PortNo, user, pass );
     655                                        if (mailbox.isConnected() ) {
     656                                                sessionObject.mailbox = mailbox;
    629657                                                sessionObject.user = user;
    630658                                                sessionObject.pass = pass;
     
    632660                                                sessionObject.smtpPort = smtpPortNo;
    633661                                                sessionObject.state = STATE_LIST;
    634                                                 sessionObject.mailCache = new MailCache( sessionObject.mailbox );
     662                                                sessionObject.mailCache = new MailCache(mailbox);
    635663                                                sessionObject.folder = new Folder<String>();
    636                                                 sessionObject.folder.setElements( sessionObject.mailbox.getUIDLs() );
     664                                                sessionObject.folder.setElements(mailbox.getUIDLs() );
    637665                                                sessionObject.folder.addSorter( SORT_ID, new IDSorter( sessionObject.mailCache ) );
    638666                                                sessionObject.folder.addSorter( SORT_SENDER, new SenderSorter( sessionObject.mailCache ) );
     
    646674                                        }
    647675                                        else {
    648                                                 sessionObject.error += sessionObject.mailbox.lastError();
    649                                                 sessionObject.mailbox.close();
     676                                                sessionObject.error += mailbox.lastError();
     677                                                mailbox.close();
    650678                                                sessionObject.mailbox = null;
    651679                                                Debug.debug(Debug.DEBUG, "NOT CONNECTED, BOO");
     
    667695                        session.removeAttribute( "sessionObject" );
    668696                        session.invalidate();
    669                         if( sessionObject.mailbox != null ) {
    670                                 sessionObject.mailbox.close();
     697                        POP3MailBox mailbox = sessionObject.mailbox;
     698                        if (mailbox != null) {
     699                                mailbox.close();
    671700                                sessionObject.mailbox = null;
    672701                        }
     
    700729                 */
    701730                if( sessionObject.state == STATE_NEW ) {
    702                         if (buttonPressed( request, CANCEL ) ||
    703                             buttonPressed( request, LIST )) {      // LIST button not shown but we could be lost
    704                                 sessionObject.state = STATE_LIST;
    705                         } else if( buttonPressed( request, SEND ) ) {
     731                        // We have to make sure to get the state right even if
     732                        // the user hit the back button previously
     733                        if( buttonPressed( request, SEND ) ) {
    706734                                if( sendMail( sessionObject, request ) )
    707735                                        sessionObject.state = STATE_LIST;
     736                        } else if (buttonPressed( request, CANCEL ) ||
     737                            buttonPressed( request, SHOW )  ||       // A param, not a button, but we could be lost
     738                            buttonPressed( request, PREVPAGE ) ||    // All these buttons are not shown but we could be lost
     739                            buttonPressed( request, NEXTPAGE ) ||
     740                            buttonPressed( request, FIRSTPAGE ) ||
     741                            buttonPressed( request, LASTPAGE ) ||
     742                            buttonPressed( request, SETPAGESIZE ) ||
     743                            buttonPressed( request, MARKALL ) ||
     744                            buttonPressed( request, CLEAR ) ||
     745                            buttonPressed( request, INVERT ) ||
     746                            buttonPressed( request, SORT_ID ) ||
     747                            buttonPressed( request, SORT_SENDER ) ||
     748                            buttonPressed( request, SORT_SUBJECT ) ||
     749                            buttonPressed( request, SORT_DATE ) ||
     750                            buttonPressed( request, SORT_SIZE ) ||
     751                            buttonPressed( request, REFRESH ) ||
     752                            buttonPressed( request, LIST )) {
     753                                sessionObject.state = STATE_LIST;
     754                                sessionObject.sentMail = null; 
     755                                if( sessionObject.attachments != null )
     756                                        sessionObject.attachments.clear();
     757                        } else if (buttonPressed( request, PREV ) ||     // All these buttons are not shown but we could be lost
     758                            buttonPressed( request, NEXT )  ||
     759                            buttonPressed( request, DELETE )) {
     760                                sessionObject.state = STATE_SHOW;
     761                                sessionObject.sentMail = null; 
     762                                if( sessionObject.attachments != null )
     763                                        sessionObject.attachments.clear();
    708764                        }
    709765                }
     
    13591415                                        "<head>\n" +
    13601416                                        "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n" +
    1361                                         "<title>susimail - " + subtitle + "</title>\n" +
     1417                                        "<title>" + _("SusiMail") + " - " + subtitle + "</title>\n" +
    13621418                                        "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + sessionObject.themePath + "susimail.css\">\n" );
    13631419                                if (sessionObject.isMobile ) {
     
    13651421                                                "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + sessionObject.themePath + "mobile.css\" />\n" );
    13661422                                }
    1367                                 // TODO javascript here
     1423                                if (sessionObject.state == STATE_NEW) {
     1424                                        // TODO cancel if to and body are empty
     1425                                        out.println(
     1426                                                "<script type = \"text/javascript\">" +
     1427                                                        "window.onbeforeunload = function () {" +
     1428                                                                "return \"" + _("Message has not been sent. Do you want to discard it?") + "\";" +
     1429                                                        "};" +
     1430                                                        "function cancelPopup() {" +
     1431                                                                "window.onbeforeunload = null;" +
     1432                                                        "};" +
     1433                                                "</script>"
     1434                                        );
     1435                                }
    13681436                                out.println( "</head>\n<body>\n" +
    13691437                                        "<div class=\"page\"><p><img src=\"" + sessionObject.imgPath + "susimail.png\" alt=\"Susimail\"><br>&nbsp;</p>\n" +
     
    15201588                if( qp == null ) {
    15211589                        ok = false;
    1522                         sessionObject.error += _("Internal error") + ": Quoted printable encoder not available.";
     1590                        // can't happen, don't translate
     1591                        sessionObject.error += "Internal error: Quoted printable encoder not available.";
    15231592                }
    15241593               
    15251594                if( hl == null ) {
    15261595                        ok = false;
    1527                         sessionObject.error += _("Internal error") + ": Header line encoder not available.";
     1596                        // can't happen, don't translate
     1597                        sessionObject.error += "Internal error: Header line encoder not available.";
    15281598                }
    15291599
     
    15661636                        }
    15671637                       
     1638                        // TODO set to the StringBuilder instead so SMTP can replace() in place
    15681639                        sessionObject.sentMail = body.toString();       
    15691640                       
    1570                         SMTPClient relay = new SMTPClient();
    1571                        
    15721641                        if( ok ) {
     1642                                SMTPClient relay = new SMTPClient();
    15731643                                if( relay.sendMail( sessionObject.host, sessionObject.smtpPort,
    15741644                                                sessionObject.user, sessionObject.pass,
    1575                                                 sender, recipients.toArray(), body.toString() ) ) {
     1645                                                sender, recipients.toArray(), sessionObject.sentMail ) ) {
    15761646                                       
    15771647                                        sessionObject.info += _("Mail sent.");
    15781648                                       
     1649                                        sessionObject.sentMail = null; 
    15791650                                        if( sessionObject.attachments != null )
    15801651                                                sessionObject.attachments.clear();
     
    16491720                                "<tr><td colspan=\"2\" align=\"center\"><textarea cols=\"" + Config.getProperty( CONFIG_COMPOSER_COLS, 80 )+ "\" rows=\"" + Config.getProperty( CONFIG_COMPOSER_ROWS, 10 )+ "\" name=\"" + NEW_TEXT + "\">" + text + "</textarea>" +
    16501721                                "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
    1651                                 "<tr><td align=\"right\">" + _("New Attachment:") + "</td><td align=\"left\"><input type=\"file\" size=\"50%\" name=\"" + NEW_FILENAME + "\" value=\"\"><input type=\"submit\" name=\"" + NEW_UPLOAD + "\" value=\"" + _("Upload File") + "\"></td></tr>" );
     1722                                "<tr><td align=\"right\">" + _("New Attachment:") + "</td><td align=\"left\"><input type=\"file\" size=\"50%\" name=\"" + NEW_FILENAME + "\" value=\"\">" +
     1723                                "<input type=\"submit\" name=\"" + NEW_UPLOAD + "\" value=\"" + _("Upload File") + "\" onclick=\"cancelPopup()\"></td></tr>" );
    16521724               
    16531725                if( sessionObject.attachments != null && !sessionObject.attachments.isEmpty() ) {
     
    16771749                String smtp = Config.getProperty( CONFIG_PORTS_SMTP, "" + DEFAULT_SMTPPORT );
    16781750               
    1679                 out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
     1751                out.println( "<table cellspacing=\"3\" cellpadding=\"5\">\n" +
    16801752                        // current postman hq length limits 16/12, new postman version 32/32
    16811753                        "<tr><td align=\"right\" width=\"30%\">" + _("User") + "</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + USER + "\" value=\"" + "\"> @mail.i2p</td></tr>\n" +
     
    16901762                }
    16911763                out.println(
    1692                         "<tr><td></td><td align=\"left\">" + button( LOGIN, _("Login") ) + " <input class=\"cancel\" type=\"reset\" value=\"" + _("Reset") + "\"></td></tr>\n" +
     1764                        "<tr><td colspan=\"2\">&nbsp;</td></tr>\n" +
     1765                        "<tr><td></td><td align=\"left\">" + button( LOGIN, _("Login") ) + spacer + " <input class=\"cancel\" type=\"reset\" value=\"" + _("Reset") + "\"></td></tr>\n" +
     1766                        "<tr><td colspan=\"2\">&nbsp;</td></tr>\n" +
    16931767                        "<tr><td></td><td align=\"left\"><a href=\"http://hq.postman.i2p/?page_id=14\">" + _("Learn about I2P mail") + "</a></td></tr>\n" +
    16941768                        "<tr><td></td><td align=\"left\"><a href=\"http://hq.postman.i2p/?page_id=16\">" + _("Create Account") + "</a></td></tr>\n" +
  • apps/susimail/src/src/i2p/susi/webmail/encoding/EncodingFactory.java

    r67eb3cc r3b2e5bd  
    2727import i2p.susi.util.Config;
    2828
    29 import java.util.Hashtable;
     29import java.util.HashMap;
     30import java.util.Map;
    3031import java.util.Set;
    3132
     
    3738       
    3839        private static final String CONFIG_ENCODING = "encodings";
     40        private static final String DEFAULT_ENCODINGS = "i2p.susi.webmail.encoding.HeaderLine;i2p.susi.webmail.encoding.QuotedPrintable;i2p.susi.webmail.encoding.Base64;i2p.susi.webmail.encoding.SevenBit;i2p.susi.webmail.encoding.EightBit;i2p.susi.webmail.encoding.HTML";
    3941       
    40         private static final Hashtable<String, Encoding> encodings;
     42        private static final Map<String, Encoding> encodings;
    4143       
    4244        static {
    43                 encodings = new Hashtable<String, Encoding>();
    44                 String list = Config.getProperty( CONFIG_ENCODING );
     45                encodings = new HashMap<String, Encoding>();
     46                // Let's not give the user a chance to break things
     47                //String list = Config.getProperty( CONFIG_ENCODING );
     48                String list = DEFAULT_ENCODINGS;
    4549                if( list != null ) {
    4650                        String[] classNames = list.split( ";" );
  • apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java

    r67eb3cc r3b2e5bd  
    392392                        }
    393393                        catch (IOException e1) {
    394                                 lastError = _("Error opening mailbox") + ": " + e1;
     394                                lastError = _("Error opening mailbox") + ": " + e1.getLocalizedMessage();
    395395                        }
    396396                }
  • apps/susimail/src/susimail.properties

    r67eb3cc r3b2e5bd  
    1 susimail.encodings=i2p.susi.webmail.encoding.HeaderLine;i2p.susi.webmail.encoding.QuotedPrintable;i2p.susi.webmail.encoding.Base64;i2p.susi.webmail.encoding.SevenBit;i2p.susi.webmail.encoding.EightBit;i2p.susi.webmail.encoding.HTML
    2 
    31susimail.host=localhost
    42
Note: See TracChangeset for help on using the changeset viewer.