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);
|