diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index 77c10d402..320b5005a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -457,14 +457,18 @@ public class I2PSnarkUtil { _openTrackerString = ot; } + /** Comma delimited list of open trackers to use as backups + * non-null but possibly empty + */ public String getOpenTrackerString() { if (_openTrackerString == null) return DEFAULT_OPENTRACKERS; return _openTrackerString; } - /** comma delimited list open trackers to use as backups */ - /** sorted map of name to announceURL=baseURL */ + /** List of open trackers to use as backups + * Null if disabled + */ public List getOpenTrackers() { if (!shouldUseOpenTrackers()) return null; diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 94e797456..7c1c421a8 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -365,7 +365,7 @@ public class SnarkManager implements Snark.CompleteListener { public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay, String startDelay, String seedPct, String eepHost, String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts, - String upLimit, String upBW, boolean useOpenTrackers, String openTrackers, String theme) { + String upLimit, String upBW, boolean useOpenTrackers, String theme) { boolean changed = false; //if (eepHost != null) { // // unused, we use socket eepget @@ -549,14 +549,6 @@ public class SnarkManager implements Snark.CompleteListener { _util.setUseOpenTrackers(useOpenTrackers); changed = true; } - if (openTrackers != null) { - if (openTrackers.trim().length() > 0 && !openTrackers.trim().equals(_util.getOpenTrackerString())) { - _config.setProperty(PROP_OPENTRACKERS, openTrackers.trim()); - _util.setOpenTrackerString(openTrackers); - addMessage(_("Open Tracker list changed - torrent restart required to take effect.")); - changed = true; - } - } if (theme != null) { if(!theme.equals(_config.getProperty(PROP_THEME))) { _config.setProperty(PROP_THEME, theme); @@ -571,6 +563,20 @@ public class SnarkManager implements Snark.CompleteListener { } } + /** + * @param ot null to restore default + * @since 0.9.1 + */ + public void saveOpenTrackers(String ot) { + _util.setOpenTrackerString(ot); + if (ot != null) + _config.setProperty(PROP_OPENTRACKERS, ot); + else + _config.remove(PROP_OPENTRACKERS); + addMessage(_("Open Tracker list changed - torrent restart required to take effect.")); + saveConfig(); + } + public void saveConfig() { try { synchronized (_configFile) { 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 06c0581ab..dd9b14ba3 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -693,11 +693,11 @@ public class I2PSnarkServlet extends DefaultServlet { String refreshDel = req.getParameter("refreshDelay"); String startupDel = req.getParameter("startupDelay"); boolean useOpenTrackers = req.getParameter("useOpenTrackers") != null; - String openTrackers = req.getParameter("openTrackers"); + //String openTrackers = req.getParameter("openTrackers"); String theme = req.getParameter("theme"); _manager.updateConfig(dataDir, filesPublic, autoStart, refreshDel, startupDel, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, - upLimit, upBW, useOpenTrackers, openTrackers, theme); + upLimit, upBW, useOpenTrackers, theme); } else if ("Save2".equals(action)) { String taction = req.getParameter("taction"); if (taction != null) @@ -771,26 +771,35 @@ public class I2PSnarkServlet extends DefaultServlet { /** @since 0.9 */ private void processTrackerForm(String action, HttpServletRequest req) { - if (action.equals(_("Delete selected"))) { + if (action.equals(_("Delete selected")) || action.equals(_("Change open trackers"))) { boolean changed = false; Map trackers = _manager.getTrackerMap(); + StringBuilder openBuf = new StringBuilder(128); Enumeration e = req.getParameterNames(); while (e.hasMoreElements()) { Object o = e.nextElement(); if (!(o instanceof String)) continue; String k = (String) o; - if (!k.startsWith("delete_")) - continue; - k = k.substring(7); - if (trackers.remove(k) != null) { - _manager.addMessage(_("Removed") + ": " + k); - changed = true; + if (k.startsWith("delete_")) { + k = k.substring(7); + if (trackers.remove(k) != null) { + _manager.addMessage(_("Removed") + ": " + k); + changed = true; + } + } else if (k.startsWith("open_")) { + if (openBuf.length() > 0) + openBuf.append(','); + openBuf.append(k.substring(5)); } } if (changed) { _manager.saveTrackerMap(); } + String newOpen = openBuf.toString(); + if (!newOpen.equals(_manager.util().getOpenTrackerString())) { + _manager.saveOpenTrackers(newOpen); + } } else if (action.equals(_("Add tracker"))) { String name = req.getParameter("tname"); String hurl = req.getParameter("thurl"); @@ -803,6 +812,11 @@ public class I2PSnarkServlet extends DefaultServlet { Map trackers = _manager.getTrackerMap(); trackers.put(name, new Tracker(name, aurl, hurl)); _manager.saveTrackerMap(); + if (req.getParameter("_add_open_") != null) { + String oldOpen = _manager.util().getOpenTrackerString(); + String newOpen = oldOpen.length() <= 0 ? aurl : oldOpen + ',' + aurl; + _manager.saveOpenTrackers(newOpen); + } } else { _manager.addMessage(_("Enter valid tracker name and URLs")); } @@ -811,6 +825,7 @@ public class I2PSnarkServlet extends DefaultServlet { } } else if (action.equals(_("Restore defaults"))) { _manager.setDefaultTrackerMap(); + _manager.saveOpenTrackers(null); _manager.addMessage(_("Restored default trackers")); } else { _manager.addMessage("Unknown POST action: \"" + action + '\"'); @@ -1422,7 +1437,7 @@ public class I2PSnarkServlet extends DefaultServlet { boolean filesPublic = _manager.areFilesPublic(); boolean autoStart = _manager.shouldAutoStart(); boolean useOpenTrackers = _manager.util().shouldUseOpenTrackers(); - String openTrackers = _manager.util().getOpenTrackerString(); + //String openTrackers = _manager.util().getOpenTrackerString(); //int seedPct = 0; out.write("
\n" + @@ -1536,12 +1551,12 @@ public class I2PSnarkServlet extends DefaultServlet { + (useOpenTrackers ? "checked " : "") + "title=\""); out.write(_("If checked, announce torrents to open trackers as well as the tracker listed in the torrent file")); - out.write("\" > " + + out.write("\" >\n"); - ""); - out.write(_("Open tracker announce URLs")); - out.write(":
\n"); + // ""); + //out.write(_("Open tracker announce URLs")); + //out.write(":
\n"); //out.write("\n"); //out.write("EepProxy host: ") .append(_("Website URL")) .append("") + .append(_("Open Tracker?")) + .append("") .append(_("Announce URL")) .append("\n"); + List openTrackers = _manager.util().getOpenTrackers(); for (Tracker t : _manager.getSortedTrackers()) { String name = t.name; String homeURL = t.baseURL; String announceURL = t.announceURL.replace("=", "="); buf.append("" + + .append(name).append("\" title=\"").append(_("Delete")).append("\">" + "").append(name) .append("").append(urlify(homeURL, 35)) - .append("").append(urlify(announceURL, 35)) + .append("" + + "").append(urlify(announceURL, 35)) .append("\n"); } buf.append("") .append(_("Add")).append(":" + "" + "" + + "" + "\n" + - "\n" + + "\n" + "\n" + "\n" + + "\n" + // "\n" + "\n" + "\n" +