2005-12-19 jrandom
* Fix for old Syndie blog bookmarks (thanks Complication!) * Fix for I2PSnark to accept incoming connections again (oops) * Randomize the order that peers from the tracker are contacted
This commit is contained in:
@ -104,7 +104,10 @@ public class Peer implements Comparable
|
|||||||
*/
|
*/
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
return peerID.toString() + _id;
|
if (peerID != null)
|
||||||
|
return peerID.toString() + _id;
|
||||||
|
else
|
||||||
|
return "[unknown id]" + _id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -163,13 +166,16 @@ public class Peer implements Comparable
|
|||||||
if (din == null)
|
if (din == null)
|
||||||
{
|
{
|
||||||
sock = I2PSnarkUtil.instance().connect(peerID);
|
sock = I2PSnarkUtil.instance().connect(peerID);
|
||||||
|
_log.debug("Connected to " + peerID + ": " + sock);
|
||||||
if ((sock == null) || (sock.isClosed())) {
|
if ((sock == null) || (sock.isClosed())) {
|
||||||
throw new IOException("Unable to reach " + peerID);
|
throw new IOException("Unable to reach " + peerID);
|
||||||
}
|
}
|
||||||
InputStream in = new BufferedInputStream(sock.getInputStream());
|
InputStream in = sock.getInputStream();
|
||||||
OutputStream out = sock.getOutputStream(); //new BufferedOutputStream(sock.getOutputStream());
|
OutputStream out = sock.getOutputStream(); //new BufferedOutputStream(sock.getOutputStream());
|
||||||
if (true)
|
if (true) {
|
||||||
out = new BufferedOutputStream(out);
|
out = new BufferedOutputStream(out);
|
||||||
|
in = new BufferedInputStream(sock.getInputStream());
|
||||||
|
}
|
||||||
//BufferedInputStream bis
|
//BufferedInputStream bis
|
||||||
// = new BufferedInputStream(sock.getInputStream());
|
// = new BufferedInputStream(sock.getInputStream());
|
||||||
//BufferedOutputStream bos
|
//BufferedOutputStream bos
|
||||||
@ -181,6 +187,9 @@ public class Peer implements Comparable
|
|||||||
+ PeerID.idencode(id)
|
+ PeerID.idencode(id)
|
||||||
+ "' expected '"
|
+ "' expected '"
|
||||||
+ PeerID.idencode(expected_id) + "'");
|
+ PeerID.idencode(expected_id) + "'");
|
||||||
|
_log.debug("Handshake got matching IDs with " + toString());
|
||||||
|
} else {
|
||||||
|
_log.debug("Already have din [" + sock + "] with " + toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
PeerConnectionIn in = new PeerConnectionIn(this, din);
|
PeerConnectionIn in = new PeerConnectionIn(this, din);
|
||||||
@ -195,8 +204,10 @@ public class Peer implements Comparable
|
|||||||
state = s;
|
state = s;
|
||||||
listener.connected(this);
|
listener.connected(this);
|
||||||
|
|
||||||
|
_log.debug("Start running the reader with " + toString());
|
||||||
// Use this thread for running the incomming connection.
|
// Use this thread for running the incomming connection.
|
||||||
// The outgoing connection has created its own Thread.
|
// The outgoing connection creates its own Thread.
|
||||||
|
out.startup();
|
||||||
s.in.run();
|
s.in.run();
|
||||||
}
|
}
|
||||||
catch(IOException eofe)
|
catch(IOException eofe)
|
||||||
@ -241,6 +252,8 @@ public class Peer implements Comparable
|
|||||||
dout.write(my_id);
|
dout.write(my_id);
|
||||||
dout.flush();
|
dout.flush();
|
||||||
|
|
||||||
|
_log.debug("Wrote my shared hash and ID to " + toString());
|
||||||
|
|
||||||
// Handshake read - header
|
// Handshake read - header
|
||||||
byte b = din.readByte();
|
byte b = din.readByte();
|
||||||
if (b != 19)
|
if (b != 19)
|
||||||
@ -266,6 +279,7 @@ public class Peer implements Comparable
|
|||||||
|
|
||||||
// Handshake read - peer id
|
// Handshake read - peer id
|
||||||
din.readFully(bs);
|
din.readFully(bs);
|
||||||
|
_log.debug("Read the remote side's hash and peerID fully from " + toString());
|
||||||
return bs;
|
return bs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,15 +63,22 @@ public class PeerAcceptor
|
|||||||
// ahead the first $LOOKAHEAD_SIZE bytes to figure out which infohash they want to
|
// ahead the first $LOOKAHEAD_SIZE bytes to figure out which infohash they want to
|
||||||
// talk about, and we can just look for that in our list of active torrents.
|
// talk about, and we can just look for that in our list of active torrents.
|
||||||
byte peerInfoHash[] = null;
|
byte peerInfoHash[] = null;
|
||||||
try {
|
if (in instanceof BufferedInputStream) {
|
||||||
peerInfoHash = readHash(in);
|
in.mark(LOOKAHEAD_SIZE);
|
||||||
_log.info("infohash read from " + socket.getPeerDestination().calculateHash().toBase64()
|
peerInfoHash = readHash(in);
|
||||||
+ ": " + Base64.encode(peerInfoHash));
|
in.reset();
|
||||||
} catch (IOException ioe) {
|
} else {
|
||||||
_log.info("Unable to read the infohash from " + socket.getPeerDestination().calculateHash().toBase64());
|
// is this working right?
|
||||||
throw ioe;
|
try {
|
||||||
|
peerInfoHash = readHash(in);
|
||||||
|
_log.info("infohash read from " + socket.getPeerDestination().calculateHash().toBase64()
|
||||||
|
+ ": " + Base64.encode(peerInfoHash));
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
_log.info("Unable to read the infohash from " + socket.getPeerDestination().calculateHash().toBase64());
|
||||||
|
throw ioe;
|
||||||
|
}
|
||||||
|
in = new SequenceInputStream(new ByteArrayInputStream(peerInfoHash), in);
|
||||||
}
|
}
|
||||||
in = new SequenceInputStream(new ByteArrayInputStream(peerInfoHash), in);
|
|
||||||
if (coordinator != null) {
|
if (coordinator != null) {
|
||||||
// single torrent capability
|
// single torrent capability
|
||||||
MetaInfo meta = coordinator.getMetaInfo();
|
MetaInfo meta = coordinator.getMetaInfo();
|
||||||
|
@ -53,6 +53,9 @@ class PeerConnectionOut implements Runnable
|
|||||||
|
|
||||||
lastSent = System.currentTimeMillis();
|
lastSent = System.currentTimeMillis();
|
||||||
quit = false;
|
quit = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startup() {
|
||||||
thread = new I2PThread(this, "Snark sender " + _id);
|
thread = new I2PThread(this, "Snark sender " + _id);
|
||||||
thread.start();
|
thread.start();
|
||||||
}
|
}
|
||||||
@ -63,6 +66,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
*/
|
*/
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
|
try { Thread.sleep(1000); } catch (InterruptedException ie) {}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
while (!quit && peer.isConnected())
|
while (!quit && peer.isConnected())
|
||||||
|
@ -129,7 +129,7 @@ public class Storage
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Creates piece hases for a new storage.
|
// Creates piece hases for a new storage.
|
||||||
private void create() throws IOException
|
public void create() throws IOException
|
||||||
{
|
{
|
||||||
if (true) {
|
if (true) {
|
||||||
fast_digestCreate();
|
fast_digestCreate();
|
||||||
|
@ -209,7 +209,9 @@ public class TrackerClient extends I2PThread
|
|||||||
if ( (left > 0) && (!completed) ) {
|
if ( (left > 0) && (!completed) ) {
|
||||||
// we only want to talk to new people if we need things
|
// we only want to talk to new people if we need things
|
||||||
// from them (duh)
|
// from them (duh)
|
||||||
Iterator it = peers.iterator();
|
List ordered = new ArrayList(peers);
|
||||||
|
Collections.shuffle(ordered);
|
||||||
|
Iterator it = ordered.iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
Peer cur = (Peer)it.next();
|
Peer cur = (Peer)it.next();
|
||||||
coordinator.addPeer(cur);
|
coordinator.addPeer(cur);
|
||||||
|
@ -80,6 +80,8 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
|
|
||||||
out.write(TABLE_FOOTER);
|
out.write(TABLE_FOOTER);
|
||||||
writeAddForm(out, req);
|
writeAddForm(out, req);
|
||||||
|
if (false) // seeding needs to register the torrent first (boo, hiss)
|
||||||
|
writeSeedForm(out, req);
|
||||||
writeConfigForm(out, req);
|
writeConfigForm(out, req);
|
||||||
out.write(FOOTER);
|
out.write(FOOTER);
|
||||||
}
|
}
|
||||||
@ -227,6 +229,36 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
String i2cpPort = req.getParameter("i2cpPort");
|
String i2cpPort = req.getParameter("i2cpPort");
|
||||||
String i2cpOpts = req.getParameter("i2cpOpts");
|
String i2cpOpts = req.getParameter("i2cpOpts");
|
||||||
_manager.updateConfig(dataDir, autoStart, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts);
|
_manager.updateConfig(dataDir, autoStart, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts);
|
||||||
|
} else if ("Create torrent".equals(action)) {
|
||||||
|
String baseData = req.getParameter("baseFile");
|
||||||
|
if (baseData != null) {
|
||||||
|
File baseFile = new File(_manager.getDataDir(), baseData);
|
||||||
|
String announceURL = req.getParameter("announceURL");
|
||||||
|
String announceURLOther = req.getParameter("announceURLOther");
|
||||||
|
if ( (announceURLOther != null) && (announceURLOther.trim().length() > "http://.i2p/announce".length()) )
|
||||||
|
announceURL = announceURLOther;
|
||||||
|
|
||||||
|
if (baseFile.exists()) {
|
||||||
|
try {
|
||||||
|
Storage s = new Storage(baseFile, announceURL, null);
|
||||||
|
s.create();
|
||||||
|
MetaInfo info = s.getMetaInfo();
|
||||||
|
File torrentFile = new File(baseFile.getParent(), baseFile.getName() + ".torrent");
|
||||||
|
if (torrentFile.exists())
|
||||||
|
throw new IOException("Cannot overwrite an existing .torrent file: " + torrentFile.getPath());
|
||||||
|
FileOutputStream out = new FileOutputStream(torrentFile);
|
||||||
|
out.write(info.getTorrentData());
|
||||||
|
out.close();
|
||||||
|
_manager.addMessage("Torrent created for " + baseFile.getName() + ": " + torrentFile.getAbsolutePath());
|
||||||
|
// now fire it up and seed away!
|
||||||
|
_manager.addTorrent(torrentFile.getCanonicalPath());
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
_manager.addMessage("Error creating a torrent for " + baseFile.getAbsolutePath() + ": " + ioe.getMessage());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_manager.addMessage("Cannot create a torrent for the nonexistant data: " + baseFile.getAbsolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,6 +434,35 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("</form>\n</span>\n");
|
out.write("</form>\n</span>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final String DEFAULT_TRACKERS[] = {
|
||||||
|
"Postman's tracker", "http://YRgrgTLGnbTq2aZOZDJQ~o6Uk5k6TK-OZtx0St9pb0G-5EGYURZioxqYG8AQt~LgyyI~NCj6aYWpPO-150RcEvsfgXLR~CxkkZcVpgt6pns8SRc3Bi-QSAkXpJtloapRGcQfzTtwllokbdC-aMGpeDOjYLd8b5V9Im8wdCHYy7LRFxhEtGb~RL55DA8aYOgEXcTpr6RPPywbV~Qf3q5UK55el6Kex-6VCxreUnPEe4hmTAbqZNR7Fm0hpCiHKGoToRcygafpFqDw5frLXToYiqs9d4liyVB-BcOb0ihORbo0nS3CLmAwZGvdAP8BZ7cIYE3Z9IU9D1G8JCMxWarfKX1pix~6pIA-sp1gKlL1HhYhPMxwyxvuSqx34o3BqU7vdTYwWiLpGM~zU1~j9rHL7x60pVuYaXcFQDR4-QVy26b6Pt6BlAZoFmHhPcAuWfu-SFhjyZYsqzmEmHeYdAwa~HojSbofg0TMUgESRXMw6YThK1KXWeeJVeztGTz25sL8AAAA.i2p/announce.php",
|
||||||
|
"Orion's tracker", "http://gKik1lMlRmuroXVGTZ~7v4Vez3L3ZSpddrGZBrxVriosCQf7iHu6CIk8t15BKsj~P0JJpxrofeuxtm7SCUAJEr0AIYSYw8XOmp35UfcRPQWyb1LsxUkMT4WqxAT3s1ClIICWlBu5An~q-Mm0VFlrYLIPBWlUFnfPR7jZ9uP5ZMSzTKSMYUWao3ejiykr~mtEmyls6g-ZbgKZawa9II4zjOy-hdxHgP-eXMDseFsrym4Gpxvy~3Fv9TuiSqhpgm~UeTo5YBfxn6~TahKtE~~sdCiSydqmKBhxAQ7uT9lda7xt96SS09OYMsIWxLeQUWhns-C~FjJPp1D~IuTrUpAFcVEGVL-BRMmdWbfOJEcWPZ~CBCQSO~VkuN1ebvIOr9JBerFMZSxZtFl8JwcrjCIBxeKPBmfh~xYh16BJm1BBBmN1fp2DKmZ2jBNkAmnUbjQOqWvUcehrykWk5lZbE7bjJMDFH48v3SXwRuDBiHZmSbsTY6zhGY~GkMQHNGxPMMSIAAAA.i2p/bt",
|
||||||
|
"The freak's tracker", "http://mHKva9x24E5Ygfey2llR1KyQHv5f8hhMpDMwJDg1U-hABpJ2NrQJd6azirdfaR0OKt4jDlmP2o4Qx0H598~AteyD~RJU~xcWYdcOE0dmJ2e9Y8-HY51ie0B1yD9FtIV72ZI-V3TzFDcs6nkdX9b81DwrAwwFzx0EfNvK1GLVWl59Ow85muoRTBA1q8SsZImxdyZ-TApTVlMYIQbdI4iQRwU9OmmtefrCe~ZOf4UBS9-KvNIqUL0XeBSqm0OU1jq-D10Ykg6KfqvuPnBYT1BYHFDQJXW5DdPKwcaQE4MtAdSGmj1epDoaEBUa9btQlFsM2l9Cyn1hzxqNWXELmx8dRlomQLlV4b586dRzW~fLlOPIGC13ntPXogvYvHVyEyptXkv890jC7DZNHyxZd5cyrKC36r9huKvhQAmNABT2Y~pOGwVrb~RpPwT0tBuPZ3lHYhBFYmD8y~AOhhNHKMLzea1rfwTvovBMByDdFps54gMN1mX4MbCGT4w70vIopS9yAAAA.i2p/bytemonsoon/announce.php"
|
||||||
|
};
|
||||||
|
private void writeSeedForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
||||||
|
String uri = req.getRequestURI();
|
||||||
|
String baseFile = req.getParameter("baseFile");
|
||||||
|
if (baseFile == null)
|
||||||
|
baseFile = "";
|
||||||
|
|
||||||
|
out.write("<span class=\"snarkNewTorrent\">\n");
|
||||||
|
// *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
|
||||||
|
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
||||||
|
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n");
|
||||||
|
//out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br />\n");
|
||||||
|
out.write("Data to seed: <input type=\"text\" name=\"baseFile\" size=\"50\" value=\"" + baseFile
|
||||||
|
+ "\" title=\"File within " + _manager.getDataDir().getAbsolutePath() + " to seed\" /><br />\n");
|
||||||
|
out.write("Tracker: <select name=\"announceURL\"><option value=\"\">Select a tracker</option>\n");
|
||||||
|
for (int i = 0; i + 1 < DEFAULT_TRACKERS.length; i += 2)
|
||||||
|
out.write("\t<option value=\"" + DEFAULT_TRACKERS[i+1] + "\">" + DEFAULT_TRACKERS[i] + "</option>\n");
|
||||||
|
out.write("</select><br />\n");
|
||||||
|
out.write(" or: ");
|
||||||
|
out.write("<input type=\"text\" name=\"announceURLOther\" size=\"50\" value=\"http://\" " +
|
||||||
|
"title=\"Custom tracker URL\" /><br />\n");
|
||||||
|
out.write("<input type=\"submit\" value=\"Create torrent\" name=\"action\" />\n");
|
||||||
|
out.write("</form>\n</span>\n");
|
||||||
|
}
|
||||||
|
|
||||||
private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
||||||
String uri = req.getRequestURI();
|
String uri = req.getRequestURI();
|
||||||
String dataDir = _manager.getDataDir().getAbsolutePath();
|
String dataDir = _manager.getDataDir().getAbsolutePath();
|
||||||
|
@ -50,6 +50,7 @@ public class User {
|
|||||||
private static final String DEFAULT_FAVORITE_TAGS[] = {
|
private static final String DEFAULT_FAVORITE_TAGS[] = {
|
||||||
"syndie", "syndie.tech", "syndie.intro", "syndie.bugs", "syndie.featurerequest", "syndie.announce",
|
"syndie", "syndie.tech", "syndie.intro", "syndie.bugs", "syndie.featurerequest", "syndie.announce",
|
||||||
"i2p", "i2p.tech", "i2p.bugs", "i2p.i2phex", "i2p.susimail", "i2p.irc",
|
"i2p", "i2p.tech", "i2p.bugs", "i2p.i2phex", "i2p.susimail", "i2p.irc",
|
||||||
|
"bt.i2psnark", "bt.i2prufus", "bt.i2p-bt", "bt.azureus", "bt.misc",
|
||||||
"security.misc",
|
"security.misc",
|
||||||
"chat",
|
"chat",
|
||||||
"test"
|
"test"
|
||||||
|
@ -330,7 +330,8 @@ public abstract class BaseServlet extends HttpServlet {
|
|||||||
(AddressesServlet.ACTION_DELETE_OTHER.equals(action)) ||
|
(AddressesServlet.ACTION_DELETE_OTHER.equals(action)) ||
|
||||||
(AddressesServlet.ACTION_DELETE_TAG.equals(action)) ||
|
(AddressesServlet.ACTION_DELETE_TAG.equals(action)) ||
|
||||||
(AddressesServlet.ACTION_DELETE_PEER.equals(action)) ) {
|
(AddressesServlet.ACTION_DELETE_PEER.equals(action)) ) {
|
||||||
PetName pn = user.getPetNameDB().getByName(req.getParameter(AddressesServlet.PARAM_NAME));
|
String name = req.getParameter(AddressesServlet.PARAM_NAME);
|
||||||
|
PetName pn = user.getPetNameDB().getByName(name);
|
||||||
if (pn != null) {
|
if (pn != null) {
|
||||||
user.getPetNameDB().remove(pn);
|
user.getPetNameDB().remove(pn);
|
||||||
BlogManager.instance().saveUser(user);
|
BlogManager.instance().saveUser(user);
|
||||||
@ -580,7 +581,7 @@ public abstract class BaseServlet extends HttpServlet {
|
|||||||
//out.write("<tr class=\"topNav\"><td class=\"topNav_user\" colspan=\"2\" nowrap=\"true\">\n");
|
//out.write("<tr class=\"topNav\"><td class=\"topNav_user\" colspan=\"2\" nowrap=\"true\">\n");
|
||||||
out.write("<tr class=\"topNav\"><td colspan=\"3\" nowrap=\"true\"><span class=\"topNav_user\">\n");
|
out.write("<tr class=\"topNav\"><td colspan=\"3\" nowrap=\"true\"><span class=\"topNav_user\">\n");
|
||||||
out.write("<!-- nav bar begin -->\n");
|
out.write("<!-- nav bar begin -->\n");
|
||||||
out.write("<a href=\"threads.jsp\" title=\"Syndie home\">Home</a> <a href=\"blogs.jsp\" title=\"Blog summary\">Blogs</a> ");
|
out.write("<a href=\"threads.jsp\" title=\"Syndie home\">Threads</a> <a href=\"blogs.jsp\" title=\"Blog summary\">Blogs</a> ");
|
||||||
if (user.getAuthenticated() && (user.getBlog() != null) ) {
|
if (user.getAuthenticated() && (user.getBlog() != null) ) {
|
||||||
out.write("Logged in as <a href=\"" + getProfileLink(req, user.getBlog()) + "\" title=\"Edit your profile\">");
|
out.write("Logged in as <a href=\"" + getProfileLink(req, user.getBlog()) + "\" title=\"Edit your profile\">");
|
||||||
out.write(user.getUsername());
|
out.write(user.getUsername());
|
||||||
|
@ -26,8 +26,8 @@ public class ViewBlogsServlet extends BaseServlet {
|
|||||||
private String getViewBlogLink(Hash blog, long lastPost) {
|
private String getViewBlogLink(Hash blog, long lastPost) {
|
||||||
long dayBegin = BlogManager.instance().getDayBegin();
|
long dayBegin = BlogManager.instance().getDayBegin();
|
||||||
int daysAgo = 2;
|
int daysAgo = 2;
|
||||||
if ( (lastPost > 0) && (dayBegin - 3*24*60*6081000 > lastPost) ) // last post was old 3 days ago
|
if ( (lastPost > 0) && (dayBegin - 3*24*60*60*1000l >= lastPost) ) // last post was old 3 days ago
|
||||||
daysAgo = (int)((dayBegin - lastPost + 24*60*60*1000-1)/(24*60*60*1000));
|
daysAgo = (int)((dayBegin - lastPost + 24*60*60*1000l-1)/(24*60*60*1000l));
|
||||||
daysAgo++;
|
daysAgo++;
|
||||||
return getControlTarget() + "?" + ThreadedHTMLRenderer.PARAM_AUTHOR + '=' + blog.toBase64()
|
return getControlTarget() + "?" + ThreadedHTMLRenderer.PARAM_AUTHOR + '=' + blog.toBase64()
|
||||||
+ '&' + ThreadedHTMLRenderer.PARAM_THREAD_AUTHOR + "=true&daysBack=" + daysAgo;
|
+ '&' + ThreadedHTMLRenderer.PARAM_THREAD_AUTHOR + "=true&daysBack=" + daysAgo;
|
||||||
@ -65,7 +65,7 @@ public class ViewBlogsServlet extends BaseServlet {
|
|||||||
|
|
||||||
out.write("<tr><td colspan=\"3\" valign=\"top\" align=\"left\"><span class=\"syndieBlogFavorites\">");
|
out.write("<tr><td colspan=\"3\" valign=\"top\" align=\"left\"><span class=\"syndieBlogFavorites\">");
|
||||||
if ( (user != null) && (user.getAuthenticated()) ) {
|
if ( (user != null) && (user.getAuthenticated()) ) {
|
||||||
out.write("<b>Favorite blogs:</b><br />\n");
|
out.write("<b>Favorite blogs:</b> <a href=\"" + getControlTarget() + "?author=favorites&daysBack=3\" title=\"View all posts by your favorite authors in the last 3 days\">view all</a><br />\n");
|
||||||
out.write("<a href=\"" + getViewBlogLink(user.getBlog(), user.getLastMetaEntry())
|
out.write("<a href=\"" + getViewBlogLink(user.getBlog(), user.getLastMetaEntry())
|
||||||
+ "\" title=\"View your blog\">Your blog</a><br />\n");
|
+ "\" title=\"View your blog\">Your blog</a><br />\n");
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ public class PetNameDB {
|
|||||||
public boolean isEmpty() { return _names.isEmpty(); }
|
public boolean isEmpty() { return _names.isEmpty(); }
|
||||||
public Iterator iterator() { return new ArrayList(_names.values()).iterator(); }
|
public Iterator iterator() { return new ArrayList(_names.values()).iterator(); }
|
||||||
public void remove(PetName pn) {
|
public void remove(PetName pn) {
|
||||||
if (pn != null) _names.remove(pn.getName());
|
if (pn != null) _names.remove(pn.getName().toLowerCase());
|
||||||
}
|
}
|
||||||
public void removeName(String name) {
|
public void removeName(String name) {
|
||||||
if (name != null) _names.remove(name.toLowerCase());
|
if (name != null) _names.remove(name.toLowerCase());
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
$Id: history.txt,v 1.363 2005/12/18 00:39:54 jrandom Exp $
|
$Id: history.txt,v 1.364 2005/12/19 08:34:56 jrandom Exp $
|
||||||
|
|
||||||
|
2005-12-19 jrandom
|
||||||
|
* Fix for old Syndie blog bookmarks (thanks Complication!)
|
||||||
|
* Fix for I2PSnark to accept incoming connections again (oops)
|
||||||
|
* Randomize the order that peers from the tracker are contacted
|
||||||
|
|
||||||
2005-12-19 jrandom
|
2005-12-19 jrandom
|
||||||
* I2PSnark logging, disconnect old inactive peers rather than new ones,
|
* I2PSnark logging, disconnect old inactive peers rather than new ones,
|
||||||
|
@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class RouterVersion {
|
public class RouterVersion {
|
||||||
public final static String ID = "$Revision: 1.312 $ $Date: 2005/12/16 22:47:03 $";
|
public final static String ID = "$Revision: 1.313 $ $Date: 2005/12/19 08:34:55 $";
|
||||||
public final static String VERSION = "0.6.1.7";
|
public final static String VERSION = "0.6.1.7";
|
||||||
public final static long BUILD = 6;
|
public final static long BUILD = 7;
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
||||||
System.out.println("Router ID: " + RouterVersion.ID);
|
System.out.println("Router ID: " + RouterVersion.ID);
|
||||||
|
Reference in New Issue
Block a user