propagate from branch 'i2p.i2p.str4d.fux' (head 48cafeb29fb3408078a8b93c0bab0fc9d766a8bc)

to branch 'i2p.i2p' (head 47f04ff21e8edd00134a0fd68219f86fd3caba36)
This commit is contained in:
str4d
2012-07-16 16:17:19 +00:00
168 changed files with 5361 additions and 1949 deletions

View File

@ -232,7 +232,7 @@ public class I2PSnarkServlet extends DefaultServlet {
//out.write("<meta http-equiv=\"refresh\" content=\"" + delay + ";/i2psnark/" + peerString + "\">\n"); //out.write("<meta http-equiv=\"refresh\" content=\"" + delay + ";/i2psnark/" + peerString + "\">\n");
out.write("<script src=\"/js/ajax.js\" type=\"text/javascript\"></script>\n" + out.write("<script src=\"/js/ajax.js\" type=\"text/javascript\"></script>\n" +
"<script type=\"text/javascript\">\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 requestAjax1() { ajax(\"/i2psnark/.ajax/xhr1.html" + peerString + "\", \"mainsection\", " + (delay*1000) + "); }\n" +
"function initAjax(delayMs) { setTimeout(requestAjax1, " + (delay*1000) +"); }\n" + "function initAjax(delayMs) { setTimeout(requestAjax1, " + (delay*1000) +"); }\n" +
"</script>\n"); "</script>\n");
@ -1325,7 +1325,7 @@ public class I2PSnarkServlet extends DefaultServlet {
* @return string or null * @return string or null
* @since 0.8.4 * @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 // 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") || if (announce != null && (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") ||
announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/") || announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/") ||
@ -1341,15 +1341,29 @@ public class I2PSnarkServlet extends DefaultServlet {
StringBuilder buf = new StringBuilder(128); StringBuilder buf = new StringBuilder(128);
buf.append("<a href=\"").append(baseURL).append("details.php?dllist=1&amp;filelist=1&amp;info_hash=") buf.append("<a href=\"").append(baseURL).append("details.php?dllist=1&amp;filelist=1&amp;info_hash=")
.append(TrackerClient.urlencode(infohash)) .append(TrackerClient.urlencode(infohash))
.append("\" title=\"").append(_("Details at {0} tracker", name)).append("\" target=\"_blank\">" + .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>");
return buf.toString(); return buf.toString();
} }
} }
return null; 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 { private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException {
// display incoming parameter if a GET so links will work // display incoming parameter if a GET so links will work
String newURL = req.getParameter("newURL"); 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=\"" out.write(": <td><input type=\"text\" name=\"upBW\" class=\"r\" value=\""
+ _manager.util().getMaxUpBW() + "\" size=\"4\" maxlength=\"4\" > KBps <i>"); + _manager.util().getMaxUpBW() + "\" size=\"4\" maxlength=\"4\" > KBps <i>");
out.write(_("Half available bandwidth recommended.")); 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(_("View or change router bandwidth"));
out.write("</a></i><br>\n" + out.write("</a>]</i><br>\n" +
"<tr><td>"); "<tr><td>");
out.write(_("Use open trackers also")); out.write(_("Use open trackers also"));
@ -1640,7 +1654,7 @@ public class I2PSnarkServlet extends DefaultServlet {
"<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> "); "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
buf.append(_("Trackers")); buf.append(_("Trackers"));
buf.append("</span><hr>\n" + buf.append("</span><hr>\n" +
"<table><tr><th>") "<table class=\"trackerconfig\"><tr><th>")
//.append(_("Remove")) //.append(_("Remove"))
.append("</th><th>") .append("</th><th>")
.append(_("Name")) .append(_("Name"))
@ -1659,16 +1673,16 @@ public class I2PSnarkServlet extends DefaultServlet {
String name = t.name; String name = t.name;
String homeURL = t.baseURL; String homeURL = t.baseURL;
String announceURL = t.announceURL.replace("&#61;", "="); String announceURL = t.announceURL.replace("&#61;", "=");
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("\">" + .append(name).append("\" title=\"").append(_("Delete")).append("\">" +
"</td><td align=\"left\">").append(name) "</td><td>").append(name)
.append("</td><td align=\"left\">").append(urlify(homeURL, 35)) .append("</td><td>").append(urlify(homeURL, 35))
.append("</td><td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"open_") .append("</td><td><input type=\"checkbox\" class=\"optbox\" name=\"open_")
.append(announceURL).append("\""); .append(announceURL).append("\"");
if (openTrackers.contains(t.announceURL)) if (openTrackers.contains(t.announceURL))
buf.append(" checked=\"checked\""); buf.append(" checked=\"checked\"");
buf.append(">" + 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("\""); .append(announceURL).append("\"");
if (privateTrackers.contains(t.announceURL)) { if (privateTrackers.contains(t.announceURL)) {
buf.append(" checked=\"checked\""); buf.append(" checked=\"checked\"");
@ -1681,17 +1695,17 @@ public class I2PSnarkServlet extends DefaultServlet {
} }
} }
buf.append(">" + buf.append(">" +
"</td><td align=\"left\">").append(urlify(announceURL, 35)) "</td><td>").append(urlify(announceURL, 35))
.append("</td></tr>\n"); .append("</td></tr>\n");
} }
buf.append("<tr><td align=\"center\"><b>") buf.append("<tr><td><b>")
.append(_("Add")).append(":</b></td>" + .append(_("Add")).append(":</b></td>" +
"<td align=\"left\"><input type=\"text\" size=\"16\" name=\"tname\"></td>" + "<td><input type=\"text\" class=\"trackername\" name=\"tname\"></td>" +
"<td align=\"left\"><input type=\"text\" size=\"40\" name=\"thurl\"></td>" + "<td><input type=\"text\" class=\"trackerhome\" name=\"thurl\"></td>" +
"<td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"_add_open_\"></td>" + "<td><input type=\"checkbox\" class=\"optbox\" name=\"_add_open_\"></td>" +
"<td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"_add_private_\"></td>" + "<td><input type=\"checkbox\" class=\"optbox\" name=\"_add_private_\"></td>" +
"<td align=\"left\"><input type=\"text\" size=\"40\" name=\"taurl\"></td></tr>\n" + "<td><input type=\"text\" class=\"trackerannounce\" name=\"taurl\"></td></tr>\n" +
"<tr><td colspan=\"2\"></td><td colspan=\"4\" align=\"left\">\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=\"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=\"delete\" value=\"").append(_("Delete selected")).append("\">\n" +
"<input type=\"submit\" name=\"taction\" class=\"accept\" value=\"").append(_("Save tracker configuration")).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(); boolean showPriority = ls != null && snark != null && snark.getStorage() != null && !snark.getStorage().complete();
if (showPriority) if (showPriority)
buf.append("<form action=\"").append(base).append("\" method=\"POST\">\n"); buf.append("<form action=\"").append(base).append("\" method=\"POST\">\n");
buf.append("<TABLE BORDER=0 class=\"snarkTorrents\" ><thead>");
if (snark != null) { if (snark != null) {
// first row - torrent info // first table - torrent info
// FIXME center buf.append("<table class=\"snarkTorrentInfo\">\n");
buf.append("<tr><th colspan=\"" + (showPriority ? '4' : '3') + "\"><div>") buf.append("<tr><th><b>")
.append(_("Torrent")).append(": ").append(snark.getBaseName()); .append(_("Torrent"))
int pieces = snark.getPieces(); .append(":</b> ")
double completion = (pieces - snark.getNeeded()) / (double) pieces; .append(snark.getBaseName())
if (completion < 1.0) .append("</th></tr>\n");
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)));
buf.append("<tr><td>")
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" >&nbsp;<b>")
.append(_("Torrent file"))
.append(":</b> ")
.append(snark.getName())
.append("</td></tr>\n");
MetaInfo meta = snark.getMetaInfo();
if (meta != null) { if (meta != null) {
String announce = meta.getAnnounce(); String announce = meta.getAnnounce();
if (announce != null) { if (announce != null) {
buf.append("<br>"); buf.append("<tr><td>");
String trackerLink = getTrackerLink(announce, snark.getInfoHash()); String trackerLink = getTrackerLink(announce, snark.getInfoHash());
if (trackerLink != null) if (trackerLink != null)
buf.append(trackerLink).append(' '); 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://")) if (announce.startsWith("http://"))
announce = announce.substring(7); announce = announce.substring(7);
int slsh = announce.indexOf('/'); int slsh = announce.indexOf('/');
@ -2091,53 +2099,110 @@ public class I2PSnarkServlet extends DefaultServlet {
if (announce.length() > 67) if (announce.length() > 67)
announce = announce.substring(0, 40) + "&hellip;" + announce.substring(announce.length() - 8); announce = announce.substring(0, 40) + "&hellip;" + announce.substring(announce.length() - 8);
buf.append(announce); buf.append(announce);
if (trackerLinkUrl != null)
buf.append("</a>");
buf.append("</td></tr>");
} }
} }
String hex = I2PSnarkUtil.toHex(snark.getInfoHash()); String hex = I2PSnarkUtil.toHex(snark.getInfoHash());
if (meta == null || !meta.isPrivate()) { 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("\">")
.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 { } 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 // 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("\">") //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>"); // .append(MAGGOT).append(hex).append(':').append(hex).append("</a></td></tr>");
buf.append("<br>").append(_("Torrent file")).append(": ").append(snark.getName());
buf.append("</div></th></tr>"); buf.append("<tr><td>")
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "size.png\" >&nbsp;<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("&nbsp;<img alt=\"\" border=\"0\" src=\"" + _imgPath + "head_rx.png\" >&nbsp;<b>")
.append(_("Completion"))
.append(":</b> ")
.append((new DecimalFormat("0.00%")).format(completion));
else
buf.append("&nbsp;<img alt=\"\" border=\"0\" src=\"" + _imgPath + "head_rx.png\" >&nbsp;")
.append(_("Complete"));
// else unknown
long needed = snark.getNeededLength();
if (needed > 0)
buf.append("&nbsp;<img alt=\"\" border=\"0\" src=\"" + _imgPath + "head_rx.png\" >&nbsp;<b>")
.append(_("Remaining"))
.append(":</b> ")
.append(formatSize(needed));
if (meta != null) {
List files = meta.getFiles();
int fileCount = files != null ? files.size() : 1;
buf.append("&nbsp;<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" >&nbsp;<b>")
.append(_("Files"))
.append(":</b> ")
.append(fileCount);
}
buf.append("&nbsp;<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" >&nbsp;<b>")
.append(_("Pieces"))
.append(":</b> ")
.append(pieces);
buf.append("&nbsp;<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" >&nbsp;<b>")
.append(_("Piece size"))
.append(":</b> ")
.append(formatSize(snark.getPieceLength(0)))
.append("</td></tr>\n");
} else { } else {
// shouldn't happen // shouldn't happen
buf.append("<tr><th>Not found<br>resource=\"").append(r.toString()) buf.append("<tr><th>Not found<br>resource=\"").append(r.toString())
.append("\"<br>base=\"").append(base) .append("\"<br>base=\"").append(base)
.append("\"<br>torrent=\"").append(torrentName) .append("\"<br>torrent=\"").append(torrentName)
.append("\"</th></tr>"); .append("\"</th></tr>\n");
} }
buf.append("</table>\n");
if (ls == null) { if (ls == null) {
// We are only showing the torrent info section // 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(); return buf.toString();
} }
// second row - dir info // second table - dir info
buf.append("<tr><th>") buf.append("<table class=\"snarkDirInfo\"><thead>\n");
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" >&nbsp;") buf.append("<tr>\n")
.append(_("Directory")).append(": ").append(directory).append("</th><th align=\"right\">") .append("<th colspan=2>")
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "size.png\" >&nbsp;") .append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" >&nbsp;")
.append(_("Size")); .append(_("Directory"))
buf.append("</th><th class=\"headerstatus\">") .append(": ")
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "status.png\" >&nbsp;") .append(directory)
.append(_("Status")).append("</th>"); .append("</th>\n");
buf.append("<th align=\"right\">")
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "size.png\" >&nbsp;")
.append(_("Size"))
.append("</th>\n");
buf.append("<th class=\"headerstatus\">")
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "status.png\" >&nbsp;")
.append(_("Status"))
.append("</th>\n");
if (showPriority) if (showPriority)
buf.append("<th class=\"headerpriority\">") buf.append("<th class=\"headerpriority\">")
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "priority.png\" >&nbsp;") .append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "priority.png\" >&nbsp;")
.append(_("Priority")).append("</th>"); .append(_("Priority")).append("</th>\n");
buf.append("</tr></thead>\n"); buf.append("</tr>\n</thead>\n");
buf.append("<tr><td colspan=\"" + (showPriority ? '4' : '3') + "\" class=\"ParentDir\"><A HREF=\""); buf.append("<tr><td colspan=\"" + (showPriority ? '5' : '4') + "\" class=\"ParentDir\"><A HREF=\"");
buf.append(URIUtil.addPaths(base,"../")); buf.append(URIUtil.addPaths(base,"../"));
buf.append("\"><img alt=\"\" border=\"0\" src=\"" + _imgPath + "up.png\"> ") 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, //DateFormat dfmt=DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
@ -2153,8 +2218,7 @@ public class I2PSnarkServlet extends DefaultServlet {
Resource item = r.addPath(ls[i]); Resource item = r.addPath(ls[i]);
String rowClass = (i % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd"); String rowClass = (i % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd");
buf.append("<TR class=\"").append(rowClass).append("\"><TD class=\"snarkFileName ") buf.append("<TR class=\"").append(rowClass).append("\">");
.append(rowClass).append("\">");
// Get completeness and status string // Get completeness and status string
boolean complete = false; boolean complete = false;
@ -2190,7 +2254,7 @@ public class I2PSnarkServlet extends DefaultServlet {
status = toImg("clock_red"); status = toImg("clock_red");
status += " " + status += " " +
(100 * (length - remaining) / length) + "% " + _("complete") + (100 * (length - remaining) / length) + "% " + _("complete") +
" (" + DataHelper.formatSize2(remaining) + _("bytes remaining") + ")"; " (" + DataHelper.formatSize2(remaining) + "B " + _("remaining") + ")";
} }
} else { } else {
status = "Not a file?"; status = "Not a file?";
@ -2206,6 +2270,8 @@ public class I2PSnarkServlet extends DefaultServlet {
path=URIUtil.addPaths(path,"/"); path=URIUtil.addPaths(path,"/");
String icon = toIcon(item); String icon = toIcon(item);
buf.append("<TD class=\"snarkFileIcon ")
.append(rowClass).append("\">");
if (complete) { if (complete) {
buf.append("<a href=\"").append(path).append("\">"); buf.append("<a href=\"").append(path).append("\">");
// thumbnail ? // thumbnail ?
@ -2213,16 +2279,17 @@ public class I2PSnarkServlet extends DefaultServlet {
if (plc.endsWith(".jpg") || plc.endsWith(".jpeg") || plc.endsWith(".png") || if (plc.endsWith(".jpg") || plc.endsWith(".jpeg") || plc.endsWith(".png") ||
plc.endsWith(".gif") || plc.endsWith(".ico")) { plc.endsWith(".gif") || plc.endsWith(".ico")) {
buf.append("<img alt=\"\" border=\"0\" class=\"thumb\" src=\"") buf.append("<img alt=\"\" border=\"0\" class=\"thumb\" src=\"")
.append(path).append("\"></a> "); .append(path).append("\"></a>");
} else { } 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 { } 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]); buf.append(ls[i]);
if (complete) if (complete)
buf.append("</a>"); buf.append("</a>");
@ -2259,14 +2326,14 @@ public class I2PSnarkServlet extends DefaultServlet {
buf.append("</TR>\n"); buf.append("</TR>\n");
} }
if (showSaveButton) { if (showSaveButton) {
buf.append("<thead><tr><th colspan=\"3\">&nbsp;</th><th class=\"headerpriority\"><input type=\"submit\" value=\""); buf.append("<thead><tr><th colspan=\"4\">&nbsp;</th><th class=\"headerpriority\"><input type=\"submit\" value=\"");
buf.append(_("Save priorities")); buf.append(_("Save priorities"));
buf.append("\" name=\"foo\" ></th></tr></thead>\n"); buf.append("\" name=\"foo\" ></th></tr></thead>\n");
} }
buf.append("</TABLE>\n"); buf.append("</table>\n");
if (showPriority) if (showPriority)
buf.append("</form>"); buf.append("</form>");
buf.append("</div></div></BODY></HTML>\n"); buf.append("</div></div></BODY></HTML>\n");
return buf.toString(); return buf.toString();
} }

View File

@ -19,9 +19,10 @@
<title><%=intl._("I2P Tunnel Manager - Edit Client Tunnel")%></title> <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="text/html; charset=UTF-8" />
<meta http-equiv="Content-Type" content="application/xhtml+xml; 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()) { <% 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()%>default.css" rel="stylesheet" type="text/css" />
<link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" /> <link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
<% } <% }

