From f9b8f0528d489399307cf831db7175be97522ce6 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Wed, 17 Oct 2012 23:45:44 +0000
Subject: [PATCH] - Straighten out some confusion on versions, RFC 822 dates,  
 etc. on news and unsigned updates. Stored versions are always  
 Long.toString(modtime). Only convert to RFC 822 for eepget or display.

---
 .../router/update/ConsoleUpdateManager.java   | 55 ++++++++++++-------
 .../router/update/UnsignedUpdateChecker.java  |  6 +-
 .../router/update/UnsignedUpdateRunner.java   |  6 +-
 .../src/net/i2p/router/web/NewsHelper.java    | 12 +++-
 4 files changed, 52 insertions(+), 27 deletions(-)

diff --git a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
index ef2db32777..dfba379564 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
@@ -5,9 +5,11 @@ import java.io.File;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -45,6 +47,9 @@ import net.i2p.util.VersionComparator;
  *  prevents multiple updates as appropriate,
  *  and controls notification to the user.
  *
+ *  Version notes: For news and unsigned updates, use
+ *  Long.toString(modtime).
+ *
  *  @since 0.9.4
  */
 public class ConsoleUpdateManager implements UpdateManager {
@@ -149,7 +154,6 @@ public class ConsoleUpdateManager implements UpdateManager {
      *  @return new version or null if nothing newer is available
      */
     public String checkAvailable(UpdateType type, String id, long maxWait) {
-//// update too?
         if (isCheckInProgress(type, id) || isUpdateInProgress(type, id)) {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Check or update already in progress for: " + type + ' ' + id);
@@ -157,7 +161,8 @@ public class ConsoleUpdateManager implements UpdateManager {
         }
         for (RegisteredChecker r : _registeredCheckers) {
             if (r.type == type) {
-                UpdateTask t = r.checker.check(type, r.method, id, "FIXME", maxWait);
+                String current = getDownloadedOrInstalledVersion(type, id);
+                UpdateTask t = r.checker.check(type, r.method, id, current, maxWait);
                 if (t != null) {
                     synchronized(t) {
                         try {
@@ -183,8 +188,8 @@ public class ConsoleUpdateManager implements UpdateManager {
         }
         for (RegisteredChecker r : _registeredCheckers) {
             if (r.type == type) {
-/// fixme "" will put an entry in _available for everything grrrrr????
-                UpdateTask t = r.checker.check(type, r.method, id, "", 5*60*1000);
+                String current = getDownloadedOrInstalledVersion(type, id);
+                UpdateTask t = r.checker.check(type, r.method, id, current, 5*60*1000);
                 if (t != null)
                     break;
             }
@@ -233,6 +238,22 @@ public class ConsoleUpdateManager implements UpdateManager {
         return v.version;
     }
 
+    /**
+     *  The highest of the installed or downloaded version.
+     *  @return new version or null if nothing was downloaded or installed
+     */
+    private String getDownloadedOrInstalledVersion(UpdateType type, String id) {
+        UpdateItem ui = new UpdateItem(type, id);
+        Version vi = _installed.get(ui);
+        Version vd = _downloaded.get(ui);
+        if (vi != null) {
+            if (vd != null)
+                return (vi.compareTo(vd) > 0) ? vi.version : vd.version;
+            return vi.version;
+        }
+        return vd != null ? vd.version : null;
+    }
+
     /**
      *  Is any download in progress?
      *  Does not include checks.
@@ -701,7 +722,6 @@ public class ConsoleUpdateManager implements UpdateManager {
 
             case ROUTER_UNSIGNED:
                 rv = handleUnsignedFile(task.getURI(), actualVersion, file);
-/////// FIXME RFC822 or long?
                 if (rv)
                     notifyDownloaded(task.getType(), task.getID(), actualVersion);
                 break;
@@ -846,15 +866,8 @@ public class ConsoleUpdateManager implements UpdateManager {
         if (err == null) {
             String policy = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_POLICY);
             // So unsigned update handler doesn't overwrite unless newer.
-/// FIXME
-            //String lastmod = _get.getLastModified();
-            String lastmod = null;
-            long modtime = 0;
-            if (lastmod != null)
-                modtime = RFC822Date.parse822Date(lastmod);
-            if (modtime <= 0)
-                modtime = _context.clock().now();
-            _context.router().saveConfig(NewsHelper.PROP_LAST_UPDATE_TIME, "" + modtime);
+            long modtime = _context.clock().now();
+            _context.router().saveConfig(NewsHelper.PROP_LAST_UPDATE_TIME, Long.toString(modtime));
 
             if ("install".equals(policy)) {
                 _log.log(Log.CRIT, "Update was VERIFIED, restarting to install it");
@@ -881,6 +894,7 @@ public class ConsoleUpdateManager implements UpdateManager {
     }
 
     /**
+     *  @param Long.toString(timestamp)
      *  @return success
      */
     private boolean handleUnsignedFile(URI uri, String lastmod, File updFile) {
@@ -899,11 +913,14 @@ public class ConsoleUpdateManager implements UpdateManager {
             updFile.delete();
             String policy = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_POLICY);
             long modtime = 0;
-            if (lastmod != null)
-                modtime = RFC822Date.parse822Date(lastmod);
+            if (lastmod != null) {
+                try {
+                    modtime = Long.parseLong(lastmod);
+                } catch (NumberFormatException nfe) {}
+            }
             if (modtime <= 0)
                 modtime = _context.clock().now();
-            _context.router().saveConfig(NewsHelper.PROP_LAST_UPDATE_TIME, "" + modtime);
+            _context.router().saveConfig(NewsHelper.PROP_LAST_UPDATE_TIME, Long.toString(modtime));
             if ("install".equals(policy)) {
                 _log.log(Log.CRIT, "Update was downloaded, restarting to install it");
                 updateStatus("<b>" + _("Update downloaded") + "</b><br>" + _("Restarting"));
@@ -916,8 +933,8 @@ public class ConsoleUpdateManager implements UpdateManager {
                     buf.append(_("Click Restart to install"));
                 else
                     buf.append(_("Click Shutdown and restart to install"));
-/// OK?
-                    buf.append(' ').append(_("Version {0}", lastmod));
+                String ver = (new SimpleDateFormat("dd-MMM HH:mm")).format(new Date(modtime)) + " UTC";
+                buf.append(' ').append(_("Version {0}", ver));
                 updateStatus(buf.toString());
             }
         } else {
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateChecker.java b/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateChecker.java
index 3f162b1235..62363da148 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateChecker.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateChecker.java
@@ -2,9 +2,7 @@ package net.i2p.router.update;
 
 import java.io.File;
 import java.net.URI;
-import java.text.SimpleDateFormat;
 import java.util.List;
-import java.util.Date;
 
 import net.i2p.router.RouterContext;
 import net.i2p.router.util.RFC822Date;
@@ -78,10 +76,8 @@ class UnsignedUpdateChecker extends UpdateRunner {
                     if (_ms <= 0) return false;
                     if (modtime > _ms) {
                         _unsignedUpdateAvailable = true;
-                        // '07-Jul 21:09 UTC' with month name in the system locale
-                        String unsignedUpdateVersion = (new SimpleDateFormat("dd-MMM HH:mm")).format(new Date(modtime)) + " UTC";
                         _mgr.notifyVersionAvailable(this, _urls.get(0), getType(), "", getMethod(), _urls,
-                                                    unsignedUpdateVersion, "");
+                                                    Long.toString(modtime), "");
                     }
                 }
                 return true;
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateRunner.java b/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateRunner.java
index 265861f91d..c77a5ec921 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateRunner.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateRunner.java
@@ -60,8 +60,10 @@ class UnsignedUpdateRunner extends UpdateRunner {
         public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {
             String lastmod = _get.getLastModified();
             File tmp = new File(_updateFile);
-/////// FIXME RFC822 or long?
-            if (_mgr.notifyComplete(this, lastmod, tmp))
+            long modtime = RFC822Date.parse822Date(lastmod);
+            if (modtime <= 0)
+                modtime = _context.clock().now();
+            if (_mgr.notifyComplete(this, Long.toString(modtime), tmp))
                 this.done = true;
             else
                 tmp.delete();  // corrupt
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java
index f8a45b215c..5510de3ddd 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java
@@ -1,6 +1,8 @@
 package net.i2p.router.web;
 
 import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
 import net.i2p.data.DataHelper;
 import net.i2p.router.RouterContext;
@@ -82,7 +84,15 @@ public class NewsHelper extends ContentHelper {
     public static String unsignedUpdateVersion() {
         ConsoleUpdateManager mgr = ConsoleUpdateManager.getInstance();
         if (mgr == null) return null;
-        return mgr.getUpdateAvailable(ROUTER_UNSIGNED);
+        String ver = mgr.getUpdateAvailable(ROUTER_UNSIGNED);
+        if (ver != null) {
+            try {
+                long modtime = Long.parseLong(ver);
+                // '07-Jul 21:09 UTC' with month name in the system locale
+                return (new SimpleDateFormat("dd-MMM HH:mm")).format(new Date(modtime)) + " UTC";
+            } catch (NumberFormatException nfe) {}
+        }
+        return null;
     }
 
     /**
-- 
GitLab