Changeset 6f05328


Ignore:
Timestamp:
Aug 19, 2009 8:20:25 PM (11 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
7782970
Parents:
5bc2dab
Message:
  • Update:
    • Fix problems where a requested unsigned update would actually kick off a signed update
    • Fix problem when policy set to notify, and clicking check for update, incorrectly causing unsigned update download and bad messages
    • Verify zip integrity of unsigned updates
    • Move zip files to router dir, not base dir
    • More tweaks and cleanup
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java

    r5bc2dab r6f05328  
    5555            fetcher.fetchNews();
    5656            if (fetcher.shouldFetchUnsigned())
    57                 fetcher.fetchUnsigned();
     57                fetcher.fetchUnsignedHead();
    5858            if (fetcher.updateAvailable() || fetcher.unsignedUpdateAvailable()) {
    5959                if ( (_updatePolicy == null) || (!_updatePolicy.equals("notify")) )
  • apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java

    r5bc2dab r6f05328  
    189189                    if (modtime > ms) {
    190190                        _unsignedUpdateAvailable = true;
    191                         // '07-Jul 21:09' with month name in the system locale
    192                         _unsignedUpdateVersion = (new SimpleDateFormat("dd-MMM HH:mm")).format(new Date(modtime));
     191                        // '07-Jul 21:09 UTC' with month name in the system locale
     192                        _unsignedUpdateVersion = (new SimpleDateFormat("dd-MMM HH:mm")).format(new Date(modtime)) + " UTC";
    193193                        if (shouldInstall())
    194194                            fetchUnsigned();
  • apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java

    r5bc2dab r6f05328  
    2222 */
    2323public class UnsignedUpdateHandler extends UpdateHandler {
     24    private static UnsignedUpdateRunner _unsignedUpdateRunner;
    2425    private String _zipURL;
    2526    private String _zipVersion;
     
    3536    public void update() {
    3637        // don't block waiting for the other one to finish
    37         if ("true".equals(System.getProperty(PROP_UPDATE_IN_PROGRESS, "false"))) {
     38        if ("true".equals(System.getProperty(PROP_UPDATE_IN_PROGRESS))) {
    3839            _log.error("Update already running");
    3940            return;
    4041        }
    4142        synchronized (UpdateHandler.class) {
    42             if (_updateRunner == null) {
    43                 _updateRunner = new UnsignedUpdateRunner();
     43            if (_unsignedUpdateRunner == null) {
     44                _unsignedUpdateRunner = new UnsignedUpdateRunner();
    4445            }
    45             if (_updateRunner.isRunning()) {
     46            if (_unsignedUpdateRunner.isRunning()) {
    4647                return;
    4748            } else {
    4849                System.setProperty(PROP_UPDATE_IN_PROGRESS, "true");
    49                 I2PAppThread update = new I2PAppThread(_updateRunner, "Update");
     50                I2PAppThread update = new I2PAppThread(_unsignedUpdateRunner, "UnsignedUpdate");
    5051                update.start();
    5152            }
     
    6566        protected void update() {
    6667            _status = "<b>Updating</b>";
     68            if (_log.shouldLog(Log.DEBUG))
     69                _log.debug("Starting unsigned update URL: " + _zipURL);
    6770            // always proxy for now
    6871            //boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
     
    7578                _get.fetch();
    7679            } catch (Throwable t) {
    77                 _context.logManager().getLog(UpdateHandler.class).error("Error updating", t);
     80                _log.error("Error updating", t);
    7881            }
    7982        }
     
    8285        @Override
    8386        public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {
    84             _status = "<b>Update downloaded</b>";
    85             // we should really verify zipfile integrity here but there's no easy way to do it
    86             String to = (new File(_context.getBaseDir(), Router.UPDATE_FILE)).getAbsolutePath();
     87            File updFile = new File(_updateFile);
     88            if (FileUtil.verifyZip(updFile)) {
     89                _status = "<b>Update downloaded</b>";
     90            } else {
     91                updFile.delete();
     92                _status = "<b>Unsigned update file is corrupt</b> from " + url;
     93                _log.log(Log.CRIT, "Corrupt zip file from " + url);
     94                return;
     95            }
     96            String to = (new File(_context.getRouterDir(), Router.UPDATE_FILE)).getAbsolutePath();
    8797            boolean copied = FileUtil.copy(_updateFile, to, true);
    8898            if (copied) {
    89                 (new File(_updateFile)).delete();
     99                updFile.delete();
    90100                String policy = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_POLICY);
    91101                this.done = true;
  • apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java

    r5bc2dab r6f05328  
    99import net.i2p.I2PAppContext;
    1010import net.i2p.crypto.TrustedUpdate;
     11import net.i2p.data.DataHelper;
    1112import net.i2p.router.Router;
    1213import net.i2p.router.RouterContext;
    1314import net.i2p.router.RouterVersion;
    1415import net.i2p.util.EepGet;
    15 import net.i2p.util.I2PThread;
     16import net.i2p.util.I2PAppThread;
    1617import net.i2p.util.Log;
    1718
     
    3233    protected Log _log;
    3334    protected String _updateFile;
     35    protected static String _status = "";
    3436    private String _action;
     37    private String _nonce;
    3538   
    3639    protected static final String SIGNED_UPDATE_FILE = "i2pupdate.sud";
     
    6265    }
    6366   
    64     public void setUpdateAction(String val) { _action = val; }
     67    /** these two can be set in either order, so call checkUpdateAction() twice */
     68    public void setUpdateAction(String val) {
     69        _action = val;
     70        checkUpdateAction();
     71    }
    6572   
    6673    public void setUpdateNonce(String nonce) {
    67         if (nonce == null) return;
    68         if (nonce.equals(System.getProperty("net.i2p.router.web.UpdateHandler.nonce")) ||
    69             nonce.equals(System.getProperty("net.i2p.router.web.UpdateHandler.noncePrev"))) {
    70             if (_action != null && _action.contains("Unsigned")) {
     74        _nonce = nonce;
     75        checkUpdateAction();
     76    }
     77
     78    private void checkUpdateAction() {
     79        if (_nonce == null || _action == null) return;
     80        if (_nonce.equals(System.getProperty("net.i2p.router.web.UpdateHandler.nonce")) ||
     81            _nonce.equals(System.getProperty("net.i2p.router.web.UpdateHandler.noncePrev"))) {
     82            if (_action.contains("Unsigned")) {
    7183                // Not us, have NewsFetcher instantiate the correct class.
    7284                NewsFetcher fetcher = NewsFetcher.getInstance(_context);
     
    91103            } else {
    92104                System.setProperty(PROP_UPDATE_IN_PROGRESS, "true");
    93                 I2PThread update = new I2PThread(_updateRunner, "Update");
     105                I2PAppThread update = new I2PAppThread(_updateRunner, "SignedUpdate");
    94106                update.start();
    95107            }
     
    97109    }
    98110   
    99     public String getStatus() {
    100         if (_updateRunner == null)
    101             return "";
    102         return _updateRunner.getStatus();
     111    public static String getStatus() {
     112        return _status;
    103113    }
    104114   
     
    114124        protected boolean _isRunning;
    115125        protected boolean done;
    116         protected String _status;
    117126        protected EepGet _get;
    118127        private final DecimalFormat _pct = new DecimalFormat("0.0%");
     
    127136            return this.done;
    128137        }
    129         public String getStatus() { return _status; }
    130138        public void run() {
    131139            _isRunning = true;
     
    151159                _get.fetch();
    152160            } catch (Throwable t) {
    153                 _context.logManager().getLog(UpdateHandler.class).error("Error updating", t);
     161                _log.error("Error updating", t);
    154162            }
    155163        }
     
    168176                buf.append(_pct.format(pct));
    169177            }
    170             buf.append(":<br />\n" + (currentWrite + alreadyTransferred));
    171             buf.append(" transferred");
     178            buf.append(":<br>\n");
     179            buf.append(DataHelper.formatSize(currentWrite + alreadyTransferred));
     180            buf.append("B transferred");
    172181            _status = buf.toString();
    173182        }
     
    176185            TrustedUpdate up = new TrustedUpdate(_context);
    177186            File f = new File(_updateFile);
    178             File to = new File(_context.getBaseDir(), Router.UPDATE_FILE);
     187            File to = new File(_context.getRouterDir(), Router.UPDATE_FILE);
    179188            String err = up.migrateVerified(RouterVersion.VERSION, f, to);
    180189            f.delete();
     
    234243            URLList.add(tok.nextToken().trim());
    235244        int size = URLList.size();
    236         _log.log(Log.DEBUG, "Picking update source from " + size + " candidates.");
     245        //_log.log(Log.DEBUG, "Picking update source from " + size + " candidates.");
    237246        if (size <= 0) {
    238             _log.log(Log.WARN, "Update list is empty - no update available");
     247            _log.log(Log.CRIT, "Update source list is empty - cannot download update");
    239248            return null;
    240249        }
  • apps/routerconsole/jsp/summarynoframe.jsp

    r5bc2dab r6f05328  
    6161    if (helper.updateAvailable() || helper.unsignedUpdateAvailable()) {
    6262        // display all the time so we display the final failure message
    63         out.print("<br />" + update.getStatus());
     63        out.print("<br>" + net.i2p.router.web.UpdateHandler.getStatus());
    6464        if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress"))) {
    6565        } else if((!update.isDone()) &&
     
    7777                out.print("<button type=\"submit\" name=\"updateAction\" value=\"signed\" >Download " + helper.getUpdateVersion() + " Update</button>\n");
    7878            if (helper.unsignedUpdateAvailable())
    79                 out.print("<button type=\"submit\" name=\"updateAction\" value=\"Unsigned\" >Download Unsigned<br />" + helper.getUnsignedUpdateVersion() + " Update</button>\n");
     79                out.print("<button type=\"submit\" name=\"updateAction\" value=\"Unsigned\" >Download Unsigned<br>Update " + helper.getUnsignedUpdateVersion() + "</button>\n");
    8080            out.print("</form></p>\n");
    8181        }
  • core/java/src/net/i2p/util/FileUtil.java

    r5bc2dab r6f05328  
    139139   
    140140    /**
     141     * Verify the integrity of a zipfile.
     142     * There doesn't seem to be any library function to do this,
     143     * so we basically go through all the motions of extractZip() above,
     144     * unzipping everything but throwing away the data.
     145     *
     146     * @return true if ok
     147     */
     148    public static boolean verifyZip(File zipfile) {
     149        ZipFile zip = null;
     150        try {
     151            byte buf[] = new byte[16*1024];
     152            zip = new ZipFile(zipfile);
     153            Enumeration entries = zip.entries();
     154            while (entries.hasMoreElements()) {
     155                ZipEntry entry = (ZipEntry)entries.nextElement();
     156                if (entry.getName().indexOf("..") != -1) {
     157                    //System.err.println("ERROR: Refusing to extract a zip entry with '..' in it [" + entry.getName() + "]");
     158                    return false;
     159                }
     160                if (entry.isDirectory()) {
     161                    // noop
     162                } else {
     163                    try {
     164                        InputStream in = zip.getInputStream(entry);
     165                        int read = 0;
     166                        while ( (read = in.read(buf)) != -1) {
     167                            // throw the data away
     168                        }
     169                        //System.err.println("INFO: File [" + entry.getName() + "] extracted");
     170                        in.close();
     171                    } catch (IOException ioe) {
     172                        //System.err.println("ERROR: Error extracting the zip entry (" + entry.getName() + "]");
     173                        //ioe.printStackTrace();
     174                        return false;
     175                    }
     176                }
     177            }
     178            return true;
     179        } catch (IOException ioe) {
     180            //System.err.println("ERROR: Unable to extract the zip file");
     181            //ioe.printStackTrace();
     182            return false;
     183        } finally {
     184            if (zip != null) {
     185                try { zip.close(); } catch (IOException ioe) {}
     186            }
     187        }
     188    }
     189   
     190    /**
    141191     * Read in the last few lines of a (newline delimited) textfile, or null if
    142192     * the file doesn't exist. 
Note: See TracChangeset for help on using the changeset viewer.