diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ReseedHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ReseedHandler.java index 2c6a635e3..243ed87ac 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ReseedHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ReseedHandler.java @@ -28,14 +28,19 @@ public class ReseedHandler { if (nonce == null) return; if (nonce.equals(System.getProperty("net.i2p.router.web.ReseedHandler.nonce")) || nonce.equals(System.getProperty("net.i2p.router.web.ReseedHandler.noncePrev"))) { - synchronized (_reseedRunner) { - if (_reseedRunner.isRunning()) { - return; - } else { - System.setProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "true"); - I2PThread reseed = new I2PThread(_reseedRunner, "Reseed"); - reseed.start(); - } + requestReseed(); + } + } + + public static void requestReseed() { + synchronized (_reseedRunner) { + if (_reseedRunner.isRunning()) { + return; + } else { + System.setProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "true"); + System.out.println("Reseeding"); + I2PThread reseed = new I2PThread(_reseedRunner, "Reseed"); + reseed.start(); } } } @@ -46,7 +51,8 @@ public class ReseedHandler { public boolean isRunning() { return _isRunning; } public void run() { _isRunning = true; - reseed(); + reseed(false); + System.out.println("Reseeding complete"); System.setProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "false"); _isRunning = false; } @@ -59,7 +65,7 @@ public class ReseedHandler { * save them into this router's netDb dir. * */ - private static void reseed() { + private static void reseed(boolean echoStatus) { String seedURL = System.getProperty("i2p.reseedURL", DEFAULT_SEED_URL); if ( (seedURL == null) || (seedURL.trim().length() <= 0) ) seedURL = DEFAULT_SEED_URL; @@ -85,10 +91,16 @@ public class ReseedHandler { try { fetchSeed(seedURL, (String)iter.next()); fetched++; + if (echoStatus) { + System.out.print("."); + if (fetched % 60 == 0) + System.out.println(); + } } catch (Exception e) { errors++; } } + if (echoStatus) System.out.println(); } catch (Throwable t) { I2PAppContext.getGlobalContext().logManager().getLog(ReseedHandler.class).error("Error reseeding", t); } @@ -172,7 +184,11 @@ public class ReseedHandler { } public static void main(String args[]) { - reseed(); - //System.out.println("Done reseeding"); + if ( (args != null) && (args.length == 1) && (!Boolean.valueOf(args[0]).booleanValue()) ) { + System.out.println("Not reseeding, as requested"); + return; // not reseeding on request + } + System.out.println("Reseeding"); + reseed(true); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java index 3646382fd..3625e050e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java @@ -72,6 +72,14 @@ public class RouterConsoleRunner { } catch (Throwable t) { t.printStackTrace(); } + + File noReseedFile = new File(new File(System.getProperty("user.home")), ".i2pnoreseed"); + if (!noReseedFile.exists()) { + RouterContext ctx = (RouterContext)RouterContext.listContexts().get(0); + if (ctx.netDb().getKnownRouters() < 15) { + ReseedHandler.requestReseed(); + } + } NewsFetcher fetcher = NewsFetcher.getInstance(I2PAppContext.getGlobalContext()); I2PThread t = new I2PThread(fetcher, "NewsFetcher"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java index 8459e3720..d3d3c3078 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java @@ -94,7 +94,7 @@ public class UpdateHandler { public void run() { _isRunning = true; update(); - System.setProperty("net.i2p.router.web.ReseedHandler.updateInProgress", "false"); + System.setProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"); _isRunning = false; } private void update() { diff --git a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java index 473b14cd5..ed772988b 100644 --- a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java +++ b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java @@ -143,6 +143,27 @@ public class BlogManager { return info; } + public boolean updateMetadata(User user, Hash blog, Properties opts) { + if (!user.getAuthenticated()) return false; + BlogInfo oldInfo = getArchive().getBlogInfo(blog); + if (oldInfo == null) return false; + if (!user.getBlog().equals(oldInfo.getKey().calculateHash())) return false; + int oldEdition = 0; + try { + String ed = oldInfo.getProperty("Edition"); + if (ed != null) + oldEdition = Integer.parseInt(ed); + } catch (NumberFormatException nfe) {} + opts.setProperty("Edition", oldEdition + 1 + ""); + BlogInfo info = new BlogInfo(oldInfo.getKey(), oldInfo.getPosters(), opts); + SigningPrivateKey key = getMyPrivateKey(oldInfo); + info.sign(_context, key); + getArchive().storeBlogInfo(info); + user.setLastMetaEntry(oldEdition+1); + saveUser(user); + return true; + } + public Archive getArchive() { return _archive; } public File getTempDir() { return _tempDir; } diff --git a/apps/syndie/java/src/net/i2p/syndie/web/ArchiveViewerBean.java b/apps/syndie/java/src/net/i2p/syndie/web/ArchiveViewerBean.java index 570e07253..3f84b0e07 100644 --- a/apps/syndie/java/src/net/i2p/syndie/web/ArchiveViewerBean.java +++ b/apps/syndie/java/src/net/i2p/syndie/web/ArchiveViewerBean.java @@ -672,7 +672,60 @@ public class ArchiveViewerBean { out.write(DataHelper.getUTF8("No such entry, or no such attachment")); } - public static void renderMetadata(Map parameters, Writer out) throws IOException { + private static String getURL(String uri, Map parameters) { + StringBuffer rv = new StringBuffer(128); + rv.append(uri); + rv.append('?'); + if (parameters != null) { + for (Iterator iter = parameters.keySet().iterator(); iter.hasNext(); ) { + String key = (String)iter.next(); + String vals[] = getStrings(parameters, key); + // we are already looking at the page with the given parameters, no need to further sanitize + if ( (key != null) && (vals != null) ) + for (int i = 0; i < vals.length; i++) + rv.append(key).append('=').append(vals[i]).append('&'); + } + } + return rv.toString(); + } + + private static void updateMetadata(User viewer, Map parameters, Writer out) throws IOException { + if ( (viewer == null) || (!viewer.getAuthenticated()) ) + return; + String blogStr = getString(parameters, PARAM_BLOG); + if (blogStr != null) { + Hash blog = new Hash(Base64.decode(blogStr)); + Archive archive = BlogManager.instance().getArchive(); + BlogInfo info = archive.getBlogInfo(blog); + if (info != null) { + boolean isUser = viewer.getBlog().equals(info.getKey().calculateHash()); + if (!isUser) + return; + Properties toSave = new Properties(); + String existing[] = info.getProperties(); + for (int i = 0; i < existing.length; i++) { + String newVal = getString(parameters, existing[i]); + if ( (newVal != null) && (newVal.length() > 0) ) + toSave.setProperty(existing[i], newVal.trim()); + else + toSave.setProperty(existing[i], info.getProperty(existing[i])); + } + boolean saved = BlogManager.instance().updateMetadata(viewer, blog, toSave); + if (saved) + out.write("
Blog metadata saved
\n"); + else + out.write("Blog metadata could not be saved
\n"); + } + } + } + + /** + * @param currentURI URI of the with current page without any parameters tacked on + */ + public static void renderMetadata(User viewer, String currentURI, Map parameters, Writer out) throws IOException { + if (parameters.get("action") != null) { + updateMetadata(viewer, parameters, out); + } String blogStr = getString(parameters, PARAM_BLOG); if (blogStr != null) { Hash blog = new Hash(Base64.decode(blogStr)); @@ -682,7 +735,12 @@ public class ArchiveViewerBean { out.write("Blog " + blog.toBase64() + " does not exist"); return; } + boolean isUser = ( (viewer != null) && (viewer.getAuthenticated()) && (viewer.getBlog().equals(info.getKey().calculateHash())) ); String props[] = info.getProperties(); + if (isUser) { + out.write("