diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java index 92d8d2b99d..f7b6c776e3 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java @@ -90,7 +90,7 @@ public class NewsManager implements ClientApp { * Does NOT update the NewsEntry list. * * @param entries each one should be "entry" at the root - * @return success + * @return true if any new entry was written (not if changed) */ public synchronized boolean storeEntries(List entries) { return PersistNews.store(_context, entries); diff --git a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java index 132769451d..c209fc571b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java @@ -46,7 +46,7 @@ class PersistNews { * Old entries are always overwritten, as they may change even without the updated date changing. * * @param entries each one should be "entry" at the root - * @return success + * @return true if any new entry was written (not if changed) */ public static boolean store(I2PAppContext ctx, List entries) { Log log = ctx.logManager().getLog(PersistNews.class); @@ -54,7 +54,7 @@ class PersistNews { if (!dir.exists()) dir.mkdirs(); StringBuilder buf = new StringBuilder(); - boolean rv = true; + boolean rv = false; for (Node entry : entries) { Node nid = entry.getNode("id"); if (nid == null) { @@ -70,6 +70,8 @@ class PersistNews { } String name = idToName(ctx, id); File file = new File(dir, name); + if (!rv && !file.exists()) + rv = true; Writer out = null; try { out = new OutputStreamWriter(new GZIPOutputStream(new SecureFileOutputStream(file))); @@ -80,7 +82,6 @@ class PersistNews { } catch (IOException ioe) { if (log.shouldWarn()) log.warn("failed store to " + file, ioe); - rv = false; } finally { if (out != null) try { out.close(); } catch (IOException ioe) {} } diff --git a/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java index 831f199d93..e56b88e5b6 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java @@ -73,6 +73,8 @@ class NewsFetcher extends UpdateRunner { /** is the news newer */ private boolean _isNewer; private boolean _success; + /** did we get a new news entry */ + private boolean _gotNewEntry; private static final String TEMP_NEWS_FILE = "news.xml.temp"; static final String PROP_BLOCKLIST_TIME = "router.blocklistVersion"; @@ -141,10 +143,14 @@ class NewsFetcher extends UpdateRunner { if (get.fetch()) { int status = get.getStatusCode(); if (status == 200 || status == 304) { - Map opts = new HashMap(2); + Map opts = new HashMap(3); opts.put(NewsHelper.PROP_LAST_CHECKED, Long.toString(start)); - if (status == 200 && _isNewer) - opts.put(NewsHelper.PROP_LAST_UPDATED, Long.toString(_newLastModified)); + if (status == 200 && _isNewer) { + String lastMod = Long.toString(_newLastModified); + opts.put(NewsHelper.PROP_LAST_UPDATED, lastMod); + if (_gotNewEntry) + opts.put(NewsHelper.PROP_LAST_NEW_ENTRY, lastMod); + } _context.router().saveConfig(opts, null); return; } @@ -526,7 +532,7 @@ class NewsFetcher extends UpdateRunner { if (nmgr != null) { nmgr.addEntries(entries); List nodes = NewsXMLParser.getNodes(root, "entry"); - nmgr.storeEntries(nodes); + _gotNewEntry = nmgr.storeEntries(nodes); } } // Persist any new CRL entries 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 b30bf9d406..1e71d86905 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -25,6 +25,8 @@ public class NewsHelper extends ContentHelper { public static final String PROP_LAST_CHECKED = "routerconsole.newsLastChecked"; /** @since 0.9.4 */ public static final String PROP_LAST_UPDATED = "routerconsole.newsLastUpdated"; + /** @since 0.9.55 */ + public static final String PROP_LAST_NEW_ENTRY = "routerconsole.newsLastNewEntry"; /** * Default true * @since 0.9.21 @@ -256,7 +258,7 @@ public class NewsHelper extends ContentHelper { * @since 0.9.4 */ public static boolean shouldShowNews(RouterContext ctx) { - long lastUpdated = lastUpdated(ctx); + long lastUpdated = lastNewEntry(ctx); if (lastUpdated <= 0) return true; long last = ctx.getProperty(PROP_LAST_HIDDEN, 0L); @@ -276,7 +278,7 @@ public class NewsHelper extends ContentHelper { * @since 0.9.4 */ public static void showNews(RouterContext ctx, boolean yes) { - long stamp = yes ? 0 : lastUpdated(ctx); + long stamp = yes ? 0 : lastNewEntry(ctx); ctx.router().saveConfig(PROP_LAST_HIDDEN, Long.toString(stamp)); } @@ -370,4 +372,17 @@ public class NewsHelper extends ContentHelper { ctx.router().saveConfig(PROP_LAST_UPDATED, Long.toString(rv)); return rv; } + + /** + * When we last got a new news entry + * @since 0.9.55 + */ + private static long lastNewEntry(RouterContext ctx) { + long rv = ctx.getProperty(PROP_LAST_NEW_ENTRY, 0L); + if (rv > 0) + return rv; + rv = lastUpdated(ctx); + ctx.router().saveConfig(PROP_LAST_NEW_ENTRY, Long.toString(rv)); + return rv; + } } diff --git a/history.txt b/history.txt index f7a6535426..f88c598e06 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,22 @@ +2022-07-09 zzz + * Console: Only display news if a new entry is found + * SSU2: Support other reason codes in destroy message + +2022-07-08 zzz + * SSU: Initialize MTUs + * SSU2: Persist SSU2 tokens + * Transports: Don't lookup RI in wasUnreachable() + +2022-07-05 zzz + * SSU2: Fix peer test throttling + +2022-07-04 zzz + * Console: Add cancel button to netdb search form + * NetDB: Lookup handling cleanups + +2022-07-02 zzz + * SSU: Remove copy of peers in idle timeout checker + 2022-06-25 zzz * SSU: MTU fixes for IPv6 and SSU2 diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f40f9f7a0c..837dbdd0fb 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Git"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 9; + public final static long BUILD = 10; /** for example "-test" */ public final static String EXTRA = "";