diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java index c2db75cb9c745b7ed34b011e79b0d5058e19af59..892c80643011375701556a7e2460361c0567c1d0 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java @@ -210,7 +210,11 @@ public abstract class LocalHTTPServer { String nonce = opts.get("nonce"); String code = opts.get("code"); String privkey = opts.get("privkey"); + if (privkey != null) + privkey = privkey.trim(); String secret = opts.get("secret"); + if (secret != null) + secret = secret.trim(); String action = opts.get("action"); if (proxyNonce.equals(nonce) && url != null && host != null && code != null) { boolean success = true; @@ -218,7 +222,7 @@ public abstract class LocalHTTPServer { if (!code.equals("2") && !code.equals("4")) { secret = null; } else if (secret == null || secret.length() == 0) { - err = "Missing lookup password"; + err = _t("Missing lookup password"); success = false; } @@ -231,12 +235,12 @@ public abstract class LocalHTTPServer { privateKey = kp.getPrivate(); authType = action.equals("newdh") ? BlindData.AUTH_DH : BlindData.AUTH_PSK; } else if (privkey == null || privkey.length() == 0) { - err = "Missing private key"; + err = _t("Missing private key"); success = false; } else { byte[] data = Base64.decode(privkey); if (data == null || data.length != 32) { - err = "Bad private key"; + err = _t("Invalid private key"); success = false; } else { privateKey = new PrivateKey(EncType.ECIES_X25519, data); @@ -258,7 +262,7 @@ public abstract class LocalHTTPServer { bd.setExpiration(exp); I2PSession sess = sockMgr.getSession(); sess.sendBlindingInfo(bd); - writeRedirectPage(out, success, host, "FIXME", url); + writeB32RedirectPage(out, host, url); return; } catch (IllegalArgumentException iae) { err = iae.toString(); @@ -269,7 +273,7 @@ public abstract class LocalHTTPServer { } out.write(ERR_B32.getBytes("UTF-8")); if (err != null) - out.write(("\n\n" + err + "\n\nGo back and fix it").getBytes("UTF-8")); + out.write(("\n\n" + err + "\n\n" + _t("Go back and fix the error")).getBytes("UTF-8")); } else { out.write(ERR_404.getBytes("UTF-8")); } @@ -320,6 +324,38 @@ public abstract class LocalHTTPServer { out.flush(); } + /** @since 0.9.43 */ + private static void writeB32RedirectPage(OutputStream out, String host, String url) throws IOException { + PortMapper pm = I2PAppContext.getGlobalContext().portMapper(); + String conURL = pm.getConsoleURL(); + out.write(("HTTP/1.1 200 OK\r\n"+ + "Content-Type: text/html; charset=UTF-8\r\n"+ + "Referrer-Policy: no-referrer\r\n"+ + "Connection: close\r\n"+ + "Proxy-Connection: close\r\n"+ + "\r\n"+ + "<html><head>"+ + "<title>" + _t("Redirecting to {0}", host) + "</title>\n" + + "<link rel=\"shortcut icon\" href=\"http://proxy.i2p/themes/console/images/favicon.ico\" >\n" + + "<link href=\"http://proxy.i2p/themes/console/default/console.css\" rel=\"stylesheet\" type=\"text/css\" >\n" + + "<meta http-equiv=\"Refresh\" content=\"1; url=" + url + "\">\n" + + "</head><body>\n" + + "<div class=logo>\n" + + "<a href=\"" + conURL + "\" title=\"" + _t("Router Console") + "\"><img src=\"http://proxy.i2p/themes/console/images/i2plogo.png\" alt=\"I2P Router Console\" border=\"0\"></a><hr>\n" + + "<a href=\"" + conURL + "config\">" + _t("Configuration") + "</a> <a href=\"" + conURL + "help.jsp\">" + _t("Help") + "</a>").getBytes("UTF-8")); + if (pm.isRegistered(PortMapper.SVC_SUSIDNS)) + out.write((" <a href=\"" + conURL + "susidns/index\">" + _t("Addressbook") + "</a>\n").getBytes("UTF-8")); + out.write(("</div>" + + "<div class=warning id=warning>\n" + + "<h3>" + + _t("Saved the authentication for {0}, redirecting now.", host) + + "</h3>\n<p><a href=\"" + url + "\">" + + _t("Click here if you are not redirected automatically.") + + "</a></p></div>").getBytes("UTF-8")); + I2PTunnelHTTPClient.writeFooter(out); + out.flush(); + } + /** * Parse an encoded query. * Only supports ONE value per key.