diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 30e21752e49cb3871267cd122d6b8dd436724db0..8ee32d985fb545d15fc144c64894599bbc4ee8ed 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -129,6 +129,9 @@ public class SnarkManager implements CompleteListener { /** * "name", "announceURL=websiteURL" pairs * '=' in announceURL must be escaped as , + * + * Please use host name, not b32 or full dest, in announce URL. Ensure in default hosts.txt. + * Please use host name, not b32 or full dest, in website URL. Ensure in default hosts.txt. */ private static final String DEFAULT_TRACKERS[] = { // "Postman", "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=http://tracker.postman.i2p/" diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java index c30ccb0cc89dd24c593381f00d93ceb4dc0cca3c..17579af0b23c56f02247f114e532821bc1bf34a9 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java +++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java @@ -72,6 +72,7 @@ public class TrackerClient implements Runnable { private static final String STOPPED_EVENT = "stopped"; private static final String NOT_REGISTERED = "torrent not registered"; //bytemonsoon private static final String NOT_REGISTERED_2 = "torrent not found"; // diftracker + private static final String NOT_REGISTERED_3 = "torrent unauthorised"; // vuze /** this is our equivalent to router.utorrent.com for bootstrap */ private static final String DEFAULT_BACKUP_TRACKER = "http://tracker.welterde.i2p/a"; @@ -577,14 +578,19 @@ public class TrackerClient implements Runnable { if (tr.isPrimary) snark.setTrackerProblems(tr.trackerProblems); String tplc = tr.trackerProblems.toLowerCase(Locale.US); - if (tplc.startsWith(NOT_REGISTERED) || tplc.startsWith(NOT_REGISTERED_2)) { + if (tplc.startsWith(NOT_REGISTERED) || tplc.startsWith(NOT_REGISTERED_2) || + tplc.startsWith(NOT_REGISTERED_3)) { // Give a guy some time to register it if using opentrackers too //if (trckrs.size() == 1) { // stop = true; // snark.stopTorrent(); //} else { // hopefully each on the opentrackers list is really open if (tr.registerFails++ > MAX_REGISTER_FAILS || + !completed || // no use retrying if we aren't seeding (!tr.isPrimary && tr.registerFails > MAX_REGISTER_FAILS / 2)) + if (_log.shouldLog(Log.WARN)) + _log.warn("Not longer announcing to " + tr.announce + " : " + + tr.trackerProblems + " after " + tr.registerFails + " failures"); tr.stop = true; // } diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 96890d8f166e7e6182655999ded298cb4af34fcf..e8fdcff91e5e8f29d57762280db00f93050e03c9 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -25,8 +25,10 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import net.i2p.data.Base32; import net.i2p.data.Base64; import net.i2p.data.DataHelper; +import net.i2p.data.Hash; import net.i2p.util.Log; import org.klomp.snark.I2PSnarkUtil; @@ -1717,8 +1719,10 @@ public class I2PSnarkServlet extends BasicServlet { } /** - * Start of anchor only, caller must add anchor text or img and close anchor - * @return string or null + * Generate link to details page if we know it supports it. + * Start of anchor only, caller must add anchor text or img and close anchor. + * + * @return string or null if unknown tracker * @since 0.8.4 */ private String getTrackerLinkUrl(String announce, byte[] infohash) { @@ -1745,8 +1749,8 @@ public class I2PSnarkServlet extends BasicServlet { } /** - * Full anchor with img - * @return string or null + * Full link to details page with img + * @return string or null if details page unsupported * @since 0.8.4 */ private String getTrackerLink(String announce, byte[] infohash) { @@ -1762,7 +1766,7 @@ public class I2PSnarkServlet extends BasicServlet { } /** - * Full anchor with shortened URL as anchor text + * Full anchor to home page or details page with shortened host name as anchor text * @return string, non-null * @since 0.9.5 */ @@ -1771,14 +1775,37 @@ public class I2PSnarkServlet extends BasicServlet { String trackerLinkUrl = getTrackerLinkUrl(announce, infohash); if (announce.startsWith("http://")) announce = announce.substring(7); + // strip path int slsh = announce.indexOf('/'); if (slsh > 0) announce = announce.substring(0, slsh); - if (trackerLinkUrl != null) + if (trackerLinkUrl != null) { buf.append(trackerLinkUrl); - else - // TODO encode - buf.append("<a href=\"http://").append(urlEncode(announce)).append("/\">"); + } else { + // browsers don't like a full b64 dest, so convert it to b32 + String host = announce; + if (host.length() >= 516) { + int colon = announce.indexOf(':'); + String port = ""; + if (colon > 0) { + port = host.substring(colon); + host = host.substring(0, colon); + } + if (host.endsWith(".i2p")) + host = host.substring(0, host.length() - 4); + byte[] b = Base64.decode(host); + if (b != null) { + Hash h = _context.sha().calculateHash(b); + // should we add the port back or strip it? + host = Base32.encode(h.getData()) + ".b32.i2p" + port; + } + } + buf.append("<a href=\"http://").append(urlEncode(host)).append("/\">"); + } + // strip port + int colon = announce.indexOf(':'); + if (colon > 0) + announce = announce.substring(0, colon); if (announce.length() > 67) announce = DataHelper.escapeHTML(announce.substring(0, 40)) + "…" + DataHelper.escapeHTML(announce.substring(announce.length() - 8));