View File

@ -19,9 +19,10 @@
<title><%=intl._("I2P Tunnel Manager - Edit Server Tunnel")%></title> <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="text/html; charset=UTF-8" />
<meta http-equiv="Content-Type" content="application/xhtml+xml; 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()) { <% 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()%>default.css" rel="stylesheet" type="text/css" />
<link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" /> <link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
<% } <% }

View File

@ -24,7 +24,8 @@
<link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" /> <link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
<% if (indexBean.allowCSS()) { <% 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" /> <link href="<%=indexBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
<% } <% }
%> %>

View File

@ -57,7 +57,8 @@
<link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" /> <link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
<% if (editBean.allowCSS()) { <% 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" /> <link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
<% } <% }
%> %>

View File

@ -19,6 +19,8 @@ public class CSSHelper extends HelperBase {
private static final String FORCE = "classic"; private static final String FORCE = "classic";
public static final String PROP_REFRESH = "routerconsole.summaryRefresh"; public static final String PROP_REFRESH = "routerconsole.summaryRefresh";
public static final String DEFAULT_REFRESH = "60"; 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"; private static final String PROP_XFRAME = "routerconsole.disableXFrame";
public String getTheme(String userAgent) { public String getTheme(String userAgent) {
@ -70,12 +72,42 @@ public class CSSHelper extends HelperBase {
/** change refresh and save it */ /** change refresh and save it */
public void setRefresh(String r) { public void setRefresh(String r) {
try {
if (Integer.parseInt(r) < MIN_REFRESH)
r = "" + MIN_REFRESH;
} catch (Exception e) {
}
_context.router().saveConfig(PROP_REFRESH, r); _context.router().saveConfig(PROP_REFRESH, r);
} }
/** @return refresh time in seconds, as a string */ /** @return refresh time in seconds, as a string */
public String getRefresh() { 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 */ /** translate the title and display consistently */

View File

@ -11,12 +11,12 @@ public class ConfigNavHelper extends HelperBase {
/** configX.jsp */ /** configX.jsp */
private static final String pages[] = private static final String pages[] =
{"", "net", "ui", "home", "service", "update", "tunnels", {"", "net", "ui", "sidebar", "home", "service", "update", "tunnels",
"clients", "peer", "keyring", "logging", "stats", "clients", "peer", "keyring", "logging", "stats",
"reseed", "advanced" }; "reseed", "advanced" };
private static final String titles[] = 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("Service"), _x("Update"), _x("Tunnels"),
_x("Clients"), _x("Peers"), _x("Keyring"), _x("Logging"), _x("Stats"), _x("Clients"), _x("Peers"), _x("Keyring"), _x("Logging"), _x("Stats"),
_x("Reseeding"), _x("Advanced") }; _x("Reseeding"), _x("Advanced") };

View File

@ -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(",", "&#44;");
order = DataHelper.escapeHTML(order).replace(",", "&#44;");
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;
}
}
}
}

View File

@ -191,7 +191,8 @@ public class GraphHelper extends FormHandler {
} }
// FIXME jrobin doesn't support setting the timezone, will have to mod TimeAxis.java // 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) { } catch (IOException ioe) {
ioe.printStackTrace(); ioe.printStackTrace();
} }

View File

