diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java index cadcd544a6..702c24bf50 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -479,9 +479,12 @@ public class IndexBean { public void setStartOnLoad(String moo) { _startOnLoad = true; } - public void setSharedClient(String moo) { + public void setShared(String moo) { _sharedClient=true; } + public void setShared(boolean val) { + _sharedClient=val; + } public void setConnectDelay(String moo) { _connectDelay = true; } diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp index 31516add16..dd6de657b9 100644 --- a/apps/i2ptunnel/jsp/editClient.jsp +++ b/apps/i2ptunnel/jsp/editClient.jsp @@ -166,9 +166,9 @@ if (curTunnel >= 0) { <% if (editBean.isSharedClient(curTunnel)) { %> - + <% } else { %> - + <% } %> (Share tunnels with other clients and httpclients? Change requires restart of client proxy) diff --git a/apps/syndie/java/src/net/i2p/syndie/ArchiveIndexer.java b/apps/syndie/java/src/net/i2p/syndie/ArchiveIndexer.java index bec4174273..09e6568312 100644 --- a/apps/syndie/java/src/net/i2p/syndie/ArchiveIndexer.java +++ b/apps/syndie/java/src/net/i2p/syndie/ArchiveIndexer.java @@ -158,7 +158,7 @@ class ArchiveIndexer { _headers.setProperty(header, value); } - public void receiveAddress(String name, String schema, String location, String anchorText) {} + public void receiveAddress(String name, String schema, String protocol, String location, String anchorText) {} public void receiveArchive(String name, String description, String locationSchema, String location, String postingKey, String anchorText) {} public void receiveAttachment(int id, String anchorText) {} public void receiveBegin() {} diff --git a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java index e6f04a1982..c0c2d13b45 100644 --- a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java +++ b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java @@ -225,6 +225,7 @@ public class BlogManager { try { out = new FileOutputStream(userFile); out.write(DataHelper.getUTF8(user.export())); + user.getPetNameDB().store(user.getAddressbookLocation()); } catch (IOException ioe) { ioe.printStackTrace(); } finally { @@ -399,7 +400,7 @@ public class BlogManager { } - public String addAddress(User user, String name, String location, String schema) { + public String addAddress(User user, String name, String protocol, String location, String schema) { if (!user.getAuthenticated()) return "Not logged in"; boolean ok = validateAddressName(name); if (!ok) return "Invalid name: " + HTMLRenderer.sanitizeString(name); @@ -408,19 +409,17 @@ public class BlogManager { if (!validateAddressSchema(schema)) return "Unsupported schema: " + HTMLRenderer.sanitizeString(schema); // no need to quote user/location further, as they've been sanitized - FileOutputStream out = null; - try { - File userHostsFile = new File(user.getAddressbookLocation()); - Properties knownHosts = getKnownHosts(user, true); - if (knownHosts.containsKey(name)) return "Name is already in use"; + PetNameDB names = user.getPetNameDB(); + if (names.exists(name)) + return "Name is already in use"; + PetName pn = new PetName(name, schema, protocol, location); + names.set(name, pn); - out = new FileOutputStream(userHostsFile, true); - out.write(DataHelper.getUTF8(name + "=" + location + '\n')); - return "Address " + name + " written to your hosts file (" + userHostsFile.getName() + ")"; + try { + names.store(user.getAddressbookLocation()); + return "Address " + name + " written to your addressbook"; } catch (IOException ioe) { - return "Error writing out host entry: " + ioe.getMessage(); - } finally { - if (out != null) try { out.close(); } catch (IOException ioe) {} + return "Error writing out the name: " + ioe.getMessage(); } } @@ -455,12 +454,17 @@ public class BlogManager { private boolean validateAddressLocation(String location) { if ( (location == null) || (location.trim().length() <= 0) ) return false; - try { - Destination d = new Destination(location); - return (d.getPublicKey() != null); - } catch (DataFormatException dfe) { - dfe.printStackTrace(); - return false; + if (false) { + try { + Destination d = new Destination(location); + return (d.getPublicKey() != null); + } catch (DataFormatException dfe) { + dfe.printStackTrace(); + return false; + } + } else { + // not everything is an i2p destination... + return true; } } diff --git a/apps/syndie/java/src/net/i2p/syndie/PetName.java b/apps/syndie/java/src/net/i2p/syndie/PetName.java new file mode 100644 index 0000000000..a6c42e9da5 --- /dev/null +++ b/apps/syndie/java/src/net/i2p/syndie/PetName.java @@ -0,0 +1,175 @@ +package net.i2p.syndie; + +import java.util.*; +import net.i2p.data.DataHelper; + +/** + * + */ +public class PetName { + private String _name; + private String _network; + private String _protocol; + private List _groups; + private boolean _isPublic; + private String _location; + + public PetName() { + this(null, null, null, null); + } + public PetName(String name, String network, String protocol, String location) { + _name = name; + _network = network; + _protocol = protocol; + _location = location; + _groups = new ArrayList(); + _isPublic = false; + } + /** + * @param dbLine name:network:protocol:isPublic:group1,group2,group3:location + */ + public PetName(String dbLine) { + _groups = new ArrayList(); + StringTokenizer tok = new StringTokenizer(dbLine, ":\n", true); + int tokens = tok.countTokens(); + System.out.println("Tokens: " + tokens); + if (tokens < 7) { + return; + } + String s = tok.nextToken(); + if (":".equals(s)) { + _name = null; + } else { + _name = s; + s = tok.nextToken(); // skip past the : + } + s = tok.nextToken(); + if (":".equals(s)) { + _network = null; + } else { + _network = s; + s = tok.nextToken(); // skip past the : + } + s = tok.nextToken(); + if (":".equals(s)) { + _protocol = null; + } else { + _protocol = s; + s = tok.nextToken(); // skip past the : + } + s = tok.nextToken(); + if (":".equals(s)) { + _isPublic = false; + } else { + if ("true".equals(s)) + _isPublic = true; + else + _isPublic = false; + s = tok.nextToken(); // skip past the : + } + s = tok.nextToken(); + if (":".equals(s)) { + // noop + } else { + StringTokenizer gtok = new StringTokenizer(s, ","); + while (gtok.hasMoreTokens()) + _groups.add(gtok.nextToken().trim()); + s = tok.nextToken(); // skip past the : + } + if (tok.hasMoreTokens()) { + s = tok.nextToken(); + if (":".equals(s)) { + _location = null; + } else { + _location = s; + } + } else { + _location = null; + } + } + + public String getName() { return _name; } + public String getNetwork() { return _network; } + public String getProtocol() { return _protocol; } + public String getLocation() { return _location; } + public boolean getIsPublic() { return _isPublic; } + public int getGroupCount() { return _groups.size(); } + public String getGroup(int i) { return (String)_groups.get(i); } + + public void setName(String name) { _name = name; } + public void setNetwork(String network) { _network = network; } + public void setProtocol(String protocol) { _protocol = protocol; } + public void setLocation(String location) { _location = location; } + public void setIsPublic(boolean pub) { _isPublic = pub; } + public void addGroup(String name) { + if ( (name != null) && (name.length() > 0) && (!_groups.contains(name)) ) + _groups.add(name); + } + public void removeGroup(String name) { _groups.remove(name); } + public void setGroups(String groups) { + if (groups != null) { + _groups.clear(); + StringTokenizer tok = new StringTokenizer(groups, ", \t"); + while (tok.hasMoreTokens()) + addGroup(tok.nextToken().trim()); + } else { + _groups.clear(); + } + } + public boolean isMember(String group) { + for (int i = 0; i < getGroupCount(); i++) + if (getGroup(i).equals(group)) + return true; + return false; + } + + public String toString() { + StringBuffer buf = new StringBuffer(256); + if (_name != null) buf.append(_name.trim()); + buf.append(':'); + if (_network != null) buf.append(_network.trim()); + buf.append(':'); + if (_protocol != null) buf.append(_protocol.trim()); + buf.append(':').append(_isPublic).append(':'); + if (_groups != null) { + for (int i = 0; i < _groups.size(); i++) { + buf.append(((String)_groups.get(i)).trim()); + if (i + 1 < _groups.size()) + buf.append(','); + } + } + buf.append(':'); + if (_location != null) buf.append(_location.trim()); + return buf.toString(); + } + + public boolean equals(Object obj) { + if ( (obj == null) || !(obj instanceof PetName) ) return false; + PetName pn = (PetName)obj; + return DataHelper.eq(_name, pn._name) && + DataHelper.eq(_location, pn._location) && + DataHelper.eq(_network, pn._network) && + DataHelper.eq(_protocol, pn._protocol); + } + public int hashCode() { + int rv = 0; + rv += DataHelper.hashCode(_name); + rv += DataHelper.hashCode(_location); + rv += DataHelper.hashCode(_network); + rv += DataHelper.hashCode(_protocol); + return rv; + } + + public static void main(String args[]) { + test("a:b:c:d:e:f"); + test("a:::::d"); + test("a:::::"); + test("a:b::::"); + test(":::::"); + } + private static void test(String line) { + PetName pn = new PetName(line); + String val = pn.toString(); + System.out.println("OK? " + val.equals(line) + ": " + line); + } +} diff --git a/apps/syndie/java/src/net/i2p/syndie/PetNameDB.java b/apps/syndie/java/src/net/i2p/syndie/PetNameDB.java new file mode 100644 index 0000000000..700464924c --- /dev/null +++ b/apps/syndie/java/src/net/i2p/syndie/PetNameDB.java @@ -0,0 +1,74 @@ +package net.i2p.syndie; + +import java.io.*; +import java.util.*; + +/** + * + */ +public class PetNameDB { + /** name (String) to PetName mapping */ + private Map _names; + + public PetNameDB() { + _names = Collections.synchronizedMap(new HashMap()); + } + + public PetName get(String name) { return (PetName)_names.get(name); } + public boolean exists(String name) { return _names.containsKey(name); } + public void set(String name, PetName pn) { _names.put(name, pn); } + public void remove(String name) { _names.remove(name); } + public Set getNames() { return new HashSet(_names.keySet()); } + public List getGroups() { + List rv = new ArrayList(); + for (Iterator iter = new HashSet(_names.values()).iterator(); iter.hasNext(); ) { + PetName name = (PetName)iter.next(); + for (int i = 0; i < name.getGroupCount(); i++) + if (!rv.contains(name.getGroup(i))) + rv.add(name.getGroup(i)); + } + return rv; + } + + public String getNameByLocation(String location) { + if (location == null) return null; + synchronized (_names) { + for (Iterator iter = _names.values().iterator(); iter.hasNext(); ) { + PetName name = (PetName)iter.next(); + if ( (name.getLocation() != null) && (name.getLocation().trim().equals(location.trim())) ) + return name.getName(); + } + } + return null; + } + + public void load(String location) throws IOException { + File f = new File(location); + if (!f.exists()) return; + BufferedReader in = null; + try { + in = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8")); + String line = null; + while ( (line = in.readLine()) != null) { + PetName name = new PetName(line); + if (name.getName() != null) + _names.put(name.getName(), name); + } + } finally { + in.close(); + } + } + public void store(String location) throws IOException { + Writer out = null; + try { + out = new OutputStreamWriter(new FileOutputStream(location), "UTF-8"); + for (Iterator names = getNames().iterator(); names.hasNext(); ) { + PetName name = get((String)names.next()); + if (name != null) + out.write(name.toString() + "\n"); + } + } finally { + out.close(); + } + } +} diff --git a/apps/syndie/java/src/net/i2p/syndie/User.java b/apps/syndie/java/src/net/i2p/syndie/User.java index c75e951e55..b4f435c50c 100644 --- a/apps/syndie/java/src/net/i2p/syndie/User.java +++ b/apps/syndie/java/src/net/i2p/syndie/User.java @@ -1,6 +1,7 @@ package net.i2p.syndie; import java.io.UnsupportedEncodingException; +import java.io.IOException; import java.util.*; import net.i2p.I2PAppContext; import net.i2p.data.*; @@ -36,6 +37,7 @@ public class User { private int _webProxyPort; private String _torProxyHost; private int _torProxyPort; + private PetNameDB _petnames; public User() { _context = I2PAppContext.getGlobalContext(); @@ -62,6 +64,7 @@ public class User { _torProxyPort = -1; _lastLogin = -1; _lastMetaEntry = 0; + _petnames = new PetNameDB(); } public boolean getAuthenticated() { return _authenticated; } @@ -92,6 +95,8 @@ public class User { public String getTorProxyHost() { return _torProxyHost; } public int getTorProxyPort() { return _torProxyPort; } + public PetNameDB getPetNameDB() { return _petnames; } + public void invalidate() { BlogManager.instance().saveUser(this); init(); @@ -156,8 +161,14 @@ public class User { } String addr = props.getProperty("addressbook", "userhosts.txt"); - if (addr != null) + if (addr != null) { _addressbookLocation = addr; + try { + _petnames.load(addr); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } String show = props.getProperty("showimages", "false"); _showImagesByDefault = (show != null) && (show.equals("true")); diff --git a/apps/syndie/java/src/net/i2p/syndie/sml/EventReceiverImpl.java b/apps/syndie/java/src/net/i2p/syndie/sml/EventReceiverImpl.java index e00fb3ccef..3b8bfb5b6a 100644 --- a/apps/syndie/java/src/net/i2p/syndie/sml/EventReceiverImpl.java +++ b/apps/syndie/java/src/net/i2p/syndie/sml/EventReceiverImpl.java @@ -25,7 +25,7 @@ public class EventReceiverImpl implements SMLParser.EventReceiver { public void receiveImage(String alternateText, int attachmentId) { System.out.println("Receive image [" + alternateText + "]/[" + attachmentId + "]"); } - public void receiveAddress(String name, String schema, String location, String anchorText) { + public void receiveAddress(String name, String schema, String protocol, String location, String anchorText) { System.out.println("Receive address [" + name + "]/[" + schema + "]/[" + location + "]/[" + anchorText+ "]"); } public void receiveBold(String text) { System.out.println("Receive bold [" + text+ "]"); } diff --git a/apps/syndie/java/src/net/i2p/syndie/sml/HTMLPreviewRenderer.java b/apps/syndie/java/src/net/i2p/syndie/sml/HTMLPreviewRenderer.java index 8a9ad82fdd..21274d79cd 100644 --- a/apps/syndie/java/src/net/i2p/syndie/sml/HTMLPreviewRenderer.java +++ b/apps/syndie/java/src/net/i2p/syndie/sml/HTMLPreviewRenderer.java @@ -94,11 +94,20 @@ public class HTMLPreviewRenderer extends HTMLRenderer { _postBodyBuffer.append("Addresses: "); for (int i = 0; i < _addresses.size(); i++) { Address a = (Address)_addresses.get(i); - _postBodyBuffer.append("").append(sanitizeString(a.name)); + + String knownName = null; + if (_user != null) + knownName = _user.getPetNameDB().getNameByLocation(a.location); + if (knownName != null) { + _postBodyBuffer.append(' ').append(sanitizeString(knownName)); + } else { + _postBodyBuffer.append(" ").append(sanitizeString(a.name)); + } } _postBodyBuffer.append("
\n"); } diff --git a/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java b/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java index b9a957441e..57032b5c46 100644 --- a/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java +++ b/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java @@ -387,25 +387,37 @@ public class HTMLRenderer extends EventReceiverImpl { public String name; public String schema; public String location; + public String protocol; public int hashCode() { return -1; } public boolean equals(Object o) { Address a = (Address)o; - return DataHelper.eq(schema, a.schema) && DataHelper.eq(location, a.location) && DataHelper.eq(name, a.name); + return DataHelper.eq(schema, a.schema) && DataHelper.eq(location, a.location) && DataHelper.eq(protocol, a.protocol) && DataHelper.eq(name, a.name); } } - public void receiveAddress(String name, String schema, String location, String anchorText) { + public void receiveAddress(String name, String schema, String protocol, String location, String anchorText) { Address a = new Address(); a.name = name; a.schema = schema; a.location = location; + a.protocol = protocol; if (!_addresses.contains(a)) _addresses.add(a); if (!continueBody()) { return; } if ( (schema == null) || (location == null) ) return; - _bodyBuffer.append("
").append(sanitizeString(anchorText)).append(""); + String knownName = null; + if (_user != null) + knownName = _user.getPetNameDB().getNameByLocation(location); + if (knownName != null) { + _bodyBuffer.append(sanitizeString(anchorText)); + _bodyBuffer.append(" (").append(sanitizeString(knownName)).append(")"); + } else { + System.err.println("Receiving address [" + location + "]"); + _bodyBuffer.append("").append(sanitizeString(anchorText)).append(""); + } } public void receiveAttachment(int id, String anchorText) { @@ -540,11 +552,20 @@ public class HTMLRenderer extends EventReceiverImpl { _postBodyBuffer.append("Addresses:"); for (int i = 0; i < _addresses.size(); i++) { Address a = (Address)_addresses.get(i); - _postBodyBuffer.append(" ").append(sanitizeString(a.name)); + + String knownName = null; + if (_user != null) + knownName = _user.getPetNameDB().getNameByLocation(a.location); + if (knownName != null) { + _postBodyBuffer.append(' ').append(sanitizeString(knownName)); + } else { + _postBodyBuffer.append(" ").append(sanitizeString(a.name)); + } } _postBodyBuffer.append("
\n"); } @@ -632,20 +653,47 @@ public class HTMLRenderer extends EventReceiverImpl { if ( (tags != null) && (tags.length > 0) ) _preBodyBuffer.append("
"); _preBodyBuffer.append("\n"); + + String knownName = null; + if ( (_entry != null) && (_user != null) ) + knownName = _user.getPetNameDB().getNameByLocation(_entry.getURI().getKeyHash().toBase64()); + //if (knownName != null) + // _preBodyBuffer.append("Pet name: ").append(sanitizeString(knownName)).append(" "); + BlogInfo info = null; if (_entry != null) info = _archive.getBlogInfo(_entry.getURI()); if (info != null) { _preBodyBuffer.append(""); - String nameStr = info.getProperty("Name"); - if (nameStr == null) - _preBodyBuffer.append("[no name]"); - else - _preBodyBuffer.append(sanitizeString(nameStr)); + if (knownName != null) { + _preBodyBuffer.append(sanitizeString(knownName)); + } else { + String nameStr = info.getProperty("Name"); + if (nameStr == null) + _preBodyBuffer.append("[no name]"); + else + _preBodyBuffer.append(sanitizeString(nameStr)); + } _preBodyBuffer.append(""); } else { _preBodyBuffer.append("[unknown blog]"); } + + + if ( (_user != null) && (_user.getAuthenticated()) && (_entry != null) ) { + PetName pn = _user.getPetNameDB().get(knownName); + if ( (pn == null) || (!pn.isMember("Favorites")) ) + _preBodyBuffer.append(" "); + if ( (pn == null) || (!pn.isMember("Ignore")) ) + _preBodyBuffer.append(" "); + else + _preBodyBuffer.append(" "); + _preBodyBuffer.append(" "); + if (info != null) + _preBodyBuffer.append(" "); + } + + if ( (tags != null) && (tags.length > 0) ) { _preBodyBuffer.append(" Tags: "); _preBodyBuffer.append(" diff --git a/apps/syndie/jsp/_topnav.jsp b/apps/syndie/jsp/_topnav.jsp index 43a2055d2d..66c1ac7646 100644 --- a/apps/syndie/jsp/_topnav.jsp +++ b/apps/syndie/jsp/_topnav.jsp @@ -24,6 +24,7 @@ Logged in as: : <%=HTMLRenderer.sanitizeString(ArchiveViewerBean.getBlogName(user.getBlogStr()))%> Post Metadata +Addressbook Logout
<%} else {%> Login: diff --git a/apps/syndie/jsp/addaddress.jsp b/apps/syndie/jsp/addaddress.jsp index 681e186dc4..9a63e9774d 100644 --- a/apps/syndie/jsp/addaddress.jsp +++ b/apps/syndie/jsp/addaddress.jsp @@ -14,13 +14,17 @@ <% String nameStr = request.getParameter("name"); +String protoStr = request.getParameter("proto"); String locStr = request.getParameter("location"); String schemaStr = request.getParameter("schema"); String name = null; +String proto = null; String location = null; String schema = null; try { name = DataHelper.getUTF8(Base64.decode(nameStr)); + if ( (protoStr != null) && (protoStr.trim().length() > 0) ) + proto = DataHelper.getUTF8(Base64.decode(protoStr)); location = DataHelper.getUTF8(Base64.decode(locStr)); schema = DataHelper.getUTF8(Base64.decode(schemaStr)); } catch (NullPointerException npe) { @@ -30,7 +34,7 @@ try { if ( (name == null) || (location == null) || (schema == null) ) { out.write("No location specified"); } else if (user.getAuthenticated() && ("Add".equals(request.getParameter("action"))) ) { - out.write("" + BlogManager.instance().addAddress(user, name, location, schema) + ""); + out.write("" + BlogManager.instance().addAddress(user, name, proto, location, schema) + ""); } else { %>Are you sure you really want to add the addressbook mapping of <%=HTMLRenderer.sanitizeString(name)%> to , applicable within the diff --git a/apps/syndie/jsp/addresses.jsp b/apps/syndie/jsp/addresses.jsp new file mode 100644 index 0000000000..e591dcad1c --- /dev/null +++ b/apps/syndie/jsp/addresses.jsp @@ -0,0 +1,158 @@ +<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="net.i2p.data.Base64, net.i2p.syndie.web.*, net.i2p.syndie.sml.*, net.i2p.syndie.data.*, net.i2p.syndie.*, org.mortbay.servlet.MultiPartRequest, java.util.*, java.io.*" %> +<% request.setCharacterEncoding("UTF-8"); %> + + + +SyndieMedia addressbook + + + + + + + + + +
<% +if (!user.getAuthenticated()) { + %>You must log in to view your addressbook<% +} else { + PetNameDB names = user.getPetNameDB(); + String action = request.getParameter("action"); + if ( (action != null) && ("Change".equals(action)) ) { + String oldPetname = request.getParameter("petname"); + PetName cur = names.get(oldPetname); + if (cur != null) { + cur.setName(request.getParameter("name")); + cur.setNetwork(request.getParameter("network")); + cur.setProtocol(request.getParameter("protocol")); + cur.setIsPublic(null != request.getParameter("isPublic")); + cur.setLocation(request.getParameter("location")); + cur.setGroups(request.getParameter("groups")); + names.store(user.getAddressbookLocation()); + %>Address updated<% + } + } else if ( (action != null) && ("Add".equals(action)) ) { + PetName cur = names.get(request.getParameter("name")); + if (cur != null) { %>Address already exists<% } else { + cur = new PetName(); + cur.setName(request.getParameter("name")); + cur.setNetwork(request.getParameter("network")); + cur.setProtocol(request.getParameter("protocol")); + cur.setIsPublic(null != request.getParameter("isPublic")); + cur.setLocation(request.getParameter("location")); + cur.setGroups(request.getParameter("groups")); + names.set(cur.getName(), cur); + names.store(user.getAddressbookLocation()); + %>Address added<% + } + } else if ( (action != null) && ("Delete".equals(action)) ) { + PetName cur = names.get(request.getParameter("name")); + if (cur != null) { + names.remove(cur.getName()); + names.store(user.getAddressbookLocation()); + %>Address removed<% + } + } + TreeSet sorted = new TreeSet(names.getNames()); + %> + +<% + StringBuffer buf = new StringBuffer(128); + for (Iterator iter = sorted.iterator(); iter.hasNext(); ) { + PetName name = names.get((String)iter.next()); + buf.append(""); + buf.append(""); + buf.append(""); + out.write(buf.toString()); + buf.setLength(0); + } + %> + + + + + + + + +
NameNetworkProtocolLocationPublic?Groups 
"); + buf.append(""); + if (name.getLocation() != null) + buf.append(""); + else + buf.append(""); + + buf.append(""); + buf.append(" "); + buf.append("
<% +} +%> +
+ diff --git a/history.txt b/history.txt index ef2770b47b..393a46bf24 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,12 @@ -$Id: history.txt,v 1.236 2005/09/02 13:34:14 jrandom Exp $ +$Id: history.txt,v 1.237 2005/09/02 14:10:05 jrandom Exp $ + +2005-09-04 jrandom + * Don't persist peer profiles until we are shutting down, as the + persistence process gobbles RAM and wall time. + * Bugfix to allow you to check/uncheck the sharedClient setting on the + I2PTunnel web interface. + * Be more careful when expiring a failed tunnel message fragment so we + don't drop the data while attempting to read it. * 2005-09-02 0.6.0.5 released diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 02d92e0b7b..7ac8785575 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.225 $ $Date: 2005/09/02 13:34:15 $"; + public final static String ID = "$Revision: 1.226 $ $Date: 2005/09/02 14:10:06 $"; public final static String VERSION = "0.6.0.5"; - public final static long BUILD = 0; + public final static long BUILD = 1; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION); System.out.println("Router ID: " + RouterVersion.ID); diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java index 68aa11e9b7..9eae727915 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerManager.java +++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java @@ -39,7 +39,7 @@ class PeerManager { _organizer.setUs(context.routerHash()); loadProfiles(); _context.jobQueue().addJob(new EvaluateProfilesJob(_context)); - _context.jobQueue().addJob(new PersistProfilesJob(_context, this)); + //_context.jobQueue().addJob(new PersistProfilesJob(_context, this)); } void storeProfiles() { diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java index 4b80c32e12..b3ea7dac97 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java @@ -408,7 +408,7 @@ class PeerTestManager { charlieInfo = _context.netDb().lookupRouterInfoLocally(charlie.getRemotePeer()); } - if (charlie == null) { + if ( (charlie == null) || (charlieInfo == null) ) { if (_log.shouldLog(Log.WARN)) _log.warn("Unable to pick a charlie"); return; diff --git a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java index 9aefba1f39..e8f81d50b4 100644 --- a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java +++ b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java @@ -353,6 +353,8 @@ public class FragmentHandler { _completed++; try { byte data[] = msg.toByteArray(); + if (msg == null) + return; if (_log.shouldLog(Log.DEBUG)) _log.debug("RECV(" + data.length + "): " + Base64.encode(data) + " " + _context.sha().calculateHash(data).toBase64()); diff --git a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java index d39a5e56b2..186843d815 100644 --- a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java +++ b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java @@ -214,15 +214,20 @@ public class FragmentedMessage { _completed = true; } public byte[] toByteArray() { - byte rv[] = new byte[getCompleteSize()]; - writeComplete(rv, 0); - releaseFragments(); - return rv; + synchronized (this) { + if (_releasedAfter > 0) return null; + byte rv[] = new byte[getCompleteSize()]; + writeComplete(rv, 0); + releaseFragments(); + return rv; + } } public long getReleasedAfter() { return _releasedAfter; } public void failed() { - releaseFragments(); + synchronized (this) { + releaseFragments(); + } } /**