propagate from branch 'i2p.i2p.str4d.fux' (head 48cafeb29fb3408078a8b93c0bab0fc9d766a8bc)
to branch 'i2p.i2p' (head 47f04ff21e8edd00134a0fd68219f86fd3caba36)
@ -232,7 +232,7 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
//out.write("<meta http-equiv=\"refresh\" content=\"" + delay + ";/i2psnark/" + peerString + "\">\n");
|
||||
out.write("<script src=\"/js/ajax.js\" type=\"text/javascript\"></script>\n" +
|
||||
"<script type=\"text/javascript\">\n" +
|
||||
"var failMessage = \"<b>" + _("Router is down") + "<\\/b>\";\n" +
|
||||
"var failMessage = \"<div class=\"routerdown\"><b>" + _("Router is down") + "<\\/b></div>\";\n" +
|
||||
"function requestAjax1() { ajax(\"/i2psnark/.ajax/xhr1.html" + peerString + "\", \"mainsection\", " + (delay*1000) + "); }\n" +
|
||||
"function initAjax(delayMs) { setTimeout(requestAjax1, " + (delay*1000) +"); }\n" +
|
||||
"</script>\n");
|
||||
@ -1325,7 +1325,7 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
* @return string or null
|
||||
* @since 0.8.4
|
||||
*/
|
||||
private String getTrackerLink(String announce, byte[] infohash) {
|
||||
private String getTrackerLinkUrl(String announce, byte[] infohash) {
|
||||
// temporarily hardcoded for postman* and anonymity, requires bytemonsoon patch for lookup by info_hash
|
||||
if (announce != null && (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") ||
|
||||
announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/") ||
|
||||
@ -1341,15 +1341,29 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
StringBuilder buf = new StringBuilder(128);
|
||||
buf.append("<a href=\"").append(baseURL).append("details.php?dllist=1&filelist=1&info_hash=")
|
||||
.append(TrackerClient.urlencode(infohash))
|
||||
.append("\" title=\"").append(_("Details at {0} tracker", name)).append("\" target=\"_blank\">" +
|
||||
"<img alt=\"").append(_("Info")).append("\" border=\"0\" src=\"")
|
||||
.append(_imgPath).append("details.png\"></a>");
|
||||
.append("\" title=\"").append(_("Details at {0} tracker", name)).append("\" target=\"_blank\">");
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string or null
|
||||
* @since 0.8.4
|
||||
*/
|
||||
private String getTrackerLink(String announce, byte[] infohash) {
|
||||
String linkUrl = getTrackerLinkUrl(announce, infohash);
|
||||
if (linkUrl != null) {
|
||||
StringBuilder buf = new StringBuilder(128);
|
||||
buf.append(linkUrl)
|
||||
.append("<img alt=\"").append(_("Info")).append("\" border=\"0\" src=\"")
|
||||
.append(_imgPath).append("details.png\"></a>");
|
||||
return buf.toString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
||||
// display incoming parameter if a GET so links will work
|
||||
String newURL = req.getParameter("newURL");
|
||||
@ -1560,9 +1574,9 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
out.write(": <td><input type=\"text\" name=\"upBW\" class=\"r\" value=\""
|
||||
+ _manager.util().getMaxUpBW() + "\" size=\"4\" maxlength=\"4\" > KBps <i>");
|
||||
out.write(_("Half available bandwidth recommended."));
|
||||
out.write("<br><a href=\"/config.jsp\" target=\"blank\">");
|
||||
out.write(" [<a href=\"/config.jsp\" target=\"blank\">");
|
||||
out.write(_("View or change router bandwidth"));
|
||||
out.write("</a></i><br>\n" +
|
||||
out.write("</a>]</i><br>\n" +
|
||||
|
||||
"<tr><td>");
|
||||
out.write(_("Use open trackers also"));
|
||||
@ -1640,7 +1654,7 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
"<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
|
||||
buf.append(_("Trackers"));
|
||||
buf.append("</span><hr>\n" +
|
||||
"<table><tr><th>")
|
||||
"<table class=\"trackerconfig\"><tr><th>")
|
||||
//.append(_("Remove"))
|
||||
.append("</th><th>")
|
||||
.append(_("Name"))
|
||||
@ -1659,16 +1673,16 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
String name = t.name;
|
||||
String homeURL = t.baseURL;
|
||||
String announceURL = t.announceURL.replace("=", "=");
|
||||
buf.append("<tr><td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"delete_")
|
||||
buf.append("<tr><td><input type=\"checkbox\" class=\"optbox\" name=\"delete_")
|
||||
.append(name).append("\" title=\"").append(_("Delete")).append("\">" +
|
||||
"</td><td align=\"left\">").append(name)
|
||||
.append("</td><td align=\"left\">").append(urlify(homeURL, 35))
|
||||
.append("</td><td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"open_")
|
||||
"</td><td>").append(name)
|
||||
.append("</td><td>").append(urlify(homeURL, 35))
|
||||
.append("</td><td><input type=\"checkbox\" class=\"optbox\" name=\"open_")
|
||||
.append(announceURL).append("\"");
|
||||
if (openTrackers.contains(t.announceURL))
|
||||
buf.append(" checked=\"checked\"");
|
||||
buf.append(">" +
|
||||
"</td><td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"private_")
|
||||
"</td><td><input type=\"checkbox\" class=\"optbox\" name=\"private_")
|
||||
.append(announceURL).append("\"");
|
||||
if (privateTrackers.contains(t.announceURL)) {
|
||||
buf.append(" checked=\"checked\"");
|
||||
@ -1681,17 +1695,17 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
}
|
||||
}
|
||||
buf.append(">" +
|
||||
"</td><td align=\"left\">").append(urlify(announceURL, 35))
|
||||
"</td><td>").append(urlify(announceURL, 35))
|
||||
.append("</td></tr>\n");
|
||||
}
|
||||
buf.append("<tr><td align=\"center\"><b>")
|
||||
buf.append("<tr><td><b>")
|
||||
.append(_("Add")).append(":</b></td>" +
|
||||
"<td align=\"left\"><input type=\"text\" size=\"16\" name=\"tname\"></td>" +
|
||||
"<td align=\"left\"><input type=\"text\" size=\"40\" name=\"thurl\"></td>" +
|
||||
"<td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"_add_open_\"></td>" +
|
||||
"<td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"_add_private_\"></td>" +
|
||||
"<td align=\"left\"><input type=\"text\" size=\"40\" name=\"taurl\"></td></tr>\n" +
|
||||
"<tr><td colspan=\"2\"></td><td colspan=\"4\" align=\"left\">\n" +
|
||||
"<td><input type=\"text\" class=\"trackername\" name=\"tname\"></td>" +
|
||||
"<td><input type=\"text\" class=\"trackerhome\" name=\"thurl\"></td>" +
|
||||
"<td><input type=\"checkbox\" class=\"optbox\" name=\"_add_open_\"></td>" +
|
||||
"<td><input type=\"checkbox\" class=\"optbox\" name=\"_add_private_\"></td>" +
|
||||
"<td><input type=\"text\" class=\"trackerannounce\" name=\"taurl\"></td></tr>\n" +
|
||||
"<tr><td colspan=\"2\"></td><td colspan=\"4\">\n" +
|
||||
"<input type=\"submit\" name=\"taction\" class=\"default\" value=\"").append(_("Add tracker")).append("\">\n" +
|
||||
"<input type=\"submit\" name=\"taction\" class=\"delete\" value=\"").append(_("Delete selected")).append("\">\n" +
|
||||
"<input type=\"submit\" name=\"taction\" class=\"accept\" value=\"").append(_("Save tracker configuration")).append("\">\n" +
|
||||
@ -2049,40 +2063,34 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
boolean showPriority = ls != null && snark != null && snark.getStorage() != null && !snark.getStorage().complete();
|
||||
if (showPriority)
|
||||
buf.append("<form action=\"").append(base).append("\" method=\"POST\">\n");
|
||||
buf.append("<TABLE BORDER=0 class=\"snarkTorrents\" ><thead>");
|
||||
if (snark != null) {
|
||||
// first row - torrent info
|
||||
// FIXME center
|
||||
buf.append("<tr><th colspan=\"" + (showPriority ? '4' : '3') + "\"><div>")
|
||||
.append(_("Torrent")).append(": ").append(snark.getBaseName());
|
||||
int pieces = snark.getPieces();
|
||||
double completion = (pieces - snark.getNeeded()) / (double) pieces;
|
||||
if (completion < 1.0)
|
||||
buf.append("<br>").append(_("Completion")).append(": ").append((new DecimalFormat("0.00%")).format(completion));
|
||||
else
|
||||
buf.append("<br>").append(_("Complete"));
|
||||
// else unknown
|
||||
long needed = snark.getNeededLength();
|
||||
if (needed > 0)
|
||||
buf.append("<br>").append(_("Remaining")).append(": ").append(formatSize(needed));
|
||||
buf.append("<br>").append(_("Size")).append(": ").append(formatSize(snark.getTotalLength()));
|
||||
MetaInfo meta = snark.getMetaInfo();
|
||||
if (meta != null) {
|
||||
List files = meta.getFiles();
|
||||
int fileCount = files != null ? files.size() : 1;
|
||||
buf.append("<br>").append(_("Files")).append(": ").append(fileCount);
|
||||
}
|
||||
buf.append("<br>").append(_("Pieces")).append(": ").append(pieces);
|
||||
buf.append("<br>").append(_("Piece size")).append(": ").append(formatSize(snark.getPieceLength(0)));
|
||||
// first table - torrent info
|
||||
buf.append("<table class=\"snarkTorrentInfo\">\n");
|
||||
buf.append("<tr><th><b>")
|
||||
.append(_("Torrent"))
|
||||
.append(":</b> ")
|
||||
.append(snark.getBaseName())
|
||||
.append("</th></tr>\n");
|
||||
|
||||
buf.append("<tr><td>")
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > <b>")
|
||||
.append(_("Torrent file"))
|
||||
.append(":</b> ")
|
||||
.append(snark.getName())
|
||||
.append("</td></tr>\n");
|
||||
|
||||
MetaInfo meta = snark.getMetaInfo();
|
||||
if (meta != null) {
|
||||
String announce = meta.getAnnounce();
|
||||
if (announce != null) {
|
||||
buf.append("<br>");
|
||||
buf.append("<tr><td>");
|
||||
String trackerLink = getTrackerLink(announce, snark.getInfoHash());
|
||||
if (trackerLink != null)
|
||||
buf.append(trackerLink).append(' ');
|
||||
buf.append(_("Tracker")).append(": ");
|
||||
buf.append("<b>").append(_("Tracker")).append(":</b> ");
|
||||
String trackerLinkUrl = getTrackerLinkUrl(announce, snark.getInfoHash());
|
||||
if (trackerLinkUrl != null)
|
||||
buf.append(trackerLinkUrl);
|
||||
if (announce.startsWith("http://"))
|
||||
announce = announce.substring(7);
|
||||
int slsh = announce.indexOf('/');
|
||||
@ -2091,53 +2099,110 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
if (announce.length() > 67)
|
||||
announce = announce.substring(0, 40) + "…" + announce.substring(announce.length() - 8);
|
||||
buf.append(announce);
|
||||
if (trackerLinkUrl != null)
|
||||
buf.append("</a>");
|
||||
buf.append("</td></tr>");
|
||||
}
|
||||
}
|
||||
|
||||
String hex = I2PSnarkUtil.toHex(snark.getInfoHash());
|
||||
if (meta == null || !meta.isPrivate()) {
|
||||
buf.append("<br>").append(toImg("magnet", _("Magnet link"))).append(" <a href=\"")
|
||||
buf.append("<tr><td><a href=\"")
|
||||
.append(MAGNET_FULL).append(hex).append("\">")
|
||||
.append(MAGNET_FULL).append(hex).append("</a>");
|
||||
.append(toImg("magnet", _("Magnet link")))
|
||||
.append("</a> <b>Magnet:</b> <a href=\"")
|
||||
.append(MAGNET_FULL).append(hex).append("\">")
|
||||
.append(MAGNET_FULL).append(hex).append("</a>")
|
||||
.append("</td></tr>\n");
|
||||
} else {
|
||||
buf.append("<br>").append(_("Private torrent"));
|
||||
buf.append("<tr><td>")
|
||||
.append(_("Private torrent"))
|
||||
.append("</td></tr>\n");
|
||||
}
|
||||
// We don't have the hash of the torrent file
|
||||
//buf.append("<br>").append(_("Maggot link")).append(": <a href=\"").append(MAGGOT).append(hex).append(':').append(hex).append("\">")
|
||||
// .append(MAGGOT).append(hex).append(':').append(hex).append("</a>");
|
||||
buf.append("<br>").append(_("Torrent file")).append(": ").append(snark.getName());
|
||||
buf.append("</div></th></tr>");
|
||||
//buf.append("<tr><td>").append(_("Maggot link")).append(": <a href=\"").append(MAGGOT).append(hex).append(':').append(hex).append("\">")
|
||||
// .append(MAGGOT).append(hex).append(':').append(hex).append("</a></td></tr>");
|
||||
|
||||
buf.append("<tr><td>")
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "size.png\" > <b>")
|
||||
.append(_("Size"))
|
||||
.append(":</b> ")
|
||||
.append(formatSize(snark.getTotalLength()));
|
||||
int pieces = snark.getPieces();
|
||||
double completion = (pieces - snark.getNeeded()) / (double) pieces;
|
||||
if (completion < 1.0)
|
||||
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "head_rx.png\" > <b>")
|
||||
.append(_("Completion"))
|
||||
.append(":</b> ")
|
||||
.append((new DecimalFormat("0.00%")).format(completion));
|
||||
else
|
||||
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "head_rx.png\" > ")
|
||||
.append(_("Complete"));
|
||||
// else unknown
|
||||
long needed = snark.getNeededLength();
|
||||
if (needed > 0)
|
||||
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "head_rx.png\" > <b>")
|
||||
.append(_("Remaining"))
|
||||
.append(":</b> ")
|
||||
.append(formatSize(needed));
|
||||
if (meta != null) {
|
||||
List files = meta.getFiles();
|
||||
int fileCount = files != null ? files.size() : 1;
|
||||
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > <b>")
|
||||
.append(_("Files"))
|
||||
.append(":</b> ")
|
||||
.append(fileCount);
|
||||
}
|
||||
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > <b>")
|
||||
.append(_("Pieces"))
|
||||
.append(":</b> ")
|
||||
.append(pieces);
|
||||
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > <b>")
|
||||
.append(_("Piece size"))
|
||||
.append(":</b> ")
|
||||
.append(formatSize(snark.getPieceLength(0)))
|
||||
.append("</td></tr>\n");
|
||||
} else {
|
||||
// shouldn't happen
|
||||
buf.append("<tr><th>Not found<br>resource=\"").append(r.toString())
|
||||
.append("\"<br>base=\"").append(base)
|
||||
.append("\"<br>torrent=\"").append(torrentName)
|
||||
.append("\"</th></tr>");
|
||||
.append("\"</th></tr>\n");
|
||||
}
|
||||
buf.append("</table>\n");
|
||||
if (ls == null) {
|
||||
// We are only showing the torrent info section
|
||||
buf.append("</thead></table></div></div></BODY></HTML>");
|
||||
buf.append("</div></div></BODY></HTML>");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
// second row - dir info
|
||||
buf.append("<tr><th>")
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > ")
|
||||
.append(_("Directory")).append(": ").append(directory).append("</th><th align=\"right\">")
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "size.png\" > ")
|
||||
.append(_("Size"));
|
||||
buf.append("</th><th class=\"headerstatus\">")
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "status.png\" > ")
|
||||
.append(_("Status")).append("</th>");
|
||||
// second table - dir info
|
||||
buf.append("<table class=\"snarkDirInfo\"><thead>\n");
|
||||
buf.append("<tr>\n")
|
||||
.append("<th colspan=2>")
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > ")
|
||||
.append(_("Directory"))
|
||||
.append(": ")
|
||||
.append(directory)
|
||||
.append("</th>\n");
|
||||
buf.append("<th align=\"right\">")
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "size.png\" > ")
|
||||
.append(_("Size"))
|
||||
.append("</th>\n");
|
||||
buf.append("<th class=\"headerstatus\">")
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "status.png\" > ")
|
||||
.append(_("Status"))
|
||||
.append("</th>\n");
|
||||
if (showPriority)
|
||||
buf.append("<th class=\"headerpriority\">")
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "priority.png\" > ")
|
||||
.append(_("Priority")).append("</th>");
|
||||
buf.append("</tr></thead>\n");
|
||||
buf.append("<tr><td colspan=\"" + (showPriority ? '4' : '3') + "\" class=\"ParentDir\"><A HREF=\"");
|
||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "priority.png\" > ")
|
||||
.append(_("Priority")).append("</th>\n");
|
||||
buf.append("</tr>\n</thead>\n");
|
||||
buf.append("<tr><td colspan=\"" + (showPriority ? '5' : '4') + "\" class=\"ParentDir\"><A HREF=\"");
|
||||
buf.append(URIUtil.addPaths(base,"../"));
|
||||
buf.append("\"><img alt=\"\" border=\"0\" src=\"" + _imgPath + "up.png\"> ")
|
||||
.append(_("Up to higher level directory")).append("</A></td></tr>\n");
|
||||
.append(_("Up to higher level directory"))
|
||||
.append("</A></td></tr>\n");
|
||||
|
||||
|
||||
//DateFormat dfmt=DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
|
||||
@ -2153,8 +2218,7 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
Resource item = r.addPath(ls[i]);
|
||||
|
||||
String rowClass = (i % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd");
|
||||
buf.append("<TR class=\"").append(rowClass).append("\"><TD class=\"snarkFileName ")
|
||||
.append(rowClass).append("\">");
|
||||
buf.append("<TR class=\"").append(rowClass).append("\">");
|
||||
|
||||
// Get completeness and status string
|
||||
boolean complete = false;
|
||||
@ -2190,7 +2254,7 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
status = toImg("clock_red");
|
||||
status += " " +
|
||||
(100 * (length - remaining) / length) + "% " + _("complete") +
|
||||
" (" + DataHelper.formatSize2(remaining) + _("bytes remaining") + ")";
|
||||
" (" + DataHelper.formatSize2(remaining) + "B " + _("remaining") + ")";
|
||||
}
|
||||
} else {
|
||||
status = "Not a file?";
|
||||
@ -2206,6 +2270,8 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
path=URIUtil.addPaths(path,"/");
|
||||
String icon = toIcon(item);
|
||||
|
||||
buf.append("<TD class=\"snarkFileIcon ")
|
||||
.append(rowClass).append("\">");
|
||||
if (complete) {
|
||||
buf.append("<a href=\"").append(path).append("\">");
|
||||
// thumbnail ?
|
||||
@ -2213,16 +2279,17 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
if (plc.endsWith(".jpg") || plc.endsWith(".jpeg") || plc.endsWith(".png") ||
|
||||
plc.endsWith(".gif") || plc.endsWith(".ico")) {
|
||||
buf.append("<img alt=\"\" border=\"0\" class=\"thumb\" src=\"")
|
||||
.append(path).append("\"></a> ");
|
||||
.append(path).append("\"></a>");
|
||||
} else {
|
||||
buf.append(toImg(icon, _("Open"))).append("</a> ");
|
||||
buf.append(toImg(icon, _("Open"))).append("</a>");
|
||||
}
|
||||
buf.append("<A HREF=\"");
|
||||
buf.append(path);
|
||||
buf.append("\">");
|
||||
} else {
|
||||
buf.append(toImg(icon)).append(' ');
|
||||
buf.append(toImg(icon));
|
||||
}
|
||||
buf.append("</TD><TD class=\"snarkFileName ")
|
||||
.append(rowClass).append("\">");
|
||||
if (complete)
|
||||
buf.append("<a href=\"").append(path).append("\">");
|
||||
buf.append(ls[i]);
|
||||
if (complete)
|
||||
buf.append("</a>");
|
||||
@ -2259,14 +2326,14 @@ public class I2PSnarkServlet extends DefaultServlet {
|
||||
buf.append("</TR>\n");
|
||||
}
|
||||
if (showSaveButton) {
|
||||
buf.append("<thead><tr><th colspan=\"3\"> </th><th class=\"headerpriority\"><input type=\"submit\" value=\"");
|
||||
buf.append("<thead><tr><th colspan=\"4\"> </th><th class=\"headerpriority\"><input type=\"submit\" value=\"");
|
||||
buf.append(_("Save priorities"));
|
||||
buf.append("\" name=\"foo\" ></th></tr></thead>\n");
|
||||
}
|
||||
buf.append("</TABLE>\n");
|
||||
buf.append("</table>\n");
|
||||
if (showPriority)
|
||||
buf.append("</form>");
|
||||
buf.append("</div></div></BODY></HTML>\n");
|
||||
buf.append("</form>");
|
||||
buf.append("</div></div></BODY></HTML>\n");
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
@ -19,9 +19,10 @@
|
||||
<title><%=intl._("I2P Tunnel Manager - Edit Client Tunnel")%></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
|
||||
|
||||
<% if (editBean.allowCSS()) {
|
||||
%><link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
|
||||
%><link rel="icon" href="<%=editBean.getTheme()%>images/favicon.ico">
|
||||
<link href="<%=editBean.getTheme()%>default.css" rel="stylesheet" type="text/css" />
|
||||
<link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
|
||||
<% }
|
||||
|
@ -19,9 +19,10 @@
|
||||
<title><%=intl._("I2P Tunnel Manager - Edit Server Tunnel")%></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
|
||||
|
||||
<% if (editBean.allowCSS()) {
|
||||
%><link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
|
||||
%><link rel="icon" href="<%=editBean.getTheme()%>images/favicon.ico">
|
||||
<link href="<%=editBean.getTheme()%>default.css" rel="stylesheet" type="text/css" />
|
||||
<link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
|
||||
<% }
|
||||
|
@ -24,7 +24,8 @@
|
||||
<link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
|
||||
|
||||
<% if (indexBean.allowCSS()) {
|
||||
%><link href="<%=indexBean.getTheme()%>default.css" rel="stylesheet" type="text/css" />
|
||||
%><link rel="icon" href="<%=indexBean.getTheme()%>images/favicon.ico">
|
||||
<link href="<%=indexBean.getTheme()%>default.css" rel="stylesheet" type="text/css" />
|
||||
<link href="<%=indexBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
|
||||
<% }
|
||||
%>
|
||||
|
@ -57,7 +57,8 @@
|
||||
<link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
|
||||
|
||||
<% if (editBean.allowCSS()) {
|
||||
%><link href="<%=editBean.getTheme()%>default.css" rel="stylesheet" type="text/css" />
|
||||
%><link rel="icon" href="<%=editBean.getTheme()%>images/favicon.ico">
|
||||
<link href="<%=editBean.getTheme()%>default.css" rel="stylesheet" type="text/css" />
|
||||
<link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
|
||||
<% }
|
||||
%>
|
||||
|
@ -19,6 +19,8 @@ public class CSSHelper extends HelperBase {
|
||||
private static final String FORCE = "classic";
|
||||
public static final String PROP_REFRESH = "routerconsole.summaryRefresh";
|
||||
public static final String DEFAULT_REFRESH = "60";
|
||||
public static final int MIN_REFRESH = 3;
|
||||
public static final String PROP_DISABLE_REFRESH = "routerconsole.summaryDisableRefresh";
|
||||
private static final String PROP_XFRAME = "routerconsole.disableXFrame";
|
||||
|
||||
public String getTheme(String userAgent) {
|
||||
@ -70,12 +72,42 @@ public class CSSHelper extends HelperBase {
|
||||
|
||||
/** change refresh and save it */
|
||||
public void setRefresh(String r) {
|
||||
try {
|
||||
if (Integer.parseInt(r) < MIN_REFRESH)
|
||||
r = "" + MIN_REFRESH;
|
||||
} catch (Exception e) {
|
||||
}
|
||||
_context.router().saveConfig(PROP_REFRESH, r);
|
||||
}
|
||||
|
||||
/** @return refresh time in seconds, as a string */
|
||||
public String getRefresh() {
|
||||
return _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH);
|
||||
String r = _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH);
|
||||
try {
|
||||
if (Integer.parseInt(r) < MIN_REFRESH)
|
||||
r = "" + MIN_REFRESH;
|
||||
} catch (Exception e) {
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* change disable refresh boolean and save it
|
||||
* @since 0.9.1
|
||||
*/
|
||||
public void setDisableRefresh(String r) {
|
||||
String disableRefresh = "false";
|
||||
if ("0".equals(r))
|
||||
disableRefresh = "true";
|
||||
_context.router().saveConfig(PROP_DISABLE_REFRESH, disableRefresh);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if refresh is disabled
|
||||
* @since 0.9.1
|
||||
*/
|
||||
public boolean getDisableRefresh() {
|
||||
return _context.getBooleanProperty(PROP_DISABLE_REFRESH);
|
||||
}
|
||||
|
||||
/** translate the title and display consistently */
|
||||
|
@ -11,12 +11,12 @@ public class ConfigNavHelper extends HelperBase {
|
||||
|
||||
/** configX.jsp */
|
||||
private static final String pages[] =
|
||||
{"", "net", "ui", "home", "service", "update", "tunnels",
|
||||
{"", "net", "ui", "sidebar", "home", "service", "update", "tunnels",
|
||||
"clients", "peer", "keyring", "logging", "stats",
|
||||
"reseed", "advanced" };
|
||||
|
||||
private static final String titles[] =
|
||||
{_x("Bandwidth"), _x("Network"), _x("UI"), _x("Home Page"),
|
||||
{_x("Bandwidth"), _x("Network"), _x("UI"), _x("Summary Bar"), _x("Home Page"),
|
||||
_x("Service"), _x("Update"), _x("Tunnels"),
|
||||
_x("Clients"), _x("Peers"), _x("Keyring"), _x("Logging"), _x("Stats"),
|
||||
_x("Reseeding"), _x("Advanced") };
|
||||
|
@ -0,0 +1,168 @@
|
||||
package net.i2p.router.web;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import net.i2p.data.DataHelper;
|
||||
|
||||
/**
|
||||
* Simple summary bar configuration.
|
||||
*
|
||||
* @since 0.9.1
|
||||
*/
|
||||
public class ConfigSummaryHandler extends FormHandler {
|
||||
|
||||
private Map _settings;
|
||||
|
||||
@Override
|
||||
protected void processForm() {
|
||||
if (_action == null) return;
|
||||
String group = getJettyString("group");
|
||||
boolean deleting = _action.equals(_("Delete selected"));
|
||||
boolean adding = _action.equals(_("Add item"));
|
||||
boolean saving = _action.equals(_("Save order"));
|
||||
boolean moving = _action.startsWith("move_");
|
||||
if (_action.equals(_("Save")) && "0".equals(group)) {
|
||||
try {
|
||||
int refreshInterval = Integer.parseInt(getJettyString("refreshInterval"));
|
||||
if (refreshInterval >= CSSHelper.MIN_REFRESH) {
|
||||
_context.router().saveConfig(CSSHelper.PROP_REFRESH, "" + refreshInterval);
|
||||
addFormNotice(_("Refresh interval changed"));
|
||||
} else
|
||||
addFormError(_("Refresh interval must be at least {0} seconds", CSSHelper.MIN_REFRESH));
|
||||
} catch (java.lang.NumberFormatException e) {
|
||||
addFormError(_("Refresh interval must be a number"));
|
||||
return;
|
||||
}
|
||||
} else if (_action.equals(_("Restore full default"))) {
|
||||
_context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR + "default", SummaryHelper.DEFAULT_FULL);
|
||||
addFormNotice(_("Full summary bar default restored.") + " " +
|
||||
_("Summary bar will refresh shortly."));
|
||||
} else if (_action.equals(_("Restore minimal default"))) {
|
||||
_context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR + "default", SummaryHelper.DEFAULT_MINIMAL);
|
||||
addFormNotice(_("Minimal summary bar default restored.") + " " +
|
||||
_("Summary bar will refresh shortly."));
|
||||
} else if (adding || deleting || saving || moving) {
|
||||
Map<Integer, String> sections = new TreeMap<Integer, String>();
|
||||
for (Object o : _settings.keySet()) {
|
||||
if (!(o instanceof String))
|
||||
continue;
|
||||
String k = (String) o;
|
||||
if (!k.startsWith("order_"))
|
||||
continue;
|
||||
String v = getJettyString(k);
|
||||
k = k.substring(6);
|
||||
k = k.substring(k.indexOf('_') + 1);
|
||||
try {
|
||||
int order = Integer.parseInt(v);
|
||||
sections.put(order, k);
|
||||
} catch (java.lang.NumberFormatException e) {
|
||||
addFormError(_("Order must be an integer"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (adding) {
|
||||
String name = getJettyString("name");
|
||||
if (name == null || name.length() <= 0) {
|
||||
addFormError(_("No section selected"));
|
||||
return;
|
||||
}
|
||||
String order = getJettyString("order");
|
||||
if (order == null || order.length() <= 0) {
|
||||
addFormError(_("No order entered"));
|
||||
return;
|
||||
}
|
||||
name = DataHelper.escapeHTML(name).replace(",", ",");
|
||||
order = DataHelper.escapeHTML(order).replace(",", ",");
|
||||
try {
|
||||
int ki = Integer.parseInt(order);
|
||||
sections.put(ki, name);
|
||||
addFormNotice(_("Added") + ": " + name);
|
||||
} catch (java.lang.NumberFormatException e) {
|
||||
addFormError(_("Order must be an integer"));
|
||||
return;
|
||||
}
|
||||
} else if (deleting) {
|
||||
Set<Integer> toDelete = new HashSet();
|
||||
for (Object o : _settings.keySet()) {
|
||||
if (!(o instanceof String))
|
||||
continue;
|
||||
String k = (String) o;
|
||||
if (!k.startsWith("delete_"))
|
||||
continue;
|
||||
k = k.substring(7);
|
||||
try {
|
||||
int ki = Integer.parseInt(k);
|
||||
toDelete.add(ki);
|
||||
} catch (java.lang.NumberFormatException e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
for (Iterator<Integer> iter = sections.keySet().iterator(); iter.hasNext(); ) {
|
||||
int i = iter.next();
|
||||
if (toDelete.contains(i)) {
|
||||
String removedName = sections.get(i);
|
||||
iter.remove();
|
||||
addFormNotice(_("Removed") + ": " + removedName);
|
||||
}
|
||||
}
|
||||
} else if (moving) {
|
||||
String parts[] = _action.split("_");
|
||||
try {
|
||||
int from = Integer.parseInt(parts[1]);
|
||||
int to = 0;
|
||||
if ("up".equals(parts[2]))
|
||||
to = from - 1;
|
||||
if ("down".equals(parts[2]))
|
||||
to = from + 1;
|
||||
if ("bottom".equals(parts[2]))
|
||||
to = sections.size() - 1;
|
||||
int n = -1;
|
||||
if ("down".equals(parts[2]) || "bottom".equals(parts[2]))
|
||||
n = 1;
|
||||
for (int i = from; n * i < n * to; i += n) {
|
||||
String temp = sections.get(i + n);
|
||||
sections.put(i + n, sections.get(i));
|
||||
sections.put(i, temp);
|
||||
}
|
||||
addFormNotice(_("Moved") + ": " + sections.get(to));
|
||||
} catch (java.lang.NumberFormatException e) {
|
||||
addFormError(_("Order must be an integer"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
SummaryHelper.saveSummaryBarSections(_context, "default", sections);
|
||||
addFormNotice(_("Saved order of sections.") + " " +
|
||||
_("Summary bar will refresh shortly."));
|
||||
} else {
|
||||
addFormError(_("Unsupported"));
|
||||
}
|
||||
}
|
||||
|
||||
public void setSettings(Map settings) { _settings = new HashMap(settings); }
|
||||
|
||||
/** curses Jetty for returning arrays */
|
||||
private String getJettyString(String key) {
|
||||
String[] arr = (String[]) _settings.get(key);
|
||||
if (arr == null)
|
||||
return null;
|
||||
return arr[0].trim();
|
||||
}
|
||||
|
||||
public void setMovingAction() {
|
||||
for (Object o : _settings.keySet()) {
|
||||
if (!(o instanceof String))
|
||||
continue;
|
||||
String k = (String) o;
|
||||
if (k.startsWith("move_") && k.endsWith(".x") && _settings.get(k) != null) {
|
||||
_action = k.substring(0, k.length() - 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -191,7 +191,8 @@ public class GraphHelper extends FormHandler {
|
||||
}
|
||||
|
||||
// FIXME jrobin doesn't support setting the timezone, will have to mod TimeAxis.java
|
||||
_out.write("<p><i>" + _("All times are UTC.") + "</i></p>\n");
|
||||
// 0.9.1 - all graphs currently state UTC on them, so this text blurb is unnecessary,
|
||||
//_out.write("<p><i>" + _("All times are UTC.") + "</i></p>\n");
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
|
@ -24,14 +24,14 @@ public class HomeHelper extends HelperBase {
|
||||
private static final String PROP_SEARCH = "routerconsole.showSearch";
|
||||
|
||||
static final String DEFAULT_SERVICES =
|
||||
_x("Addressbook") + S + _x("Manage your I2P hosts file here (I2P domain name resolution)") + S + "/susidns/index" + S + I + "book_addresses.png" + S +
|
||||
_x("Addressbook") + S + _x("Manage your I2P hosts file here (I2P domain name resolution)") + S + "/dns" + S + I + "book_addresses.png" + S +
|
||||
_x("Configure Bandwidth") + S + _x("I2P Bandwidth Configuration") + S + "/config" + S + I + "wrench_orange.png" + S +
|
||||
_x("Configure Language") + S + _x("Console Language Selection") + S + "/configui" + S + I + "wrench_orange.png" + S +
|
||||
_x("Customize Home Page") + S + _x("I2P Home Page Configuration") + S + "/confighome" + S + I + "wrench_orange.png" + S +
|
||||
_x("Email") + S + _x("Anonymous webmail client") + S + "/susimail/susimail" + S + I + "email.png" + S +
|
||||
_x("Email") + S + _x("Anonymous webmail client") + S + "/webmail" + S + I + "email.png" + S +
|
||||
_x("Help") + S + _x("I2P Router Help") + S + "/help" + S + I + "help.png" + S +
|
||||
_x("Router Console") + S + _x("I2P Router Console") + S + "/console" + S + I + "wrench_orange.png" + S +
|
||||
_x("Torrents") + S + _x("Built-in anonymous BitTorrent Client") + S + "/i2psnark/" + S + I + "film.png" + S +
|
||||
_x("Torrents") + S + _x("Built-in anonymous BitTorrent Client") + S + "/torrents" + S + I + "film.png" + S +
|
||||
_x("Website") + S + _x("Local web server") + S + "http://127.0.0.1:7658/" + S + I + "server.png" + S +
|
||||
"";
|
||||
|
||||
|
@ -3,6 +3,10 @@ package net.i2p.router.web;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.router.RouterContext;
|
||||
@ -12,6 +16,36 @@ import net.i2p.router.RouterContext;
|
||||
*
|
||||
*/
|
||||
public class SummaryBarRenderer {
|
||||
// Commented out because broken. Replaced by if-elseif blob below.
|
||||
/*static final Map<String, java.lang.reflect.Method> ALL_SECTIONS;
|
||||
static {
|
||||
Map<String, java.lang.reflect.Method> aMap = new HashMap<String, java.lang.reflect.Method>();;
|
||||
try {
|
||||
aMap.put("HelpAndFAQ", SummaryBarRenderer.class.getMethod("renderHelpAndFAQHTML"));
|
||||
aMap.put("I2PServices", SummaryBarRenderer.class.getMethod("renderI2PServicesHTML"));
|
||||
aMap.put("I2PInternals", SummaryBarRenderer.class.getMethod("renderI2PInternalsHTML"));
|
||||
aMap.put("General", SummaryBarRenderer.class.getMethod("renderGeneralHTML"));
|
||||
aMap.put("ShortGeneral", SummaryBarRenderer.class.getMethod("renderShortGeneralHTML"));
|
||||
aMap.put("NetworkReachability", SummaryBarRenderer.class.getMethod("renderNetworkReachabilityHTML"));
|
||||
aMap.put("UpdateStatus", SummaryBarRenderer.class.getMethod("renderUpdateStatusHTML"));
|
||||
aMap.put("RestartStatus", SummaryBarRenderer.class.getMethod("renderRestartStatusHTMLHTML"));
|
||||
aMap.put("Peers", SummaryBarRenderer.class.getMethod("renderPeersHTML"));
|
||||
aMap.put("FirewallAndReseedStatus", SummaryBarRenderer.class.getMethod("renderFirewallAndReseedStatusHTML"));
|
||||
aMap.put("Bandwidth", SummaryBarRenderer.class.getMethod("renderBandwidthHTML"));
|
||||
aMap.put("Tunnels", SummaryBarRenderer.class.getMethod("renderTunnelsHTML"));
|
||||
aMap.put("Congestion", SummaryBarRenderer.class.getMethod("renderCongestionHTML"));
|
||||
aMap.put("TunnelStatus", SummaryBarRenderer.class.getMethod("renderTunnelStatusHTML"));
|
||||
aMap.put("Destinations", SummaryBarRenderer.class.getMethod("renderDestinationsHTML"));
|
||||
aMap.put("NewsHeadings", SummaryBarRenderer.class.getMethod("renderNewsHeadingsHTML"));
|
||||
} catch (java.lang.NoSuchMethodException e) {
|
||||
}
|
||||
ALL_SECTIONS = Collections.unmodifiableMap(aMap);
|
||||
}*/
|
||||
static final String ALL_SECTIONS[] =
|
||||
{"HelpAndFAQ", "I2PServices", "I2PInternals", "General", "ShortGeneral", "NetworkReachability",
|
||||
"UpdateStatus", "RestartStatus", "Peers", "FirewallAndReseedStatus", "Bandwidth", "Tunnels",
|
||||
"Congestion", "TunnelStatus", "Destinations", "NewsHeadings" };
|
||||
|
||||
private final RouterContext _context;
|
||||
private final SummaryHelper _helper;
|
||||
|
||||
@ -25,155 +59,199 @@ public class SummaryBarRenderer {
|
||||
* on lower-level directory errors.
|
||||
*/
|
||||
public void renderSummaryHTML(Writer out) throws IOException {
|
||||
String requestURI = _helper.getRequestURI();
|
||||
String page = requestURI.replace("/", "").replace(".jsp", "");
|
||||
List<String> sections = _helper.getSummaryBarSections(page);
|
||||
StringBuilder buf = new StringBuilder(8*1024);
|
||||
String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
|
||||
for (String section : sections) {
|
||||
// Commented out because broken. Replaced by if-elseif blob below.
|
||||
/*try {
|
||||
String section = (String)ALL_SECTIONS.get(sections[i]).invoke(this);
|
||||
if (section != null && section != "") {
|
||||
out.write("<hr>" + i + "<hr>\n" + section);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
out.write("<hr>" +i + " - Exception<hr>\n" + e);
|
||||
}*/
|
||||
buf.setLength(0);
|
||||
|
||||
// TODO - the bar would render more cleanly if we specified the img height and width here,
|
||||
// but unfortunately the images in the different themes are different sizes.
|
||||
// They range in height from 37 to 43 px. But there's a -2 bottom margin...
|
||||
// So put it in a div.
|
||||
buf.append("<div style=\"height: 36px;\"><a href=\"/\" target=\"_top\"><img src=\"")
|
||||
.append(CSSHelper.BASE_THEME_PATH)
|
||||
.append(theme)
|
||||
.append("/images/i2plogo.png\" alt=\"")
|
||||
.append(_("I2P Router Console"))
|
||||
.append("\" title=\"")
|
||||
.append(_("I2P Router Console"))
|
||||
.append("\"></a></div><hr>")
|
||||
buf.append("<hr>\n");
|
||||
if ("HelpAndFAQ".equals(section))
|
||||
buf.append(renderHelpAndFAQHTML());
|
||||
else if ("I2PServices".equals(section))
|
||||
buf.append(renderI2PServicesHTML());
|
||||
else if ("I2PInternals".equals(section))
|
||||
buf.append(renderI2PInternalsHTML());
|
||||
else if ("General".equals(section))
|
||||
buf.append(renderGeneralHTML());
|
||||
else if ("ShortGeneral".equals(section))
|
||||
buf.append(renderShortGeneralHTML());
|
||||
else if ("NetworkReachability".equals(section))
|
||||
buf.append(renderNetworkReachabilityHTML());
|
||||
else if ("UpdateStatus".equals(section))
|
||||
buf.append(renderUpdateStatusHTML());
|
||||
else if ("RestartStatus".equals(section))
|
||||
buf.append(renderRestartStatusHTML());
|
||||
else if ("Peers".equals(section))
|
||||
buf.append(renderPeersHTML());
|
||||
else if ("FirewallAndReseedStatus".equals(section))
|
||||
buf.append(renderFirewallAndReseedStatusHTML());
|
||||
else if ("Bandwidth".equals(section))
|
||||
buf.append(renderBandwidthHTML());
|
||||
else if ("Tunnels".equals(section))
|
||||
buf.append(renderTunnelsHTML());
|
||||
else if ("Congestion".equals(section))
|
||||
buf.append(renderCongestionHTML());
|
||||
else if ("TunnelStatus".equals(section))
|
||||
buf.append(renderTunnelStatusHTML());
|
||||
else if ("Destinations".equals(section))
|
||||
buf.append(renderDestinationsHTML());
|
||||
else if ("NewsHeadings".equals(section))
|
||||
buf.append(renderNewsHeadingsHTML());
|
||||
|
||||
.append("<h3><a href=\"/help\" target=\"_top\" title=\"")
|
||||
// Only output section if there's more than the <hr> to print
|
||||
if (buf.length() > 5)
|
||||
out.write(buf.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public String renderHelpAndFAQHTML() {
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/help\" target=\"_top\" title=\"")
|
||||
.append(_("I2P Router Help & FAQ"))
|
||||
.append("\">")
|
||||
.append(_("Help & FAQ"))
|
||||
.append("</a></h3><hr>");
|
||||
.append("</a></h3>");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
File lpath = new File(_context.getBaseDir(), "docs/toolbar.html");
|
||||
// you better have target="_top" for the links in there...
|
||||
if (lpath.exists()) {
|
||||
ContentHelper linkhelper = new ContentHelper();
|
||||
linkhelper.setPage(lpath.getAbsolutePath());
|
||||
linkhelper.setMaxLines("100");
|
||||
buf.append(linkhelper.getContent());
|
||||
} else {
|
||||
buf.append("<h3><a href=\"/configclients\" target=\"_top\" title=\"")
|
||||
.append(_("Configure startup of clients and webapps (services); manually start dormant services"))
|
||||
.append("\">")
|
||||
.append(_("I2P Services"))
|
||||
.append("</a></h3>\n" +
|
||||
public String renderI2PServicesHTML() {
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/configclients\" target=\"_top\" title=\"")
|
||||
.append(_("Configure startup of clients and webapps (services); manually start dormant services"))
|
||||
.append("\">")
|
||||
.append(_("I2P Services"))
|
||||
.append("</a></h3>\n" +
|
||||
|
||||
"<hr class=\"b\"><table><tr><td>" +
|
||||
"<hr class=\"b\"><table><tr><td>" +
|
||||
|
||||
"<a href=\"/susimail/susimail\" target=\"blank\" title=\"")
|
||||
.append(_("Anonymous webmail client"))
|
||||
.append("\">")
|
||||
.append(_("Email"))
|
||||
.append("</a>\n" +
|
||||
"<a href=\"/webmail\" target=\"_top\" title=\"")
|
||||
.append(_("Anonymous webmail client"))
|
||||
.append("\">")
|
||||
.append(_("Email"))
|
||||
.append("</a>\n" +
|
||||
|
||||
"<a href=\"/i2psnark/\" target=\"_blank\" title=\"")
|
||||
.append(_("Built-in anonymous BitTorrent Client"))
|
||||
.append("\">")
|
||||
.append(_("Torrents"))
|
||||
.append("</a>\n" +
|
||||
"<a href=\"/torrents\" target=\"_top\" title=\"")
|
||||
.append(_("Built-in anonymous BitTorrent Client"))
|
||||
.append("\">")
|
||||
.append(_("Torrents"))
|
||||
.append("</a>\n" +
|
||||
|
||||
"<a href=\"http://127.0.0.1:7658/\" target=\"_blank\" title=\"")
|
||||
.append(_("Local web server"))
|
||||
.append("\">")
|
||||
.append(_("Website"))
|
||||
.append("</a>\n")
|
||||
"<a href=\"http://127.0.0.1:7658/\" target=\"_blank\" title=\"")
|
||||
.append(_("Local web server"))
|
||||
.append("\">")
|
||||
.append(_("Website"))
|
||||
.append("</a>\n")
|
||||
|
||||
.append(NavHelper.getClientAppLinks(_context))
|
||||
.append(NavHelper.getClientAppLinks(_context))
|
||||
|
||||
.append("</td></tr></table>\n" +
|
||||
.append("</td></tr></table>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
"<hr><h3><a href=\"/config\" target=\"_top\" title=\"")
|
||||
.append(_("Configure I2P Router"))
|
||||
.append("\">")
|
||||
.append(_("I2P Internals"))
|
||||
.append("</a></h3><hr class=\"b\">\n" +
|
||||
public String renderI2PInternalsHTML() {
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/config\" target=\"_top\" title=\"")
|
||||
.append(_("Configure I2P Router"))
|
||||
.append("\">")
|
||||
.append(_("I2P Internals"))
|
||||
.append("</a></h3><hr class=\"b\">\n" +
|
||||
|
||||
"<table><tr><td>\n" +
|
||||
"<table><tr><td>\n" +
|
||||
|
||||
"<a href=\"/tunnels\" target=\"_top\" title=\"")
|
||||
.append(_("View existing tunnels and tunnel build status"))
|
||||
.append("\">")
|
||||
.append(_("Tunnels"))
|
||||
.append("</a>\n" +
|
||||
"<a href=\"/tunnels\" target=\"_top\" title=\"")
|
||||
.append(_("View existing tunnels and tunnel build status"))
|
||||
.append("\">")
|
||||
.append(_("Tunnels"))
|
||||
.append("</a>\n" +
|
||||
|
||||
"<a href=\"/peers\" target=\"_top\" title=\"")
|
||||
.append(_("Show all current peer connections"))
|
||||
.append("\">")
|
||||
.append(_("Peers"))
|
||||
.append("</a>\n" +
|
||||
"<a href=\"/peers\" target=\"_top\" title=\"")
|
||||
.append(_("Show all current peer connections"))
|
||||
.append("\">")
|
||||
.append(_("Peers"))
|
||||
.append("</a>\n" +
|
||||
|
||||
"<a href=\"/profiles\" target=\"_top\" title=\"")
|
||||
.append(_("Show recent peer performance profiles"))
|
||||
.append("\">")
|
||||
.append(_("Profiles"))
|
||||
.append("</a>\n" +
|
||||
"<a href=\"/profiles\" target=\"_top\" title=\"")
|
||||
.append(_("Show recent peer performance profiles"))
|
||||
.append("\">")
|
||||
.append(_("Profiles"))
|
||||
.append("</a>\n" +
|
||||
|
||||
"<a href=\"/netdb\" target=\"_top\" title=\"")
|
||||
.append(_("Show list of all known I2P routers"))
|
||||
.append("\">")
|
||||
.append(_("NetDB"))
|
||||
.append("</a>\n" +
|
||||
"<a href=\"/netdb\" target=\"_top\" title=\"")
|
||||
.append(_("Show list of all known I2P routers"))
|
||||
.append("\">")
|
||||
.append(_("NetDB"))
|
||||
.append("</a>\n" +
|
||||
|
||||
"<a href=\"/logs\" target=\"_top\" title=\"")
|
||||
.append(_("Health Report"))
|
||||
.append("\">")
|
||||
.append(_("Logs"))
|
||||
.append("</a>\n");
|
||||
"<a href=\"/logs\" target=\"_top\" title=\"")
|
||||
.append(_("Health Report"))
|
||||
.append("\">")
|
||||
.append(_("Logs"))
|
||||
.append("</a>\n");
|
||||
|
||||
// "<a href=\"/jobs.jsp\" target=\"_top\" title=\"")
|
||||
// .append(_("Show the router's workload, and how it's performing"))
|
||||
// .append("\">")
|
||||
// .append(_("Jobs"))
|
||||
// .append("</a>\n" +
|
||||
// "<a href=\"/jobs.jsp\" target=\"_top\" title=\"")
|
||||
// .append(_("Show the router's workload, and how it's performing"))
|
||||
// .append("\">")
|
||||
// .append(_("Jobs"))
|
||||
// .append("</a>\n" +
|
||||
|
||||
if (!StatSummarizer.isDisabled()) {
|
||||
buf.append("<a href=\"/graphs\" target=\"_top\" title=\"")
|
||||
if (!StatSummarizer.isDisabled()) {
|
||||
buf.append("<a href=\"/graphs\" target=\"_top\" title=\"")
|
||||
.append(_("Graph router performance"))
|
||||
.append("\">")
|
||||
.append(_("Graphs"))
|
||||
.append("</a>\n");
|
||||
}
|
||||
|
||||
buf.append("<a href=\"/stats\" target=\"_top\" title=\"")
|
||||
.append(_("Textual router performance statistics"))
|
||||
.append("\">")
|
||||
.append(_("Stats"))
|
||||
.append("</a>\n" +
|
||||
|
||||
"<a href=\"/i2ptunnel/\" target=\"_blank\" title=\"")
|
||||
.append(_("Local Destinations"))
|
||||
.append("\">")
|
||||
.append(_("I2PTunnel"))
|
||||
.append("</a>\n" +
|
||||
|
||||
"<a href=\"/susidns/index\" target=\"_blank\" title=\"")
|
||||
.append(_("Manage your I2P hosts file here (I2P domain name resolution)"))
|
||||
.append("\">")
|
||||
.append(_("Addressbook"))
|
||||
.append("</a>\n");
|
||||
|
||||
File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html");
|
||||
if (javadoc.exists())
|
||||
buf.append("<a href=\"/javadoc/index.html\" target=\"_blank\">Javadoc</a>\n");
|
||||
buf.append("</td></tr></table>\n");
|
||||
|
||||
out.write(buf.toString());
|
||||
buf.setLength(0);
|
||||
}
|
||||
|
||||
buf.append("<a href=\"/stats\" target=\"_top\" title=\"")
|
||||
.append(_("Textual router performance statistics"))
|
||||
.append("\">")
|
||||
.append(_("Stats"))
|
||||
.append("</a>\n" +
|
||||
|
||||
"<a href=\"/i2ptunnelmgr\" target=\"_top\" title=\"")
|
||||
.append(_("Local Destinations"))
|
||||
.append("\">")
|
||||
.append(_("I2PTunnel"))
|
||||
.append("</a>\n" +
|
||||
|
||||
buf.append("<hr><h3><a href=\"/help\" target=\"_top\" title=\"")
|
||||
"<a href=\"/dns\" target=\"_top\" title=\"")
|
||||
.append(_("Manage your I2P hosts file here (I2P domain name resolution)"))
|
||||
.append("\">")
|
||||
.append(_("Addressbook"))
|
||||
.append("</a>\n");
|
||||
|
||||
File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html");
|
||||
if (javadoc.exists())
|
||||
buf.append("<a href=\"/javadoc/index.html\" target=\"_blank\">Javadoc</a>\n");
|
||||
buf.append("</td></tr></table>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String renderGeneralHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/help\" target=\"_top\" title=\"")
|
||||
.append(_("I2P Router Help"))
|
||||
.append("\">")
|
||||
.append(_("General"))
|
||||
.append("</a></h3><hr class=\"b\">\n" +
|
||||
|
||||
"<table><tr>" +
|
||||
"<td align=\"left\"><b>")
|
||||
"<td align=\"left\"><b title=\"")
|
||||
.append(_("Your Local Identity is your unique I2P router identity, similar to an ip address but tailored to I2P. "))
|
||||
.append(_("Never disclose this to anyone, as it can reveal your real world ip."))
|
||||
.append("\">")
|
||||
.append(_("Local Identity"))
|
||||
.append(":</b></td>" +
|
||||
"<td align=\"right\">" +
|
||||
@ -187,7 +265,10 @@ public class SummaryBarRenderer {
|
||||
.append(_("show"))
|
||||
.append("</a></td></tr>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("The version of the I2P software we are running"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Version"))
|
||||
.append(":</b></td>" +
|
||||
"<td align=\"right\">")
|
||||
@ -202,24 +283,74 @@ public class SummaryBarRenderer {
|
||||
.append(":</b></td>" +
|
||||
"<td align=\"right\">")
|
||||
.append(_helper.getUptime())
|
||||
.append("</td></tr></table>\n" +
|
||||
.append("</td></tr></table>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
"<hr><h4><a href=\"/confignet#help\" target=\"_top\" title=\"")
|
||||
public String renderShortGeneralHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<table>" +
|
||||
"<tr title=\"")
|
||||
.append(_("The version of the I2P software we are running"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Version"))
|
||||
.append(":</b></td>" +
|
||||
"<td align=\"right\">")
|
||||
.append(_helper.getVersion())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<tr title=\"")
|
||||
.append(_("How long we've been running for this session"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Uptime"))
|
||||
.append(":</b></td>" +
|
||||
"<td align=\"right\">")
|
||||
.append(_helper.getUptime())
|
||||
.append("</td></tr></table>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String renderNetworkReachabilityHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h4><a href=\"/confignet#help\" target=\"_top\" title=\"")
|
||||
.append(_("Help with configuring your firewall and router for optimal I2P performance"))
|
||||
.append("\">")
|
||||
.append(_("Network"))
|
||||
.append(": ")
|
||||
.append(_helper.getReachability())
|
||||
.append("</a></h4><hr>\n")
|
||||
.append("</a></h4>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String renderUpdateStatusHTML() {
|
||||
if (_helper == null) return "";
|
||||
String updateStatus = _helper.getUpdateStatus();
|
||||
if ("".equals(updateStatus)) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/configupdate\" target=\"_top\" title=\"")
|
||||
.append(_("Configure I2P Updates"))
|
||||
.append("\">")
|
||||
.append(_("I2P Update"))
|
||||
.append("</a></h3><hr class=\"b\">\n");
|
||||
buf.append(updateStatus);
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
.append(_helper.getUpdateStatus())
|
||||
public String renderRestartStatusHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append(_helper.getRestartStatus());
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
|
||||
.append(_helper.getRestartStatus())
|
||||
|
||||
|
||||
.append("<hr><h3><a href=\"/peers\" target=\"_top\" title=\"")
|
||||
public String renderPeersHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/peers\" target=\"_top\" title=\"")
|
||||
.append(_("Show all current peer connections"))
|
||||
.append("\">")
|
||||
.append(_("Peers"))
|
||||
@ -227,7 +358,10 @@ public class SummaryBarRenderer {
|
||||
|
||||
"<table>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("Peers we've been talking to in the last few minutes/last hour"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Active"))
|
||||
.append(":</b></td><td align=\"right\">");
|
||||
int active = _helper.getActivePeers();
|
||||
@ -236,38 +370,56 @@ public class SummaryBarRenderer {
|
||||
.append(Math.max(active, _helper.getActiveProfiles()))
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("The number of peers available for building client tunnels"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Fast"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getFastPeers())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("The number of peers available for building exploratory tunnels"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("High capacity"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getHighCapacityPeers())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("The number of peers available for network database inquries"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Integrated"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getWellIntegratedPeers())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("The total number of peers in our network database"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Known"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getAllPeers())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"</table><hr>\n");
|
||||
|
||||
|
||||
out.write(buf.toString());
|
||||
buf.setLength(0);
|
||||
"</table>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String renderFirewallAndReseedStatusHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append(_helper.getFirewallAndReseedStatus());
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String renderBandwidthHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/config\" title=\"")
|
||||
.append(_("Configure router bandwidth allocation"))
|
||||
.append("\" target=\"_top\">")
|
||||
@ -303,82 +455,181 @@ public class SummaryBarRenderer {
|
||||
.append(_helper.getInboundTransferred())
|
||||
.append(SummaryHelper.THINSP)
|
||||
.append(_helper.getOutboundTransferred())
|
||||
.append("</td></tr></table>\n" +
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<hr><h3><a href=\"/tunnels\" target=\"_top\" title=\"")
|
||||
"</table>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String renderTunnelsHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/tunnels\" target=\"_top\" title=\"")
|
||||
.append(_("View existing tunnels and tunnel build status"))
|
||||
.append("\">")
|
||||
.append(_("Tunnels"))
|
||||
.append("</a></h3><hr class=\"b\">" +
|
||||
"<table>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("Used for building and testing tunnels, and communicating with floodfill peers"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Exploratory"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getInboundTunnels() + _helper.getOutboundTunnels())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("Tunnels we are using to provide or access services on the network"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Client"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getInboundClientTunnels() + _helper.getOutboundClientTunnels())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("Tunnels we are participating in, directly contributing bandwith to the network"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Participating"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getParticipatingTunnels())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("The ratio of tunnel hops we provide to tunnel hops we use - a value greater than 1.00 indicates a positive contribution to the network"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Share ratio"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getShareRatio())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"</table><hr><h3><a href=\"/jobs\" target=\"_top\" title=\"")
|
||||
"</table>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String renderCongestionHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/jobs\" target=\"_top\" title=\"")
|
||||
.append(_("What's in the router's job queue?"))
|
||||
.append("\">")
|
||||
.append(_("Congestion"))
|
||||
.append("</a></h3><hr class=\"b\">" +
|
||||
"<table>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("Indicates router performance"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Job lag"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getJobLag())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"<tr><td align=\"left\"><b>")
|
||||
"<tr title=\"")
|
||||
.append(_("Indicates how quickly outbound messages to other I2P routers are sent"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Message delay"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getMessageDelay())
|
||||
.append("</td></tr>\n");
|
||||
|
||||
if (!_context.getBooleanPropertyDefaultTrue("router.disableTunnelTesting")) {
|
||||
buf.append("<tr><td align=\"left\"><b>")
|
||||
buf.append("<tr title=\"")
|
||||
.append(_("Round trip time for a tunnel test"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Tunnel lag"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getTunnelLag())
|
||||
.append("</td></tr>\n");
|
||||
}
|
||||
|
||||
buf.append("<tr><td align=\"left\"><b>")
|
||||
buf.append("<tr title=\"")
|
||||
.append(_("Queued requests from other routers to participate in tunnels"))
|
||||
.append("\">" +
|
||||
"<td align=\"left\"><b>")
|
||||
.append(_("Backlog"))
|
||||
.append(":</b></td><td align=\"right\">")
|
||||
.append(_helper.getInboundBacklog())
|
||||
.append("</td></tr>\n" +
|
||||
|
||||
"</table><hr><h4>")
|
||||
"</table>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String renderTunnelStatusHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(50);
|
||||
buf.append("<h4>")
|
||||
.append(_(_helper.getTunnelStatus()))
|
||||
.append("</h4><hr>\n")
|
||||
.append("</h4>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
.append(_helper.getDestinations())
|
||||
.append("<hr>\n");
|
||||
public String renderDestinationsHTML() {
|
||||
if (_helper == null) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append(_helper.getDestinations());
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
out.write(buf.toString());
|
||||
/** @since 0.9.1 */
|
||||
public String renderNewsHeadingsHTML() {
|
||||
if (_helper == null) return "";
|
||||
NewsHelper newshelper = _helper.getNewsHelper();
|
||||
if (newshelper == null || newshelper.shouldShowNews()) return "";
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
String consoleNonce = System.getProperty("router.consoleNonce");
|
||||
if (consoleNonce != null) {
|
||||
// Set up title and pre-headings stuff.
|
||||
buf.append("<h3><a href=\"/configupdate\">")
|
||||
.append(_("News & Updates"))
|
||||
.append("</a></h3><hr class=\"b\"><div class=\"newsheadings\">\n");
|
||||
// Get news content.
|
||||
String newsContent = newshelper.getContent();
|
||||
if (newsContent != "") {
|
||||
buf.append("<ul>\n");
|
||||
// Parse news content for headings.
|
||||
int start = newsContent.indexOf("<h3>");
|
||||
while (start >= 0) {
|
||||
// Add offset to start:
|
||||
// 4 - gets rid of <h3>
|
||||
// 16 - gets rid of the date as well (assuming form "<h3>yyyy-mm-dd: Foobarbaz...")
|
||||
newsContent = newsContent.substring(start+16, newsContent.length());
|
||||
int end = newsContent.indexOf("</h3>");
|
||||
if (end >= 0) {
|
||||
String heading = newsContent.substring(0, end);
|
||||
buf.append("<li>")
|
||||
.append(heading)
|
||||
.append("</li>\n");
|
||||
}
|
||||
start = newsContent.indexOf("<h3>");
|
||||
}
|
||||
buf.append("</ul>\n");
|
||||
// Set up string containing <a> to show news.
|
||||
String requestURI = _helper.getRequestURI();
|
||||
if (requestURI.contains("/home")) {
|
||||
buf.append("<a href=\"/?news=1&consoleNonce=")
|
||||
.append(consoleNonce)
|
||||
.append("\">")
|
||||
.append(_("Show news"))
|
||||
.append("</a>\n");
|
||||
}
|
||||
} else {
|
||||
buf.append("<center><i>")
|
||||
.append(_("none"))
|
||||
.append("</i></center>");
|
||||
}
|
||||
// Add post-headings stuff.
|
||||
buf.append("</div>\n");
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/** translate a string */
|
||||
|
@ -4,10 +4,13 @@ import java.io.IOException;
|
||||
import java.text.Collator;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.data.Destination;
|
||||
@ -17,6 +20,7 @@ import net.i2p.data.RouterAddress;
|
||||
import net.i2p.data.RouterInfo;
|
||||
import net.i2p.router.CommSystemFacade;
|
||||
import net.i2p.router.Router;
|
||||
import net.i2p.router.RouterContext;
|
||||
import net.i2p.router.RouterVersion;
|
||||
import net.i2p.router.TunnelPoolSettings;
|
||||
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
|
||||
@ -35,6 +39,35 @@ public class SummaryHelper extends HelperBase {
|
||||
// Opera 10.63 doesn't have the char, TODO check UA
|
||||
//static final String THINSP = " / ";
|
||||
static final String THINSP = " / ";
|
||||
private static final char S = ',';
|
||||
static final String PROP_SUMMARYBAR = "routerconsole.summaryBar.";
|
||||
|
||||
static final String DEFAULT_FULL =
|
||||
"HelpAndFAQ" + S +
|
||||
"I2PServices" + S +
|
||||
"I2PInternals" + S +
|
||||
"General" + S +
|
||||
"NetworkReachability" + S +
|
||||
"UpdateStatus" + S +
|
||||
"RestartStatus" + S +
|
||||
"Peers" + S +
|
||||
"FirewallAndReseedStatus" + S +
|
||||
"Bandwidth" + S +
|
||||
"Tunnels" + S +
|
||||
"Congestion" + S +
|
||||
"TunnelStatus" + S +
|
||||
"Destinations" + S +
|
||||
"";
|
||||
|
||||
static final String DEFAULT_MINIMAL =
|
||||
"ShortGeneral" + S +
|
||||
"NewsHeadings" + S +
|
||||
"UpdateStatus" + S +
|
||||
"NetworkReachability" + S +
|
||||
"FirewallAndReseedStatus" + S +
|
||||
"Destinations" + S +
|
||||
"RestartStatus" + S +
|
||||
"";
|
||||
|
||||
/**
|
||||
* Retrieve the shortened 4 character ident for the router located within
|
||||
@ -375,7 +408,7 @@ public class SummaryHelper extends HelperBase {
|
||||
List<Destination> clients = new ArrayList(_context.clientManager().listClients());
|
||||
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
buf.append("<h3><a href=\"/i2ptunnel/\" target=\"_blank\" title=\"").append(_("Add/remove/edit & control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr class=\"b\"><div class=\"tunnels\">");
|
||||
buf.append("<h3><a href=\"/i2ptunnelmgr\" target=\"_top\" title=\"").append(_("Add/remove/edit & control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr class=\"b\"><div class=\"tunnels\">");
|
||||
if (!clients.isEmpty()) {
|
||||
Collections.sort(clients, new AlphaComparator());
|
||||
buf.append("<table>");
|
||||
@ -618,7 +651,7 @@ public class SummaryHelper extends HelperBase {
|
||||
// display all the time so we display the final failure message, and plugin update messages too
|
||||
String status = UpdateHandler.getStatus();
|
||||
if (status.length() > 0) {
|
||||
buf.append("<h4>").append(status).append("</h4><hr>\n");
|
||||
buf.append("<h4>").append(status).append("</h4>\n");
|
||||
}
|
||||
if (updateAvailable() || unsignedUpdateAvailable()) {
|
||||
if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) {
|
||||
@ -706,10 +739,31 @@ public class SummaryHelper extends HelperBase {
|
||||
}
|
||||
if (buf.length() <= 0)
|
||||
return "";
|
||||
buf.append("<hr>");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private NewsHelper _newshelper;
|
||||
public void storeNewsHelper(NewsHelper n) { _newshelper = n; }
|
||||
public NewsHelper getNewsHelper() { return _newshelper; }
|
||||
|
||||
public List<String> getSummaryBarSections(String page) {
|
||||
String config = "";
|
||||
if ("home".equals(page))
|
||||
config = _context.getProperty(PROP_SUMMARYBAR + page, DEFAULT_MINIMAL);
|
||||
else
|
||||
config = _context.getProperty(PROP_SUMMARYBAR + page, null);
|
||||
if (config == null)
|
||||
config = _context.getProperty(PROP_SUMMARYBAR + "default", DEFAULT_FULL);
|
||||
return Arrays.asList(config.split("" + S));
|
||||
}
|
||||
|
||||
static void saveSummaryBarSections(RouterContext ctx, String page, Map<Integer, String> sections) {
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
for(String section : sections.values())
|
||||
buf.append(section).append(S);
|
||||
ctx.router().saveConfig(PROP_SUMMARYBAR + page, buf.toString());
|
||||
}
|
||||
|
||||
/** output the summary bar to _out */
|
||||
public void renderSummaryBar() throws IOException {
|
||||
SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this);
|
||||
@ -733,4 +787,91 @@ public class SummaryHelper extends HelperBase {
|
||||
private String _requestURI;
|
||||
public void setRequestURI(String s) { _requestURI = s; }
|
||||
public String getRequestURI() { return _requestURI; }
|
||||
|
||||
public String getConfigTable() {
|
||||
String[] allSections = SummaryBarRenderer.ALL_SECTIONS;
|
||||
List<String> sections = getSummaryBarSections("default");
|
||||
TreeSet<String> sortedSections = new TreeSet();
|
||||
|
||||
for (int i = 0; i < allSections.length; i++) {
|
||||
String section = allSections[i];
|
||||
if (!sections.contains(section))
|
||||
sortedSections.add(section);
|
||||
}
|
||||
|
||||
String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
|
||||
String imgPath = CSSHelper.BASE_THEME_PATH + theme + "/images/";
|
||||
|
||||
StringBuilder buf = new StringBuilder(2048);
|
||||
buf.append("<table class=\"sidebarconf\"><tr><th>")
|
||||
.append(_("Remove"))
|
||||
.append("</th><th>")
|
||||
.append(_("Name"))
|
||||
.append("</th><th colspan=\"2\">")
|
||||
.append(_("Order"))
|
||||
.append("</th></tr>\n");
|
||||
for (String section : sections) {
|
||||
int i = sections.indexOf(section);
|
||||
buf.append("<tr><td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"delete_")
|
||||
.append(i)
|
||||
.append("\"></td><td align=\"left\">")
|
||||
.append(section)
|
||||
.append("</td><td align=\"right\"><input type=\"hidden\" name=\"order_")
|
||||
.append(i + "_" + section)
|
||||
.append("\" value=\"")
|
||||
.append(i)
|
||||
.append("\">");
|
||||
if (i > 0) {
|
||||
buf.append("<input type=\"image\" class=\"buttonTop\" name=\"move_")
|
||||
.append(i)
|
||||
.append("_top\" alt=\"")
|
||||
.append(_("Top"))
|
||||
.append("\" src=\"" + imgPath + "move_top.png\">");
|
||||
buf.append("<input type=\"image\" class=\"buttonUp\" name=\"move_")
|
||||
.append(i)
|
||||
.append("_up\" alt=\"")
|
||||
.append(_("Up"))
|
||||
.append("\" src=\"" + imgPath + "move_up.png\">");
|
||||
}
|
||||
buf.append("</td><td align=\"left\">");
|
||||
if (i < sections.size() - 1) {
|
||||
buf.append("<input type=\"image\" class=\"buttonDown\" name=\"move_")
|
||||
.append(i)
|
||||
.append("_down\" alt=\"")
|
||||
.append(_("Down"))
|
||||
.append("\" src=\"" + imgPath + "move_down.png\">");
|
||||
buf.append("<input type=\"image\" class=\"buttonBottom\" name=\"move_")
|
||||
.append(i)
|
||||
.append("_bottom\" alt=\"")
|
||||
.append(_("Bottom"))
|
||||
.append("\" src=\"" + imgPath + "move_bottom.png\">");
|
||||
}
|
||||
buf.append("</td></tr>\n");
|
||||
}
|
||||
buf.append("<tr><td align=\"center\">" +
|
||||
"<input type=\"submit\" name=\"action\" class=\"delete\" value=\"")
|
||||
.append(_("Delete selected"))
|
||||
.append("\"></td><td align=\"left\"><b>")
|
||||
.append(_("Add")).append(":</b> " +
|
||||
"<select name=\"name\">\n" +
|
||||
"<option value=\"\" selected=\"selected\">")
|
||||
.append(_("Select a section to add"))
|
||||
.append("</option>\n");
|
||||
|
||||
for (String s : sortedSections) {
|
||||
buf.append("<option value=\"").append(s).append("\">")
|
||||
.append(s).append("</option>\n");
|
||||
}
|
||||
|
||||
buf.append("</select>\n" +
|
||||
"<input type=\"hidden\" name=\"order\" value=\"")
|
||||
.append(sections.size())
|
||||
.append("\"></td>" +
|
||||
"<td align=\"center\" colspan=\"2\">" +
|
||||
"<input type=\"submit\" name=\"action\" class=\"add\" value=\"")
|
||||
.append(_("Add item"))
|
||||
.append("\"></td></tr>")
|
||||
.append("</table>\n");
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
||||
|
@ -237,14 +237,16 @@ public class UpdateHandler {
|
||||
if (_isPartial)
|
||||
return;
|
||||
StringBuilder buf = new StringBuilder(64);
|
||||
buf.append("<b>").append(_("Updating")).append("</b> ");
|
||||
double pct = ((double)alreadyTransferred + (double)currentWrite) /
|
||||
((double)alreadyTransferred + (double)currentWrite + bytesRemaining);
|
||||
synchronized (_pct) {
|
||||
buf.append(_pct.format(pct));
|
||||
buf.append(_("{0} downloaded", _pct.format(pct)));
|
||||
}
|
||||
buf.append(":<br>\n");
|
||||
buf.append(_("{0}B transferred", DataHelper.formatSize2(currentWrite + alreadyTransferred)));
|
||||
buf.append("<br>\n");
|
||||
buf.append(DataHelper.formatSize2(currentWrite + alreadyTransferred))
|
||||
.append("B / ")
|
||||
.append(DataHelper.formatSize2(currentWrite + alreadyTransferred + bytesRemaining))
|
||||
.append("B");
|
||||
updateStatus(buf.toString());
|
||||
}
|
||||
public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("configure bandwidth")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config advanced")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
|
@ -10,7 +10,14 @@ button span.hide{
|
||||
display:none;
|
||||
}
|
||||
input.default { width: 1px; height: 1px; visibility: hidden; }
|
||||
</style></head><body>
|
||||
</style>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
|
@ -12,7 +12,13 @@ input.default {
|
||||
visibility: hidden;
|
||||
}
|
||||
</style>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Home Page Configuration")%></h1>
|
||||
|
@ -5,7 +5,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config keyring")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Keyring Configuration")%></h1>
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config logging")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<jsp:useBean class="net.i2p.router.web.ConfigLoggingHelper" id="logginghelper" scope="request" />
|
||||
<jsp:setProperty name="logginghelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
|
||||
|
@ -5,7 +5,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config networking")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
|
@ -5,7 +5,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config peers")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Peer Configuration")%></h1>
|
||||
|
@ -5,7 +5,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config reseeding")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
|
@ -5,7 +5,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config service")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Service Configuration")%></h1>
|
||||
|
62
apps/routerconsole/jsp/configsidebar.jsp
Normal file
@ -0,0 +1,62 @@
|
||||
<%@page contentType="text/html"%>
|
||||
<%@page pageEncoding="UTF-8"%>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config summary bar")%>
|
||||
<style type='text/css'>
|
||||
input.default {
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
visibility: hidden;
|
||||
}
|
||||
</style>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Summary Bar Configuration")%></h1>
|
||||
<div class="main" id="main">
|
||||
<%@include file="confignav.jsi" %>
|
||||
|
||||
<jsp:useBean class="net.i2p.router.web.ConfigSummaryHandler" id="formhandler" scope="request" />
|
||||
<% formhandler.storeMethod(request.getMethod()); %>
|
||||
<jsp:setProperty name="formhandler" property="*" />
|
||||
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" />
|
||||
<%
|
||||
formhandler.setMovingAction();
|
||||
%>
|
||||
<jsp:getProperty name="formhandler" property="allMessages" />
|
||||
<%
|
||||
String pageNonce = formhandler.getNewNonce();
|
||||
%>
|
||||
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="summaryhelper" scope="request" />
|
||||
<jsp:setProperty name="summaryhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
|
||||
<h3><%=intl._("Refresh Interval")%></h3>
|
||||
<form action="" method="POST">
|
||||
<input type="hidden" name="nonce" value="<%=pageNonce%>" >
|
||||
<input type="hidden" name="group" value="0">
|
||||
<input type="text" name="refreshInterval" value="<jsp:getProperty name="intl" property="refresh" />" >
|
||||
<%=intl._("seconds")%>
|
||||
<input type="submit" name="action" class="accept" value="<%=intl._("Save")%>" >
|
||||
</form>
|
||||
|
||||
<h3><%=intl._("Customise Summary Bar")%></h3>
|
||||
<form action="" method="POST">
|
||||
<input type="hidden" name="nonce" value="<%=pageNonce%>" >
|
||||
<input type="hidden" name="group" value="2">
|
||||
<jsp:getProperty name="summaryhelper" property="configTable" />
|
||||
<div class="formaction">
|
||||
<input type="submit" class="reload" name="action" value="<%=intl._("Restore full default")%>" >
|
||||
<input type="submit" class="reload" name="action" value="<%=intl._("Restore minimal default")%>" >
|
||||
</div>
|
||||
</form>
|
||||
</div></body></html>
|
@ -6,10 +6,17 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config stats")%>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
function init()
|
||||
{
|
||||
checkAll = false;
|
||||
initAjax();
|
||||
}
|
||||
function toggleAll(category)
|
||||
{
|
||||
|
@ -5,7 +5,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config tunnels")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config UI")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("config update")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Update Configuration")%></h1>
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("home")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%
|
||||
String consoleNonce = System.getProperty("router.consoleNonce");
|
||||
if (consoleNonce == null) {
|
||||
@ -15,16 +21,13 @@
|
||||
}
|
||||
%>
|
||||
|
||||
<%@include file="summary.jsi" %><h1><%=intl._("I2P Router Console")%></h1>
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
<h1><%=intl._("I2P Router Console")%></h1>
|
||||
<div class="news" id="news">
|
||||
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
|
||||
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
if (newshelper.shouldShowNews()) {
|
||||
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
|
||||
%>
|
||||
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
|
||||
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
|
||||
<jsp:getProperty name="newshelper" property="content" />
|
||||
<hr>
|
||||
<%
|
||||
|
@ -28,6 +28,7 @@
|
||||
<link rel="shortcut icon" href="/themes/console/images/favicon.ico">
|
||||
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" />
|
||||
<jsp:setProperty name="intl" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<link rel="icon" href="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/favicon.ico">
|
||||
<%
|
||||
// clickjacking
|
||||
if (intl.shouldSendXFrame())
|
||||
|
@ -9,7 +9,13 @@
|
||||
%>
|
||||
<html><head><title>I2P Router Console - Debug</title>
|
||||
<%@include file="css.jsi" %>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1>Router SKM</h1>
|
||||
<div class="main" id="main">
|
||||
|
78
apps/routerconsole/jsp/dns.jsp
Normal file
@ -0,0 +1,78 @@
|
||||
<%@page contentType="text/html"%>
|
||||
<%@page trimDirectiveWhitespaces="true"%>
|
||||
<%@page pageEncoding="UTF-8"%>
|
||||
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
|
||||
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
// CSSHelper is also pulled in by css.jsi below...
|
||||
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
|
||||
if (!testIFrame) {
|
||||
response.setStatus(302, "Moved");
|
||||
response.setHeader("Location", "/susidns/index");
|
||||
} else {
|
||||
%>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("addressbook")%>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
function injectClass(f) {
|
||||
f.className += ' iframed';
|
||||
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||
doc.body.className += ' iframed';
|
||||
}
|
||||
function resizeFrame(f) {
|
||||
// offsetHeight returns the height of the visible area for an object, in pixels.
|
||||
// The value contains the height with the padding, scrollBar, and the border,
|
||||
// but does not include the margin. Therefore, any content within the iframe
|
||||
// should have no margins at the very top or very bottom to avoid a scrollbar.
|
||||
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||
var totalHeight = doc.body.offsetHeight;
|
||||
|
||||
// Detect if horizontal scrollbar is present, and add its width to height if so.
|
||||
// This prevents a vertical scrollbar appearing when the min-width is passed.
|
||||
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
|
||||
if (true) {
|
||||
// Create the measurement node
|
||||
var scrollDiv = document.createElement("div");
|
||||
scrollDiv.className = "scrollbar-measure";
|
||||
scrollDiv.style.width = "100px";
|
||||
scrollDiv.style.height = "100px";
|
||||
scrollDiv.style.overflow = "scroll";
|
||||
scrollDiv.style.position = "absolute";
|
||||
scrollDiv.style.top = "-9999px";
|
||||
document.body.appendChild(scrollDiv);
|
||||
|
||||
// Get the scrollbar width
|
||||
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||
totalHeight += scrollbarWidth;
|
||||
|
||||
// Delete the div
|
||||
document.body.removeChild(scrollDiv);
|
||||
}
|
||||
|
||||
f.style.height = totalHeight + "px";
|
||||
}
|
||||
function setupFrame() {
|
||||
f = document.getElementById("susidnsframe");
|
||||
injectClass(f);
|
||||
resizeFrame(f);
|
||||
}
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
<h1><%=intl._("I2P Addressbook")%> <span class="newtab"><a href="/susidns/index" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
|
||||
<div class="main" id="main">
|
||||
<iframe src="/susidns/index" width="100%" height="100%" frameborder="0" border="0" name="susidnsframe" id="susidnsframe" onload="setupFrame()" allowtransparency="true">
|
||||
</iframe>
|
||||
</div></body></html>
|
||||
<%
|
||||
}
|
||||
%>
|
@ -16,10 +16,16 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("Page Not Found")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=ERROR_CODE%> <%=ERROR_MESSAGE%></h1>
|
||||
<h1><%=ERROR_CODE%> <%=ERROR_MESSAGE%></h1>
|
||||
<div class="sorry" id="warning">
|
||||
<%=intl._("Sorry! You appear to be requesting a non-existent Router Console page or resource.")%><hr>
|
||||
<%=intl._("Error 404")%>: <%=ERROR_URI%> <%=intl._("not found")%>.
|
||||
<%=intl._("Error 404")%>: <%=ERROR_URI%> <%=intl._("not found")%>.
|
||||
</div></body></html>
|
||||
|
@ -12,7 +12,13 @@
|
||||
<%
|
||||
graphHelper.storeWriter(out);
|
||||
%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Performance Graphs")%></h1>
|
||||
<div class="main" id="main">
|
||||
|
@ -19,7 +19,13 @@
|
||||
out.print(graphHelper.getRefreshMeta());
|
||||
}
|
||||
%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Performance Graphs")%></h1>
|
||||
<div class="main" id="main">
|
||||
|
@ -9,7 +9,13 @@
|
||||
%>
|
||||
<html><head><title>I2P Router Console - help</title>
|
||||
<%@include file="css.jsi" %>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1>I2P Router Help & Support</h1>
|
||||
<div class="main" id="main"><p>
|
||||
|
@ -9,7 +9,13 @@
|
||||
%>
|
||||
<html><head><title>I2P مساعدة لوحة التحكم</title>
|
||||
<%@include file="css.jsi" %>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1>I2P مساعدة لوحة التحكم</h1>
|
||||
<div class="main" id="main" dir="rtl" lang="ar"><p>
|
||||
|
@ -9,7 +9,13 @@
|
||||
%>
|
||||
<html><head><title>Console du routeur I2P - Aide</title>
|
||||
<%@include file="css.jsi" %>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
Traduction de mars 2011 (magma@mail.i2p)
|
||||
<h1>Aide et assistance du routeur I2P</h1>
|
||||
|
@ -9,7 +9,13 @@
|
||||
%>
|
||||
<html><head><title>I2P Router Console - help</title>
|
||||
<%@include file="css.jsi" %>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1>I2P Router Help & Support</h1>
|
||||
<div class="main" id="main"><p>
|
||||
|
@ -9,7 +9,13 @@
|
||||
%>
|
||||
<html><head><title>Консоль маршрутизатора I2P - справка</title>
|
||||
<%@include file="css.jsi" %>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
<h1>Справка маршрутизатора I2P</h1>
|
||||
|
@ -6,9 +6,9 @@
|
||||
<%=intl.title("home")%>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp", "xhr", 15000); }
|
||||
function initAjax() { setTimeout(requestAjax1, 15000); }
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%
|
||||
@ -20,6 +20,11 @@
|
||||
%>
|
||||
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
|
||||
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
|
||||
%>
|
||||
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
|
||||
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
|
||||
<jsp:useBean class="net.i2p.router.web.ConfigUpdateHelper" id="updatehelper" scope="request" />
|
||||
<jsp:setProperty name="updatehelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
|
||||
@ -28,19 +33,10 @@
|
||||
<div style="height: 36px;">
|
||||
<a href="/console"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/i2plogo.png" alt="<%=intl._("I2P Router Console")%>" title="<%=intl._("I2P Router Console")%>"></a>
|
||||
</div>
|
||||
<hr>
|
||||
<div id="xhr">
|
||||
<!-- for non-script -->
|
||||
<%@include file="xhr1.jsi" %>
|
||||
</div>
|
||||
<%
|
||||
if (!newshelper.shouldShowNews()) {
|
||||
%>
|
||||
<hr><h3><%=intl._("News")%></h3><hr class="b">
|
||||
<jsp:getProperty name="updatehelper" property="newsStatus" />
|
||||
<%
|
||||
} // !shouldShowNews()
|
||||
%>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -48,11 +44,8 @@
|
||||
|
||||
<%
|
||||
if (newshelper.shouldShowNews()) {
|
||||
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
|
||||
%>
|
||||
<div class="news" id="news">
|
||||
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
|
||||
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
|
||||
<jsp:getProperty name="newshelper" property="content" />
|
||||
<hr>
|
||||
<jsp:getProperty name="updatehelper" property="newsStatus" /><br>
|
||||
|
96
apps/routerconsole/jsp/i2ptunnelmgr.jsp
Normal file
@ -0,0 +1,96 @@
|
||||
<%@page contentType="text/html"%>
|
||||
<%@page trimDirectiveWhitespaces="true"%>
|
||||
<%@page pageEncoding="UTF-8"%>
|
||||
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
|
||||
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
// CSSHelper is also pulled in by css.jsi below...
|
||||
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
|
||||
if (!testIFrame) {
|
||||
response.setStatus(302, "Moved");
|
||||
response.setHeader("Location", "/i2ptunnel/");
|
||||
} else {
|
||||
%>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("i2p tunnel manager")%>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
function injectClass(f) {
|
||||
f.className += ' iframed';
|
||||
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||
if (doc.getElementsByClassName == undefined) {
|
||||
doc.getElementsByClassName = function(className)
|
||||
{
|
||||
var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
|
||||
var allElements = document.getElementsByTagName("*");
|
||||
var results = [];
|
||||
|
||||
var element;
|
||||
for (var i = 0; (element = allElements[i]) != null; i++) {
|
||||
var elementClass = element.className;
|
||||
if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
|
||||
results.push(element);
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
}
|
||||
doc.body.className += ' iframed';
|
||||
doc.getElementsByClassName('panel')[0].className += ' iframed';
|
||||
}
|
||||
function resizeFrame(f) {
|
||||
// offsetHeight returns the height of the visible area for an object, in pixels.
|
||||
// The value contains the height with the padding, scrollBar, and the border,
|
||||
// but does not include the margin. Therefore, any content within the iframe
|
||||
// should have no margins at the very top or very bottom to avoid a scrollbar.
|
||||
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||
var totalHeight = doc.body.offsetHeight;
|
||||
|
||||
// Detect if horizontal scrollbar is present, and add its width to height if so.
|
||||
// This prevents a vertical scrollbar appearing when the min-width is passed.
|
||||
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
|
||||
if (true) {
|
||||
// Create the measurement node
|
||||
var scrollDiv = document.createElement("div");
|
||||
scrollDiv.className = "scrollbar-measure";
|
||||
scrollDiv.style.width = "100px";
|
||||
scrollDiv.style.height = "100px";
|
||||
scrollDiv.style.overflow = "scroll";
|
||||
scrollDiv.style.position = "absolute";
|
||||
scrollDiv.style.top = "-9999px";
|
||||
document.body.appendChild(scrollDiv);
|
||||
|
||||
// Get the scrollbar width
|
||||
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||
totalHeight += scrollbarWidth;
|
||||
|
||||
// Delete the div
|
||||
document.body.removeChild(scrollDiv);
|
||||
}
|
||||
|
||||
f.style.height = totalHeight + "px";
|
||||
}
|
||||
function setupFrame() {
|
||||
f = document.getElementById("i2ptunnelframe");
|
||||
injectClass(f);
|
||||
resizeFrame(f);
|
||||
}
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
<h1><%=intl._("I2P Tunnel Manager")%> <span class="newtab"><a href="/i2ptunnel/" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
|
||||
<div class="main" id="main">
|
||||
<iframe src="/i2ptunnel/" width="100%" height="100%" frameborder="0" border="0" name="i2ptunnelframe" id="i2ptunnelframe" onload="setupFrame()" allowtransparency="true">
|
||||
</iframe>
|
||||
</div></body></html>
|
||||
<%
|
||||
}
|
||||
%>
|
@ -5,7 +5,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("Jar File Dump")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %><h1>Jar File Dump</h1>
|
||||
<div class="main" id="main">
|
||||
<jsp:useBean class="net.i2p.router.web.FileDumpHelper" id="dumpHelper" scope="request" />
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("job queue")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %><h1><%=intl._("I2P Router Job Queue")%></h1>
|
||||
<div class="main" id="main">
|
||||
<jsp:useBean class="net.i2p.router.web.JobQueueHelper" id="jobQueueHelper" scope="request" />
|
||||
|
@ -5,7 +5,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("logs")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Router Logs")%></h1>
|
||||
<div class="main" id="main">
|
||||
@ -33,8 +39,10 @@
|
||||
<p><%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%></p>
|
||||
<h3><%=intl._("Critical Logs")%></h3><a name="criticallogs"> </a>
|
||||
<jsp:getProperty name="logsHelper" property="criticalLogs" />
|
||||
<hr>
|
||||
<h3><%=intl._("Router Logs")%> (<a href="configlogging"><%=intl._("configure")%></a>)</h3>
|
||||
<jsp:getProperty name="logsHelper" property="logs" />
|
||||
<hr>
|
||||
<h3><%=intl._("Service (Wrapper) Logs")%></h3><a name="servicelogs"> </a>
|
||||
<jsp:getProperty name="logsHelper" property="serviceLogs" />
|
||||
</div><hr></div></body></html>
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("network database")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Network Database")%></h1>
|
||||
<div class="main" id="main">
|
||||
|
@ -7,7 +7,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("WebApp Not Found")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("Web Application Not Running")%></h1>
|
||||
<div class="sorry" id="warning">
|
||||
|
@ -9,7 +9,13 @@
|
||||
%>
|
||||
<html><head><title>I2P Router Console - internals</title>
|
||||
<%@include file="css.jsi" %>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="conhelper" scope="request" />
|
||||
<jsp:setProperty name="conhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("peer connections")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Network Peers")%></h1>
|
||||
<div class="main" id="main"><div class="wideload">
|
||||
|
@ -6,7 +6,14 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("peer profiles")%>
|
||||
</head><body><%@include file="summary.jsi" %>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("I2P Network Peer Profiles")%></h1>
|
||||
<div class="main" id="main"><div class="wideload">
|
||||
<jsp:useBean class="net.i2p.router.web.ProfilesHelper" id="profilesHelper" scope="request" />
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("statistics")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="oldhelper" scope="request" />
|
||||
<jsp:setProperty name="oldhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
|
@ -1,3 +1,10 @@
|
||||
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
|
||||
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
|
||||
%>
|
||||
<jsp:setProperty name="newshelper" property="page" value="<%=newspath.getAbsolutePath()%>" />
|
||||
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
|
||||
<div class="routersummaryouter">
|
||||
<%
|
||||
// The refresh delay, 0 to disable
|
||||
@ -13,9 +20,11 @@
|
||||
d = net.i2p.data.DataHelper.stripHTML(d); // XSS
|
||||
// pass the new delay parameter to the iframe
|
||||
newDelay = "?refresh=" + d;
|
||||
// update disable boolean
|
||||
intl.setDisableRefresh(d);
|
||||
}
|
||||
if (!"0".equals(d))
|
||||
out.print("<iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\">\n");
|
||||
if (!intl.getDisableRefresh())
|
||||
out.print("<noscript><iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\"></noscript>\n");
|
||||
}
|
||||
%>
|
||||
<div class="routersummary">
|
||||
@ -33,12 +42,12 @@
|
||||
}
|
||||
|
||||
// d and allowIFrame defined above
|
||||
if (!"0".equals(d)) {
|
||||
out.print("</div></iframe>\n");
|
||||
if (!intl.getDisableRefresh()) {
|
||||
out.print("</div><noscript></iframe></noscript>\n");
|
||||
} else if (allowIFrame) {
|
||||
// since we don't have an iframe this will reload the base page, and
|
||||
// the new delay will be passed to the iframe above
|
||||
out.print("<div class=\"refresh\"><form action=\"" + request.getRequestURI() + "\" method=\"POST\">\n" +
|
||||
out.print("<noscript><div class=\"refresh\"><form action=\"" + request.getRequestURI() + "\" method=\"POST\">\n" +
|
||||
"<b>");
|
||||
// We have intl defined when this is included, but not when compiled standalone.
|
||||
out.print(intl._("Refresh (s)"));
|
||||
@ -47,7 +56,7 @@
|
||||
// ditto
|
||||
out.print(intl._("Enable"));
|
||||
out.print("</button>\n" +
|
||||
"</form></div></div>\n");
|
||||
"</form></div></noscript></div>\n");
|
||||
} else {
|
||||
out.print("</div>\n");
|
||||
}
|
||||
|
@ -26,10 +26,11 @@
|
||||
} else {
|
||||
d = net.i2p.data.DataHelper.stripHTML(d); // XSS
|
||||
intl.setRefresh(d);
|
||||
intl.setDisableRefresh(d);
|
||||
}
|
||||
// we probably don't get here if d == "0" since caught in summary.jsi, but just
|
||||
// to be sure...
|
||||
if (!"0".equals(d)) {
|
||||
if (!intl.getDisableRefresh()) {
|
||||
// doesn't work for restart or shutdown with no expl. tunnels,
|
||||
// since the call to ConfigRestartBean.renderStatus() hasn't happened yet...
|
||||
// So we delay slightly
|
||||
@ -52,12 +53,19 @@
|
||||
}
|
||||
%>
|
||||
</head><body style="margin: 0;"><div class="routersummary">
|
||||
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
|
||||
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
|
||||
%>
|
||||
<jsp:setProperty name="newshelper" property="page" value="<%=newspath.getAbsolutePath()%>" />
|
||||
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
|
||||
<%@include file="summarynoframe.jsi" %>
|
||||
<%
|
||||
// d and shutdownSoon defined above
|
||||
if (!shutdownSoon) {
|
||||
out.print("<div class=\"refresh\"><form action=\"summaryframe.jsp\" method=\"POST\">\n");
|
||||
if ("0".equals(d)) {
|
||||
out.print("<hr>\n<div class=\"refresh\"><form action=\"summaryframe.jsp\" method=\"POST\">\n");
|
||||
if (intl.getDisableRefresh()) {
|
||||
out.print("<b>");
|
||||
out.print(intl._("Refresh (s)"));
|
||||
out.print(":</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" >\n");
|
||||
|
@ -1,35 +1,17 @@
|
||||
<%@page import="net.i2p.router.web.SummaryHelper" %>
|
||||
<%
|
||||
/*
|
||||
* Note:
|
||||
* This is included almost 30 times, so keep whitespace etc. to a minimum.
|
||||
* TODO - the bar would render more cleanly if we specified the img height and width here,
|
||||
* but unfortunately the images in the different themes are different sizes.
|
||||
* They range in height from 37 to 43 px. But there's a -2 bottom margin...
|
||||
* So put it in a div.
|
||||
*/
|
||||
%>
|
||||
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" />
|
||||
<jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<jsp:setProperty name="helper" property="action" value="<%=request.getParameter(\"action\")%>" />
|
||||
<jsp:setProperty name="helper" property="updateNonce" value="<%=request.getParameter(\"updateNonce\")%>" />
|
||||
<jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" />
|
||||
<jsp:setProperty name="helper" property="requestURI" value="<%=request.getRequestURI()%>" />
|
||||
<% helper.storeWriter(out); %>
|
||||
<%
|
||||
/*
|
||||
* The following is required for the reseed button to work, although we probably
|
||||
* only need the reseedNonce property.
|
||||
*/
|
||||
%>
|
||||
<jsp:useBean class="net.i2p.router.web.ReseedHandler" id="reseed" scope="request" />
|
||||
<jsp:setProperty name="reseed" property="*" />
|
||||
<%
|
||||
/*
|
||||
* The following is required for the update buttons to work, although we probably
|
||||
* only need the updateNonce property.
|
||||
*/
|
||||
%>
|
||||
<jsp:useBean class="net.i2p.router.web.UpdateHandler" id="update" scope="request" />
|
||||
<jsp:setProperty name="update" property="*" />
|
||||
<jsp:setProperty name="update" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
// moved to java for ease of translation and to avoid 30 copies
|
||||
helper.renderSummaryBar();
|
||||
%>
|
||||
<div style="height: 36px;">
|
||||
<a href="/" target="_top">
|
||||
<img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/i2plogo.png" alt="<%=intl._("I2P Router Console")%>" title="<%=intl._("I2P Router Console")%>">
|
||||
</a>
|
||||
</div>
|
||||
<div id="xhr">
|
||||
<!-- for non-script -->
|
||||
<%@include file="xhr1.jsi" %>
|
||||
</div>
|
||||
|
78
apps/routerconsole/jsp/torrents.jsp
Normal file
@ -0,0 +1,78 @@
|
||||
<%@page contentType="text/html"%>
|
||||
<%@page trimDirectiveWhitespaces="true"%>
|
||||
<%@page pageEncoding="UTF-8"%>
|
||||
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
|
||||
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
// CSSHelper is also pulled in by css.jsi below...
|
||||
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
|
||||
if (!testIFrame) {
|
||||
response.setStatus(302, "Moved");
|
||||
response.setHeader("Location", "/i2psnark/");
|
||||
} else {
|
||||
%>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("torrents")%>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
function injectClass(f) {
|
||||
f.className += ' iframed';
|
||||
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||
doc.body.className += ' iframed';
|
||||
}
|
||||
function resizeFrame(f) {
|
||||
// offsetHeight returns the height of the visible area for an object, in pixels.
|
||||
// The value contains the height with the padding, scrollBar, and the border,
|
||||
// but does not include the margin. Therefore, any content within the iframe
|
||||
// should have no margins at the very top or very bottom to avoid a scrollbar.
|
||||
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||
var totalHeight = doc.body.offsetHeight;
|
||||
|
||||
// Detect if horizontal scrollbar is present, and add its width to height if so.
|
||||
// This prevents a vertical scrollbar appearing when the min-width is passed.
|
||||
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
|
||||
if (true) {
|
||||
// Create the measurement node
|
||||
var scrollDiv = document.createElement("div");
|
||||
scrollDiv.className = "scrollbar-measure";
|
||||
scrollDiv.style.width = "100px";
|
||||
scrollDiv.style.height = "100px";
|
||||
scrollDiv.style.overflow = "scroll";
|
||||
scrollDiv.style.position = "absolute";
|
||||
scrollDiv.style.top = "-9999px";
|
||||
document.body.appendChild(scrollDiv);
|
||||
|
||||
// Get the scrollbar width
|
||||
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||
totalHeight += scrollbarWidth;
|
||||
|
||||
// Delete the div
|
||||
document.body.removeChild(scrollDiv);
|
||||
}
|
||||
|
||||
f.style.height = totalHeight + "px";
|
||||
}
|
||||
function setupFrame() {
|
||||
f = document.getElementById("i2psnarkframe");
|
||||
injectClass(f);
|
||||
resizeFrame(f);
|
||||
}
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
<h1><%=intl._("I2P Torrent Downloader")%> <span class="newtab"><a href="/i2psnark/" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
|
||||
<div class="main" id="main">
|
||||
<iframe src="/i2psnark/" width="100%" height="100%" frameborder="0" border="0" name="i2psnarkframe" id="i2psnarkframe" onload="setupFrame()" allowtransparency="true">
|
||||
</iframe>
|
||||
</div></body></html>
|
||||
<%
|
||||
}
|
||||
%>
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("tunnel summary")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %><h1><%=intl._("I2P Tunnel Summary")%></h1>
|
||||
<div class="main" id="main">
|
||||
<jsp:useBean class="net.i2p.router.web.TunnelHelper" id="tunnelHelper" scope="request" />
|
||||
|
@ -6,7 +6,13 @@
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("Peer Profile")%>
|
||||
</head><body>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
<%@include file="summary.jsi" %>
|
||||
<h1><%=intl._("Peer Profile")%></h1>
|
||||
<div class="main" id="main"><div class="wideload">
|
||||
|
78
apps/routerconsole/jsp/webmail.jsp
Normal file
@ -0,0 +1,78 @@
|
||||
<%@page contentType="text/html"%>
|
||||
<%@page trimDirectiveWhitespaces="true"%>
|
||||
<%@page pageEncoding="UTF-8"%>
|
||||
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
|
||||
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
// CSSHelper is also pulled in by css.jsi below...
|
||||
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
|
||||
if (!testIFrame) {
|
||||
response.setStatus(302, "Moved");
|
||||
response.setHeader("Location", "/susimail/susimail");
|
||||
} else {
|
||||
%>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
|
||||
<html><head>
|
||||
<%@include file="css.jsi" %>
|
||||
<%=intl.title("webmail")%>
|
||||
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||
function injectClass(f) {
|
||||
f.className += ' iframed';
|
||||
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||
doc.body.className += ' iframed';
|
||||
}
|
||||
function resizeFrame(f) {
|
||||
// offsetHeight returns the height of the visible area for an object, in pixels.
|
||||
// The value contains the height with the padding, scrollBar, and the border,
|
||||
// but does not include the margin. Therefore, any content within the iframe
|
||||
// should have no margins at the very top or very bottom to avoid a scrollbar.
|
||||
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||
var totalHeight = doc.body.offsetHeight;
|
||||
|
||||
// Detect if horizontal scrollbar is present, and add its width to height if so.
|
||||
// This prevents a vertical scrollbar appearing when the min-width is passed.
|
||||
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
|
||||
if (true) {
|
||||
// Create the measurement node
|
||||
var scrollDiv = document.createElement("div");
|
||||
scrollDiv.className = "scrollbar-measure";
|
||||
scrollDiv.style.width = "100px";
|
||||
scrollDiv.style.height = "100px";
|
||||
scrollDiv.style.overflow = "scroll";
|
||||
scrollDiv.style.position = "absolute";
|
||||
scrollDiv.style.top = "-9999px";
|
||||
document.body.appendChild(scrollDiv);
|
||||
|
||||
// Get the scrollbar width
|
||||
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||
totalHeight += scrollbarWidth;
|
||||
|
||||
// Delete the div
|
||||
document.body.removeChild(scrollDiv);
|
||||
}
|
||||
|
||||
f.style.height = totalHeight + "px";
|
||||
}
|
||||
function setupFrame() {
|
||||
f = document.getElementById("susimailframe");
|
||||
injectClass(f);
|
||||
resizeFrame(f);
|
||||
}
|
||||
</script>
|
||||
</head><body onload="initAjax()">
|
||||
|
||||
<%@include file="summary.jsi" %>
|
||||
|
||||
<h1><%=intl._("I2P Webmail")%> <span class="newtab"><a href="/susimail/susimail" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
|
||||
<div class="main" id="main">
|
||||
<iframe src="/susimail/susimail" width="100%" height="100%" frameborder="0" border="0" name="susimailframe" id="susimailframe" onload="setupFrame()" allowtransparency="true">
|
||||
</iframe>
|
||||
</div></body></html>
|
||||
<%
|
||||
}
|
||||
%>
|
@ -1,24 +1,41 @@
|
||||
<%@page import="net.i2p.router.web.SummaryHelper" %>
|
||||
<%
|
||||
/*
|
||||
* Note:
|
||||
* This is included on every refresh, so keep whitespace etc. to a minimum.
|
||||
*/
|
||||
%>
|
||||
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" />
|
||||
<jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<jsp:setProperty name="helper" property="action" value="<%=request.getParameter(\"action\")%>" />
|
||||
<table><tr><td align="left"><b><%=intl._("Version")%>:</b></td><td align="right">
|
||||
<jsp:getProperty name="helper" property="version" />
|
||||
</td></tr><tr><td align="left"><b><%=intl._("Uptime")%>:</b></td><td align="right">
|
||||
<jsp:getProperty name="helper" property="uptime" />
|
||||
</td></tr></table><hr>
|
||||
<jsp:setProperty name="helper" property="updateNonce" value="<%=request.getParameter(\"updateNonce\")%>" />
|
||||
<jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" />
|
||||
<%
|
||||
String reqURI = request.getRequestURI();
|
||||
if (reqURI != null)
|
||||
reqURI = reqURI.replace("/xhr1.jsp", "/home");
|
||||
if (reqURI.contains("/xhr1"))
|
||||
reqURI = request.getParameter("requestURI");
|
||||
helper.setRequestURI(reqURI);
|
||||
%>
|
||||
<h4><a href="/confignet#help" title="<%=intl._("Help with configuring your firewall and router for optimal I2P performance")%>"><%=intl._("Network")%>:
|
||||
<jsp:getProperty name="helper" property="reachability" /></a></h4>
|
||||
<hr>
|
||||
<jsp:getProperty name="helper" property="updateStatus" />
|
||||
<jsp:getProperty name="helper" property="restartStatus" />
|
||||
<hr>
|
||||
<jsp:getProperty name="helper" property="firewallAndReseedStatus" />
|
||||
<jsp:getProperty name="helper" property="destinations" />
|
||||
<% helper.storeWriter(out); %>
|
||||
<% helper.storeNewsHelper(newshelper); %>
|
||||
<%
|
||||
/*
|
||||
* The following is required for the reseed button to work, although we probably
|
||||
* only need the reseedNonce property.
|
||||
*/
|
||||
%>
|
||||
<jsp:useBean class="net.i2p.router.web.ReseedHandler" id="reseed" scope="request" />
|
||||
<jsp:setProperty name="reseed" property="*" />
|
||||
<%
|
||||
/*
|
||||
* The following is required for the update buttons to work, although we probably
|
||||
* only need the updateNonce property.
|
||||
*/
|
||||
%>
|
||||
<jsp:useBean class="net.i2p.router.web.UpdateHandler" id="update" scope="request" />
|
||||
<jsp:setProperty name="update" property="*" />
|
||||
<jsp:setProperty name="update" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
// moved to java for ease of translation
|
||||
helper.renderSummaryBar();
|
||||
%>
|
||||
|
@ -11,4 +11,11 @@
|
||||
%>
|
||||
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" />
|
||||
<jsp:setProperty name="intl" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
|
||||
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||
<%
|
||||
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
|
||||
%>
|
||||
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
|
||||
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
|
||||
<%@include file="xhr1.jsi" %>
|
||||
|
@ -40,11 +40,10 @@ import net.i2p.data.DataHelper;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.util.SecureFileOutputStream;
|
||||
|
||||
public class AddressbookBean
|
||||
public class AddressbookBean extends BaseBean
|
||||
{
|
||||
protected String book, action, serial, lastSerial, filter, search, hostname, destination;
|
||||
protected int beginIndex, endIndex;
|
||||
protected final Properties properties;
|
||||
private Properties addressbook;
|
||||
private int trClass;
|
||||
protected final LinkedList<String> deletionMarks;
|
||||
@ -82,41 +81,12 @@ public class AddressbookBean
|
||||
|
||||
public AddressbookBean()
|
||||
{
|
||||
properties = new Properties();
|
||||
super();
|
||||
deletionMarks = new LinkedList();
|
||||
beginIndex = 0;
|
||||
endIndex = DISPLAY_SIZE - 1;
|
||||
}
|
||||
|
||||
private long configLastLoaded = 0;
|
||||
private static final String PRIVATE_BOOK = "private_addressbook";
|
||||
private static final String DEFAULT_PRIVATE_BOOK = "../privatehosts.txt";
|
||||
|
||||
protected void loadConfig()
|
||||
{
|
||||
long currentTime = System.currentTimeMillis();
|
||||
|
||||
if( !properties.isEmpty() && currentTime - configLastLoaded < 10000 )
|
||||
return;
|
||||
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
properties.clear();
|
||||
fis = new FileInputStream( ConfigBean.configFileName );
|
||||
properties.load( fis );
|
||||
// added in 0.5, for compatibility with 0.4 config.txt
|
||||
if( properties.getProperty(PRIVATE_BOOK) == null)
|
||||
properties.setProperty(PRIVATE_BOOK, DEFAULT_PRIVATE_BOOK);
|
||||
configLastLoaded = currentTime;
|
||||
}
|
||||
catch (Exception e) {
|
||||
Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
|
||||
} finally {
|
||||
if (fis != null)
|
||||
try { fis.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
}
|
||||
|
||||
public String getFileName()
|
||||
{
|
||||
loadConfig();
|
||||
|
64
apps/susidns/src/java/src/i2p/susi/dns/BaseBean.java
Normal file
@ -0,0 +1,64 @@
|
||||
package i2p.susi.dns;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Holds methods common to several Beans.
|
||||
* @since 0.9.1
|
||||
*/
|
||||
public class BaseBean
|
||||
{
|
||||
protected final Properties properties;
|
||||
|
||||
private long configLastLoaded = 0;
|
||||
private static final String PRIVATE_BOOK = "private_addressbook";
|
||||
private static final String DEFAULT_PRIVATE_BOOK = "../privatehosts.txt";
|
||||
|
||||
public static final String PROP_THEME_NAME = "theme";
|
||||
public static final String DEFAULT_THEME = "light";
|
||||
public static final String BASE_THEME_PATH = "/themes/susidns/";
|
||||
|
||||
public BaseBean()
|
||||
{
|
||||
properties = new Properties();
|
||||
}
|
||||
|
||||
protected void loadConfig()
|
||||
{
|
||||
long currentTime = System.currentTimeMillis();
|
||||
|
||||
if( !properties.isEmpty() && currentTime - configLastLoaded < 10000 )
|
||||
return;
|
||||
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
properties.clear();
|
||||
fis = new FileInputStream( ConfigBean.configFileName );
|
||||
properties.load( fis );
|
||||
// added in 0.5, for compatibility with 0.4 config.txt
|
||||
if( properties.getProperty(PRIVATE_BOOK) == null)
|
||||
properties.setProperty(PRIVATE_BOOK, DEFAULT_PRIVATE_BOOK);
|
||||
configLastLoaded = currentTime;
|
||||
}
|
||||
catch (Exception e) {
|
||||
Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
|
||||
} finally {
|
||||
if (fis != null)
|
||||
try { fis.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the theme path
|
||||
* @since 0.9.1
|
||||
*/
|
||||
public String getTheme() {
|
||||
loadConfig();
|
||||
String url = BASE_THEME_PATH;
|
||||
String theme = properties.getProperty(PROP_THEME_NAME, DEFAULT_THEME);
|
||||
url += theme + "/";
|
||||
return url;
|
||||
}
|
||||
}
|
@ -36,38 +36,10 @@ import java.util.Properties;
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.util.SecureFileOutputStream;
|
||||
|
||||
public class SubscriptionsBean
|
||||
public class SubscriptionsBean extends BaseBean
|
||||
{
|
||||
private String action, fileName, content, serial, lastSerial;
|
||||
|
||||
Properties properties;
|
||||
|
||||
public SubscriptionsBean()
|
||||
{
|
||||
properties = new Properties();
|
||||
}
|
||||
private long configLastLoaded = 0;
|
||||
private void loadConfig()
|
||||
{
|
||||
long currentTime = System.currentTimeMillis();
|
||||
|
||||
if( !properties.isEmpty() && currentTime - configLastLoaded < 10000 )
|
||||
return;
|
||||
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
properties.clear();
|
||||
fis = new FileInputStream( ConfigBean.configFileName );
|
||||
properties.load( fis );
|
||||
configLastLoaded = currentTime;
|
||||
}
|
||||
catch (Exception e) {
|
||||
Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
|
||||
} finally {
|
||||
if (fis != null)
|
||||
try { fis.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
}
|
||||
public String getAction() {
|
||||
return action;
|
||||
}
|
||||
|
@ -47,12 +47,12 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>${book.book} <%=intl._("address book")%> - susidns</title>
|
||||
<link rel="stylesheet" type="text/css" href="css.css">
|
||||
<link rel="stylesheet" type="text/css" href="<%=book.getTheme()%>susidns.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<div id="logo">
|
||||
<a href="index"><img src="images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
|
||||
<a href="index"><img src="<%=book.getTheme()%>images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
|
||||
</div>
|
||||
<hr>
|
||||
<div id="navi">
|
||||
|
@ -36,6 +36,7 @@
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application"/>
|
||||
<jsp:useBean id="cfg" class="i2p.susi.dns.ConfigBean" scope="session"/>
|
||||
<jsp:useBean id="base" class="i2p.susi.dns.BaseBean" scope="session" />
|
||||
<jsp:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
|
||||
<jsp:setProperty name="cfg" property="*" />
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
@ -43,12 +44,12 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=intl._("configuration")%> - susidns</title>
|
||||
<link rel="stylesheet" type="text/css" href="css.css">
|
||||
<link rel="stylesheet" type="text/css" href="<%=base.getTheme()%>susidns.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<div id="logo">
|
||||
<a href="index"><img src="images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
|
||||
<a href="index"><img src="<%=base.getTheme()%>images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
|
||||
</div><hr>
|
||||
<div id="navi">
|
||||
<p>
|
||||
@ -129,6 +130,9 @@
|
||||
<li><b>log</b> -
|
||||
<%=intl._("File to log activity to (change to /dev/null if you like)")%>
|
||||
</li>
|
||||
<li><b>theme</b> -
|
||||
<%=intl._("Name of the theme to use (defaults to 'light')")%>
|
||||
</li>
|
||||
</ul>
|
||||
</div><hr>
|
||||
<div id="footer">
|
||||
|
@ -41,12 +41,12 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>${book.book} <%=intl._("addressbook")%> - susidns</title>
|
||||
<link rel="stylesheet" type="text/css" href="css.css">
|
||||
<link rel="stylesheet" type="text/css" href="<%=book.getTheme()%>susidns.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<div id="logo">
|
||||
<a href="index"><img src="images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
|
||||
<a href="index"><img src="<%=book.getTheme()%>images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
|
||||
</div>
|
||||
<hr>
|
||||
<div id="navi">
|
||||
|
@ -35,18 +35,19 @@
|
||||
<%@ page contentType="text/html"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
|
||||
<jsp:useBean id="base" class="i2p.susi.dns.BaseBean" scope="session" />
|
||||
<jsp:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=intl._("Introduction")%> - SusiDNS</title>
|
||||
<link rel="stylesheet" type="text/css" href="css.css">
|
||||
<link rel="stylesheet" type="text/css" href="<%=base.getTheme()%>susidns.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<div id="logo">
|
||||
<img src="images/logo.png" alt="susidns logo" border="0">
|
||||
<img src="<%=base.getTheme()%>images/logo.png" alt="susidns logo" border="0">
|
||||
</div>
|
||||
<hr>
|
||||
<div id="navi">
|
||||
@ -85,7 +86,7 @@
|
||||
<%=intl._("Hosts in the private address book can be accessed by you but their addresses are never distributed to others.")%>
|
||||
<%=intl._("The private address book can also be used for aliases of hosts in your other address books.")%>
|
||||
</p>
|
||||
<center><img src="images/how.png" border="0" alt="address book working scheme" title="How the address book works" class="illustrate" /></center>
|
||||
<center><img src="/themes/susidns/images/how.png" border="0" alt="address book working scheme" title="How the address book works" class="illustrate" /></center>
|
||||
</div>
|
||||
<hr>
|
||||
<div id="footer">
|
||||
|
@ -43,12 +43,12 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=intl._("subscriptions")%> - susidns</title>
|
||||
<link rel="stylesheet" type="text/css" href="css.css">
|
||||
<link rel="stylesheet" type="text/css" href="<%=subs.getTheme()%>susidns.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<div id="logo">
|
||||
<a href="index"><img src="images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
|
||||
<a href="index"><img src="<%=subs.getTheme()%>images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
|
||||
</div><hr>
|
||||
<div id="navi">
|
||||
<p>
|
||||
|
@ -164,6 +164,9 @@ public class WebMail extends HttpServlet
|
||||
|
||||
private static final String CONFIG_BCC_TO_SELF = "composer.bcc.to.self";
|
||||
|
||||
private static final String CONFIG_THEME = "theme";
|
||||
private static final String DEFAULT_THEME = "light";
|
||||
|
||||
private static final String spacer = " ";
|
||||
private static final String thSpacer = "<th> </th>\n";
|
||||
/**
|
||||
@ -314,6 +317,7 @@ public class WebMail extends HttpServlet
|
||||
public String sentMail;
|
||||
public ArrayList attachments;
|
||||
public boolean reallyDelete;
|
||||
String themePath, imgPath;
|
||||
|
||||
|
||||
SessionObject()
|
||||
@ -357,9 +361,9 @@ public class WebMail extends HttpServlet
|
||||
* @param label
|
||||
* @return
|
||||
*/
|
||||
private static String sortHeader( String name, String label )
|
||||
private static String sortHeader( String name, String label, String imgPath )
|
||||
{
|
||||
return "" + label + " <a href=\"" + myself + "?" + name + "=up\"><img src=\"3up.png\" border=\"0\" alt=\"^\"></a><a href=\"" + myself + "?" + name + "=down\"><img src=\"3down.png\" border=\"0\" alt=\"v\"></a>";
|
||||
return "" + label + " <a href=\"" + myself + "?" + name + "=up\"><img src=\"" + imgPath + "3up.png\" border=\"0\" alt=\"^\"></a><a href=\"" + myself + "?" + name + "=down\"><img src=\"" + imgPath + "3down.png\" border=\"0\" alt=\"v\"></a>";
|
||||
}
|
||||
/**
|
||||
* check, if a given button "was pressed" in the received http request
|
||||
@ -1202,6 +1206,8 @@ public class WebMail extends HttpServlet
|
||||
sessionObject.info = "";
|
||||
sessionObject.pageChanged = false;
|
||||
sessionObject.showAttachment = null;
|
||||
sessionObject.themePath = "/themes/susimail/" + Config.getProperty(CONFIG_THEME, DEFAULT_THEME) + '/';
|
||||
sessionObject.imgPath = sessionObject.themePath + "images/";
|
||||
|
||||
processStateChangeButtons( sessionObject, request );
|
||||
|
||||
@ -1260,9 +1266,9 @@ public class WebMail extends HttpServlet
|
||||
"<head>\n" +
|
||||
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n" +
|
||||
"<title>susimail - " + subtitle + "</title>\n" +
|
||||
"<link rel=\"stylesheet\" type=\"text/css\" href=\"css.css\">\n" +
|
||||
"<link rel=\"stylesheet\" type=\"text/css\" href=\"" + sessionObject.themePath + "susimail.css\">\n" +
|
||||
"</head>\n<body>\n" +
|
||||
"<div class=\"page\"><p><img src=\"susimail.png\" alt=\"Susimail\"><br> </p>\n" +
|
||||
"<div class=\"page\"><p><img src=\"" + sessionObject.imgPath + "susimail.png\" alt=\"Susimail\"><br> </p>\n" +
|
||||
"<form method=\"POST\" enctype=\"multipart/form-data\" action=\"" + myself + "\">" );
|
||||
|
||||
if( sessionObject.error != null && sessionObject.error.length() > 0 ) {
|
||||
@ -1607,10 +1613,10 @@ public class WebMail extends HttpServlet
|
||||
button( RELOAD, _("Reload Config") ) + spacer +
|
||||
button( LOGOUT, _("Logout") ) + "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
|
||||
"<tr><td colspan=\"8\"><hr></td></tr>\n<tr>" +
|
||||
thSpacer + "<th>" + sortHeader( SORT_SENDER, _("Sender") ) + "</th>" +
|
||||
thSpacer + "<th>" + sortHeader( SORT_SUBJECT, _("Subject") ) + "</th>" +
|
||||
thSpacer + "<th>" + sortHeader( SORT_DATE, _("Date") ) + sortHeader( SORT_ID, "" ) + "</th>" +
|
||||
thSpacer + "<th>" + sortHeader( SORT_SIZE, _("Size") ) + "</th></tr>" );
|
||||
thSpacer + "<th>" + sortHeader( SORT_SENDER, _("Sender"), sessionObject.imgPath ) + "</th>" +
|
||||
thSpacer + "<th>" + sortHeader( SORT_SUBJECT, _("Subject"), sessionObject.imgPath ) + "</th>" +
|
||||
thSpacer + "<th>" + sortHeader( SORT_DATE, _("Date"), sessionObject.imgPath ) + sortHeader( SORT_ID, "", sessionObject.imgPath ) + "</th>" +
|
||||
thSpacer + "<th>" + sortHeader( SORT_SIZE, _("Size"), sessionObject.imgPath ) + "</th></tr>" );
|
||||
int bg = 0;
|
||||
int i = 0;
|
||||
for( Iterator it = sessionObject.folder.currentPageIterator(); it != null && it.hasNext(); ) {
|
||||
|
34
history.txt
@ -1,3 +1,37 @@
|
||||
2012-07-16 str4d
|
||||
* console: work towards better integration
|
||||
- Wrapped the bundled apps in iFrames (with a link in the page header to
|
||||
open the app in a new tab):
|
||||
- i2ptunnel
|
||||
- i2psnark
|
||||
- susimail
|
||||
- susidns
|
||||
- Theme improvements
|
||||
- Added theme support to susimail and susidns
|
||||
- "susimail.theme=foo" in susimail.config
|
||||
- "theme=foo" on susidns config page
|
||||
- Extensive work on dark console theme (dr|z3d)
|
||||
- Improved integration of i2ptunnel in iframe
|
||||
- General improvements
|
||||
- New dark themes for i2psnark, susimail and susidns which integrate well
|
||||
with dark console theme (dr|z3d)
|
||||
- Tweaks to other themes (console and i2psnark) to work with the various
|
||||
structural changes (dr|z3d)
|
||||
- Added per-theme favicons
|
||||
- Updated IE shim to fix some issues
|
||||
- Summary bar improvements
|
||||
- Updated every console page to use Ajax for the summary bar
|
||||
- Falls back to iFrame if JS disabled
|
||||
- Ajax refresh time is adjustable
|
||||
- The summary bar is now customizable; sections can be added, removed and
|
||||
reordered as desired
|
||||
- Added/updated tooltips
|
||||
- Added a new summary bar section to show news headings when the main news
|
||||
display is hidden
|
||||
- Changes to structure of /home to bring it in line with rest of console
|
||||
* i2psnark
|
||||
- Reworked the torrent info/file manager page to improve the layout
|
||||
|
||||
2012-07-15 zzz
|
||||
* XORComparator: Reduce object churn (Ticket #658)
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
<li class="tidylist"><b>Invisible Internet & Public Web Browsing</b><br>On I2P you can access anonymous websites (eepsites) and other services (e.g. ssh over I2P, IRC, Jabber etc.) in addition to being able to host your own services. You can also access the normal web anonymously via I2P's built-in web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configure your browser</a> to use the HTTP proxy at <code>127.0.0.1 port 4444</code>, then browse to an eepsite or a normal, unencrypted <code>http://</code> address. If you wish to disable or change outproxy access to the normal internet, remove or modify the outproxy entry for <code>false.i2p</code> under the <i>Outproxies</i> option in the <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In the "Sites of Interest" section <a href="#eepsites">below</a>, we list a few of the sites hosted on I2P.</li>
|
||||
|
||||
<li class="tidylist"><b>Anonymous E-Mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/susimail/susimail">I2P's built-in mail client</a>
|
||||
<li class="tidylist"><b>Anonymous E-Mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/webmail">I2P's built-in mail client</a>
|
||||
(susimail) or using any mail client that supports smtp and pop3.
|
||||
Accounts can send and receive mail from the normal internet. For an
|
||||
account, visit <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Additionally, <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> is a new I2P-internal serverless, secure (end-to-end encrypted) e-mail system with an integrated anonymous/pseudonymous remailer, providing a web interface and a built-in addressbook. It is developed by HungryHobo, and can be installed as a <a href="#plugins">plugin</a>.</li>
|
||||
|
@ -25,7 +25,7 @@
|
||||
kompatibel zu normalen Email-Klienten (POP3/SMTP) ist, und welches es erlaubt,
|
||||
Emails innerhalb von I2P sowie Emails von und ins normale Internet zu
|
||||
schicken. Hole Dir Dein Emailkonto auf <a href="http://hq.postman.i2p/">hq.postman.i2p</a>.
|
||||
Im Verbund damit gibt es <a href="/susimail/susimail">susimail</a>, einen
|
||||
Im Verbund damit gibt es <a href="/webmail">susimail</a>, einen
|
||||
browserbasierten anonymen POP3/SMTP-Klienten, fertig eingerichtet
|
||||
für Postmans Email-Service.
|
||||
<br>Oder probier unser neues serverloses und Ende-zu-Ende-verschlüsseltes Emailsystem <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a> (mit Webinterface) aus, welches als Plugin erhältlich ist!</li>
|
||||
|
@ -17,7 +17,7 @@
|
||||
<li class="tidylist"><b>navegar en internet</b> - I2P cuenta con un HTTP-"Outproxy". Para poder usarlo, puedes también utilizar el proxy HTTP en el puerto 4444 - Si configuras tu navegador web para usar este proxy, puedes visitar las páginas web de forma anónima. El tráfico será enrutado através de la red I2P.</li>
|
||||
<li class="tidylist"><b>intercambiar datos</b> - Hay una <a href="i2psnark/">adaptación</a> para I2P de la aplicación <a href="http://www.bittorrent.com/">BitTorrent</a>
|
||||
<a href="http://www.klomp.org/snark/">Snark</a>.</li>
|
||||
<li class="tidylist"><b>correo electrónico anónimo</b> - Postman creó un sistema de correo electrónico que es compatible con las aplicaciones de correo comunes (POP3/SMTP), el cual permite enviar correos electrónicos tanto dentro de I2P como recibir y mandar correos de/a internet. Puedes registrar tu cuenta en <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. Junto a esto tenemos <a href="/susimail/susimail">susimail</a>, un cliente anónimo de correo que se abre en el navegador web. Ya está configurado para el servicio de Postman.<br>También te recomendamos nuestro nuevo sistema de correo electrónico sin servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe en forma de plugin. Viene con una interfaz web y cifra todos los mensajes de fin a fin.</li>
|
||||
<li class="tidylist"><b>correo electrónico anónimo</b> - Postman creó un sistema de correo electrónico que es compatible con las aplicaciones de correo comunes (POP3/SMTP), el cual permite enviar correos electrónicos tanto dentro de I2P como recibir y mandar correos de/a internet. Puedes registrar tu cuenta en <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. Junto a esto tenemos <a href="/webmail">susimail</a>, un cliente anónimo de correo que se abre en el navegador web. Ya está configurado para el servicio de Postman.<br>También te recomendamos nuestro nuevo sistema de correo electrónico sin servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe en forma de plugin. Viene con una interfaz web y cifra todos los mensajes de fin a fin.</li>
|
||||
<li class="tidylist"><b>chat anónimo</b> - Lanza tu cliente IRC preferido y conéctate con el servidor anónimo en
|
||||
<b>127.0.0.1 puerto 6668</b>. Esto te llevará a uno de dos servidores anónimos de IRC
|
||||
- y ni tu ni los demás usuarios sabrán quien es el otro, ni siquiera el administrador del servidor.</li>
|
||||
|
@ -34,7 +34,7 @@ mandataire <code>127.0.0.1 sur le port 4444</code>, puis promenez-vous sur les s
|
||||
<a href="#eepsites">ci-dessous</a>, vous trouverez notre petite sélection de sites hébergés sur I2P.</li>
|
||||
|
||||
<li class="tidylist"><b>Messagerie anonyme</b><br>Le système de messagerie basé sur I2P de Postman est utilisable soit
|
||||
par le <a href="/susimail/susimail">client de messagerie I2P intégré</a> dans la console du routeur (susimail), soit en
|
||||
par le <a href="/webmail">client de messagerie I2P intégré</a> dans la console du routeur (susimail), soit en
|
||||
configurant n'importe quel logiciel client de messagerie compatible SMTP et POP3. Les comptes peuvent recevoir et
|
||||
envoyer du courrier de/vers l'Internet normal. Créez au moins votre compte sur
|
||||
<a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. En complément,
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
<li class="tidylist"><b>Invisible Internet & Public Web Browsing</b><br>Op I2P kan je toegang verkrijgen tot anonieme websites (eepsites) en andere diensten (zoals; SSH over I2P, IRC, Jabber etc.), daarnaast heb je ook de mogelijkheid om je eigen dienst aan te bieden. Je kan ook anoniem toegang krijgen tot het normale Internet via de ingebouwde web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configureer je browser</a> voor het gebruik van de HTTP proxy op <code>127.0.0.1 poort 4444</code>, waarna je naar zowel eepsites als normale, onversleutelde <code>http://</code> websites kan surfen. Als je een aanpassing wilt maken aan de outproxy of deze wilt uitschakelen kan je de 'client tunnel' voor <code>false.i2p</code> onder het <i>Outproxies</i> gedeelte in de <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In het "Interessante websites" gedeelte <a href="#eepsites">hier onder</a> staat een lijst met een paar van de bekende sites die op I2P gehost worden.</li>
|
||||
|
||||
<li class="tidylist"><b>Anonieme E-Mail</b><br>Postman's I2P email systeem kan worden benaderd via <a href="/susimail/susimail">de ingebouwde email client</a>
|
||||
<li class="tidylist"><b>Anonieme E-Mail</b><br>Postman's I2P email systeem kan worden benaderd via <a href="/webmail">de ingebouwde email client</a>
|
||||
(susimail) of door het gebruik van elke andere normale email client die ondersteuning biedt voor SMTP en POP3.
|
||||
Deze accounts kunnen tevens email versturen en ontvangen naar en van het normale Internet. Voor een account, bezoek <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Daarnaast is er <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a>, dit is een nieuw end-to-end versleuteld email systeem zonder centrale servers welke een webinterface en geïntegreerd adressen boek bied. Het is ontwikkeld door HungryHobo en kan worden geïnstalleerd als <a href="#plugins">plugin</a>.</li>
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
<li class="tidylist"><b>navegar na internet</b> - I2P dispõe de um "outproxy" http - para usâ-lo, também pode empregar o proxy http no porto 4444 - Se configurar o seu navegador web para usar este proxy, pode visitar as páginas web de maneira anônima e o trânsito será roteado atravez da rede I2P.</li>
|
||||
<li class="tidylist"><b>trocar dados</b> - Ha uma <a href="i2psnark/">adaptação</a> para I2P da aplicação <a href="http://www.bittorrent.com/">BitTorrent</a>
|
||||
<a href="http://www.klomp.org/snark/">Snark</a>.</li>
|
||||
<li class="tidylist"><b>correio eletrônico anônimo</b> - O Postman fez um sistema de correio eletrônico que é compatível com as aplicações de correio eletrônico comunes (POP3/SMTP), o qual permite de enviar correios eletrônicos tanto dentro de I2P como também receber e mandar correios desde a / para a internet. Pode registrar a sua conta aqui: <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. Junto com isso temos <a href="/susimail/susimail">susimail</a>, um cliente anônimo de correio que se abre com o navegador web. Já está configurado para o servício de Postman.<br>Também lhe recomendamos o nosso novo sistema de correio eletrônico sem servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe em forma de um plugin. Vem com uma interface web e criptografa todas as mensagens de final a final.</li>
|
||||
<li class="tidylist"><b>correio eletrônico anônimo</b> - O Postman fez um sistema de correio eletrônico que é compatível com as aplicações de correio eletrônico comunes (POP3/SMTP), o qual permite de enviar correios eletrônicos tanto dentro de I2P como também receber e mandar correios desde a / para a internet. Pode registrar a sua conta aqui: <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. Junto com isso temos <a href="/webmail">susimail</a>, um cliente anônimo de correio que se abre com o navegador web. Já está configurado para o servício de Postman.<br>Também lhe recomendamos o nosso novo sistema de correio eletrônico sem servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe em forma de um plugin. Vem com uma interface web e criptografa todas as mensagens de final a final.</li>
|
||||
<li class="tidylist"><b>bate-papo anônimo</b> - Lance o seu cliente IRC preferido e conécte-se com o servidor anônimamente en
|
||||
<b>127.0.0.1 porto 6668</b>. Isto lhe levará a um dos dois servidores anônimos de IRC oficiales em I2P
|
||||
- e nem você nem os outros usuários sabrão quem é o outro, nem mesmo o administrador do servidor!</li>
|
||||
|
@ -43,7 +43,7 @@ fungerar med vanliga email-klienter
|
||||
och från det vanliga Internet!
|
||||
skaffa dig ett konto hos <a
|
||||
href="http://hq.postman.i2p/">hq.postman.i2p</a>.
|
||||
Vi skickar med <a href="/susimail/susimail">susimail</a>,
|
||||
Vi skickar med <a href="/webmail">susimail</a>,
|
||||
som är en webb-baserad anonymt inriktad pop3/smtp-klient, inställd
|
||||
till att ansluta till postmans email-tjänst.</li>
|
||||
<li><b>chatta anonymt</b> - starta din IRC-klient och anslut till
|
||||
|
@ -15,7 +15,7 @@
|
||||
I2P网络中还有很多其他站点 - 访问上面的网站你会找到更多,别忘了收藏你喜爱的 I2P 网站方便访问。<br>
|
||||
<li><b>浏览 Web 网页</b> - 目前 IP2 网络中的出口代理("Outproxy")只有一个,它的HTTP代理映射在本机的4444端口上。- 将浏览器的代理设置指向为上述地址(127.0.0.1:4444)后,访问任何普通链接即可 - 您的HTTP请求将在 I2P 网络内部传递。</li>
|
||||
<li><b>文件交换</b> - I2P的其中一个本地 <a href="/i2psnark">端口</a> 用于内置的 <a href="http://www.klomp.org/snark/">Snark</a> <a href="http://www.bittorrent.com/">BitTorrent</a> 客户端。</li>
|
||||
<li><b>匿名电邮</b> - 由POSTMAN维护的邮件系统支持普通邮件客户端(POP3 / SMTP),这个系统可以在 I2P 网络内部收发 Email 也可以收发来自外部 Internet 的邮件!建立I2P邮件帐户请到 <a href="http://hq.postman.i2p/">hq.postman.i2p</a> 申请。I2P中集成有Web界面的pop3/stmp邮件客户端 <a href="/susimail/susimail">SUSIMail</a>,并配置为使用POSTMAN 的邮件服务。</li>
|
||||
<li><b>匿名电邮</b> - 由POSTMAN维护的邮件系统支持普通邮件客户端(POP3 / SMTP),这个系统可以在 I2P 网络内部收发 Email 也可以收发来自外部 Internet 的邮件!建立I2P邮件帐户请到 <a href="http://hq.postman.i2p/">hq.postman.i2p</a> 申请。I2P中集成有Web界面的pop3/stmp邮件客户端 <a href="/webmail">SUSIMail</a>,并配置为使用POSTMAN 的邮件服务。</li>
|
||||
<li><b>匿名聊天</b> - 打开你的 IRC 聊天程序,连接至 <b>127.0.0.1:6668 </b>即可访问I2P的匿名聊天室,如果您的聊天客户端配置错误泄露IP(DDC,MSG)我们的匿名服务器会自动过滤掉这些数据不让对方发现你,如果您的IRC设置正确无论服务器还是其他聊天的人都不知道您在哪里。</li>
|
||||
<li><b>匿名博客</b> - 参见 <a href="http://syndie.i2p2.de/">Syndie</a></li>
|
||||
<li>以及其他服务。</li>
|
||||
|
@ -216,6 +216,10 @@ div.routersummary h3 a, div.routersummary h4 a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
div.routersummary ul {
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
div.routersummary table {
|
||||
border: 0;
|
||||
text-align: center !important;
|
||||
@ -234,6 +238,16 @@ div.routersummary tr {
|
||||
border: 0 !important;
|
||||
}
|
||||
|
||||
div.newsheadings {
|
||||
text-align: right;
|
||||
margin: 0 0 0 10px;
|
||||
}
|
||||
|
||||
div.newsheadings li {
|
||||
list-style: none outside url('images/newsbullet_mini.png');
|
||||
margin: 0 -4px 2px 8px;
|
||||
}
|
||||
|
||||
div.tunnels table {
|
||||
margin: 0 -7px !important;
|
||||
width: 193px;
|
||||
@ -501,6 +515,45 @@ div.configure h2:first-child {
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.sidebarconf input[type="image"] {
|
||||
margin: 2px;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
.sidebarconf th:nth-child(1) {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sidebarconf th:nth-child(2) {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.sidebarconf td:first-child {
|
||||
width: 60px;
|
||||
text-align: right;
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
.sidebarconf td {
|
||||
font-weight: bold;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(3), .sidebarconf td:nth-child(4) {
|
||||
width: 70px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(3) {
|
||||
text-align: right;
|
||||
padding-left: 50px;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(4) {
|
||||
text-align: left;
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
.topshimten {
|
||||
margin-top: 15px;
|
||||
margin-bottom: 15px;
|
||||
@ -543,13 +596,24 @@ h1 {
|
||||
line-height: 93%;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.3em;
|
||||
background: #fff;
|
||||
background: #fff url(images/titlebg.png) center right no-repeat !important;
|
||||
min-width: 500px;
|
||||
-moz-border-radius: 0 3px 0 0;
|
||||
-khtml-border-radius: 0 3px 0 0;
|
||||
border-radius: 0 3px 0 0;
|
||||
}
|
||||
|
||||
span.newtab {
|
||||
text-align: right;
|
||||
font-size: 8pt;
|
||||
float: right;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
/* opera targetted hack */
|
||||
x:-o-prefocus, span.newtab {
|
||||
margin-top: -25px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 14pt;
|
||||
padding: 10px;
|
||||
|
@ -116,6 +116,11 @@ div.news hr {
|
||||
margin: 0 -10px 0 -13px !important;
|
||||
}
|
||||
|
||||
div.routersummaryouter {
|
||||
left: 5px;
|
||||
top: 5px;
|
||||
}
|
||||
|
||||
div.routersummary {
|
||||
color: #001;
|
||||
padding-left: 0px;
|
||||
@ -173,7 +178,7 @@ div.routersummary table {
|
||||
border: 0;
|
||||
text-align: center !important;
|
||||
margin: -5px 5px !important;
|
||||
width: 192px !important;
|
||||
width: 182px !important;
|
||||
overflow: hidden;
|
||||
font-size: 8pt;
|
||||
padding: 0px -10px;
|
||||
@ -235,10 +240,6 @@ div.warning {
|
||||
margin: 7px -18px 0px 5px;
|
||||
}
|
||||
|
||||
td {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: left;
|
||||
padding-left: 3px;
|
||||
@ -265,7 +266,7 @@ div.graphspanel hr {
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100% !important;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.links li {
|
||||
@ -294,9 +295,5 @@ div.news {
|
||||
font-size: 7pt;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
background: #fff url(images/titlebg.png) center right no-repeat !important;
|
||||
}
|
||||
|
||||
.routersummary h2, .routersummary h3 {
|
||||
background: #fff url(images/tinytitle.png) center right tile-x !important;
|
||||
|
BIN
installer/resources/themes/console/classic/images/favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 326 B |
BIN
installer/resources/themes/console/classic/images/move_down.png
Normal file
After Width: | Height: | Size: 325 B |
BIN
installer/resources/themes/console/classic/images/move_top.png
Normal file
After Width: | Height: | Size: 325 B |
BIN
installer/resources/themes/console/classic/images/move_up.png
Normal file
After Width: | Height: | Size: 290 B |
After Width: | Height: | Size: 270 B |
BIN
installer/resources/themes/console/classic/images/newtab.png
Normal file
After Width: | Height: | Size: 337 B |
@ -1,6 +1,6 @@
|
||||
/* I2P Theme: Camo aka Dark */
|
||||
/* Description: Military Grade. */
|
||||
/* Comment: Thanks to Florian Kuhlmann for the hatface images. [ http://www.flickr.com/photos/floriankuhlmann/]
|
||||
/* Comment: Thanks to Florian Kuhlmann for the hatface images. [http://www.flickr.com/photos/floriankuhlmann/] */
|
||||
/* Author: dr|z3d */
|
||||
|
||||
body {
|
||||
@ -10,7 +10,6 @@ body {
|
||||
background: #010 url('images/camotile.png') center bottom;
|
||||
color: #EE9;
|
||||
font: 8.5pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
||||
|
||||
}
|
||||
|
||||
.hide {
|
||||
@ -39,7 +38,7 @@ div.logo {
|
||||
float: left;
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
font-color: #EE9;
|
||||
color: #EE9;
|
||||
margin: 0 20px 0 20px;
|
||||
border: 1px solid #494;
|
||||
-moz-border-radius: 4px;
|
||||
@ -84,13 +83,13 @@ div.toolbar a:visited {
|
||||
background: #ddf;
|
||||
}
|
||||
|
||||
div.toolbar a:hover, button:hover{
|
||||
div.toolbar a:hover, button:hover {
|
||||
border: 1px solid #f60;
|
||||
background: #030;
|
||||
color: #f60;
|
||||
}
|
||||
|
||||
a:active{
|
||||
a:active {
|
||||
color: #900;
|
||||
}
|
||||
|
||||
@ -108,7 +107,7 @@ div.routersummaryouter {
|
||||
|
||||
div.routersummary {
|
||||
width: 173px;
|
||||
padding: 10px;
|
||||
padding: 10px 10px 8px;
|
||||
text-align: center;
|
||||
border: 1px solid #494;
|
||||
background: #000 url(images/camotile2.png);
|
||||
@ -122,6 +121,7 @@ div.routersummary {
|
||||
-moz-box-shadow: 0 1px 5px #000;
|
||||
-khtml-box-shadow: 0 1px 5px #000;
|
||||
box-shadow: 0 1px 5px #000;
|
||||
margin-bottom: 7px !important;
|
||||
}
|
||||
|
||||
div.routersummary input[type=text] {
|
||||
@ -153,7 +153,6 @@ div.routersummary h3 {
|
||||
-khtml-border-radius: 0;
|
||||
border-radius: 0;
|
||||
background: #000 url('images/header.png') center center ;
|
||||
background-image: -moz-linear-gradient(top, bottom, from(#050), to(#030), color-stop(7%, #000), color-stop(100%, #050));
|
||||
}
|
||||
|
||||
div.routersummary h4 {
|
||||
@ -167,10 +166,13 @@ div.routersummary h4 {
|
||||
text-transform: capitalize;
|
||||
text-decoration: none !important;
|
||||
color: #2b2;
|
||||
background-image: -moz-linear-gradient(top, bottom, from(#000), to(#050), color-stop(10%, #050), color-stop(100%, #004));
|
||||
line-height: 100%;
|
||||
}
|
||||
|
||||
div.routersummary ul {
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
div.routersummary table {
|
||||
border: 0;
|
||||
text-align: center !important;
|
||||
@ -178,7 +180,7 @@ div.routersummary table {
|
||||
width: 188px !important;
|
||||
overflow: hidden;
|
||||
font-size: 8pt;
|
||||
padding: 0 -10px;
|
||||
/* padding: 0 -10px; */
|
||||
background-image: none !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
@ -190,7 +192,7 @@ div.routersummary tr {
|
||||
}
|
||||
|
||||
div.routersummary form {
|
||||
margin: -5px 0 -7px;
|
||||
margin: -4px 0 -6px;
|
||||
}
|
||||
|
||||
div.routersummary form:first-child {
|
||||
@ -210,6 +212,7 @@ div.refresh {
|
||||
div.routersummary a:link, div.routersummary a:visited {
|
||||
text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8);
|
||||
text-shadow: 0px 0px 2px #101 !important;
|
||||
padding: 0 1px;
|
||||
}
|
||||
|
||||
div.routersummary a:hover {
|
||||
@ -221,6 +224,7 @@ div.routersummary td {
|
||||
padding: 0px 2px 0px 2px;
|
||||
background-image: none !important;
|
||||
border: 0 !important;
|
||||
word-spacing: -0.1em;
|
||||
}
|
||||
|
||||
div routersummary hr:last-child {
|
||||
@ -228,6 +232,28 @@ div routersummary hr:last-child {
|
||||
margin-bottom: -5px !important;
|
||||
}
|
||||
|
||||
div.newsheadings {
|
||||
text-align: center;
|
||||
margin: -3px 0 -5px 10px;
|
||||
word-spacing: 0;
|
||||
}
|
||||
|
||||
div.newsheadings li {
|
||||
list-style: none outside url('images/newsbullet_mini.png');
|
||||
margin: 0 -4px 2px 8px;
|
||||
line-height: 110%;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
div.newsheadings li b {
|
||||
font-weight: normal !important;
|
||||
}
|
||||
|
||||
|
||||
div.newsheadings button {
|
||||
margin: 4px 0 2px;
|
||||
}
|
||||
|
||||
div.tunnels {
|
||||
padding-top: 3px !important;
|
||||
margin-left: -4px;
|
||||
@ -366,6 +392,7 @@ div.news li {
|
||||
div.news h3 {
|
||||
text-align: left !important;
|
||||
font-size: 9.5pt;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
div.news h4 {
|
||||
@ -401,14 +428,14 @@ div.news hr {
|
||||
}
|
||||
|
||||
div.confignav {
|
||||
padding: 15px 10px !important;
|
||||
margin: 15px 0;
|
||||
background: #000 url('images/header.png') center center repeat-x ;
|
||||
-moz-border-radius: 4px;
|
||||
-khtml-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
background: url('images/header.png') repeat-x scroll center center #000;
|
||||
padding:5px 5px 6px !important;
|
||||
margin: -1px 0 15px;
|
||||
-moz-border-radius: 0 0 4px 4px;
|
||||
-khtml-border-radius: 0 0 4px 4px;
|
||||
border-radius: 0 0 4px 4px;
|
||||
border: 1px solid #494;
|
||||
font-size: 9.5pt !important;
|
||||
font-size: 8.5pt !important;
|
||||
font-weight: bold !important;
|
||||
line-height: 160% !important;
|
||||
|
||||
@ -424,6 +451,44 @@ div.configure {
|
||||
background: none;/* url(images/camotile2.png);*/
|
||||
}
|
||||
|
||||
.sidebarconf input[type="image"] {
|
||||
margin: 2px;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
.sidebarconf th:nth-child(1) {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sidebarconf th:nth-child(2) {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.sidebarconf td:first-child {
|
||||
width: 60px;
|
||||
text-align: right;
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(2) {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(3), .sidebarconf td:nth-child(4) {
|
||||
width: 70px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(3) {
|
||||
text-align: right;
|
||||
padding-left: 50px;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(4) {
|
||||
text-align: left;
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
div.messages {
|
||||
padding: 10px;
|
||||
margin: 10px 0 15px 0;
|
||||
@ -431,7 +496,7 @@ div.messages {
|
||||
-khtml-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #494;
|
||||
background: #000 /*url('images/infotile.png') center left no-repeat;*/
|
||||
background: #000; /*url('images/infotile.png') center left no-repeat;*/
|
||||
font-weight: bold;
|
||||
font-size: 9pt;
|
||||
color: #4f4;
|
||||
@ -484,7 +549,6 @@ div.graphspanel img {
|
||||
margin: 5px;
|
||||
text-align: center !important;
|
||||
background: #000;
|
||||
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
@ -504,7 +568,7 @@ table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
border: 1px solid #494;
|
||||
cell-padding: 1px;
|
||||
padding: 1px;
|
||||
font-size: 8pt;
|
||||
background: #030;
|
||||
margin: 1px 0;
|
||||
@ -525,7 +589,6 @@ th {
|
||||
color: #EE9;
|
||||
text-align: center;
|
||||
font-size: 9pt;
|
||||
background: #000; /*url('images/tabletitledark.png') repeat-x;*/
|
||||
background: #000 url('images/header.png') center center repeat-x ;
|
||||
border-top: 1px solid #494;
|
||||
border-bottom: 1px solid #494 !important;
|
||||
@ -537,14 +600,15 @@ tr {
|
||||
}
|
||||
|
||||
tr:nth-child(even) {
|
||||
background: #010;/* url('images/darkerbluetile.png') !important;*/
|
||||
background: #010;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
tr:nth-child(odd) {
|
||||
background: #000800;/* url('images/darkbluetile.png') !important;*/
|
||||
background: #000800;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/*
|
||||
tr:last-child {
|
||||
background: #004 url('images/lightbluetile.png') !important;
|
||||
@ -552,6 +616,7 @@ tr:last-child {
|
||||
border: 1px solid #494 !important;
|
||||
}
|
||||
*/
|
||||
|
||||
td {
|
||||
padding: 4px 6px;
|
||||
color: #EE9;
|
||||
@ -628,21 +693,21 @@ code {
|
||||
padding: 1px 2px;
|
||||
}
|
||||
|
||||
a:link, h2 a:link{
|
||||
a:link, h2 a:link {
|
||||
color: #494;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
a:visited{
|
||||
a:visited {
|
||||
color: #7b7;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
a:hover{
|
||||
a:hover {
|
||||
color: #f60;
|
||||
text-decoration: underline;
|
||||
font-weight: bold;
|
||||
@ -650,7 +715,7 @@ a:hover{
|
||||
}
|
||||
|
||||
.links {
|
||||
padding-bottom: -2px;
|
||||
/* padding-bottom: -2px; */
|
||||
text-align: justify;
|
||||
margin-top: 10px;
|
||||
margin-bottom: -10px;
|
||||
@ -660,7 +725,7 @@ a:hover{
|
||||
list-style-image: url("images/link.png") !important;
|
||||
}
|
||||
|
||||
.links b{
|
||||
.links b {
|
||||
color: #b70 !important;
|
||||
letter-spacing: 0.07em;
|
||||
font-size: 8.5pt;
|
||||
@ -673,7 +738,7 @@ p {
|
||||
line-height: 160%;
|
||||
}
|
||||
|
||||
p img:first-child{
|
||||
p img:first-child {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@ -689,10 +754,7 @@ h1 {
|
||||
letter-spacing: 0.15em;
|
||||
text-shadow: 0px 0px 2px #010;
|
||||
white-space: normal;
|
||||
background: #000 url("images/scope.png")no-repeat scroll right top;
|
||||
background: #000 url("images/bg2.png")no-repeat scroll top right;
|
||||
background: #000 url('images/header.png') center center;
|
||||
background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
|
||||
border: 1px solid #494;
|
||||
border-radius: 4px 4px 0 0;
|
||||
-moz-border-radius: 4px 4px 0 0;
|
||||
@ -704,23 +766,33 @@ h1 {
|
||||
box-shadow: 0 1px 5px #000;
|
||||
}
|
||||
|
||||
span.newtab {
|
||||
text-align: right;
|
||||
font-size: 8pt;
|
||||
float: right;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
/* opera targetted hack */
|
||||
x:-o-prefocus, span.newtab {
|
||||
margin-top: -25px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 12pt;
|
||||
color: #EE9;
|
||||
text-shadow: 0px 0px 2px #010;
|
||||
letter-spacing: 0.05em;
|
||||
background: #000 url(images/camotile2.png);
|
||||
background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
|
||||
background: #000 url('images/header.png') center center ;
|
||||
padding: 10px;
|
||||
wordwrap: none;
|
||||
border: 1px solid #494;
|
||||
border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
-khtml-border-radius: 4px;
|
||||
vertical-align: middle;
|
||||
margin: 15px 0 12px 0 !important;
|
||||
text-transform: uppercase;
|
||||
text-transform: uppercase;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
@ -736,7 +808,7 @@ h2 a:hover {
|
||||
h3 {
|
||||
border: 1px solid #494;
|
||||
border-left: 5px solid #494;
|
||||
padding: 5px 6px 7px;
|
||||
padding: 6px;
|
||||
margin: 12px 0 10px 0;
|
||||
border-radius: 0 4px 4px 0;
|
||||
-moz-border-radius: 0 4px 4px 0;
|
||||
@ -745,6 +817,7 @@ h3 {
|
||||
background: #000 url('images/header.png') center center ;
|
||||
text-transform: uppercase;
|
||||
text-shadow: 0px 0px 2px #010;
|
||||
letter-spacing: 0.08em;
|
||||
}
|
||||
|
||||
h4 {
|
||||
@ -769,7 +842,7 @@ button, button:visited {
|
||||
margin: 2px 3px;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
min-width: 76px;
|
||||
min-width: 70px;
|
||||
-moz-box-shadow: inset 0px 1px 1px 0px #494;
|
||||
-khtml-box-shadow: inset 0px 1px 1px 0px #191;
|
||||
box-shadow: inset 0px 1px 1px 0px #191;
|
||||
@ -802,7 +875,7 @@ button:active {
|
||||
}
|
||||
|
||||
.langbox {
|
||||
margin: 5px 3px 2px 5px;
|
||||
margin: 4px 4px 2px 5px;
|
||||
padding: 0;
|
||||
color: #EE9;
|
||||
font-size: 7pt;
|
||||
@ -815,6 +888,7 @@ button:active {
|
||||
.langbox img {
|
||||
opacity: 0.5;
|
||||
-moz-box-shadow: 0 0 1px #000;
|
||||
padding: 1px !important;
|
||||
}
|
||||
|
||||
.langbox img:hover {
|
||||
@ -877,7 +951,7 @@ input:active {
|
||||
color: #EE9;
|
||||
}
|
||||
|
||||
input[type=text] {
|
||||
input[type=text], input[type=password] {
|
||||
background: #000;
|
||||
color: #EE9;
|
||||
margin: 5px 10px;
|
||||
@ -897,6 +971,10 @@ input[type=text]:active, input[type=text]:hover {
|
||||
background: #000;
|
||||
}
|
||||
|
||||
input[type=image] {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
@ -935,7 +1013,7 @@ form {}
|
||||
.proxyfooter {
|
||||
margin: 0 20px 10px 240px;
|
||||
padding: 20px 25px 20px 75px;
|
||||
font-color: #f00;
|
||||
color: #f00;
|
||||
font-size: 7pt;
|
||||
text-align: right !important;
|
||||
border-radius: 4px;
|
||||
@ -1159,6 +1237,8 @@ div.app {
|
||||
background: #000;
|
||||
background-image: -moz-linear-gradient(center top , #000B00, #000);
|
||||
border-radius: 3px;
|
||||
-moz-border-radius: 3px;
|
||||
-khtml-border-radius: 3px;
|
||||
margin: 5px;
|
||||
height: 72px;
|
||||
text-align: center !important;
|
||||
@ -1245,3 +1325,7 @@ div.applabel {
|
||||
}
|
||||
|
||||
/* end home page */
|
||||
|
||||
iframe.iframed {
|
||||
margin: 10px 0 0;
|
||||
}
|
||||
|
91
installer/resources/themes/console/dark/console_ar.css
Normal file
@ -0,0 +1,91 @@
|
||||
/* I2P Theme: Camo aka Dark - Arabic override */
|
||||
/* Description: Military Grade. */
|
||||
/* Comment: Thanks to Florian Kuhlmann for the hatface images. [http://www.flickr.com/photos/floriankuhlmann/] */
|
||||
/* Author: dr|z3d */
|
||||
|
||||
body {
|
||||
direction: rtl;
|
||||
}
|
||||
|
||||
div.main li {
|
||||
margin: 5px 20px;
|
||||
text-align: right;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
table {
|
||||
direction: rtl;
|
||||
}
|
||||
|
||||
td {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.news {
|
||||
margin: -1px 205px 0px 5px;
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
div.main {
|
||||
margin: -1px 205px 5px 5px;
|
||||
background: url("images/scarface.jpg") no-repeat scroll left bottom #000000 !important;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0 205px 0 5px !important;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4 {
|
||||
direction: rtl;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.routersummary h3 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div.routersummary td:last-child {
|
||||
text-align: left;
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
div.tunnels {
|
||||
padding: -3px 0 !important;
|
||||
}
|
||||
|
||||
div.tunnels table {
|
||||
margin: 0 -7px 0 5px !important;
|
||||
}
|
||||
|
||||
.langbox {
|
||||
float: left;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.formaction {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
form {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.routersummary form {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.cells {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div.joblog li, div.newsheadings li {
|
||||
text-align: left;
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
span.newtab {
|
||||
text-align: left;
|
||||
font-size: 8pt;
|
||||
float: left;
|
||||
letter-spacing: 0;
|
||||
}
|
@ -18,6 +18,11 @@ body {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body.iframed {
|
||||
background: transparent url('images/transparent.gif') !important;
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
div {
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
@ -79,6 +84,9 @@ button {
|
||||
|
||||
textarea {
|
||||
border: 1px solid #494;
|
||||
background: #000;
|
||||
margin-left: 4px;
|
||||
width: 458px;
|
||||
}
|
||||
|
||||
br {
|
||||
@ -140,7 +148,7 @@ hr {
|
||||
border: 1px solid #494;
|
||||
padding: 2px;
|
||||
margin: 4px 0 2px 4px;
|
||||
background-color: #020;
|
||||
background-color: #000;
|
||||
font-size: 8.5pt;
|
||||
}
|
||||
|
||||
@ -153,7 +161,7 @@ hr {
|
||||
font-size: 8pt;
|
||||
font-weight: bold;
|
||||
background-color: #000;
|
||||
color: #9f9 !important;
|
||||
color: #494 !important;
|
||||
border: 1px outset #ddddc0;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
@ -171,8 +179,9 @@ hr {
|
||||
}
|
||||
|
||||
.control:link {
|
||||
color: #9f9;
|
||||
color: #494 !important;
|
||||
text-decoration: none;
|
||||
background: #000 !important;
|
||||
}
|
||||
|
||||
.control:hover {
|
||||
@ -188,12 +197,12 @@ hr {
|
||||
.control:active {
|
||||
border: 1px inset;
|
||||
background-color: #f60;
|
||||
color: #fff !important;
|
||||
color: #EE9 !important;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.control:visited {
|
||||
color: #010;
|
||||
color: #494 !important;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@ -205,7 +214,7 @@ hr {
|
||||
font-size: 8.5pt;
|
||||
color: #EEEE99;
|
||||
background-color: #020;
|
||||
background: #000; /*url(images/camotile2.png);*/
|
||||
background: #000 url(images/camotile2.png);
|
||||
-moz-border-radius: 4px;
|
||||
-khtml-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
@ -213,6 +222,26 @@ hr {
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
.iframed .panel {
|
||||
margin: 16px auto -8px auto !important;
|
||||
}
|
||||
|
||||
.iframed .panel.iframed {
|
||||
margin: 0 auto -8px auto !important;
|
||||
}
|
||||
|
||||
.panel td:first-child {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.panel td {
|
||||
padding: 6px 0 8px;
|
||||
}
|
||||
|
||||
.panel td:last-child {
|
||||
border-bottom: 1px dotted #494;
|
||||
}
|
||||
|
||||
.panel .footer {
|
||||
float: right;
|
||||
padding: 4px;
|
||||
@ -256,6 +285,15 @@ hr {
|
||||
|
||||
#globalOperationsPanel .control {
|
||||
width: 120px;
|
||||
color: #494 !important;
|
||||
}
|
||||
|
||||
#globalOperationsPanel .control:hover {
|
||||
color: #F60 !important;
|
||||
}
|
||||
|
||||
#globalOperationsPanel .control:active {
|
||||
color: #EE9 !important;
|
||||
}
|
||||
|
||||
.header {
|
||||
@ -268,25 +306,25 @@ hr {
|
||||
a:link{
|
||||
color: #494;
|
||||
text-decoration: none;
|
||||
background: #000;
|
||||
background: none;
|
||||
}
|
||||
|
||||
a:visited{
|
||||
color: #7b7;
|
||||
text-decoration: none;
|
||||
background: #000;
|
||||
background: none;
|
||||
}
|
||||
|
||||
a:hover{
|
||||
color: #ff6600;
|
||||
text-decoration: underline;
|
||||
background: #000;
|
||||
background: none;
|
||||
}
|
||||
|
||||
a:active{
|
||||
color: #900;
|
||||
text-decoration: underline;
|
||||
background: #000;
|
||||
background: none;
|
||||
}
|
||||
|
||||
input {
|
||||
|
@ -92,6 +92,16 @@
|
||||
|
||||
#tunnelListPage .footer .control {
|
||||
margin-left: 2px;
|
||||
color: #494 !important;
|
||||
background: #000 !important;
|
||||
}
|
||||
|
||||
#tunnelListPage .footer .control:hover {
|
||||
color: #F60 !important;
|
||||
}
|
||||
|
||||
#tunnelListPage .footer .control:active {
|
||||
color: #EE9 !important;
|
||||
}
|
||||
|
||||
#tunnelListPage .footer label {
|
||||
@ -102,6 +112,7 @@
|
||||
margin-top: 6px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
/* Use Leary and Langridge content replacement methods (LIR)
|
||||
** to embed accessibility information into the document.
|
||||
** Should allow the lists to be rendered nicely by
|
||||
|
BIN
installer/resources/themes/console/dark/images/favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
installer/resources/themes/console/dark/images/move_bottom.png
Normal file
After Width: | Height: | Size: 497 B |
BIN
installer/resources/themes/console/dark/images/move_down.png
Normal file
After Width: | Height: | Size: 498 B |
BIN
installer/resources/themes/console/dark/images/move_top.png
Normal file
After Width: | Height: | Size: 519 B |
BIN
installer/resources/themes/console/dark/images/move_up.png
Normal file
After Width: | Height: | Size: 452 B |
After Width: | Height: | Size: 424 B |
BIN
installer/resources/themes/console/dark/images/newtab.png
Normal file
After Width: | Height: | Size: 489 B |
BIN
installer/resources/themes/console/dark/images/transparent.gif
Normal file
After Width: | Height: | Size: 43 B |
@ -182,6 +182,10 @@ div.routersummary h4 {
|
||||
box-shadow: 0px 0px 1px 1px #bdf;
|
||||
}
|
||||
|
||||
div.routersummary ul {
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
div.routersummary table {
|
||||
border: 0;
|
||||
text-align: center !important;
|
||||
@ -239,6 +243,16 @@ div.routersummary img:hover:first-child {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
div.newsheadings {
|
||||
text-align: right;
|
||||
margin: 0 0 0 10px;
|
||||
}
|
||||
|
||||
div.newsheadings li {
|
||||
list-style: none outside url('images/newsbullet_mini.png');
|
||||
margin: 0 -4px 2px 8px;
|
||||
}
|
||||
|
||||
div.tunnels {
|
||||
margin-top: 6px !important;
|
||||
margin-left: -2px !important;
|
||||
@ -495,6 +509,45 @@ div.configure h3, div.graphspanel h3 {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.sidebarconf input[type="image"] {
|
||||
margin: 2px;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
.sidebarconf th:nth-child(1) {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sidebarconf th:nth-child(2) {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.sidebarconf td:first-child {
|
||||
width: 60px;
|
||||
text-align: right;
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
.sidebarconf td {
|
||||
font-weight: bold;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(3), .sidebarconf td:nth-child(4) {
|
||||
width: 70px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(3) {
|
||||
text-align: right;
|
||||
padding-left: 50px;
|
||||
}
|
||||
|
||||
.sidebarconf td:nth-child(4) {
|
||||
text-align: left;
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
div.graphspanel {
|
||||
text-align: center !important;
|
||||
margin: 15px 0px -15px;
|
||||
@ -844,6 +897,18 @@ h1 {
|
||||
min-width: 500px;
|
||||
}
|
||||
|
||||
span.newtab {
|
||||
text-align: right;
|
||||
font-size: 8pt;
|
||||
float: right;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
/* opera targetted hack */
|
||||
x:-o-prefocus, span.newtab {
|
||||
margin-top: -25px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 13pt;
|
||||
color: #115;
|
||||
|