@ -24,14 +24,14 @@ public class HomeHelper extends HelperBase {
private static final String PROP_SEARCH = "routerconsole.showSearch"; private static final String PROP_SEARCH = "routerconsole.showSearch";
static final String DEFAULT_SERVICES = 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 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("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("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("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("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 + _x("Website") + S + _x("Local web server") + S + "http://127.0.0.1:7658/" + S + I + "server.png" + S +
""; "";

View File

@ -3,6 +3,10 @@ package net.i2p.router.web;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; 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.data.DataHelper;
import net.i2p.router.RouterContext; import net.i2p.router.RouterContext;
@ -12,6 +16,36 @@ import net.i2p.router.RouterContext;
* *
*/ */
public class SummaryBarRenderer { 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 RouterContext _context;
private final SummaryHelper _helper; private final SummaryHelper _helper;
@ -25,155 +59,199 @@ public class SummaryBarRenderer {
* on lower-level directory errors. * on lower-level directory errors.
*/ */
public void renderSummaryHTML(Writer out) throws IOException { 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); 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, buf.append("<hr>\n");
// but unfortunately the images in the different themes are different sizes. if ("HelpAndFAQ".equals(section))
// They range in height from 37 to 43 px. But there's a -2 bottom margin... buf.append(renderHelpAndFAQHTML());
// So put it in a div. else if ("I2PServices".equals(section))
buf.append("<div style=\"height: 36px;\"><a href=\"/\" target=\"_top\"><img src=\"") buf.append(renderI2PServicesHTML());
.append(CSSHelper.BASE_THEME_PATH) else if ("I2PInternals".equals(section))
.append(theme) buf.append(renderI2PInternalsHTML());
.append("/images/i2plogo.png\" alt=\"") else if ("General".equals(section))
.append(_("I2P Router Console")) buf.append(renderGeneralHTML());
.append("\" title=\"") else if ("ShortGeneral".equals(section))
.append(_("I2P Router Console")) buf.append(renderShortGeneralHTML());
.append("\"></a></div><hr>") 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 &amp; FAQ")) .append(_("I2P Router Help &amp; FAQ"))
.append("\">") .append("\">")
.append(_("Help &amp; FAQ")) .append(_("Help &amp; FAQ"))
.append("</a></h3><hr>"); .append("</a></h3>");
return buf.toString();
}
File lpath = new File(_context.getBaseDir(), "docs/toolbar.html"); public String renderI2PServicesHTML() {
// you better have target="_top" for the links in there... StringBuilder buf = new StringBuilder(512);
if (lpath.exists()) { buf.append("<h3><a href=\"/configclients\" target=\"_top\" title=\"")
ContentHelper linkhelper = new ContentHelper(); .append(_("Configure startup of clients and webapps (services); manually start dormant services"))
linkhelper.setPage(lpath.getAbsolutePath()); .append("\">")
linkhelper.setMaxLines("100"); .append(_("I2P Services"))
buf.append(linkhelper.getContent()); .append("</a></h3>\n" +
} 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" +
"<hr class=\"b\"><table><tr><td>" + "<hr class=\"b\"><table><tr><td>" +
"<a href=\"/susimail/susimail\" target=\"blank\" title=\"") "<a href=\"/webmail\" target=\"_top\" title=\"")
.append(_("Anonymous webmail client")) .append(_("Anonymous webmail client"))
.append("\">") .append("\">")
.append(_("Email")) .append(_("Email"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/i2psnark/\" target=\"_blank\" title=\"") "<a href=\"/torrents\" target=\"_top\" title=\"")
.append(_("Built-in anonymous BitTorrent Client")) .append(_("Built-in anonymous BitTorrent Client"))
.append("\">") .append("\">")
.append(_("Torrents")) .append(_("Torrents"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"http://127.0.0.1:7658/\" target=\"_blank\" title=\"") "<a href=\"http://127.0.0.1:7658/\" target=\"_blank\" title=\"")
.append(_("Local web server")) .append(_("Local web server"))
.append("\">") .append("\">")
.append(_("Website")) .append(_("Website"))
.append("</a>\n") .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=\"") public String renderI2PInternalsHTML() {
.append(_("Configure I2P Router")) StringBuilder buf = new StringBuilder(512);
.append("\">") buf.append("<h3><a href=\"/config\" target=\"_top\" title=\"")
.append(_("I2P Internals")) .append(_("Configure I2P Router"))
.append("</a></h3><hr class=\"b\">\n" + .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=\"") "<a href=\"/tunnels\" target=\"_top\" title=\"")
.append(_("View existing tunnels and tunnel build status")) .append(_("View existing tunnels and tunnel build status"))
.append("\">") .append("\">")
.append(_("Tunnels")) .append(_("Tunnels"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/peers\" target=\"_top\" title=\"") "<a href=\"/peers\" target=\"_top\" title=\"")
.append(_("Show all current peer connections")) .append(_("Show all current peer connections"))
.append("\">") .append("\">")
.append(_("Peers")) .append(_("Peers"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/profiles\" target=\"_top\" title=\"") "<a href=\"/profiles\" target=\"_top\" title=\"")
.append(_("Show recent peer performance profiles")) .append(_("Show recent peer performance profiles"))
.append("\">") .append("\">")
.append(_("Profiles")) .append(_("Profiles"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/netdb\" target=\"_top\" title=\"") "<a href=\"/netdb\" target=\"_top\" title=\"")
.append(_("Show list of all known I2P routers")) .append(_("Show list of all known I2P routers"))
.append("\">") .append("\">")
.append(_("NetDB")) .append(_("NetDB"))
.append("</a>\n" + .append("</a>\n" +
"<a href=\"/logs\" target=\"_top\" title=\"") "<a href=\"/logs\" target=\"_top\" title=\"")
.append(_("Health Report")) .append(_("Health Report"))
.append("\">") .append("\">")
.append(_("Logs")) .append(_("Logs"))
.append("</a>\n"); .append("</a>\n");
// "<a href=\"/jobs.jsp\" target=\"_top\" title=\"") // "<a href=\"/jobs.jsp\" target=\"_top\" title=\"")
// .append(_("Show the router's workload, and how it's performing")) // .append(_("Show the router's workload, and how it's performing"))
// .append("\">") // .append("\">")
// .append(_("Jobs")) // .append(_("Jobs"))
// .append("</a>\n" + // .append("</a>\n" +
if (!StatSummarizer.isDisabled()) { if (!StatSummarizer.isDisabled()) {
buf.append("<a href=\"/graphs\" target=\"_top\" title=\"") buf.append("<a href=\"/graphs\" target=\"_top\" title=\"")
.append(_("Graph router performance")) .append(_("Graph router performance"))
.append("\">") .append("\">")
.append(_("Graphs")) .append(_("Graphs"))
.append("</a>\n"); .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(_("I2P Router Help"))
.append("\">") .append("\">")
.append(_("General")) .append(_("General"))
.append("</a></h3><hr class=\"b\">\n" + .append("</a></h3><hr class=\"b\">\n" +
"<table><tr>" + "<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(_("Local Identity"))
.append(":</b></td>" + .append(":</b></td>" +
"<td align=\"right\">" + "<td align=\"right\">" +
@ -187,7 +265,10 @@ public class SummaryBarRenderer {
.append(_("show")) .append(_("show"))
.append("</a></td></tr>\n" + .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(_("Version"))
.append(":</b></td>" + .append(":</b></td>" +
"<td align=\"right\">") "<td align=\"right\">")
@ -202,24 +283,74 @@ public class SummaryBarRenderer {
.append(":</b></td>" + .append(":</b></td>" +
"<td align=\"right\">") "<td align=\"right\">")
.append(_helper.getUptime()) .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(_("Help with configuring your firewall and router for optimal I2P performance"))
.append("\">") .append("\">")
.append(_("Network")) .append(_("Network"))
.append(": ") .append(": ")
.append(_helper.getReachability()) .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();
}
public String renderPeersHTML() {
.append(_helper.getRestartStatus()) if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/peers\" target=\"_top\" title=\"")
.append("<hr><h3><a href=\"/peers\" target=\"_top\" title=\"")
.append(_("Show all current peer connections")) .append(_("Show all current peer connections"))
.append("\">") .append("\">")
.append(_("Peers")) .append(_("Peers"))
@ -227,7 +358,10 @@ public class SummaryBarRenderer {
"<table>\n" + "<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(_("Active"))
.append(":</b></td><td align=\"right\">"); .append(":</b></td><td align=\"right\">");
int active = _helper.getActivePeers(); int active = _helper.getActivePeers();
@ -236,38 +370,56 @@ public class SummaryBarRenderer {
.append(Math.max(active, _helper.getActiveProfiles())) .append(Math.max(active, _helper.getActiveProfiles()))
.append("</td></tr>\n" + .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(_("Fast"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getFastPeers()) .append(_helper.getFastPeers())
.append("</td></tr>\n" + .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(_("High capacity"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getHighCapacityPeers()) .append(_helper.getHighCapacityPeers())
.append("</td></tr>\n" + .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(_("Integrated"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getWellIntegratedPeers()) .append(_helper.getWellIntegratedPeers())
.append("</td></tr>\n" + .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(_("Known"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getAllPeers()) .append(_helper.getAllPeers())
.append("</td></tr>\n" + .append("</td></tr>\n" +
"</table><hr>\n"); "</table>\n");
return buf.toString();
}
out.write(buf.toString());
buf.setLength(0);
public String renderFirewallAndReseedStatusHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append(_helper.getFirewallAndReseedStatus()); 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=\"") buf.append("<h3><a href=\"/config\" title=\"")
.append(_("Configure router bandwidth allocation")) .append(_("Configure router bandwidth allocation"))
.append("\" target=\"_top\">") .append("\" target=\"_top\">")
@ -303,82 +455,181 @@ public class SummaryBarRenderer {
.append(_helper.getInboundTransferred()) .append(_helper.getInboundTransferred())
.append(SummaryHelper.THINSP) .append(SummaryHelper.THINSP)
.append(_helper.getOutboundTransferred()) .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(_("View existing tunnels and tunnel build status"))
.append("\">") .append("\">")
.append(_("Tunnels")) .append(_("Tunnels"))
.append("</a></h3><hr class=\"b\">" + .append("</a></h3><hr class=\"b\">" +
"<table>\n" + "<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(_("Exploratory"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getInboundTunnels() + _helper.getOutboundTunnels()) .append(_helper.getInboundTunnels() + _helper.getOutboundTunnels())
.append("</td></tr>\n" + .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(_("Client"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getInboundClientTunnels() + _helper.getOutboundClientTunnels()) .append(_helper.getInboundClientTunnels() + _helper.getOutboundClientTunnels())
.append("</td></tr>\n" + .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(_("Participating"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getParticipatingTunnels()) .append(_helper.getParticipatingTunnels())
.append("</td></tr>\n" + .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(_("Share ratio"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getShareRatio()) .append(_helper.getShareRatio())
.append("</td></tr>\n" + .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(_("What's in the router's job queue?"))
.append("\">") .append("\">")
.append(_("Congestion")) .append(_("Congestion"))
.append("</a></h3><hr class=\"b\">" + .append("</a></h3><hr class=\"b\">" +
"<table>\n" + "<table>\n" +
"<tr><td align=\"left\"><b>") "<tr title=\"")
.append(_("Indicates router performance"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Job lag")) .append(_("Job lag"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getJobLag()) .append(_helper.getJobLag())
.append("</td></tr>\n" + .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(_("Message delay"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getMessageDelay()) .append(_helper.getMessageDelay())
.append("</td></tr>\n"); .append("</td></tr>\n");
if (!_context.getBooleanPropertyDefaultTrue("router.disableTunnelTesting")) { 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(_("Tunnel lag"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getTunnelLag()) .append(_helper.getTunnelLag())
.append("</td></tr>\n"); .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(_("Backlog"))
.append(":</b></td><td align=\"right\">") .append(":</b></td><td align=\"right\">")
.append(_helper.getInboundBacklog()) .append(_helper.getInboundBacklog())
.append("</td></tr>\n" + .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(_(_helper.getTunnelStatus()))
.append("</h4><hr>\n") .append("</h4>\n");
return buf.toString();
}
.append(_helper.getDestinations()) public String renderDestinationsHTML() {
.append("<hr>\n"); if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append(_helper.getDestinations());
return buf.toString();
}
/** @since 0.9.1 */
public String renderNewsHeadingsHTML() {
out.write(buf.toString()); 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&amp;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 */ /** translate a string */

View File

@ -4,10 +4,13 @@ import java.io.IOException;
import java.text.Collator; import java.text.Collator;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.data.Destination; import net.i2p.data.Destination;
@ -17,6 +20,7 @@ import net.i2p.data.RouterAddress;
import net.i2p.data.RouterInfo; import net.i2p.data.RouterInfo;
import net.i2p.router.CommSystemFacade; import net.i2p.router.CommSystemFacade;
import net.i2p.router.Router; import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import net.i2p.router.RouterVersion; import net.i2p.router.RouterVersion;
import net.i2p.router.TunnelPoolSettings; import net.i2p.router.TunnelPoolSettings;
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; 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 // Opera 10.63 doesn't have the char, TODO check UA
//static final String THINSP = "&thinsp;/&thinsp;"; //static final String THINSP = "&thinsp;/&thinsp;";
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 * 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()); List<Destination> clients = new ArrayList(_context.clientManager().listClients());
StringBuilder buf = new StringBuilder(512); StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/i2ptunnel/\" target=\"_blank\" title=\"").append(_("Add/remove/edit &amp; 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 &amp; control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr class=\"b\"><div class=\"tunnels\">");
if (!clients.isEmpty()) { if (!clients.isEmpty()) {
Collections.sort(clients, new AlphaComparator()); Collections.sort(clients, new AlphaComparator());
buf.append("<table>"); 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 // display all the time so we display the final failure message, and plugin update messages too
String status = UpdateHandler.getStatus(); String status = UpdateHandler.getStatus();
if (status.length() > 0) { 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 (updateAvailable() || unsignedUpdateAvailable()) {
if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) { if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) {
@ -706,10 +739,31 @@ public class SummaryHelper extends HelperBase {
} }
if (buf.length() <= 0) if (buf.length() <= 0)
return ""; return "";
buf.append("<hr>");
return buf.toString(); 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 */ /** output the summary bar to _out */
public void renderSummaryBar() throws IOException { public void renderSummaryBar() throws IOException {
SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this); SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this);
@ -733,4 +787,91 @@ public class SummaryHelper extends HelperBase {
private String _requestURI; private String _requestURI;
public void setRequestURI(String s) { _requestURI = s; } public void setRequestURI(String s) { _requestURI = s; }
public String getRequestURI() { return _requestURI; } 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();
}
} }

View File

@ -237,14 +237,16 @@ public class UpdateHandler {
if (_isPartial) if (_isPartial)
return; return;
StringBuilder buf = new StringBuilder(64); StringBuilder buf = new StringBuilder(64);
buf.append("<b>").append(_("Updating")).append("</b> ");
double pct = ((double)alreadyTransferred + (double)currentWrite) / double pct = ((double)alreadyTransferred + (double)currentWrite) /
((double)alreadyTransferred + (double)currentWrite + bytesRemaining); ((double)alreadyTransferred + (double)currentWrite + bytesRemaining);
synchronized (_pct) { synchronized (_pct) {
buf.append(_pct.format(pct)); buf.append(_("{0} downloaded", _pct.format(pct)));
} }
buf.append(":<br>\n"); buf.append("<br>\n");
buf.append(_("{0}B transferred", DataHelper.formatSize2(currentWrite + alreadyTransferred))); buf.append(DataHelper.formatSize2(currentWrite + alreadyTransferred))
.append("B / ")
.append(DataHelper.formatSize2(currentWrite + alreadyTransferred + bytesRemaining))
.append("B");
updateStatus(buf.toString()); updateStatus(buf.toString());
} }
public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) { public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("configure bandwidth")%> <%=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" %> <%@include file="summary.jsi" %>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config advanced")%> <%=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" %> <%@include file="summary.jsi" %>

View File

@ -10,7 +10,14 @@ button span.hide{
display:none; display:none;
} }
input.default { width: 1px; height: 1px; visibility: hidden; } 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" %> <%@include file="summary.jsi" %>

View File

@ -12,7 +12,13 @@ input.default {
visibility: hidden; visibility: hidden;
} }
</style> </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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Home Page Configuration")%></h1> <h1><%=intl._("I2P Home Page Configuration")%></h1>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config keyring")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Keyring Configuration")%></h1> <h1><%=intl._("I2P Keyring Configuration")%></h1>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config logging")%> <%=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:useBean class="net.i2p.router.web.ConfigLoggingHelper" id="logginghelper" scope="request" />
<jsp:setProperty name="logginghelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="logginghelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config networking")%> <%=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" %> <%@include file="summary.jsi" %>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config peers")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Peer Configuration")%></h1> <h1><%=intl._("I2P Peer Configuration")%></h1>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config reseeding")%> <%=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" %> <%@include file="summary.jsi" %>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config service")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Service Configuration")%></h1> <h1><%=intl._("I2P Service Configuration")%></h1>

View 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>

View File

@ -6,10 +6,17 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config stats")%> <%=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"> <script type="text/javascript">
function init() function init()
{ {
checkAll = false; checkAll = false;
initAjax();
} }
function toggleAll(category) function toggleAll(category)
{ {

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config tunnels")%> <%=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" %> <%@include file="summary.jsi" %>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config UI")%> <%=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" %> <%@include file="summary.jsi" %>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("config update")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Update Configuration")%></h1> <h1><%=intl._("I2P Update Configuration")%></h1>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("home")%> <%=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"); String consoleNonce = System.getProperty("router.consoleNonce");
if (consoleNonce == null) { 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"> <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()) { 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" /> <jsp:getProperty name="newshelper" property="content" />
<hr> <hr>
<% <%

View File

@ -28,6 +28,7 @@
<link rel="shortcut icon" href="/themes/console/images/favicon.ico"> <link rel="shortcut icon" href="/themes/console/images/favicon.ico">
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" /> <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: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 // clickjacking
if (intl.shouldSendXFrame()) if (intl.shouldSendXFrame())

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P Router Console - Debug</title> <html><head><title>I2P Router Console - Debug</title>
<%@include file="css.jsi" %> <%@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" %> <%@include file="summary.jsi" %>
<h1>Router SKM</h1> <h1>Router SKM</h1>
<div class="main" id="main"> <div class="main" id="main">

View 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>
<%
}
%>

View File

@ -16,10 +16,16 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("Page Not Found")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=ERROR_CODE%> <%=ERROR_MESSAGE%></h1> <h1><%=ERROR_CODE%>&nbsp;<%=ERROR_MESSAGE%></h1>
<div class="sorry" id="warning"> <div class="sorry" id="warning">
<%=intl._("Sorry! You appear to be requesting a non-existent Router Console page or resource.")%><hr> <%=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%>&nbsp;<%=intl._("not found")%>.
</div></body></html> </div></body></html>

View File

@ -12,7 +12,13 @@
<% <%
graphHelper.storeWriter(out); 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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Performance Graphs")%></h1> <h1><%=intl._("I2P Performance Graphs")%></h1>
<div class="main" id="main"> <div class="main" id="main">

View File

@ -19,7 +19,13 @@
out.print(graphHelper.getRefreshMeta()); 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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Performance Graphs")%></h1> <h1><%=intl._("I2P Performance Graphs")%></h1>
<div class="main" id="main"> <div class="main" id="main">

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P Router Console - help</title> <html><head><title>I2P Router Console - help</title>
<%@include file="css.jsi" %> <%@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" %> <%@include file="summary.jsi" %>
<h1>I2P Router Help &amp; Support</h1> <h1>I2P Router Help &amp; Support</h1>
<div class="main" id="main"><p> <div class="main" id="main"><p>

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P مساعدة لوحة التحكم</title> <html><head><title>I2P مساعدة لوحة التحكم</title>
<%@include file="css.jsi" %> <%@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" %> <%@include file="summary.jsi" %>
<h1>I2P مساعدة لوحة التحكم</h1> <h1>I2P مساعدة لوحة التحكم</h1>
<div class="main" id="main" dir="rtl" lang="ar"><p> <div class="main" id="main" dir="rtl" lang="ar"><p>

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>Console du routeur I2P - Aide</title> <html><head><title>Console du routeur I2P - Aide</title>
<%@include file="css.jsi" %> <%@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" %> <%@include file="summary.jsi" %>
Traduction de mars 2011 (magma@mail.i2p) Traduction de mars 2011 (magma@mail.i2p)
<h1>Aide et assistance du routeur I2P</h1> <h1>Aide et assistance du routeur I2P</h1>

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P Router Console - help</title> <html><head><title>I2P Router Console - help</title>
<%@include file="css.jsi" %> <%@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" %> <%@include file="summary.jsi" %>
<h1>I2P Router Help &amp; Support</h1> <h1>I2P Router Help &amp; Support</h1>
<div class="main" id="main"><p> <div class="main" id="main"><p>

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>Консоль маршрутизатора I2P - справка</title> <html><head><title>Консоль маршрутизатора I2P - справка</title>
<%@include file="css.jsi" %> <%@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" %> <%@include file="summary.jsi" %>
<h1>Справка маршрутизатора I2P</h1> <h1>Справка маршрутизатора I2P</h1>

View File

@ -6,9 +6,9 @@
<%=intl.title("home")%> <%=intl.title("home")%>
<script src="/js/ajax.js" type="text/javascript"></script> <script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript"> <script type="text/javascript">
var failMessage = "<b><%=intl._("Router is down")%><\/b>"; var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp", "xhr", 15000); } function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, 15000); } function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script> </script>
</head><body onload="initAjax()"> </head><body onload="initAjax()">
<% <%
@ -20,6 +20,11 @@
%> %>
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <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:useBean class="net.i2p.router.web.ConfigUpdateHelper" id="updatehelper" scope="request" />
<jsp:setProperty name="updatehelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="updatehelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
@ -28,19 +33,10 @@
<div style="height: 36px;"> <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> <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> </div>
<hr>
<div id="xhr"> <div id="xhr">
<!-- for non-script --> <!-- for non-script -->
<%@include file="xhr1.jsi" %> <%@include file="xhr1.jsi" %>
</div> </div>
<%
if (!newshelper.shouldShowNews()) {
%>
<hr><h3><%=intl._("News")%></h3><hr class="b">
<jsp:getProperty name="updatehelper" property="newsStatus" />
<%
} // !shouldShowNews()
%>
</div> </div>
</div> </div>
@ -48,11 +44,8 @@
<% <%
if (newshelper.shouldShowNews()) { if (newshelper.shouldShowNews()) {
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%> %>
<div class="news" id="news"> <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" /> <jsp:getProperty name="newshelper" property="content" />
<hr> <hr>
<jsp:getProperty name="updatehelper" property="newsStatus" /><br> <jsp:getProperty name="updatehelper" property="newsStatus" /><br>

View 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>
<%
}
%>

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("Jar File Dump")%> <%=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> <%@include file="summary.jsi" %><h1>Jar File Dump</h1>
<div class="main" id="main"> <div class="main" id="main">
<jsp:useBean class="net.i2p.router.web.FileDumpHelper" id="dumpHelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.FileDumpHelper" id="dumpHelper" scope="request" />

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("job queue")%> <%=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> <%@include file="summary.jsi" %><h1><%=intl._("I2P Router Job Queue")%></h1>
<div class="main" id="main"> <div class="main" id="main">
<jsp:useBean class="net.i2p.router.web.JobQueueHelper" id="jobQueueHelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.JobQueueHelper" id="jobQueueHelper" scope="request" />

View File

@ -5,7 +5,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("logs")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Router Logs")%></h1> <h1><%=intl._("I2P Router Logs")%></h1>
<div class="main" id="main"> <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> <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> <h3><%=intl._("Critical Logs")%></h3><a name="criticallogs"> </a>
<jsp:getProperty name="logsHelper" property="criticalLogs" /> <jsp:getProperty name="logsHelper" property="criticalLogs" />
<hr>
<h3><%=intl._("Router Logs")%> (<a href="configlogging"><%=intl._("configure")%></a>)</h3> <h3><%=intl._("Router Logs")%> (<a href="configlogging"><%=intl._("configure")%></a>)</h3>
<jsp:getProperty name="logsHelper" property="logs" /> <jsp:getProperty name="logsHelper" property="logs" />
<hr>
<h3><%=intl._("Service (Wrapper) Logs")%></h3><a name="servicelogs"> </a> <h3><%=intl._("Service (Wrapper) Logs")%></h3><a name="servicelogs"> </a>
<jsp:getProperty name="logsHelper" property="serviceLogs" /> <jsp:getProperty name="logsHelper" property="serviceLogs" />
</div><hr></div></body></html> </div><hr></div></body></html>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("network database")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Network Database")%></h1> <h1><%=intl._("I2P Network Database")%></h1>
<div class="main" id="main"> <div class="main" id="main">

View File

@ -7,7 +7,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("WebApp Not Found")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("Web Application Not Running")%></h1> <h1><%=intl._("Web Application Not Running")%></h1>
<div class="sorry" id="warning"> <div class="sorry" id="warning">

View File

@ -9,7 +9,13 @@
%> %>
<html><head><title>I2P Router Console - internals</title> <html><head><title>I2P Router Console - internals</title>
<%@include file="css.jsi" %> <%@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" %> <%@include file="summary.jsi" %>
<jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="conhelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="conhelper" scope="request" />
<jsp:setProperty name="conhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="conhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("peer connections")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("I2P Network Peers")%></h1> <h1><%=intl._("I2P Network Peers")%></h1>
<div class="main" id="main"><div class="wideload"> <div class="main" id="main"><div class="wideload">

View File

@ -6,7 +6,14 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("peer profiles")%> <%=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> <h1><%=intl._("I2P Network Peer Profiles")%></h1>
<div class="main" id="main"><div class="wideload"> <div class="main" id="main"><div class="wideload">
<jsp:useBean class="net.i2p.router.web.ProfilesHelper" id="profilesHelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.ProfilesHelper" id="profilesHelper" scope="request" />

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("statistics")%> <%=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" %> <%@include file="summary.jsi" %>
<jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="oldhelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="oldhelper" scope="request" />
<jsp:setProperty name="oldhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <jsp:setProperty name="oldhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />

View File

@ -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"> <div class="routersummaryouter">
<% <%
// The refresh delay, 0 to disable // The refresh delay, 0 to disable
@ -13,9 +20,11 @@
d = net.i2p.data.DataHelper.stripHTML(d); // XSS d = net.i2p.data.DataHelper.stripHTML(d); // XSS
// pass the new delay parameter to the iframe // pass the new delay parameter to the iframe
newDelay = "?refresh=" + d; newDelay = "?refresh=" + d;
// update disable boolean
intl.setDisableRefresh(d);
} }
if (!"0".equals(d)) if (!intl.getDisableRefresh())
out.print("<iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\">\n"); out.print("<noscript><iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\"></noscript>\n");
} }
%> %>
<div class="routersummary"> <div class="routersummary">
@ -33,12 +42,12 @@
} }
// d and allowIFrame defined above // d and allowIFrame defined above
if (!"0".equals(d)) { if (!intl.getDisableRefresh()) {
out.print("</div></iframe>\n"); out.print("</div><noscript></iframe></noscript>\n");
} else if (allowIFrame) { } else if (allowIFrame) {
// since we don't have an iframe this will reload the base page, and // since we don't have an iframe this will reload the base page, and
// the new delay will be passed to the iframe above // 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>"); "<b>");
// We have intl defined when this is included, but not when compiled standalone. // We have intl defined when this is included, but not when compiled standalone.
out.print(intl._("Refresh (s)")); out.print(intl._("Refresh (s)"));
@ -47,7 +56,7 @@
// ditto // ditto
out.print(intl._("Enable")); out.print(intl._("Enable"));
out.print("</button>\n" + out.print("</button>\n" +
"</form></div></div>\n"); "</form></div></noscript></div>\n");
} else { } else {
out.print("</div>\n"); out.print("</div>\n");
} }

View File

@ -26,10 +26,11 @@
} else { } else {
d = net.i2p.data.DataHelper.stripHTML(d); // XSS d = net.i2p.data.DataHelper.stripHTML(d); // XSS
intl.setRefresh(d); intl.setRefresh(d);
intl.setDisableRefresh(d);
} }
// we probably don't get here if d == "0" since caught in summary.jsi, but just // we probably don't get here if d == "0" since caught in summary.jsi, but just
// to be sure... // to be sure...
if (!"0".equals(d)) { if (!intl.getDisableRefresh()) {
// doesn't work for restart or shutdown with no expl. tunnels, // doesn't work for restart or shutdown with no expl. tunnels,
// since the call to ConfigRestartBean.renderStatus() hasn't happened yet... // since the call to ConfigRestartBean.renderStatus() hasn't happened yet...
// So we delay slightly // So we delay slightly
@ -52,12 +53,19 @@
} }
%> %>
</head><body style="margin: 0;"><div class="routersummary"> </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" %> <%@include file="summarynoframe.jsi" %>
<% <%
// d and shutdownSoon defined above // d and shutdownSoon defined above
if (!shutdownSoon) { if (!shutdownSoon) {
out.print("<div class=\"refresh\"><form action=\"summaryframe.jsp\" method=\"POST\">\n"); out.print("<hr>\n<div class=\"refresh\"><form action=\"summaryframe.jsp\" method=\"POST\">\n");
if ("0".equals(d)) { if (intl.getDisableRefresh()) {
out.print("<b>"); out.print("<b>");
out.print(intl._("Refresh (s)")); out.print(intl._("Refresh (s)"));
out.print(":</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" >\n"); out.print(":</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" >\n");

View File

@ -1,35 +1,17 @@
<%@page import="net.i2p.router.web.SummaryHelper" %>
<% <%
/* /*
* Note: * TODO - the bar would render more cleanly if we specified the img height and width here,
* This is included almost 30 times, so keep whitespace etc. to a minimum. * 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" /> <div style="height: 36px;">
<jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" /> <a href="/" target="_top">
<jsp:setProperty name="helper" property="action" value="<%=request.getParameter(\"action\")%>" /> <img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/i2plogo.png" alt="<%=intl._("I2P Router Console")%>" title="<%=intl._("I2P Router Console")%>">
<jsp:setProperty name="helper" property="updateNonce" value="<%=request.getParameter(\"updateNonce\")%>" /> </a>
<jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" /> </div>
<jsp:setProperty name="helper" property="requestURI" value="<%=request.getRequestURI()%>" /> <div id="xhr">
<% helper.storeWriter(out); %> <!-- for non-script -->
<% <%@include file="xhr1.jsi" %>
/* </div>
* 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();
%>

View 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>
<%
}
%>

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("tunnel summary")%> <%=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> <%@include file="summary.jsi" %><h1><%=intl._("I2P Tunnel Summary")%></h1>
<div class="main" id="main"> <div class="main" id="main">
<jsp:useBean class="net.i2p.router.web.TunnelHelper" id="tunnelHelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.TunnelHelper" id="tunnelHelper" scope="request" />

View File

@ -6,7 +6,13 @@
<html><head> <html><head>
<%@include file="css.jsi" %> <%@include file="css.jsi" %>
<%=intl.title("Peer Profile")%> <%=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" %> <%@include file="summary.jsi" %>
<h1><%=intl._("Peer Profile")%></h1> <h1><%=intl._("Peer Profile")%></h1>
<div class="main" id="main"><div class="wideload"> <div class="main" id="main"><div class="wideload">

View 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>
<%
}
%>

View File

@ -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: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="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<jsp:setProperty name="helper" property="action" value="<%=request.getParameter(\"action\")%>" /> <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="updateNonce" value="<%=request.getParameter(\"updateNonce\")%>" />
<jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" /> <jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" />
<% <%
String reqURI = request.getRequestURI(); String reqURI = request.getRequestURI();
if (reqURI != null) if (reqURI.contains("/xhr1"))
reqURI = reqURI.replace("/xhr1.jsp", "/home"); reqURI = request.getParameter("requestURI");
helper.setRequestURI(reqURI); helper.setRequestURI(reqURI);
%> %>
<h4><a href="/confignet#help" title="<%=intl._("Help with configuring your firewall and router for optimal I2P performance")%>"><%=intl._("Network")%>: <% helper.storeWriter(out); %>
<jsp:getProperty name="helper" property="reachability" /></a></h4> <% helper.storeNewsHelper(newshelper); %>
<hr> <%
<jsp:getProperty name="helper" property="updateStatus" /> /*
<jsp:getProperty name="helper" property="restartStatus" /> * The following is required for the reseed button to work, although we probably
<hr> * only need the reseedNonce property.
<jsp:getProperty name="helper" property="firewallAndReseedStatus" /> */
<jsp:getProperty name="helper" property="destinations" /> %>
<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();
%>

View File

@ -11,4 +11,11 @@
%> %>
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" /> <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: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" %> <%@include file="xhr1.jsi" %>

View File

@ -40,11 +40,10 @@ import net.i2p.data.DataHelper;
import net.i2p.data.Destination; import net.i2p.data.Destination;
import net.i2p.util.SecureFileOutputStream; import net.i2p.util.SecureFileOutputStream;
public class AddressbookBean public class AddressbookBean extends BaseBean
{ {
protected String book, action, serial, lastSerial, filter, search, hostname, destination; protected String book, action, serial, lastSerial, filter, search, hostname, destination;
protected int beginIndex, endIndex; protected int beginIndex, endIndex;
protected final Properties properties;
private Properties addressbook; private Properties addressbook;
private int trClass; private int trClass;
protected final LinkedList<String> deletionMarks; protected final LinkedList<String> deletionMarks;
@ -82,41 +81,12 @@ public class AddressbookBean
public AddressbookBean() public AddressbookBean()
{ {
properties = new Properties(); super();
deletionMarks = new LinkedList(); deletionMarks = new LinkedList();
beginIndex = 0; beginIndex = 0;
endIndex = DISPLAY_SIZE - 1; 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() public String getFileName()
{ {
loadConfig(); loadConfig();

View 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;
}
}

View File

@ -36,38 +36,10 @@ import java.util.Properties;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.util.SecureFileOutputStream; import net.i2p.util.SecureFileOutputStream;
public class SubscriptionsBean public class SubscriptionsBean extends BaseBean
{ {
private String action, fileName, content, serial, lastSerial; 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() { public String getAction() {
return action; return action;
} }

View File

@ -47,12 +47,12 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${book.book} <%=intl._("address book")%> - susidns</title> <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> </head>
<body> <body>
<div class="page"> <div class="page">
<div id="logo"> <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> </div>
<hr> <hr>
<div id="navi"> <div id="navi">

View File

@ -36,6 +36,7 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ 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="version" class="i2p.susi.dns.VersionBean" scope="application"/>
<jsp:useBean id="cfg" class="i2p.susi.dns.ConfigBean" scope="session"/> <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:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
<jsp:setProperty name="cfg" property="*" /> <jsp:setProperty name="cfg" property="*" />
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
@ -43,12 +44,12 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=intl._("configuration")%> - susidns</title> <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> </head>
<body> <body>
<div class="page"> <div class="page">
<div id="logo"> <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><hr>
<div id="navi"> <div id="navi">
<p> <p>
@ -129,6 +130,9 @@
<li><b>log</b> - <li><b>log</b> -
<%=intl._("File to log activity to (change to /dev/null if you like)")%> <%=intl._("File to log activity to (change to /dev/null if you like)")%>
</li> </li>
<li><b>theme</b> -
<%=intl._("Name of the theme to use (defaults to 'light')")%>
</li>
</ul> </ul>
</div><hr> </div><hr>
<div id="footer"> <div id="footer">

View File

@ -41,12 +41,12 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${book.book} <%=intl._("addressbook")%> - susidns</title> <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> </head>
<body> <body>
<div class="page"> <div class="page">
<div id="logo"> <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> </div>
<hr> <hr>
<div id="navi"> <div id="navi">

View File

@ -35,18 +35,19 @@
<%@ page contentType="text/html"%> <%@ page contentType="text/html"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ 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="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" /> <jsp:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=intl._("Introduction")%> - SusiDNS</title> <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> </head>
<body> <body>
<div class="page"> <div class="page">
<div id="logo"> <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> </div>
<hr> <hr>
<div id="navi"> <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._("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.")%> <%=intl._("The private address book can also be used for aliases of hosts in your other address books.")%>
</p> </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> </div>
<hr> <hr>
<div id="footer"> <div id="footer">

View File

@ -43,12 +43,12 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=intl._("subscriptions")%> - susidns</title> <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> </head>
<body> <body>
<div class="page"> <div class="page">
<div id="logo"> <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><hr>
<div id="navi"> <div id="navi">
<p> <p>

View File

@ -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_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 = "&nbsp;&nbsp;&nbsp;"; private static final String spacer = "&nbsp;&nbsp;&nbsp;";
private static final String thSpacer = "<th>&nbsp;</th>\n"; private static final String thSpacer = "<th>&nbsp;</th>\n";
/** /**
@ -314,6 +317,7 @@ public class WebMail extends HttpServlet
public String sentMail; public String sentMail;
public ArrayList attachments; public ArrayList attachments;
public boolean reallyDelete; public boolean reallyDelete;
String themePath, imgPath;
SessionObject() SessionObject()
@ -357,9 +361,9 @@ public class WebMail extends HttpServlet
* @param label * @param label
* @return * @return
*/ */
private static String sortHeader( String name, String label ) private static String sortHeader( String name, String label, String imgPath )
{ {
return "" + label + "&nbsp;<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 + "&nbsp;<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 * check, if a given button "was pressed" in the received http request
@ -1202,6 +1206,8 @@ public class WebMail extends HttpServlet
sessionObject.info = ""; sessionObject.info = "";
sessionObject.pageChanged = false; sessionObject.pageChanged = false;
sessionObject.showAttachment = null; sessionObject.showAttachment = null;
sessionObject.themePath = "/themes/susimail/" + Config.getProperty(CONFIG_THEME, DEFAULT_THEME) + '/';
sessionObject.imgPath = sessionObject.themePath + "images/";
processStateChangeButtons( sessionObject, request ); processStateChangeButtons( sessionObject, request );
@ -1260,9 +1266,9 @@ public class WebMail extends HttpServlet
"<head>\n" + "<head>\n" +
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n" + "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n" +
"<title>susimail - " + subtitle + "</title>\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" + "</head>\n<body>\n" +
"<div class=\"page\"><p><img src=\"susimail.png\" alt=\"Susimail\"><br>&nbsp;</p>\n" + "<div class=\"page\"><p><img src=\"" + sessionObject.imgPath + "susimail.png\" alt=\"Susimail\"><br>&nbsp;</p>\n" +
"<form method=\"POST\" enctype=\"multipart/form-data\" action=\"" + myself + "\">" ); "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"" + myself + "\">" );
if( sessionObject.error != null && sessionObject.error.length() > 0 ) { if( sessionObject.error != null && sessionObject.error.length() > 0 ) {
@ -1607,10 +1613,10 @@ public class WebMail extends HttpServlet
button( RELOAD, _("Reload Config") ) + spacer + button( RELOAD, _("Reload Config") ) + spacer +
button( LOGOUT, _("Logout") ) + "<table cellspacing=\"0\" cellpadding=\"5\">\n" + button( LOGOUT, _("Logout") ) + "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
"<tr><td colspan=\"8\"><hr></td></tr>\n<tr>" + "<tr><td colspan=\"8\"><hr></td></tr>\n<tr>" +
thSpacer + "<th>" + sortHeader( SORT_SENDER, _("Sender") ) + "</th>" + thSpacer + "<th>" + sortHeader( SORT_SENDER, _("Sender"), sessionObject.imgPath ) + "</th>" +
thSpacer + "<th>" + sortHeader( SORT_SUBJECT, _("Subject") ) + "</th>" + thSpacer + "<th>" + sortHeader( SORT_SUBJECT, _("Subject"), sessionObject.imgPath ) + "</th>" +
thSpacer + "<th>" + sortHeader( SORT_DATE, _("Date") ) + sortHeader( SORT_ID, "" ) + "</th>" + thSpacer + "<th>" + sortHeader( SORT_DATE, _("Date"), sessionObject.imgPath ) + sortHeader( SORT_ID, "", sessionObject.imgPath ) + "</th>" +
thSpacer + "<th>" + sortHeader( SORT_SIZE, _("Size") ) + "</th></tr>" ); thSpacer + "<th>" + sortHeader( SORT_SIZE, _("Size"), sessionObject.imgPath ) + "</th></tr>" );
int bg = 0; int bg = 0;
int i = 0; int i = 0;
for( Iterator it = sessionObject.folder.currentPageIterator(); it != null && it.hasNext(); ) { for( Iterator it = sessionObject.folder.currentPageIterator(); it != null && it.hasNext(); ) {

View File

@ -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 2012-07-15 zzz
* XORComparator: Reduce object churn (Ticket #658) * XORComparator: Reduce object churn (Ticket #658)

View File

@ -9,7 +9,7 @@
<li class="tidylist"><b>Invisible Internet &amp; 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>Invisible Internet &amp; 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. (susimail) or using any mail client that supports smtp and pop3.
Accounts can send and receive mail from the normal internet. For an 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> 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>

View File

@ -25,7 +25,7 @@
kompatibel zu normalen Email-Klienten (POP3/SMTP) ist, und welches es erlaubt, kompatibel zu normalen Email-Klienten (POP3/SMTP) ist, und welches es erlaubt,
Emails innerhalb von I2P sowie Emails von und ins normale Internet zu 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>. 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 browserbasierten anonymen POP3/SMTP-Klienten, fertig eingerichtet
f&uuml;r Postmans Email-Service. f&uuml;r Postmans Email-Service.
<br>Oder probier unser neues serverloses und Ende-zu-Ende-verschl&uuml;sseltes Emailsystem <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a> (mit Webinterface) aus, welches als Plugin erh&auml;ltlich ist!</li> <br>Oder probier unser neues serverloses und Ende-zu-Ende-verschl&uuml;sseltes Emailsystem <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a> (mit Webinterface) aus, welches als Plugin erh&auml;ltlich ist!</li>

View File

@ -17,7 +17,7 @@
<li class="tidylist"><b>navegar en internet</b> - I2P cuenta con un HTTP-"Outproxy". Para poder usarlo, puedes tambi&eacute;n utilizar el proxy HTTP en el puerto 4444 - Si configuras tu navegador web para usar este proxy, puedes visitar las p&aacute;ginas web de forma an&oacute;nima. El tr&aacute;fico ser&aacute; enrutado atrav&eacute;s de la red I2P.</li> <li class="tidylist"><b>navegar en internet</b> - I2P cuenta con un HTTP-"Outproxy". Para poder usarlo, puedes tambi&eacute;n utilizar el proxy HTTP en el puerto 4444 - Si configuras tu navegador web para usar este proxy, puedes visitar las p&aacute;ginas web de forma an&oacute;nima. El tr&aacute;fico ser&aacute; enrutado atrav&eacute;s de la red I2P.</li>
<li class="tidylist"><b>intercambiar datos</b> - Hay una <a href="i2psnark/">adaptaci&oacute;n</a> para I2P de la aplicaci&oacute;n <a href="http://www.bittorrent.com/">BitTorrent</a> <li class="tidylist"><b>intercambiar datos</b> - Hay una <a href="i2psnark/">adaptaci&oacute;n</a> para I2P de la aplicaci&oacute;n <a href="http://www.bittorrent.com/">BitTorrent</a>
<a href="http://www.klomp.org/snark/">Snark</a>.</li> <a href="http://www.klomp.org/snark/">Snark</a>.</li>
<li class="tidylist"><b>correo electr&oacute;nico an&oacute;nimo</b> - Postman cre&oacute; un sistema de correo electr&oacute;nico que es compatible con las aplicaciones de correo comunes (POP3/SMTP), el cual permite enviar correos electr&oacute;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&oacute;nimo de correo que se abre en el navegador web. Ya est&aacute; configurado para el servicio de Postman.<br>Tambi&eacute;n te recomendamos nuestro nuevo sistema de correo electr&oacute;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&oacute;nico an&oacute;nimo</b> - Postman cre&oacute; un sistema de correo electr&oacute;nico que es compatible con las aplicaciones de correo comunes (POP3/SMTP), el cual permite enviar correos electr&oacute;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&oacute;nimo de correo que se abre en el navegador web. Ya est&aacute; configurado para el servicio de Postman.<br>Tambi&eacute;n te recomendamos nuestro nuevo sistema de correo electr&oacute;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&oacute;nimo</b> - Lanza tu cliente IRC preferido y con&eacute;ctate con el servidor an&oacute;nimo en <li class="tidylist"><b>chat an&oacute;nimo</b> - Lanza tu cliente IRC preferido y con&eacute;ctate con el servidor an&oacute;nimo en
<b>127.0.0.1 puerto 6668</b>. Esto te llevar&aacute; a uno de dos servidores an&oacute;nimos de IRC <b>127.0.0.1 puerto 6668</b>. Esto te llevar&aacute; a uno de dos servidores an&oacute;nimos de IRC
- y ni tu ni los dem&aacute;s usuarios sabr&aacute;n quien es el otro, ni siquiera el administrador del servidor.</li> - y ni tu ni los dem&aacute;s usuarios sabr&aacute;n quien es el otro, ni siquiera el administrador del servidor.</li>

View File

@ -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> <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 <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 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 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, <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. En complément,

View File

@ -9,7 +9,7 @@
<li class="tidylist"><b>Invisible Internet &amp; 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>Invisible Internet &amp; 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. (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> 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>

View File

@ -17,7 +17,7 @@
<li class="tidylist"><b>navegar na internet</b> - I2P dispõe de um "outproxy" http - para usâ-lo, tamb&eacute;m pode empregar o proxy http no porto 4444 - Se configurar o seu navegador web para usar este proxy, pode visitar as p&aacute;ginas web de maneira anônima e o trânsito ser&aacute; roteado atravez da rede I2P.</li> <li class="tidylist"><b>navegar na internet</b> - I2P dispõe de um "outproxy" http - para usâ-lo, tamb&eacute;m pode empregar o proxy http no porto 4444 - Se configurar o seu navegador web para usar este proxy, pode visitar as p&aacute;ginas web de maneira anônima e o trânsito ser&aacute; 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> <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> <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&aacute; configurado para o servício de Postman.<br>Tamb&eacute;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&aacute; configurado para o servício de Postman.<br>Tamb&eacute;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&eacute;cte-se com o servidor anônimamente en <li class="tidylist"><b>bate-papo anônimo</b> - Lance o seu cliente IRC preferido e con&eacute;cte-se com o servidor anônimamente en
<b>127.0.0.1 porto 6668</b>. Isto lhe levar&aacute; a um dos dois servidores anônimos de IRC oficiales em I2P <b>127.0.0.1 porto 6668</b>. Isto lhe levar&aacute; 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> - e nem você nem os outros usuários sabrão quem é o outro, nem mesmo o administrador do servidor!</li>

View File

@ -43,7 +43,7 @@ fungerar med vanliga email-klienter
och fr&aring;n det vanliga Internet! och fr&aring;n det vanliga Internet!
skaffa dig ett konto hos <a skaffa dig ett konto hos <a
href="http://hq.postman.i2p/">hq.postman.i2p</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 &auml;r en webb-baserad anonymt inriktad pop3/smtp-klient, inst&auml;lld som &auml;r en webb-baserad anonymt inriktad pop3/smtp-klient, inst&auml;lld
till att ansluta till postmans email-tj&auml;nst.</li> till att ansluta till postmans email-tj&auml;nst.</li>
<li><b>chatta anonymt</b> - starta din IRC-klient och anslut till <li><b>chatta anonymt</b> - starta din IRC-klient och anslut till

View File

@ -15,7 +15,7 @@
I2P网络中还有很多其他站点 - 访问上面的网站你会找到更多,别忘了收藏你喜爱的 I2P 网站方便访问。<br> I2P网络中还有很多其他站点 - 访问上面的网站你会找到更多,别忘了收藏你喜爱的 I2P 网站方便访问。<br>
<li><b>浏览 Web 网页</b> - 目前 IP2 网络中的出口代理("Outproxy")只有一个它的HTTP代理映射在本机的4444端口上。- 将浏览器的代理设置指向为上述地址(127.0.0.1:4444)后,访问任何普通链接即可 - 您的HTTP请求将在 I2P 网络内部传递。</li> <li><b>浏览 Web 网页</b> - 目前 IP2 网络中的出口代理("Outproxy")只有一个它的HTTP代理映射在本机的4444端口上。- 将浏览器的代理设置指向为上述地址(127.0.0.1:4444)后,访问任何普通链接即可 - 您的HTTP请求将在 I2P 网络内部传递。</li>
<li><b>文件交换</b> - I2P的其中一个本地&nbsp;<a href="/i2psnark">端口</a>&nbsp;用于内置的&nbsp;<a href="http://www.klomp.org/snark/">Snark</a> <a href="http://www.bittorrent.com/">BitTorrent</a> 客户端。</li> <li><b>文件交换</b> - I2P的其中一个本地&nbsp;<a href="/i2psnark">端口</a>&nbsp;用于内置的&nbsp;<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&nbsp;</b>即可访问I2P的匿名聊天室如果您的聊天客户端配置错误泄露IP(DDC,MSG)我们的匿名服务器会自动过滤掉这些数据不让对方发现你如果您的IRC设置正确无论服务器还是其他聊天的人都不知道您在哪里。</li> <li><b>匿名聊天</b> - 打开你的 IRC 聊天程序,连接至 <b>127.0.0.1:6668&nbsp;</b>即可访问I2P的匿名聊天室如果您的聊天客户端配置错误泄露IP(DDC,MSG)我们的匿名服务器会自动过滤掉这些数据不让对方发现你如果您的IRC设置正确无论服务器还是其他聊天的人都不知道您在哪里。</li>
<li><b>匿名博客</b> - 参见 <a href="http://syndie.i2p2.de/">Syndie</a></li> <li><b>匿名博客</b> - 参见 <a href="http://syndie.i2p2.de/">Syndie</a></li>
<li>以及其他服务。</li> <li>以及其他服务。</li>

View File

@ -216,6 +216,10 @@ div.routersummary h3 a, div.routersummary h4 a {
text-decoration: none; text-decoration: none;
} }
div.routersummary ul {
text-align: left !important;
}
div.routersummary table { div.routersummary table {
border: 0; border: 0;
text-align: center !important; text-align: center !important;
@ -234,6 +238,16 @@ div.routersummary tr {
border: 0 !important; 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 { div.tunnels table {
margin: 0 -7px !important; margin: 0 -7px !important;
width: 193px; width: 193px;
@ -501,6 +515,45 @@ div.configure h2:first-child {
margin-top: 15px; 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 { .topshimten {
margin-top: 15px; margin-top: 15px;
margin-bottom: 15px; margin-bottom: 15px;
@ -543,13 +596,24 @@ h1 {
line-height: 93%; line-height: 93%;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.3em; letter-spacing: 0.3em;
background: #fff; background: #fff url(images/titlebg.png) center right no-repeat !important;
min-width: 500px; min-width: 500px;
-moz-border-radius: 0 3px 0 0; -moz-border-radius: 0 3px 0 0;
-khtml-border-radius: 0 3px 0 0; -khtml-border-radius: 0 3px 0 0;
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 { h2 {
font-size: 14pt; font-size: 14pt;
padding: 10px; padding: 10px;

View File

@ -116,6 +116,11 @@ div.news hr {
margin: 0 -10px 0 -13px !important; margin: 0 -10px 0 -13px !important;
} }
div.routersummaryouter {
left: 5px;
top: 5px;
}
div.routersummary { div.routersummary {
color: #001; color: #001;
padding-left: 0px; padding-left: 0px;
@ -173,7 +178,7 @@ div.routersummary table {
border: 0; border: 0;
text-align: center !important; text-align: center !important;
margin: -5px 5px !important; margin: -5px 5px !important;
width: 192px !important; width: 182px !important;
overflow: hidden; overflow: hidden;
font-size: 8pt; font-size: 8pt;
padding: 0px -10px; padding: 0px -10px;
@ -235,10 +240,6 @@ div.warning {
margin: 7px -18px 0px 5px; margin: 7px -18px 0px 5px;
} }
td {
text-align: left;
}
th { th {
text-align: left; text-align: left;
padding-left: 3px; padding-left: 3px;
@ -265,7 +266,7 @@ div.graphspanel hr {
} }
table { table {
width: 100% !important; width: auto !important;
} }
.links li { .links li {
@ -294,9 +295,5 @@ div.news {
font-size: 7pt; font-size: 7pt;
} }
h1, h2, h3 {
background: #fff url(images/titlebg.png) center right no-repeat !important;
}
.routersummary h2, .routersummary h3 { .routersummary h2, .routersummary h3 {
background: #fff url(images/tinytitle.png) center right tile-x !important; background: #fff url(images/tinytitle.png) center right tile-x !important;

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

View File

@ -1,6 +1,6 @@
/* I2P Theme: Camo aka Dark */ /* I2P Theme: Camo aka Dark */
/* Description: Military Grade. */ /* 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 */ /* Author: dr|z3d */
body { body {
@ -10,7 +10,6 @@ body {
background: #010 url('images/camotile.png') center bottom; background: #010 url('images/camotile.png') center bottom;
color: #EE9; color: #EE9;
font: 8.5pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; font: 8.5pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
} }
.hide { .hide {
@ -39,7 +38,7 @@ div.logo {
float: left; float: left;
padding: 10px; padding: 10px;
text-align: center; text-align: center;
font-color: #EE9; color: #EE9;
margin: 0 20px 0 20px; margin: 0 20px 0 20px;
border: 1px solid #494; border: 1px solid #494;
-moz-border-radius: 4px; -moz-border-radius: 4px;
@ -84,13 +83,13 @@ div.toolbar a:visited {
background: #ddf; background: #ddf;
} }
div.toolbar a:hover, button:hover{ div.toolbar a:hover, button:hover {
border: 1px solid #f60; border: 1px solid #f60;
background: #030; background: #030;
color: #f60; color: #f60;
} }
a:active{ a:active {
color: #900; color: #900;
} }
@ -108,7 +107,7 @@ div.routersummaryouter {
div.routersummary { div.routersummary {
width: 173px; width: 173px;
padding: 10px; padding: 10px 10px 8px;
text-align: center; text-align: center;
border: 1px solid #494; border: 1px solid #494;
background: #000 url(images/camotile2.png); background: #000 url(images/camotile2.png);
@ -122,6 +121,7 @@ div.routersummary {
-moz-box-shadow: 0 1px 5px #000; -moz-box-shadow: 0 1px 5px #000;
-khtml-box-shadow: 0 1px 5px #000; -khtml-box-shadow: 0 1px 5px #000;
box-shadow: 0 1px 5px #000; box-shadow: 0 1px 5px #000;
margin-bottom: 7px !important;
} }
div.routersummary input[type=text] { div.routersummary input[type=text] {
@ -153,7 +153,6 @@ div.routersummary h3 {
-khtml-border-radius: 0; -khtml-border-radius: 0;
border-radius: 0; border-radius: 0;
background: #000 url('images/header.png') center center ; 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 { div.routersummary h4 {
@ -167,10 +166,13 @@ div.routersummary h4 {
text-transform: capitalize; text-transform: capitalize;
text-decoration: none !important; text-decoration: none !important;
color: #2b2; color: #2b2;
background-image: -moz-linear-gradient(top, bottom, from(#000), to(#050), color-stop(10%, #050), color-stop(100%, #004));
line-height: 100%; line-height: 100%;
} }
div.routersummary ul {
text-align: left !important;
}
div.routersummary table { div.routersummary table {
border: 0; border: 0;
text-align: center !important; text-align: center !important;
@ -178,7 +180,7 @@ div.routersummary table {
width: 188px !important; width: 188px !important;
overflow: hidden; overflow: hidden;
font-size: 8pt; font-size: 8pt;
padding: 0 -10px; /* padding: 0 -10px; */
background-image: none !important; background-image: none !important;
background-color: transparent !important; background-color: transparent !important;
} }
@ -190,7 +192,7 @@ div.routersummary tr {
} }
div.routersummary form { div.routersummary form {
margin: -5px 0 -7px; margin: -4px 0 -6px;
} }
div.routersummary form:first-child { div.routersummary form:first-child {
@ -210,6 +212,7 @@ div.refresh {
div.routersummary a:link, div.routersummary a:visited { div.routersummary a:link, div.routersummary a:visited {
text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8); text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8);
text-shadow: 0px 0px 2px #101 !important; text-shadow: 0px 0px 2px #101 !important;
padding: 0 1px;
} }
div.routersummary a:hover { div.routersummary a:hover {
@ -221,6 +224,7 @@ div.routersummary td {
padding: 0px 2px 0px 2px; padding: 0px 2px 0px 2px;
background-image: none !important; background-image: none !important;
border: 0 !important; border: 0 !important;
word-spacing: -0.1em;
} }
div routersummary hr:last-child { div routersummary hr:last-child {
@ -228,6 +232,28 @@ div routersummary hr:last-child {
margin-bottom: -5px !important; 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 { div.tunnels {
padding-top: 3px !important; padding-top: 3px !important;
margin-left: -4px; margin-left: -4px;
@ -366,6 +392,7 @@ div.news li {
div.news h3 { div.news h3 {
text-align: left !important; text-align: left !important;
font-size: 9.5pt; font-size: 9.5pt;
letter-spacing: 0.03em;
} }
div.news h4 { div.news h4 {
@ -401,14 +428,14 @@ div.news hr {
} }
div.confignav { div.confignav {
padding: 15px 10px !important; background: url('images/header.png') repeat-x scroll center center #000;
margin: 15px 0; padding:5px 5px 6px !important;
background: #000 url('images/header.png') center center repeat-x ; margin: -1px 0 15px;
-moz-border-radius: 4px; -moz-border-radius: 0 0 4px 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 0 0 4px 4px;
border-radius: 4px; border-radius: 0 0 4px 4px;
border: 1px solid #494; border: 1px solid #494;
font-size: 9.5pt !important; font-size: 8.5pt !important;
font-weight: bold !important; font-weight: bold !important;
line-height: 160% !important; line-height: 160% !important;
@ -424,6 +451,44 @@ div.configure {
background: none;/* url(images/camotile2.png);*/ 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 { div.messages {
padding: 10px; padding: 10px;
margin: 10px 0 15px 0; margin: 10px 0 15px 0;
@ -431,7 +496,7 @@ div.messages {
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
border: 1px solid #494; 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-weight: bold;
font-size: 9pt; font-size: 9pt;
color: #4f4; color: #4f4;
@ -484,7 +549,6 @@ div.graphspanel img {
margin: 5px; margin: 5px;
text-align: center !important; text-align: center !important;
background: #000; background: #000;
opacity: 0.8; opacity: 0.8;
} }
@ -504,7 +568,7 @@ table {
border-collapse: collapse; border-collapse: collapse;
width: 100%; width: 100%;
border: 1px solid #494; border: 1px solid #494;
cell-padding: 1px; padding: 1px;
font-size: 8pt; font-size: 8pt;
background: #030; background: #030;
margin: 1px 0; margin: 1px 0;
@ -525,7 +589,6 @@ th {
color: #EE9; color: #EE9;
text-align: center; text-align: center;
font-size: 9pt; font-size: 9pt;
background: #000; /*url('images/tabletitledark.png') repeat-x;*/
background: #000 url('images/header.png') center center repeat-x ; background: #000 url('images/header.png') center center repeat-x ;
border-top: 1px solid #494; border-top: 1px solid #494;
border-bottom: 1px solid #494 !important; border-bottom: 1px solid #494 !important;
@ -537,14 +600,15 @@ tr {
} }
tr:nth-child(even) { tr:nth-child(even) {
background: #010;/* url('images/darkerbluetile.png') !important;*/ background: #010;
vertical-align: middle; vertical-align: middle;
} }
tr:nth-child(odd) { tr:nth-child(odd) {
background: #000800;/* url('images/darkbluetile.png') !important;*/ background: #000800;
vertical-align: middle; vertical-align: middle;
} }
/* /*
tr:last-child { tr:last-child {
background: #004 url('images/lightbluetile.png') !important; background: #004 url('images/lightbluetile.png') !important;
@ -552,6 +616,7 @@ tr:last-child {
border: 1px solid #494 !important; border: 1px solid #494 !important;
} }
*/ */
td { td {
padding: 4px 6px; padding: 4px 6px;
color: #EE9; color: #EE9;
@ -628,21 +693,21 @@ code {
padding: 1px 2px; padding: 1px 2px;
} }
a:link, h2 a:link{ a:link, h2 a:link {
color: #494; color: #494;
text-decoration: none; text-decoration: none;
font-weight: bold; font-weight: bold;
word-wrap: break-word; word-wrap: break-word;
} }
a:visited{ a:visited {
color: #7b7; color: #7b7;
text-decoration: none; text-decoration: none;
font-weight: bold; font-weight: bold;
word-wrap: break-word; word-wrap: break-word;
} }
a:hover{ a:hover {
color: #f60; color: #f60;
text-decoration: underline; text-decoration: underline;
font-weight: bold; font-weight: bold;
@ -650,7 +715,7 @@ a:hover{
} }
.links { .links {
padding-bottom: -2px; /* padding-bottom: -2px; */
text-align: justify; text-align: justify;
margin-top: 10px; margin-top: 10px;
margin-bottom: -10px; margin-bottom: -10px;
@ -660,7 +725,7 @@ a:hover{
list-style-image: url("images/link.png") !important; list-style-image: url("images/link.png") !important;
} }
.links b{ .links b {
color: #b70 !important; color: #b70 !important;
letter-spacing: 0.07em; letter-spacing: 0.07em;
font-size: 8.5pt; font-size: 8.5pt;
@ -673,7 +738,7 @@ p {
line-height: 160%; line-height: 160%;
} }
p img:first-child{ p img:first-child {
display: none !important; display: none !important;
} }
@ -689,10 +754,7 @@ h1 {
letter-spacing: 0.15em; letter-spacing: 0.15em;
text-shadow: 0px 0px 2px #010; text-shadow: 0px 0px 2px #010;
white-space: normal; 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: #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: 1px solid #494;
border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0;
-moz-border-radius: 4px 4px 0 0; -moz-border-radius: 4px 4px 0 0;
@ -704,23 +766,33 @@ h1 {
box-shadow: 0 1px 5px #000; 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 { h2 {
font-size: 12pt; font-size: 12pt;
color: #EE9; color: #EE9;
text-shadow: 0px 0px 2px #010; text-shadow: 0px 0px 2px #010;
letter-spacing: 0.05em; letter-spacing: 0.05em;
background: #000 url(images/camotile2.png); 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 ; background: #000 url('images/header.png') center center ;
padding: 10px; padding: 10px;
wordwrap: none;
border: 1px solid #494; border: 1px solid #494;
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
vertical-align: middle; vertical-align: middle;
margin: 15px 0 12px 0 !important; margin: 15px 0 12px 0 !important;
text-transform: uppercase; text-transform: uppercase;
word-wrap: break-word; word-wrap: break-word;
} }
@ -736,7 +808,7 @@ h2 a:hover {
h3 { h3 {
border: 1px solid #494; border: 1px solid #494;
border-left: 5px solid #494; border-left: 5px solid #494;
padding: 5px 6px 7px; padding: 6px;
margin: 12px 0 10px 0; margin: 12px 0 10px 0;
border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0;
-moz-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 ; background: #000 url('images/header.png') center center ;
text-transform: uppercase; text-transform: uppercase;
text-shadow: 0px 0px 2px #010; text-shadow: 0px 0px 2px #010;
letter-spacing: 0.08em;
} }
h4 { h4 {
@ -769,7 +842,7 @@ button, button:visited {
margin: 2px 3px; margin: 2px 3px;
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
min-width: 76px; min-width: 70px;
-moz-box-shadow: inset 0px 1px 1px 0px #494; -moz-box-shadow: inset 0px 1px 1px 0px #494;
-khtml-box-shadow: inset 0px 1px 1px 0px #191; -khtml-box-shadow: inset 0px 1px 1px 0px #191;
box-shadow: inset 0px 1px 1px 0px #191; box-shadow: inset 0px 1px 1px 0px #191;
@ -802,7 +875,7 @@ button:active {
} }
.langbox { .langbox {
margin: 5px 3px 2px 5px; margin: 4px 4px 2px 5px;
padding: 0; padding: 0;
color: #EE9; color: #EE9;
font-size: 7pt; font-size: 7pt;
@ -815,6 +888,7 @@ button:active {
.langbox img { .langbox img {
opacity: 0.5; opacity: 0.5;
-moz-box-shadow: 0 0 1px #000; -moz-box-shadow: 0 0 1px #000;
padding: 1px !important;
} }
.langbox img:hover { .langbox img:hover {
@ -877,7 +951,7 @@ input:active {
color: #EE9; color: #EE9;
} }
input[type=text] { input[type=text], input[type=password] {
background: #000; background: #000;
color: #EE9; color: #EE9;
margin: 5px 10px; margin: 5px 10px;
@ -897,6 +971,10 @@ input[type=text]:active, input[type=text]:hover {
background: #000; background: #000;
} }
input[type=image] {
min-width: 0;
}
fieldset { fieldset {
overflow: hidden; overflow: hidden;
position: relative; position: relative;
@ -935,7 +1013,7 @@ form {}
.proxyfooter { .proxyfooter {
margin: 0 20px 10px 240px; margin: 0 20px 10px 240px;
padding: 20px 25px 20px 75px; padding: 20px 25px 20px 75px;
font-color: #f00; color: #f00;
font-size: 7pt; font-size: 7pt;
text-align: right !important; text-align: right !important;
border-radius: 4px; border-radius: 4px;
@ -1159,6 +1237,8 @@ div.app {
background: #000; background: #000;
background-image: -moz-linear-gradient(center top , #000B00, #000); background-image: -moz-linear-gradient(center top , #000B00, #000);
border-radius: 3px; border-radius: 3px;
-moz-border-radius: 3px;
-khtml-border-radius: 3px;
margin: 5px; margin: 5px;
height: 72px; height: 72px;
text-align: center !important; text-align: center !important;
@ -1245,3 +1325,7 @@ div.applabel {
} }
/* end home page */ /* end home page */
iframe.iframed {
margin: 10px 0 0;
}

View 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;
}

View File

@ -18,6 +18,11 @@ body {
box-sizing: border-box; box-sizing: border-box;
} }
body.iframed {
background: transparent url('images/transparent.gif') !important;
padding-top: 5px;
}
div { div {
-moz-box-sizing: border-box; -moz-box-sizing: border-box;
box-sizing: border-box; box-sizing: border-box;
@ -79,6 +84,9 @@ button {
textarea { textarea {
border: 1px solid #494; border: 1px solid #494;
background: #000;
margin-left: 4px;
width: 458px;
} }
br { br {
@ -140,7 +148,7 @@ hr {
border: 1px solid #494; border: 1px solid #494;
padding: 2px; padding: 2px;
margin: 4px 0 2px 4px; margin: 4px 0 2px 4px;
background-color: #020; background-color: #000;
font-size: 8.5pt; font-size: 8.5pt;
} }
@ -153,7 +161,7 @@ hr {
font-size: 8pt; font-size: 8pt;
font-weight: bold; font-weight: bold;
background-color: #000; background-color: #000;
color: #9f9 !important; color: #494 !important;
border: 1px outset #ddddc0; border: 1px outset #ddddc0;
text-align: center; text-align: center;
white-space: nowrap; white-space: nowrap;
@ -171,8 +179,9 @@ hr {
} }
.control:link { .control:link {
color: #9f9; color: #494 !important;
text-decoration: none; text-decoration: none;
background: #000 !important;
} }
.control:hover { .control:hover {
@ -188,12 +197,12 @@ hr {
.control:active { .control:active {
border: 1px inset; border: 1px inset;
background-color: #f60; background-color: #f60;
color: #fff !important; color: #EE9 !important;
text-decoration: none; text-decoration: none;
} }
.control:visited { .control:visited {
color: #010; color: #494 !important;
text-decoration: none; text-decoration: none;
} }
@ -205,7 +214,7 @@ hr {
font-size: 8.5pt; font-size: 8.5pt;
color: #EEEE99; color: #EEEE99;
background-color: #020; background-color: #020;
background: #000; /*url(images/camotile2.png);*/ background: #000 url(images/camotile2.png);
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
@ -213,6 +222,26 @@ hr {
padding: 10px 20px; 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 { .panel .footer {
float: right; float: right;
padding: 4px; padding: 4px;
@ -256,6 +285,15 @@ hr {
#globalOperationsPanel .control { #globalOperationsPanel .control {
width: 120px; width: 120px;
color: #494 !important;
}
#globalOperationsPanel .control:hover {
color: #F60 !important;
}
#globalOperationsPanel .control:active {
color: #EE9 !important;
} }
.header { .header {
@ -268,25 +306,25 @@ hr {
a:link{ a:link{
color: #494; color: #494;
text-decoration: none; text-decoration: none;
background: #000; background: none;
} }
a:visited{ a:visited{
color: #7b7; color: #7b7;
text-decoration: none; text-decoration: none;
background: #000; background: none;
} }
a:hover{ a:hover{
color: #ff6600; color: #ff6600;
text-decoration: underline; text-decoration: underline;
background: #000; background: none;
} }
a:active{ a:active{
color: #900; color: #900;
text-decoration: underline; text-decoration: underline;
background: #000; background: none;
} }
input { input {

View File

@ -92,6 +92,16 @@
#tunnelListPage .footer .control { #tunnelListPage .footer .control {
margin-left: 2px; 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 { #tunnelListPage .footer label {
@ -102,6 +112,7 @@
margin-top: 6px; margin-top: 6px;
margin-right: 5px; margin-right: 5px;
} }
/* Use Leary and Langridge content replacement methods (LIR) /* Use Leary and Langridge content replacement methods (LIR)
** to embed accessibility information into the document. ** to embed accessibility information into the document.
** Should allow the lists to be rendered nicely by ** Should allow the lists to be rendered nicely by

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

View File

@ -182,6 +182,10 @@ div.routersummary h4 {
box-shadow: 0px 0px 1px 1px #bdf; box-shadow: 0px 0px 1px 1px #bdf;
} }
div.routersummary ul {
text-align: left !important;
}
div.routersummary table { div.routersummary table {
border: 0; border: 0;
text-align: center !important; text-align: center !important;
@ -239,6 +243,16 @@ div.routersummary img:hover:first-child {
opacity: 1; 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 { div.tunnels {
margin-top: 6px !important; margin-top: 6px !important;
margin-left: -2px !important; margin-left: -2px !important;
@ -495,6 +509,45 @@ div.configure h3, div.graphspanel h3 {
text-align: left; 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 { div.graphspanel {
text-align: center !important; text-align: center !important;
margin: 15px 0px -15px; margin: 15px 0px -15px;
@ -844,6 +897,18 @@ h1 {
min-width: 500px; 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 { h2 {
font-size: 13pt; font-size: 13pt;
color: #115; color: #115;

Some files were not shown because too many files have changed in this diff Show More