diff --git a/apps/rome/readme.txt b/apps/rome/readme.txt index e959d0caa..412710a2d 100644 --- a/apps/rome/readme.txt +++ b/apps/rome/readme.txt @@ -1 +1 @@ -This is ROME 0.7 from http://rome.dev.java.net/, released under a BSD license +This is ROME 0.8 from http://rome.dev.java.net/, released under a BSD license diff --git a/apps/rome/rome-0.7.jar b/apps/rome/rome-0.7.jar deleted file mode 100644 index 44c684f22..000000000 Binary files a/apps/rome/rome-0.7.jar and /dev/null differ diff --git a/apps/rome/rome-0.8.jar b/apps/rome/rome-0.8.jar new file mode 100644 index 000000000..27d2ad329 Binary files /dev/null and b/apps/rome/rome-0.8.jar differ diff --git a/apps/syndie/java/build.xml b/apps/syndie/java/build.xml index fcf14a241..7d0bdc456 100644 --- a/apps/syndie/java/build.xml +++ b/apps/syndie/java/build.xml @@ -15,7 +15,7 @@ srcdir="./src" debug="true" deprecation="on" source="1.3" target="1.3" destdir="./build/obj" - classpath="../../../core/java/build/i2p.jar:../../jetty/jettylib/org.mortbay.jetty.jar:../../jetty/jettylib/javax.servlet.jar:../../jdom/jdom.jar:../../rome/rome-0.7.jar" /> + classpath="../../../core/java/build/i2p.jar:../../jetty/jettylib/org.mortbay.jetty.jar:../../jetty/jettylib/javax.servlet.jar:../../jdom/jdom.jar:../../rome/rome-0.8.jar" /> @@ -27,7 +27,7 @@ - + @@ -37,7 +37,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -136,7 +136,7 @@ - + diff --git a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java index 175465f7f..4e78f9aaf 100644 --- a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java +++ b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java @@ -580,9 +580,42 @@ public class BlogManager { return (user.getAuthenticated() && user.getAllowAccessRemote()); } + private boolean isOkDefaultUser(String defaultUser, String defaultPass) { + User t = new User(_context); + Hash userHash = _context.sha().calculateHash(DataHelper.getUTF8(defaultUser)); + File userFile = new File(_userDir, Base64.encode(userHash.getData())); + if (userFile.exists()) { + Properties props = loadUserProps(userFile); + if (props == null) { + _log.error("Error reading the default user file: " + userFile); + return false; + } + String ok = t.login(defaultUser, defaultPass, props); + if (User.LOGIN_OK.equals(ok)) { + // ok, good enough + return true; + } else { + _log.error("Error logging into the default user, so configuration change rejected: " + ok); + return false; + } + } else { + _log.error("Not setting the default user to a nonexistant user [" + defaultUser + "]"); + return false; + } + } + public void configure(String registrationPassword, String remotePassword, String adminPass, String defaultSelector, String defaultProxyHost, int defaultProxyPort, boolean isSingleUser, Properties opts, String defaultUser, String defaultPass) { + if ( (defaultUser == null) || (defaultUser.length() <= 0) ) + defaultUser = getDefaultLogin(); + if (defaultPass == null) + defaultPass = getDefaultPass(); + // first make sure the default user is valid, if its single user + if (isSingleUser) { + if (!isOkDefaultUser(defaultUser, defaultPass)) + return; + } File cfg = getConfigFile(); Writer out = null; try { @@ -600,10 +633,6 @@ public class BlogManager { if (defaultProxyPort > 0) out.write("syndie.defaultProxyPort="+defaultProxyPort + "\n"); - if ( (defaultUser == null) || (defaultUser.length() <= 0) ) - defaultUser = getDefaultLogin(); - if (defaultPass == null) - defaultPass = getDefaultPass(); out.write("syndie.defaultSingleUserLogin="+defaultUser+"\n"); out.write("syndie.defaultSingleUserPass="+defaultPass+"\n"); diff --git a/apps/syndie/java/src/net/i2p/syndie/Sucker.java b/apps/syndie/java/src/net/i2p/syndie/Sucker.java index b11ba31b0..8478321c5 100644 --- a/apps/syndie/java/src/net/i2p/syndie/Sucker.java +++ b/apps/syndie/java/src/net/i2p/syndie/Sucker.java @@ -18,6 +18,7 @@ import java.util.List; import com.sun.syndication.feed.synd.SyndCategory; import com.sun.syndication.feed.synd.SyndContent; import com.sun.syndication.feed.synd.SyndEntry; +import com.sun.syndication.feed.synd.SyndEnclosure; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedInput; @@ -396,7 +397,27 @@ public class Sucker { sml += "\n"; } } - String source=e.getUri(); + + List enclosures = e.getEnclosures(); + debugLog("Enclosures: " + enclosures.size()); + for (int i = 0; i < enclosures.size(); i++) { + SyndEnclosure enc = (SyndEnclosure)enclosures.get(i); + String enclosureURL = enc.getUrl(); + if (enclosureURL != null) { + if (!enclosureURL.startsWith("http://")) { + // e.g. postman's rss feed @ http://tracker.postman.i2p/rss.jsp has + // baseUrl = http://tracker.postman.i2p + // and enclosure URLs are /download.php?id=123&file=blah + if (enclosureURL.startsWith("/") || baseUrl.endsWith("/")) + enclosureURL = baseUrl + enclosureURL; + else + enclosureURL = baseUrl + '/' + enclosureURL; + } + fetchAttachment(enclosureURL, enc.getType()); // fetches and adds to our streams + } + } + + String source=e.getLink(); //Uri(); if(source.indexOf("http")<0) source=baseUrl+source; sml += "[link schema=\"web\" location=\""+source+"\"]source[/link]\n"; @@ -654,7 +675,8 @@ public class Sucker { return null; } - private void fetchAttachment(String link) { + private void fetchAttachment(String link) { fetchAttachment(link, null); } + private void fetchAttachment(String link, String suggestedMimeType) { link=link.replaceAll("&","&"); @@ -684,16 +706,19 @@ public class Sucker { get.fetch(); boolean ok = lsnr.waitForSuccess(); if (!ok) { - System.err.println("Unable to retrieve the url after " + numRetries + " tries."); + debugLog("Unable to retrieve the url [" + link + "] after " + numRetries + " tries."); fetched.delete(); return; } tempFiles.add(fetched); String filename=EepGet.suggestName(link); - String contentType = get.getContentType(); + String contentType = suggestedMimeType; + if (contentType == null) + contentType = get.getContentType(); if(contentType==null) contentType="text/plain"; - debugLog("successful fetch of filename "+filename); + debugLog("successful fetch of filename "+filename + " suggested mime type [" + suggestedMimeType + + "], fetched mime type [" + get.getContentType() + "], final type [" + contentType + "]"); if(fileNames==null) fileNames = new ArrayList(); if(fileTypes==null) fileTypes = new ArrayList(); if(fileStreams==null) fileStreams = new ArrayList(); diff --git a/apps/syndie/java/src/net/i2p/syndie/sml/BlogRenderer.java b/apps/syndie/java/src/net/i2p/syndie/sml/BlogRenderer.java index 75ee5b6e7..db1642c3c 100644 --- a/apps/syndie/java/src/net/i2p/syndie/sml/BlogRenderer.java +++ b/apps/syndie/java/src/net/i2p/syndie/sml/BlogRenderer.java @@ -158,11 +158,14 @@ public class BlogRenderer extends HTMLRenderer { protected String getEntryURL() { return getEntryURL(_user != null ? _user.getShowImages() : true); } protected String getEntryURL(boolean showImages) { - if (_entry == null) return "unknown"; + return getEntryURL(_entry, _blog, showImages); + } + static String getEntryURL(EntryContainer entry, BlogInfo blog, boolean showImages) { + if (entry == null) return "unknown"; return "blog.jsp?" - + ViewBlogServlet.PARAM_BLOG + "=" + _blog.getKey().calculateHash().toBase64() + "&" + + ViewBlogServlet.PARAM_BLOG + "=" + (blog != null ? blog.getKey().calculateHash().toBase64() : "") + "&" + ViewBlogServlet.PARAM_ENTRY + "=" - + Base64.encode(_entry.getURI().getKeyHash().getData()) + '/' + _entry.getURI().getEntryId(); + + Base64.encode(entry.getURI().getKeyHash().getData()) + '/' + entry.getURI().getEntryId(); } protected String getAttachmentURLBase() { diff --git a/apps/syndie/java/src/net/i2p/syndie/sml/RSSRenderer.java b/apps/syndie/java/src/net/i2p/syndie/sml/RSSRenderer.java index eb9d46945..895e57fe0 100644 --- a/apps/syndie/java/src/net/i2p/syndie/sml/RSSRenderer.java +++ b/apps/syndie/java/src/net/i2p/syndie/sml/RSSRenderer.java @@ -24,18 +24,18 @@ public class RSSRenderer extends HTMLRenderer { public void render(User user, Archive archive, EntryContainer entry, String urlPrefix, Writer out) throws IOException { if (entry == null) return; prepare(user, archive, entry, entry.getEntry().getText(), out, RSS_EXCERPT_ONLY, false); + BlogInfo info = archive.getBlogInfo(entry.getURI()); out.write(" \n"); out.write(" " + sanitizeXML(sanitizeString((String)_headers.get(HEADER_SUBJECT))) + "\n"); - out.write(" " + urlPrefix + sanitizeXML(getEntryURL()) + "\n"); - out.write(" " + urlPrefix + entry.getURI().toString() + "\n"); + out.write(" " + urlPrefix + sanitizeXML(BlogRenderer.getEntryURL(entry, info, true)) + "\n"); + out.write(" syndie://" + entry.getURI().toString() + "\n"); out.write(" " + getRFC822Date(entry.getURI().getEntryId()) + "\n"); PetName pn = user.getPetNameDB().getByLocation(entry.getURI().getKeyHash().toBase64()); String author = null; if (pn != null) author = pn.getName(); if (author == null) { - BlogInfo info = archive.getBlogInfo(entry.getURI()); if (info != null) author = info.getProperty(BlogInfo.NAME); } @@ -49,7 +49,7 @@ public class RSSRenderer extends HTMLRenderer { out.write(" " + sanitizeXML(_bodyBuffer.toString()) + "\n"); - //renderEnclosures(user, entry, urlPrefix, out); + renderEnclosures(user, entry, urlPrefix, out); out.write(" \n"); } @@ -222,15 +222,27 @@ public class RSSRenderer extends HTMLRenderer { } private void renderEnclosures(User user, EntryContainer entry, String urlPrefix, Writer out) throws IOException { + int included = 0; if (entry.getAttachments() != null) { for (int i = 0; i < _entry.getAttachments().length; i++) { Attachment a = _entry.getAttachments()[i]; - out.write(" \n"); + out.write(" "); + // we can do neat stuff with Media RSS (http://search.yahoo.com/mrss) here, such as + // include descriptions, titles, keywords, thumbnails, etc + out.write(" \n"); + + if (included == 0) // plain RSS enclosures can only have one enclosure per entry, unlike Media RSS + out.write(" \n"); + included++; } } + /* if (_blogs.size() > 0) { for (int i = 0; i < _blogs.size(); i++) { Blog b = (Blog)_blogs.get(i); @@ -295,7 +307,8 @@ public class RSSRenderer extends HTMLRenderer { if ( (inReplyTo != null) && (inReplyTo.trim().length() > 0) ) { String url = getPageURL(sanitizeTagParam(inReplyTo)); out.write(" \n"); - } + } + */ } public void receiveHeaderEnd() {} diff --git a/apps/syndie/java/src/net/i2p/syndie/web/RSSServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/RSSServlet.java index 12e9ccf62..da6cfc117 100644 --- a/apps/syndie/java/src/net/i2p/syndie/web/RSSServlet.java +++ b/apps/syndie/java/src/net/i2p/syndie/web/RSSServlet.java @@ -60,7 +60,14 @@ public class RSSServlet extends HttpServlet { if (count > 100) count = 100; Archive archive = BlogManager.instance().getArchive(); - FilteredThreadIndex index = new FilteredThreadIndex(user, archive, tagSet, null, false); + Set authors = new HashSet(); + String reqAuth = req.getParameter(ThreadedHTMLRenderer.PARAM_AUTHOR); + if (reqAuth != null) { + byte v[] = Base64.decode(reqAuth); + if ( (v != null) && (v.length == Hash.HASH_LENGTH) ) + authors.add(new Hash(v)); + } + FilteredThreadIndex index = new FilteredThreadIndex(user, archive, tagSet, authors, false); List entries = new ArrayList(); // depth first search of the most recent threads for (int i = 0; i < count && i < index.getRootCount(); i++) { @@ -80,7 +87,7 @@ public class RSSServlet extends HttpServlet { Writer out = resp.getWriter(); out.write("\n"); - out.write("\n"); + out.write("\n"); out.write(" \n"); out.write(" Syndie feed\n"); String page = urlPrefix; diff --git a/apps/syndie/java/src/net/i2p/syndie/web/ViewBlogServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/ViewBlogServlet.java index 8db5b2074..daacf3010 100644 --- a/apps/syndie/java/src/net/i2p/syndie/web/ViewBlogServlet.java +++ b/apps/syndie/java/src/net/i2p/syndie/web/ViewBlogServlet.java @@ -162,6 +162,10 @@ public class ViewBlogServlet extends BaseServlet { out.write("\n"); out.write("\n"); out.write("\n\n" + pageTitle + "\n"); + if (info != null) + out.write("\n"); out.write(""); @@ -192,6 +196,7 @@ public class ViewBlogServlet extends BaseServlet { } public static String getLogoURL(Hash blog) { + if (blog == null) return ""; return "blog.jsp?" + PARAM_BLOG + "=" + blog.toBase64() + "&" + PARAM_IMAGE + "=" + BlogInfoData.ATTACHMENT_LOGO; } @@ -201,12 +206,15 @@ public class ViewBlogServlet extends BaseServlet { "Content\n"); renderNavBar(user, req, out); out.write("
\n"); - out.write("\"\"\n"); + Hash kh = null; + if ( (info != null) && (info.getKey() != null) ) + kh = info.getKey().calculateHash(); + out.write("\"\"\n"); String name = desc; if ( (name == null) || (name.trim().length() <= 0) ) name = title; - if ( ( (name == null) || (name.trim().length() <= 0) ) && (info != null) ) - name = info.getKey().calculateHash().toBase64(); + if ( ( (name == null) || (name.trim().length() <= 0) ) && (info != null) && (kh != null) ) + name = kh.toBase64(); if (name != null) { String url = "blog.jsp?" + (info != null ? PARAM_BLOG + "=" + info.getKey().calculateHash().toBase64() : ""); out.write("" diff --git a/history.txt b/history.txt index 66c6ca387..2f029893a 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,13 @@ -$Id: history.txt,v 1.396.2.19 2006/02/15 00:16:31 jrandom Exp $ +$Id: history.txt,v 1.397 2006/02/15 00:33:17 jrandom Exp $ + +2006-02-15 jrandom + * Add in per-blog RSS feeds to Syndie + * Upgraded sucker's ROME dependency to 0.8, bundling sucked enclosures + with the posts, marking additional attachments as Media RSS enclosures + (http://search.yahoo.com/mrss/), since RSS only supports one enclosure + per item. + * Don't allow the default syndie user to be set to something invalid if + its in single user mode. 2006-02-15 jrandom * Merged in the i2p_0_6_1_10_PRE branch to the trunk, so CVS HEAD is no diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index bc263f70d..b69ec7939 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.340.2.17 $ $Date: 2006/02/15 00:16:30 $"; + public final static String ID = "$Revision: 1.341 $ $Date: 2006/02/15 00:33:33 $"; public final static String VERSION = "0.6.1.9"; - public final static long BUILD = 25; + public final static long BUILD = 26; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);