Changeset c8f8f6f


Ignore:
Timestamp:
Apr 24, 2014 8:54:22 PM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
945d455
Parents:
0d4f597
Message:
  • SusiMail?:
    • Add background mail checker, not yet enabled
    • Add idle timeout connection closer
    • Rely on idle checker for most delayed deletions
    • Cleanup resources better when shutting down session
    • Don't add deleted mails to folder, caused errors after deletions
    • Set socket soTimeouts so things don't hang forever
    • Display errors after check mail button pushed
    • More IOE debug logging
Files:
3 added
8 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/webmail/MailCache.java

    r0d4f597 rc8f8f6f  
    8787        /**
    8888         * The ones known locally, which will include any known on the server, if connected.
     89         * Will not include any marked for deletion.
    8990         *
    9091         * @since 0.9.13
     
    9394                List<String> uidls = new ArrayList<String>(mails.size());
    9495                synchronized(mails) {
    95                         uidls.addAll(mails.keySet());
     96                        for (Mail mail : mails.values()) {
     97                                if (!mail.markForDeletion)
     98                                        uidls.add(mail.uidl);
     99                        }
    96100                }
    97101                return uidls.toArray(new String[uidls.size()]);
  • apps/susimail/src/src/i2p/susi/webmail/PersistentMailCache.java

    r0d4f597 rc8f8f6f  
    6565        public PersistentMailCache(String host, int port, String user, String pass) throws IOException {
    6666                _cacheDir = makeCacheDirs(host, port, user, pass);
     67                // TODO static locking
    6768        }
    6869
  • apps/susimail/src/src/i2p/susi/webmail/WebMail.java

    r0d4f597 rc8f8f6f  
    176176        private static final String CONFIG_BCC_TO_SELF = "composer.bcc.to.self";
    177177        static final String CONFIG_LEAVE_ON_SERVER = "pop3.leave.on.server";
     178        public static final String CONFIG_BACKGROUND_CHECK = "pop3.check.enable";
     179        public static final String CONFIG_CHECK_MINUTES = "pop3.check.interval.minutes";
     180        public static final String CONFIG_IDLE_SECONDS = "pop3.idle.timeout.seconds";
    178181        private static final String CONFIG_DEBUG = "debug";
    179182
     
    347350         * @author susi
    348351         */
    349         private static class SessionObject implements HttpSessionBindingListener {
     352        private static class SessionObject implements HttpSessionBindingListener, NewMailListener {
    350353                boolean pageChanged, markAll, clear, invert;
    351354                int state, smtpPort;
     
    381384                        POP3MailBox mbox = mailbox;
    382385                        if (mbox != null) {
    383                                 mbox.close();
     386                                mbox.destroy();
    384387                                mailbox = null;
     388                        }
     389                }
     390
     391                /**
     392                 *  Relay from the checker to the webmail session object,
     393                 *  which relays to MailCache, which will fetch the mail from us
     394                 *  in a big circle
     395                 *
     396                 *  @since 0.9.13
     397                 */
     398                public void foundNewMail() {
     399                        MailCache mc = mailCache;
     400                        Folder<String> f = folder;
     401                        if (mc != null && f != null) {
     402                                if (mc.getMail(true)) {
     403                                        String[] uidls = mc.getUIDLs();
     404                                        f.setElements(uidls);
     405                                }
    385406                        }
    386407                }
     
    518539                                        if( charset == null ) {
    519540                                                charset = "US-ASCII";
    520                                                 reason += _("Warning: no charset found, fallback to US-ASCII.") + br;
     541                                                // don't show this in text mode which is used to include the mail in the reply or forward
     542                                                if (html)
     543                                                        reason += _("Warning: no charset found, fallback to US-ASCII.") + br;
    521544                                        }
    522545                                        try {
     
    699722                                                else
    700723                                                        Debug.debug(Debug.DEBUG, "CONNECTED, YAY");
    701                                         }
    702                                         else {
     724                                                // we do this after the initial priming above
     725                                                mailbox.setNewMailListener(sessionObject);
     726                                        } else {
    703727                                                sessionObject.error += mailbox.lastError();
    704                                                 mailbox.close();
     728                                                Debug.debug(Debug.DEBUG, "LOGIN FAIL, REMOVING SESSION");
     729                                                HttpSession session = request.getSession();
     730                                                session.removeAttribute( "sessionObject" );
     731                                                session.invalidate();
     732                                                mailbox.destroy();
    705733                                                sessionObject.mailbox = null;
     734                                                sessionObject.mailCache = null;
    706735                                                Debug.debug(Debug.DEBUG, "NOT CONNECTED, BOO");
    707736                                        }
     
    719748        {
    720749                if( buttonPressed( request, LOGOUT ) ) {
    721                         Debug.debug(Debug.DEBUG, "REMOVING SESSION");
     750                        Debug.debug(Debug.DEBUG, "LOGOUT, REMOVING SESSION");
    722751                        HttpSession session = request.getSession();
    723752                        session.removeAttribute( "sessionObject" );
     
    725754                        POP3MailBox mailbox = sessionObject.mailbox;
    726755                        if (mailbox != null) {
    727                                 mailbox.close();
     756                                mailbox.destroy();
    728757                                sessionObject.mailbox = null;
     758                                sessionObject.mailCache = null;
    729759                        }
    730760                        sessionObject.info += _("User logged out.") + "<br>";
     
    10091039                if( buttonPressed( request, REFRESH ) ) {
    10101040                        sessionObject.mailbox.refresh();
     1041                        sessionObject.error += sessionObject.mailbox.lastError();
    10111042                        sessionObject.mailCache.getMail(true);
    10121043                        // get through cache so we have the disk-only ones too
  • apps/susimail/src/src/i2p/susi/webmail/pop3/DelayedDeleter.java

    r0d4f597 rc8f8f6f  
    1515
    1616/**
    17  *  Queue UIDLs for later deletion
     17 *  Queue UIDLs for later deletion.
     18 *  We send deletions at close time but we don't wait around
     19 *  for the answer. Also, the user may delete mails when offline.
     20 *  So we queue them here and reconnect to delete.
    1821 *
    1922 *  @since 0.9.13
     
    2730        private volatile boolean isDead;
    2831
    29         private final long CHECK_TIME = 5*60*1000;
    30         private final long MIN_IDLE = 5*60*1000;
     32        private static final long CHECK_TIME = 16*60*1000;
     33        private static final long MIN_IDLE = 60*60*1000;
    3134
    3235        public DelayedDeleter(POP3MailBox mailbox) {
  • apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java

    r0d4f597 rc8f8f6f  
    2626import i2p.susi.debug.Debug;
    2727import i2p.susi.webmail.Messages;
     28import i2p.susi.webmail.NewMailListener;
     29import i2p.susi.webmail.WebMail;
     30import i2p.susi.util.Config;
    2831import i2p.susi.util.ReadBuffer;
    2932
     
    4548 * @author susi23
    4649 */
    47 public class POP3MailBox {
     50public class POP3MailBox implements NewMailListener {
    4851
    4952        private final String host, user, pass;
     
    7174        private final Object synchronizer;
    7275        private final DelayedDeleter delayedDeleter;
     76        // instantiated after first successful connection
     77        private BackgroundChecker backgroundChecker;
     78        // instantiated after every successful connection
     79        private IdleCloser idleCloser;
     80        private volatile NewMailListener newMailListener;
    7381
    7482        /**
     
    110118                                checkConnection();
    111119                        } catch (IOException ioe) {
    112                                 Debug.debug( Debug.DEBUG, "Error fetching: " + ioe);
     120                                Debug.debug( Debug.DEBUG, "Error fetching header: " + ioe);
    113121                                return null;
    114122                        }
     
    162170                                checkConnection();
    163171                        } catch (IOException ioe) {
    164                                 Debug.debug( Debug.DEBUG, "Error fetching: " + ioe);
     172                                Debug.debug( Debug.DEBUG, "Error fetching body: " + ioe);
    165173                                return null;
    166174                        }
     
    206214                                sendCmds(srs);
    207215                        } catch (IOException ioe) {
     216                                Debug.debug( Debug.DEBUG, "Error fetching bodies: " + ioe);
    208217                                // todo maybe
    209218                        }
     
    603612                        return;
    604613                } catch (IOException e) {
     614                        Debug.debug( Debug.DEBUG, "Error connecting: " + e);
    605615                        lastError = e.toString();
    606616                        return;
     
    610620                                // pipeline 2 commands
    611621                                lastError = "";
     622                                socket.setSoTimeout(120*1000);
    612623                                boolean ok = doHandshake();
    613624                                if (ok) {
     
    616627                                        cmds.add(new SendRecv("USER " + user, Mode.A1));
    617628                                        cmds.add(new SendRecv("PASS " + pass, Mode.A1));
     629                                        socket.setSoTimeout(60*1000);
    618630                                        ok =  sendCmds(cmds);
    619631                                }
     
    628640                                        cmds.add(list);
    629641                                        // check individual responses
    630                                         sendCmds(cmds);
     642                                        socket.setSoTimeout(120*1000);
     643                                        ok = sendCmds(cmds);
    631644                                        if (stat.result)
    632645                                                updateMailCount(stat.response);
     
    641654                                        else
    642655                                                Debug.debug(Debug.DEBUG, "LIST failed");
     656                                        socket.setSoTimeout(300*1000);
     657                                        if (ok && backgroundChecker == null &&
     658                                                Boolean.parseBoolean(Config.getProperty(WebMail.CONFIG_BACKGROUND_CHECK)))
     659                                                backgroundChecker = new BackgroundChecker(this);
     660                                        if (ok && idleCloser == null)
     661                                                idleCloser = new IdleCloser(this);
    643662                                } else {
    644663                                        if (lastError.equals(""))
     
    791810                                                sr.result = true;
    792811                                        } catch (IOException ioe) {
     812                                                Debug.debug( Debug.DEBUG, "Error getting RB: " + ioe);
    793813                                                result = false;
    794814                                                sr.result = false;
     
    801821                                                sr.result = true;
    802822                                        } catch (IOException ioe) {
     823                                                Debug.debug( Debug.DEBUG, "Error getting LS: " + ioe);
    803824                                                result = false;
    804825                                                sr.result = false;
     
    976997         *
    977998         * @return The amount of e-mails available.
    978          * @deprecated unused
    979999         */
    9801000        public int getNumMails() {
     
    10031023        }
    10041024
     1025
     1026        /**
     1027         *  Relay from the checker to the webmail session object,
     1028         *  which relays to MailCache, which will fetch the mail from us
     1029         *  in a big circle
     1030         *
     1031         *  @since 0.9.13
     1032         */
     1033        public void setNewMailListener(NewMailListener nml) {
     1034                newMailListener = nml;
     1035        }
     1036
     1037        /**
     1038         *  Relay from the checker to the webmail session object,
     1039         *  which relays to MailCache, which will fetch the mail from us
     1040         *  in a big circle
     1041         *
     1042         *  @since 0.9.13
     1043         */
     1044        public void foundNewMail() {
     1045                NewMailListener  nml = newMailListener;
     1046                if (nml != null)
     1047                        nml.foundNewMail();
     1048        }
     1049
    10051050        /**
    10061051         *  Close without waiting for response,
     
    10091054        public void destroy() {
    10101055                delayedDeleter.cancel();
    1011                 close(false);
     1056                synchronized( synchronizer ) {
     1057                        if (backgroundChecker != null)
     1058                                backgroundChecker.cancel();
     1059                        close(false);
     1060                }
     1061        }
     1062
     1063        /**
     1064         *  For helper threads to lock
     1065         *  @since 0.9.13
     1066         */
     1067        Object getLock() {
     1068                return synchronizer;
     1069        }
     1070
     1071        /**
     1072         *  Do we have UIDLs to delete?
     1073         *  @since 0.9.13
     1074         */
     1075        boolean hasQueuedDeletions() {
     1076                return !delayedDeleter.getQueued().isEmpty();
    10121077        }
    10131078
     
    10251090         *  @since 0.9.13
    10261091         */
    1027         private void close(boolean shouldWait) {
     1092        void close(boolean shouldWait) {
    10281093                synchronized( synchronizer ) {
    10291094                        Debug.debug(Debug.DEBUG, "close()");
     1095                        if (idleCloser != null)
     1096                                idleCloser.cancel();
    10301097                        if (socket != null && socket.isConnected()) {
    10311098                                try {
     
    10591126                                        }
    10601127                                        socket.close();
    1061                                 } catch (IOException e) {}
     1128                                } catch (IOException e) {
     1129                                        Debug.debug( Debug.DEBUG, "error closing: " + e);
     1130                                }
    10621131                        }
    10631132                        socket = null;
  • apps/susimail/src/src/i2p/susi/webmail/smtp/SMTPClient.java

    r0d4f597 rc8f8f6f  
    220220                        // AUTH ref: RFC 4954
    221221                        if (ok) {
     222                                socket.setSoTimeout(120*1000);
    222223                                int result = sendCmd(null);
    223224                                if (result != 220) {
     
    229230                                sendCmdNoWait( "EHLO localhost" );
    230231                                socket.getOutputStream().flush();
     232                                socket.setSoTimeout(60*1000);
    231233                                Result r = getFullResult();
    232234                                if (r.result == 250) {
     
    267269                                socket.getOutputStream().write(DataHelper.getUTF8(body));
    268270                                socket.getOutputStream().write(DataHelper.getASCII("\r\n.\r\n"));
     271                                socket.setSoTimeout(0);
    269272                                int result = sendCmd(null);
    270273                                if (result == 250)
  • history.txt

    r0d4f597 rc8f8f6f  
     12014-04-24 zzz
     2 * SusiMail:
     3   - Add background mail checker
     4   - Add idle timeout connection closer
     5   - Rely on idle checker for most delayed deletions
     6   - Cleanup resources better when shutting down session
     7   - Don't add deleted mails to folder
     8   - Set socket soTimeouts
     9   - Display errors after check mail button pushed
     10
    1112014-04-23 zzz
    212 * SusiMail:
  • router/java/src/net/i2p/router/RouterVersion.java

    r0d4f597 rc8f8f6f  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 10;
     21    public final static long BUILD = 11;
    2222
    2323    /** for example "-test" */
Note: See TracChangeset for help on using the changeset viewer.