Changeset 0ba0f1b


Ignore:
Timestamp:
Feb 23, 2018 8:10:32 PM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
fa740e8
Parents:
4321f13
Message:

SusiMail?: Check mail fixes (ticket #2174)
Fix overlapping error and info boxes
Fix checking mail when apparently connected already
Set soTimeout when fetching mail, now that InternalSocket? supports it
Error message and formatting fixes
Debug log tweaks

Files:
4 edited

Legend:

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

    r4321f13 r0ba0f1b  
    951951                } else {
    952952                        sessionObject.isFetching = true;
    953                         if (mailbox.connectToServer(new ConnectWaiter(sessionObject)))
     953                        if (!mailbox.connectToServer(new ConnectWaiter(sessionObject))) {
     954                                sessionObject.error += _t("Cannot connect") + '\n';
    954955                                sessionObject.isFetching = false;
     956                        }
    955957                }
    956958
     
    14311433                        ConnectWaiter cw = new ConnectWaiter(sessionObject);
    14321434                        if (mailbox.connectToServer(cw)) {
    1433                                 // Already connected, start a thread ourselves
    1434                                 // TODO - But if already connected, we aren't going to find anything new.
    1435                                 // We used to call refresh() from here, which closes first,
    1436                                 // but that isn't threaded.
     1435                                // Start a thread to wait for results
    14371436                                Debug.debug(Debug.DEBUG, "Already connected, running CW");
    14381437                                Thread t = new I2PAppThread(cw, "Email fetcher");
    14391438                                t.start();
     1439                        } else {
     1440                                sessionObject.error += _t("Cannot connect") + '\n';
     1441                                sessionObject.isFetching = false;
    14401442                        }
    14411443                        // wait if it's going to be quick
     
    22412243                                        sessionObject.info += _t("Refresh the page for updates") + '\n';
    22422244                                }
    2243                                 if (sessionObject.error.length() > 0) {
    2244                                         out.println( "<div class=\"notifications\" onclick=\"this.remove()\"><p class=\"error\">" + quoteHTML(sessionObject.error).replace("\n", "<br>") + "</p></div>" );
    2245                                 }
    2246                                 if (sessionObject.info.length() > 0) {
    2247                                         out.println( "<div class=\"notifications\" onclick=\"this.remove()\"><p class=\"info\"><b>" + quoteHTML(sessionObject.info).replace("\n", "<br>") + "</b></p></div>" );
     2245                                if (sessionObject.error.length() > 0 || sessionObject.info.length() > 0) {
     2246                                        out.println("<div class=\"notifications\" onclick=\"this.remove()\">");
     2247                                        if (sessionObject.error.length() > 0)
     2248                                                out.println("<p class=\"error\">" + quoteHTML(sessionObject.error).replace("\n", "<br>") + "</p>");
     2249                                        if (sessionObject.info.length() > 0)
     2250                                                out.println("<p class=\"info\"><b>" + quoteHTML(sessionObject.info).replace("\n", "<br>") + "</b></p>");
     2251                                        out.println("</div>" );
    22482252                                }
    22492253                                /*
  • apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java

    r4321f13 r0ba0f1b  
    3737import java.io.InputStream;
    3838import java.net.Socket;
     39import java.net.SocketTimeoutException;
    3940import java.util.ArrayList;
    4041import java.util.Collection;
     
    121122                                checkConnection();
    122123                        } catch (IOException ioe) {
    123                                 Debug.debug( Debug.DEBUG, "Error fetching header: " + ioe);
     124                                Debug.debug(Debug.DEBUG, "Error fetching header", ioe);
    124125                                return null;
    125126                        }
     
    142143                        Buffer header = null;
    143144                        if (id >= 1 && id <= mails) {
     145                                try { socket.setSoTimeout(120*1000); } catch (IOException ioe) {}
    144146                                /*
    145147                                 * try 'TOP n 0' command
     
    154156                                                Debug.debug( Debug.DEBUG, "RETR returned null" );
    155157                                }
     158                                if (socket != null) try { socket.setSoTimeout(300*1000); } catch (IOException ioe) {}
    156159                        } else {
    157160                                lastError = "Message id out of range.";
     
    172175                                checkConnection();
    173176                        } catch (IOException ioe) {
    174                                 Debug.debug( Debug.DEBUG, "Error fetching body: " + ioe);
     177                                Debug.debug(Debug.DEBUG, "Error fetching body", ioe);
    175178                                return null;
    176179                        }
     
    196199                                checkConnection();
    197200                        } catch (IOException ioe) {
    198                                 Debug.debug( Debug.DEBUG, "Error fetching: " + ioe);
     201                                Debug.debug(Debug.DEBUG, "Error fetching", ioe);
    199202                                return;
    200203                        }
     
    218221                                sendCmds(srs);
    219222                        } catch (IOException ioe) {
    220                                 Debug.debug( Debug.DEBUG, "Error fetching bodies: " + ioe);
     223                                Debug.debug(Debug.DEBUG, "Error fetching bodies", ioe);
    221224                                if (socket != null) {
    222225                                        try { socket.close(); } catch (IOException e) {}
     
    245248                        if (id >= 1 && id <= mails) {
    246249                                try {
     250                                        try { socket.setSoTimeout(120*1000); } catch (IOException ioe) {}
    247251                                        body = sendCmdN("RETR " + id, buffer);
     252                                        if (socket != null) try { socket.setSoTimeout(300*1000); } catch (IOException ioe) {}
    248253                                        if (body == null)
    249254                                                Debug.debug( Debug.DEBUG, "RETR returned null" );
     
    323328                                checkConnection();
    324329                        } catch (IOException ioe) {
    325                                 Debug.debug( Debug.DEBUG, "Error deleting: " + ioe);
     330                                Debug.debug(Debug.DEBUG, "Error deleting", ioe);
    326331                                return rv;
    327332                        }
     
    364369                                //connect();
    365370                        } catch (IOException ioe) {
    366                                 Debug.debug( Debug.DEBUG, "Error deleting: " + ioe);
     371                                Debug.debug(Debug.DEBUG, "Error deleting", ioe);
    367372                                if (socket != null) {
    368373                                        try { socket.close(); } catch (IOException e) {}
     
    468473                        connect();
    469474                        if (!isConnected())
    470                                 throw new IOException("Cannot connect");
     475                                throw new IOException(_t("Cannot connect"));
    471476                }
    472477        }
     
    537542                                                        uidlToID.put( uidl, Integer.valueOf( n ) );
    538543                                                } catch (NumberFormatException nfe) {
    539                                                         Debug.debug(Debug.DEBUG, "UIDL error " + nfe);
     544                                                        Debug.debug(Debug.DEBUG, "UIDL error", nfe);
    540545                                                } catch (IndexOutOfBoundsException ioobe) {
    541                                                         Debug.debug(Debug.DEBUG, "UIDL error " + ioobe);
     546                                                        Debug.debug(Debug.DEBUG, "UIDL error", ioobe);
    542547                                                }
    543548                                        }
     
    568573                                                sizes.put(Integer.valueOf(key), Integer.valueOf(value));
    569574                                        } catch (NumberFormatException nfe) {
    570                                                 Debug.debug(Debug.DEBUG, "LIST error " + nfe);
     575                                                Debug.debug(Debug.DEBUG, "LIST error", nfe);
    571576                                        }
    572577                                }
     
    574579                } else {
    575580                        Debug.debug(Debug.DEBUG, "Error getting LIST from server.");
    576                 }
    577         }
    578 
    579         /**
    580          * Close (why?) and connect to server.
    581          * Blocking.
    582          */
    583         public void refresh() {
    584                 synchronized( synchronizer ) {
    585                         close(true);
    586                         connect();
    587581                }
    588582        }
     
    600594        /**
    601595         * Connect to pop3 server if not connected.
    602          * Does nothing if already connected.
    603          * Blocking.
     596         * Checks mail if already connected.
     597         * Non-Blocking unless an action already in progress.
    604598         *
    605599         * This will NOT call any configured NewMailListener,
     
    615609         * Failure info is available via lastError().
    616610         *
    617          * @return true if connected already and nml will NOT be called back, false if nml will be called back
     611         * @return true if nml will be called back, false on failure and nml will NOT be called back
    618612         * @since 0.9.13
    619613         */
    620614        public boolean connectToServer(NewMailListener nml) {
     615                Thread t;
    621616                synchronized( synchronizer ) {
    622617                        if (isConnected())
    623                                 return true;
    624                 }
    625                 Thread t = new I2PAppThread(new ConnectRunner(nml), "POP3 Connector");
     618                                t = new I2PAppThread(new RecheckRunner(nml), "POP3 Checker");
     619                        else
     620                                t = new I2PAppThread(new ConnectRunner(nml), "POP3 Connector");
     621                }
    626622                try {
    627623                        t.start();
    628624                } catch (Throwable e) {
    629                         // not really, but we won't be calling the callback
    630                         return true;
    631                 }
    632                 return false;
     625                        return false;
     626                }
     627                return true;
    633628
    634629        }
     
    649644                                _nml.foundNewMail(result);
    650645                        }
     646                }
     647        }
     648
     649        /** @since 0.9.34 */
     650        private class RecheckRunner implements Runnable {
     651                private final NewMailListener _nml;
     652
     653                public RecheckRunner(NewMailListener nml) {
     654                        _nml = nml;
     655                }
     656
     657                public void run() {
     658                        boolean result = false;
     659                        try {
     660                                synchronized(synchronizer) {
     661                                        result = check();
     662                                }
     663                        } finally {
     664                                _nml.foundNewMail(result);
     665                        }
     666                }
     667
     668                private boolean check() {
     669                        boolean result = false;
     670                        try {
     671                                result = doCheckMail();
     672                        } catch (SocketTimeoutException e1) {
     673                                lastError = _t("Cannot connect") + ": " + _t("No response from server");
     674                                if (socket != null) {
     675                                        try { socket.close(); } catch (IOException e) {}
     676                                        socket = null;
     677                                        connected = false;
     678                                }
     679                                Debug.debug(Debug.DEBUG, "Error rechecking", e1);
     680                        } catch (IOException e1) {
     681                                if (socket != null) {
     682                                        try { socket.close(); } catch (IOException e) {}
     683                                        socket = null;
     684                                        connected = false;
     685                                }
     686                                lastError = _t("Cannot connect") + ": " + e1.getLocalizedMessage();
     687                                Debug.debug(Debug.DEBUG, "Error rechecking", e1);
     688                                // we probably weren't really connected.
     689                                // Let's try again from the top.
     690                                result = blockingConnectToServer();
     691                                if (socket != null) {
     692                                        try { socket.close(); } catch (IOException e) {}
     693                                        socket = null;
     694                                        connected = false;
     695                                }
     696                        }
     697                        return result;
    651698                }
    652699        }
     
    718765                                if (loginOK) {
    719766                                        connected = true;
    720                                         List<SendRecv> cmds = new ArrayList<SendRecv>(4);
    721                                         SendRecv stat = new SendRecv("STAT", Mode.A1);
    722                                         cmds.add(stat);
    723                                         SendRecv uidl = new SendRecv("UIDL", Mode.LS);
    724                                         cmds.add(uidl);
    725                                         SendRecv list = new SendRecv("LIST", Mode.LS);
    726                                         cmds.add(list);
    727                                         // check individual responses
    728                                         socket.setSoTimeout(120*1000);
    729                                         ok = sendCmds(cmds);
    730                                         if (stat.result)
    731                                                 updateMailCount(stat.response);
    732                                         else
    733                                                 Debug.debug(Debug.DEBUG, "STAT failed");
    734                                         if (uidl.result)
    735                                                 updateUIDLs(uidl.ls);
    736                                         else
    737                                                 Debug.debug(Debug.DEBUG, "UIDL failed");
    738                                         if (list.result)
    739                                                 updateSizes(list.ls);
    740                                         else
    741                                                 Debug.debug(Debug.DEBUG, "LIST failed");
    742                                         socket.setSoTimeout(300*1000);
     767                                        ok = doCheckMail();
    743768                                        if (ok && backgroundChecker == null &&
    744769                                                Boolean.parseBoolean(Config.getProperty(WebMail.CONFIG_BACKGROUND_CHECK)))
     
    757782                                        close();
    758783                                }
    759                         }
    760                         catch (NumberFormatException e1) {
    761                                 lastError = _t("Error opening mailbox") + ": " + e1;
    762                         }
    763                         catch (IOException e1) {
    764                                 lastError = _t("Error opening mailbox") + ": " + e1.getLocalizedMessage();
     784                        } catch (SocketTimeoutException e1) {
     785                                lastError = _t("Cannot connect") + ": " + _t("No response from server");
    765786                                if (socket != null) {
    766787                                        try { socket.close(); } catch (IOException e) {}
     
    768789                                        connected = false;
    769790                                }
     791                                Debug.debug(Debug.DEBUG, "Error connecting", e1);
     792                        } catch (IOException e1) {
     793                                lastError = _t("Cannot connect") + ": " + e1.getLocalizedMessage();
     794                                if (socket != null) {
     795                                        try { socket.close(); } catch (IOException e) {}
     796                                        socket = null;
     797                                        connected = false;
     798                                }
     799                                Debug.debug(Debug.DEBUG, "Error connecting", e1);
    770800                        }
    771801                }
     
    810840                return rv;
    811841        }
     842
     843        /**
     844         * Send STAT, UIDL, LIST. Must be connected.
     845         * Caller must sync.
     846         * Leaves socket connected. Caller must close on IOE.
     847         *
     848         * @return success
     849         * @throws IOException
     850         * @since 0.9.34 pulled out of connect()
     851         */
     852        private boolean doCheckMail() throws IOException {
     853                if (!isConnected())
     854                        throw new IOException("not connected");
     855                List<SendRecv> cmds = new ArrayList<SendRecv>(4);
     856                SendRecv stat = new SendRecv("STAT", Mode.A1);
     857                cmds.add(stat);
     858                SendRecv uidl = new SendRecv("UIDL", Mode.LS);
     859                cmds.add(uidl);
     860                SendRecv list = new SendRecv("LIST", Mode.LS);
     861                cmds.add(list);
     862                // check individual responses
     863                socket.setSoTimeout(120*1000);
     864                boolean ok = sendCmds(cmds);
     865                if (stat.result)
     866                        updateMailCount(stat.response);
     867                else
     868                        Debug.debug(Debug.DEBUG, "STAT failed");
     869                if (uidl.result)
     870                        updateUIDLs(uidl.ls);
     871                else
     872                        Debug.debug(Debug.DEBUG, "UIDL failed");
     873                if (list.result)
     874                        updateSizes(list.ls);
     875                else
     876                        Debug.debug(Debug.DEBUG, "LIST failed");
     877                if (socket != null) try { socket.setSoTimeout(300*1000); } catch (IOException ioe) {}
     878                return ok;
     879        }
    812880       
    813881        /**
     
    907975                                                sr.result = true;
    908976                                        } catch (IOException ioe) {
    909                                                 Debug.debug( Debug.DEBUG, "Error getting RB: " + ioe);
     977                                                Debug.debug(Debug.DEBUG, "Error getting RB", ioe);
    910978                                                result = false;
    911979                                                sr.result = false;
     
    923991                                                sr.result = true;
    924992                                        } catch (IOException ioe) {
    925                                                 Debug.debug( Debug.DEBUG, "Error getting LS: " + ioe);
     993                                                Debug.debug(Debug.DEBUG, "Error getting LS", ioe);
    926994                                                result = false;
    927995                                                sr.result = false;
     
    9741042                        } catch (IOException e) {
    9751043                                lastError = e.toString();
    976                                 Debug.debug( Debug.DEBUG, "sendCmdNa throws: " + e);
     1044                                Debug.debug(Debug.DEBUG, "sendCmdNa throws", e);
    9771045                                if (socket != null) {
    9781046                                        try { socket.close(); } catch (IOException ioe) {}
     
    9871055                                } catch (IOException e2) {
    9881056                                        lastError = e2.toString();
    989                                         Debug.debug( Debug.DEBUG, "2nd sendCmdNa throws: " + e2);
     1057                                        Debug.debug(Debug.DEBUG, "2nd sendCmdNa throws", e2);
    9901058                                        if (socket != null) {
    9911059                                                try { socket.close(); } catch (IOException e) {}
     
    11051173                                break;
    11061174                        if( System.currentTimeMillis() - startTime > timeOut )
    1107                                 throw new IOException( "Timeout while waiting on server response." );
     1175                                throw new IOException(_t("No response from server"));
    11081176                        String line;
    11091177                        // RFC 1939 sec. 3 de-byte-stuffing
  • history.txt

    r4321f13 r0ba0f1b  
     12018-02-23 zzz
     2 * Getopt: Add new translations, fix tests
     3 * i2psnark: Number formatting tweaks (ticket #1913)
     4 * SusiMail: Check mail fixes (ticket #2174)
     5
    162018-02-22 zzz
    27 * Util: Support setSoTimeout() for InternalSockets
  • router/java/src/net/i2p/router/RouterVersion.java

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