From 6eb09bd0c84192dcd5664e4c6eb8eee4425fd798 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 14 Mar 2018 14:09:41 +0000 Subject: [PATCH] i2ptunnel: Check port mapper for webapp presence (ticket #2161) --- .../i2p/i2ptunnel/I2PTunnelHTTPClient.java | 14 ++++--- .../i2ptunnel/I2PTunnelHTTPClientBase.java | 38 +++++++++++++++++-- .../localServer/LocalHTTPServer.java | 10 +++-- apps/i2ptunnel/jsp/editServer.jsi | 21 ++++++++++ .../src/net/i2p/util/TranslateReader.java | 11 +++++- 5 files changed, 82 insertions(+), 12 deletions(-) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java index 26649a657..dab99ceef 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java @@ -773,19 +773,23 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn out.write(("\n" + "").getBytes("UTF-8")); out.write(_t("Conflicting address helper destination").getBytes("UTF-8")); - out.write(("\n" + + out.write(("\n").getBytes("UTF-8")); + if (_context.portMapper().getPort(PortMapper.SVC_IMAGEGEN) > 0) { + out.write(("" + "" + "\n").getBytes("UTF-8")); - out.write(("\n" + + "\" width=\"160\" height=\"160\">\n" + + "\n" + "" + "\n").getBytes("UTF-8")); - out.write("".getBytes("UTF-8")); + "\" width=\"160\" height=\"160\">\n" + + "").getBytes("UTF-8")); + } + out.write("".getBytes("UTF-8")); } out.write("".getBytes("UTF-8")); writeFooter(out); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java index d9bbe58bb..a8c0b4c6b 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java @@ -7,9 +7,11 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; +import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.net.Socket; @@ -542,18 +544,48 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem char[] buf = new char[512]; StringBuilder out = new StringBuilder(2048); try { + boolean hasSusiDNS = ctx.portMapper().getPort(PortMapper.SVC_SUSIDNS) > 0; + boolean hasI2PTunnel = ctx.portMapper().getPort(PortMapper.SVC_I2PTUNNEL) > 0; + if (hasSusiDNS && hasI2PTunnel) { + reader = new TranslateReader(ctx, BUNDLE_NAME, new FileInputStream(file)); + } else { + // strip out the addressbook links + reader = new InputStreamReader(new FileInputStream(file), "UTF-8"); + int len; + while((len = reader.read(buf)) > 0) { + out.append(buf, 0, len); + } + reader.close(); + if (!hasSusiDNS) { + DataHelper.replace(out, "_(\"Addressbook\")", ""); + } + if (!hasI2PTunnel) { + // there are also a couple in auth-header.ht that aren't worth stripping, for auth only + DataHelper.replace(out, + "_(\"You may want to {0}retry{1} as this will randomly reselect an outproxy from the pool you have defined {2}here{3} (if you have more than one configured).\", \"\", \"\", \"\", \"\")", + ""); + DataHelper.replace(out, + "", + ""); + DataHelper.replace(out, + "_(\"If you continue to have trouble you may want to edit your outproxy list {0}here{1}.\", \"\", \"\")", + ""); + } + String s = out.toString(); + out.setLength(0); + reader = new TranslateReader(ctx, BUNDLE_NAME, new StringReader(s)); + } int len; - reader = new TranslateReader(ctx, BUNDLE_NAME, new FileInputStream(file)); while((len = reader.read(buf)) > 0) { out.append(buf, 0, len); } - String rv = out.toString(); // Do we need to replace http://127.0.0.1:7657 console links in the error page? // Get the registered host and port from the PortMapper. String url = ctx.portMapper().getConsoleURL(); if (!url.equals("http://127.0.0.1:7657/")) { - rv = rv.replace("http://127.0.0.1:7657/", url); + DataHelper.replace(out, "http://127.0.0.1:7657/", url); } + String rv = out.toString(); return rv; } finally { try { 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 82cca3769..db1a735e4 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java @@ -18,6 +18,7 @@ import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.i2ptunnel.I2PTunnelHTTPClient; import net.i2p.util.FileUtil; +import net.i2p.util.PortMapper; import net.i2p.util.Translate; /** @@ -199,7 +200,8 @@ public abstract class LocalHTTPServer { else tbook = book; - String conURL = I2PAppContext.getGlobalContext().portMapper().getConsoleURL(); + 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"+ @@ -214,8 +216,10 @@ public abstract class LocalHTTPServer { "\n" + "" + + "" + _t("Configuration") + " " + _t("Help") + "").getBytes("UTF-8")); + if (pm.getPort(PortMapper.SVC_SUSIDNS) > 0) + out.write((" " + _t("Addressbook") + "\n").getBytes("UTF-8")); + out.write(("" + "
\n" + "

" + (success ? diff --git a/apps/i2ptunnel/jsp/editServer.jsi b/apps/i2ptunnel/jsp/editServer.jsi index e0aeb0ee7..bbaee8bdf 100644 --- a/apps/i2ptunnel/jsp/editServer.jsi +++ b/apps/i2ptunnel/jsp/editServer.jsi @@ -217,6 +217,9 @@ ****/ String b64 = editBean.getDestinationBase64(curTunnel); + net.i2p.util.PortMapper pm = net.i2p.I2PAppContext.getGlobalContext().portMapper(); + boolean hasImagegen = pm.getPort(net.i2p.util.PortMapper.SVC_IMAGEGEN) > 0; + boolean hasSusiDNS = pm.getPort(net.i2p.util.PortMapper.SVC_SUSIDNS) > 0; if (!"".equals(b64)) { %> @@ -231,8 +234,18 @@ %> + <% + if (hasImagegen) { + %> " href="/imagegen/qr?s=320&t=<%=name%>&c=http%3a%2f%2f<%=name%>%2f%3fi2paddresshelper%3d<%=b64%>" target="_top"><%=intl._t("Generate QR Code")%> + <% + } + if (hasSusiDNS) { + %> " href="/susidns/addressbook.jsp?book=private&hostname=<%=name%>&destination=<%=b64%>#add"><%=intl._t("Add to local addressbook")%> + <% + } + %> " href="register?tunnel=<%=curTunnel%>"><%=intl._t("Registration Authentication")%> <% @@ -887,9 +900,17 @@ + <% + if (hasImagegen) { + %> " href="/imagegen/qr?s=320&t=<%=name%>&c=http%3a%2f%2f<%=name%>%2f%3fi2paddresshelper%3d<%=ab64%>" target="_top"><%=intl._t("Generate QR Code")%> + <% + } + if (hasSusiDNS) { + %> " href="/susidns/addressbook.jsp?book=private&hostname=<%=name%>&destination=<%=ab64%>#add"><%=intl._t("Add to local addressbook")%> <% + } } else { %> diff --git a/core/java/src/net/i2p/util/TranslateReader.java b/core/java/src/net/i2p/util/TranslateReader.java index b1b4db18e..8119b1dde 100644 --- a/core/java/src/net/i2p/util/TranslateReader.java +++ b/core/java/src/net/i2p/util/TranslateReader.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; +import java.io.Reader; import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; @@ -68,7 +69,15 @@ public class TranslateReader extends FilterReader { * @param in UTF-8 */ public TranslateReader(I2PAppContext ctx, String bundle, InputStream in) throws IOException { - super(new BufferedReader(new InputStreamReader(in, "UTF-8"))); + this(ctx, bundle, new BufferedReader(new InputStreamReader(in, "UTF-8"))); + } + + /** + * @param bundle may be null for tagging only + * @since 0.9.34 + */ + public TranslateReader(I2PAppContext ctx, String bundle, Reader in) throws IOException { + super(in); _ctx = ctx; _bundle = bundle; _args = new ArrayList(4);