From 848ead76835277a4e439fcb44df5b6ccd78d426e Mon Sep 17 00:00:00 2001 From: jrandom Date: Thu, 29 Sep 2005 19:19:22 +0000 Subject: [PATCH] * 2005-09-29 0.6.1 released 2005-09-29 jrandom * Let syndie users modify their metadata. * Reseed the router on startup if there aren't enough peer references known locally. This can be disabled by creating the file .i2pnoreseed in your home directory, and the existing detection and reseed handling on the web interface is unchanged. --- .../src/net/i2p/router/web/ReseedHandler.java | 40 +++++++--- .../i2p/router/web/RouterConsoleRunner.java | 8 ++ .../src/net/i2p/router/web/UpdateHandler.java | 2 +- .../java/src/net/i2p/syndie/BlogManager.java | 21 ++++++ .../net/i2p/syndie/web/ArchiveViewerBean.java | 73 ++++++++++++++++++- apps/syndie/jsp/viewmetadata.jsp | 2 +- core/java/src/net/i2p/CoreVersion.java | 4 +- history.txt | 11 ++- initialNews.xml | 4 +- install-headless.txt | 9 ++- news.xml | 8 +- readme.html | 9 +-- .../src/net/i2p/router/RouterVersion.java | 6 +- 13 files changed, 158 insertions(+), 39 deletions(-) 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 2c6a635e3e..243ed87acc 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 3646382fd9..3625e050e9 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 8459e37207..d3d3c3078e 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 473b14cd5f..ed772988bc 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 570e072538..3f84b0e075 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("
\n"); + out.write("\n"); + } out.write(""); for (int i = 0; i < props.length; i++) { if (props[i].equals(BlogInfo.OWNER_KEY)) { @@ -704,8 +762,15 @@ public class ArchiveViewerBean { out.write("\n"); } } else { - out.write("\n"); + String field = HTMLRenderer.sanitizeString(props[i]); + String val = HTMLRenderer.sanitizeString(info.getProperty(props[i])); + out.write("\n"); + + if (isUser && (!field.equals("Edition"))) + out.write(""); } } List tags = BlogManager.instance().getArchive().getIndex().getBlogTags(blog); @@ -718,6 +783,8 @@ public class ArchiveViewerBean { } out.write(""); } + if (isUser) + out.write("\n"); out.write("
" + HTMLRenderer.sanitizeString(props[i]) - + ":" + HTMLRenderer.sanitizeString(info.getProperty(props[i])) + "
" + field + + ":" + val + "
 
"); } else { out.write("Blog not specified"); diff --git a/apps/syndie/jsp/viewmetadata.jsp b/apps/syndie/jsp/viewmetadata.jsp index 06005d0515..9547f40cca 100644 --- a/apps/syndie/jsp/viewmetadata.jsp +++ b/apps/syndie/jsp/viewmetadata.jsp @@ -14,7 +14,7 @@ request.setCharacterEncoding("UTF-8"); <% -ArchiveViewerBean.renderMetadata(request.getParameterMap(), out); +ArchiveViewerBean.renderMetadata(user, request.getRequestURI(), request.getParameterMap(), out); if (user.getAuthenticated()) { if ("Authorize".equals(request.getParameter("action"))) { %><%=BlogManager.instance().authorizeRemoteAccess(user, request.getParameter("password"))%><% diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index 06b3501cea..190d2c88c8 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -14,8 +14,8 @@ package net.i2p; * */ public class CoreVersion { - public final static String ID = "$Revision: 1.41 $ $Date: 2005/09/02 14:10:08 $"; - public final static String VERSION = "0.6.0.6"; + public final static String ID = "$Revision: 1.42 $ $Date: 2005/09/17 20:29:59 $"; + public final static String VERSION = "0.6.1"; public static void main(String args[]) { System.out.println("I2P Core version: " + VERSION); diff --git a/history.txt b/history.txt index c4232bb1d4..f17816f96c 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,13 @@ -$Id: history.txt,v 1.268 2005/09/27 17:42:49 jrandom Exp $ +$Id: history.txt,v 1.269 2005/09/28 04:17:55 jrandom Exp $ + +* 2005-09-29 0.6.1 released + +2005-09-29 jrandom + * Let syndie users modify their metadata. + * Reseed the router on startup if there aren't enough peer references + known locally. This can be disabled by creating the file .i2pnoreseed + in your home directory, and the existing detection and reseed handling + on the web interface is unchanged. 2005-09-28 jrandom * Fix for at least some (all?) of the wrong stream errors in the streaming diff --git a/initialNews.xml b/initialNews.xml index fcc260252a..30fe692649 100644 --- a/initialNews.xml +++ b/initialNews.xml @@ -1,5 +1,5 @@ - - + - + -• Thanks everyone for upgrading to 0.6.0.6 so quickly (and hope its going well for you!)
-• Just a note regarding syndie - there's a bug in 0.6.0.6-0, so you should try syncing off - gloinsblog.i2p or another syndie node instead of syndiemedia for the moment.
+• There's a new 0.6.1 release out, and while its backwards compatible, upgrading is recommended! Thanks
diff --git a/readme.html b/readme.html index b192e07e06..83f4031ac8 100644 --- a/readme.html +++ b/readme.html @@ -1,8 +1,7 @@ -

If this is your first time running I2P, you will see a link on the left hand -side telling you to "reseed" - click that to get connected to the network (you -only need to do it if that link shows up). Within 5 minutes, you should see -the number of "Active: " peers rise, and you should see some local "destinations" -listed (if not, see below). Once those are up, you can:

+

If you've just started I2P, the Active: number on the left should start to +grow over the next few minutes and you'll see some local "destinations" listed +on the left (if not, see below). Once those show up, +you can:

  • blog anonymously - check out Syndie
  • chat anonymously - fire up your own IRC client and connect to the diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 59dbf0996e..a063803cc0 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.248 $ $Date: 2005/09/27 17:42:49 $"; - public final static String VERSION = "0.6.0.6"; - public final static long BUILD = 8; + public final static String ID = "$Revision: 1.249 $ $Date: 2005/09/28 04:17:54 $"; + public final static String VERSION = "0.6.1"; + public final static long BUILD = 0; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);