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 e91ceb5da1fa008c53669abae21253297a6f9ab5..93870af97ff13bbcd1fd6df4f83e16db7ad6444c 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -246,6 +246,9 @@ public class I2PSnarkServlet extends Default { } } out.write("</div>\n"); + String newURL = req.getParameter("newURL"); + if (newURL != null && newURL.trim().length() > 0 && req.getMethod().equals("GET")) + _manager.addMessage(_("Click \"Add torrent\" button to fetch torrent")); out.write("<div class=\"page\"><div class=\"mainsection\"><div class=\"snarkMessages\"><table><tr><td align=\"left\"><pre>"); List msgs = _manager.getMessages(); for (int i = msgs.size()-1; i >= 0; i--) { @@ -491,6 +494,8 @@ public class I2PSnarkServlet extends Default { *****/ if (newURL != null) { if (newURL.startsWith("http://")) { + if (!_manager.util().connected()) + _manager.addMessage(_("Opening the I2P tunnel")); _manager.addMessage(_("Fetching {0}", urlify(newURL))); I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add", true); fetch.start(); @@ -1174,8 +1179,9 @@ public class I2PSnarkServlet extends Default { } private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException { + // display incoming parameter if a GET so links will work String newURL = req.getParameter("newURL"); - if ( (newURL == null) || (newURL.trim().length() <= 0) ) + if (newURL == null || newURL.trim().length() <= 0 || req.getMethod().equals("POST")) newURL = ""; else newURL = DataHelper.stripHTML(newURL); // XSS @@ -1220,7 +1226,7 @@ public class I2PSnarkServlet extends Default { else baseFile = DataHelper.stripHTML(baseFile); // XSS - out.write("<div class=\"newtorrentsection\"><div class=\"snarkNewTorrent\">\n"); + out.write("<a name=\"add\"></a><div class=\"newtorrentsection\"><div class=\"snarkNewTorrent\">\n"); // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file out.write("<form action=\"_post\" method=\"POST\">\n"); out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n"); @@ -2040,13 +2046,29 @@ private static class FetchAndAdd implements Runnable { try { if (in != null) in.close(); } catch (IOException ioe) {} } } else { - _manager.addMessage(_("Torrent was not retrieved from {0}", urlify(_url))); + // Generate a retry link, but sadly can't have a form inside a table + // So make this an ugly GET + StringBuilder buf = new StringBuilder(1024); + // FIXME don't lose peer setting + //String peerParam = req.getParameter("p"); + //if (peerParam != null) + // buf.append("<input type=\"hidden\" name=\"p\" value=\"").append(peerParam).append("\" >\n"); + buf.append(_("Torrent was not retrieved from {0}", urlify(_url))); + String link = _url.replace("&", "&").replace(" ", "%20").replace(":", "%3A").replace("/", "%2F"); + buf.append(" - [<a href=\"/i2psnark/?newURL=").append(link).append("#add\" >"); + buf.append(_("Retry")); + buf.append("</a>]"); + _manager.addMessage(buf.toString()); } } finally { if (file != null) file.delete(); } } + private String _(String s) { + return _manager.util().getString(s); + } + private String _(String s, String o) { return _manager.util().getString(s, o); } diff --git a/installer/resources/themes/snark/ubergine/snark.css b/installer/resources/themes/snark/ubergine/snark.css index 56124cb6d448c98e3f0f9b887ad98113b8ab81e8..e029ba0ab8e5f79e2bbc787dfcedc6a5acf22ee6 100644 --- a/installer/resources/themes/snark/ubergine/snark.css +++ b/installer/resources/themes/snark/ubergine/snark.css @@ -95,15 +95,15 @@ body { color: #26f; height: 70px; width: auto; - background: #101 url('/themes/snark/ubergine/images/hat.png') no-repeat scroll right center; + background: #2a192a url('/themes/snark/ubergine/images/hat.png') no-repeat scroll right center; } .snarkMessages a:link, .snarkMessages a:visited { - color: #37f !important; + color: #69f !important; } .snarkMessages a:hover { - color: #59f !important; + color: #f90 !important; } .logshim { @@ -116,7 +116,7 @@ pre { padding: 0; text-align: left !important; height: 8px; - color: #13f; + color: #35f; font-weight: bold !important; } @@ -515,7 +515,7 @@ input[type=image]:hover, thead img:hover { } input[type=text]:active, input[type=text]:hover, input.r:hover { - background: #f60; + background: #d60; color: #fff; }