propagate from branch 'i2p.i2p.str4d.fux' (head 48cafeb29fb3408078a8b93c0bab0fc9d766a8bc)
to branch 'i2p.i2p' (head 47f04ff21e8edd00134a0fd68219f86fd3caba36)
@ -232,7 +232,7 @@ public class I2PSnarkServlet extends DefaultServlet {
|
|||||||
//out.write("<meta http-equiv=\"refresh\" content=\"" + delay + ";/i2psnark/" + peerString + "\">\n");
|
//out.write("<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&filelist=1&info_hash=")
|
buf.append("<a href=\"").append(baseURL).append("details.php?dllist=1&filelist=1&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("=", "=");
|
String announceURL = t.announceURL.replace("=", "=");
|
||||||
buf.append("<tr><td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"delete_")
|
buf.append("<tr><td><input type=\"checkbox\" class=\"optbox\" name=\"delete_")
|
||||||
.append(name).append("\" title=\"").append(_("Delete")).append("\">" +
|
.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\" > <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) + "…" + announce.substring(announce.length() - 8);
|
announce = announce.substring(0, 40) + "…" + 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\" > <b>")
|
||||||
|
.append(_("Size"))
|
||||||
|
.append(":</b> ")
|
||||||
|
.append(formatSize(snark.getTotalLength()));
|
||||||
|
int pieces = snark.getPieces();
|
||||||
|
double completion = (pieces - snark.getNeeded()) / (double) pieces;
|
||||||
|
if (completion < 1.0)
|
||||||
|
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "head_rx.png\" > <b>")
|
||||||
|
.append(_("Completion"))
|
||||||
|
.append(":</b> ")
|
||||||
|
.append((new DecimalFormat("0.00%")).format(completion));
|
||||||
|
else
|
||||||
|
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "head_rx.png\" > ")
|
||||||
|
.append(_("Complete"));
|
||||||
|
// else unknown
|
||||||
|
long needed = snark.getNeededLength();
|
||||||
|
if (needed > 0)
|
||||||
|
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "head_rx.png\" > <b>")
|
||||||
|
.append(_("Remaining"))
|
||||||
|
.append(":</b> ")
|
||||||
|
.append(formatSize(needed));
|
||||||
|
if (meta != null) {
|
||||||
|
List files = meta.getFiles();
|
||||||
|
int fileCount = files != null ? files.size() : 1;
|
||||||
|
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > <b>")
|
||||||
|
.append(_("Files"))
|
||||||
|
.append(":</b> ")
|
||||||
|
.append(fileCount);
|
||||||
|
}
|
||||||
|
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > <b>")
|
||||||
|
.append(_("Pieces"))
|
||||||
|
.append(":</b> ")
|
||||||
|
.append(pieces);
|
||||||
|
buf.append(" <img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > <b>")
|
||||||
|
.append(_("Piece size"))
|
||||||
|
.append(":</b> ")
|
||||||
|
.append(formatSize(snark.getPieceLength(0)))
|
||||||
|
.append("</td></tr>\n");
|
||||||
} else {
|
} 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\" > ")
|
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\" > ")
|
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > ")
|
||||||
.append(_("Size"));
|
.append(_("Directory"))
|
||||||
buf.append("</th><th class=\"headerstatus\">")
|
.append(": ")
|
||||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "status.png\" > ")
|
.append(directory)
|
||||||
.append(_("Status")).append("</th>");
|
.append("</th>\n");
|
||||||
|
buf.append("<th align=\"right\">")
|
||||||
|
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "size.png\" > ")
|
||||||
|
.append(_("Size"))
|
||||||
|
.append("</th>\n");
|
||||||
|
buf.append("<th class=\"headerstatus\">")
|
||||||
|
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "status.png\" > ")
|
||||||
|
.append(_("Status"))
|
||||||
|
.append("</th>\n");
|
||||||
if (showPriority)
|
if (showPriority)
|
||||||
buf.append("<th class=\"headerpriority\">")
|
buf.append("<th class=\"headerpriority\">")
|
||||||
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "priority.png\" > ")
|
.append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "priority.png\" > ")
|
||||||
.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\"> </th><th class=\"headerpriority\"><input type=\"submit\" value=\"");
|
buf.append("<thead><tr><th colspan=\"4\"> </th><th class=\"headerpriority\"><input type=\"submit\" value=\"");
|
||||||
buf.append(_("Save priorities"));
|
buf.append(_("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();
|
||||||
}
|
}
|
||||||
|
@ -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" />
|
||||||
<% }
|
<% }
|
||||||
|
@ -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" />
|
||||||
<% }
|
<% }
|
||||||
|
@ -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" />
|
||||||
<% }
|
<% }
|
||||||
%>
|
%>
|
||||||
|
@ -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" />
|
||||||
<% }
|
<% }
|
||||||
%>
|
%>
|
||||||
|
@ -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 */
|
||||||
|
@ -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") };
|
||||||
|
@ -0,0 +1,168 @@
|
|||||||
|
package net.i2p.router.web;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
import net.i2p.data.DataHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple summary bar configuration.
|
||||||
|
*
|
||||||
|
* @since 0.9.1
|
||||||
|
*/
|
||||||
|
public class ConfigSummaryHandler extends FormHandler {
|
||||||
|
|
||||||
|
private Map _settings;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void processForm() {
|
||||||
|
if (_action == null) return;
|
||||||
|
String group = getJettyString("group");
|
||||||
|
boolean deleting = _action.equals(_("Delete selected"));
|
||||||
|
boolean adding = _action.equals(_("Add item"));
|
||||||
|
boolean saving = _action.equals(_("Save order"));
|
||||||
|
boolean moving = _action.startsWith("move_");
|
||||||
|
if (_action.equals(_("Save")) && "0".equals(group)) {
|
||||||
|
try {
|
||||||
|
int refreshInterval = Integer.parseInt(getJettyString("refreshInterval"));
|
||||||
|
if (refreshInterval >= CSSHelper.MIN_REFRESH) {
|
||||||
|
_context.router().saveConfig(CSSHelper.PROP_REFRESH, "" + refreshInterval);
|
||||||
|
addFormNotice(_("Refresh interval changed"));
|
||||||
|
} else
|
||||||
|
addFormError(_("Refresh interval must be at least {0} seconds", CSSHelper.MIN_REFRESH));
|
||||||
|
} catch (java.lang.NumberFormatException e) {
|
||||||
|
addFormError(_("Refresh interval must be a number"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (_action.equals(_("Restore full default"))) {
|
||||||
|
_context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR + "default", SummaryHelper.DEFAULT_FULL);
|
||||||
|
addFormNotice(_("Full summary bar default restored.") + " " +
|
||||||
|
_("Summary bar will refresh shortly."));
|
||||||
|
} else if (_action.equals(_("Restore minimal default"))) {
|
||||||
|
_context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR + "default", SummaryHelper.DEFAULT_MINIMAL);
|
||||||
|
addFormNotice(_("Minimal summary bar default restored.") + " " +
|
||||||
|
_("Summary bar will refresh shortly."));
|
||||||
|
} else if (adding || deleting || saving || moving) {
|
||||||
|
Map<Integer, String> sections = new TreeMap<Integer, String>();
|
||||||
|
for (Object o : _settings.keySet()) {
|
||||||
|
if (!(o instanceof String))
|
||||||
|
continue;
|
||||||
|
String k = (String) o;
|
||||||
|
if (!k.startsWith("order_"))
|
||||||
|
continue;
|
||||||
|
String v = getJettyString(k);
|
||||||
|
k = k.substring(6);
|
||||||
|
k = k.substring(k.indexOf('_') + 1);
|
||||||
|
try {
|
||||||
|
int order = Integer.parseInt(v);
|
||||||
|
sections.put(order, k);
|
||||||
|
} catch (java.lang.NumberFormatException e) {
|
||||||
|
addFormError(_("Order must be an integer"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (adding) {
|
||||||
|
String name = getJettyString("name");
|
||||||
|
if (name == null || name.length() <= 0) {
|
||||||
|
addFormError(_("No section selected"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String order = getJettyString("order");
|
||||||
|
if (order == null || order.length() <= 0) {
|
||||||
|
addFormError(_("No order entered"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
name = DataHelper.escapeHTML(name).replace(",", ",");
|
||||||
|
order = DataHelper.escapeHTML(order).replace(",", ",");
|
||||||
|
try {
|
||||||
|
int ki = Integer.parseInt(order);
|
||||||
|
sections.put(ki, name);
|
||||||
|
addFormNotice(_("Added") + ": " + name);
|
||||||
|
} catch (java.lang.NumberFormatException e) {
|
||||||
|
addFormError(_("Order must be an integer"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (deleting) {
|
||||||
|
Set<Integer> toDelete = new HashSet();
|
||||||
|
for (Object o : _settings.keySet()) {
|
||||||
|
if (!(o instanceof String))
|
||||||
|
continue;
|
||||||
|
String k = (String) o;
|
||||||
|
if (!k.startsWith("delete_"))
|
||||||
|
continue;
|
||||||
|
k = k.substring(7);
|
||||||
|
try {
|
||||||
|
int ki = Integer.parseInt(k);
|
||||||
|
toDelete.add(ki);
|
||||||
|
} catch (java.lang.NumberFormatException e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Iterator<Integer> iter = sections.keySet().iterator(); iter.hasNext(); ) {
|
||||||
|
int i = iter.next();
|
||||||
|
if (toDelete.contains(i)) {
|
||||||
|
String removedName = sections.get(i);
|
||||||
|
iter.remove();
|
||||||
|
addFormNotice(_("Removed") + ": " + removedName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (moving) {
|
||||||
|
String parts[] = _action.split("_");
|
||||||
|
try {
|
||||||
|
int from = Integer.parseInt(parts[1]);
|
||||||
|
int to = 0;
|
||||||
|
if ("up".equals(parts[2]))
|
||||||
|
to = from - 1;
|
||||||
|
if ("down".equals(parts[2]))
|
||||||
|
to = from + 1;
|
||||||
|
if ("bottom".equals(parts[2]))
|
||||||
|
to = sections.size() - 1;
|
||||||
|
int n = -1;
|
||||||
|
if ("down".equals(parts[2]) || "bottom".equals(parts[2]))
|
||||||
|
n = 1;
|
||||||
|
for (int i = from; n * i < n * to; i += n) {
|
||||||
|
String temp = sections.get(i + n);
|
||||||
|
sections.put(i + n, sections.get(i));
|
||||||
|
sections.put(i, temp);
|
||||||
|
}
|
||||||
|
addFormNotice(_("Moved") + ": " + sections.get(to));
|
||||||
|
} catch (java.lang.NumberFormatException e) {
|
||||||
|
addFormError(_("Order must be an integer"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SummaryHelper.saveSummaryBarSections(_context, "default", sections);
|
||||||
|
addFormNotice(_("Saved order of sections.") + " " +
|
||||||
|
_("Summary bar will refresh shortly."));
|
||||||
|
} else {
|
||||||
|
addFormError(_("Unsupported"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSettings(Map settings) { _settings = new HashMap(settings); }
|
||||||
|
|
||||||
|
/** curses Jetty for returning arrays */
|
||||||
|
private String getJettyString(String key) {
|
||||||
|
String[] arr = (String[]) _settings.get(key);
|
||||||
|
if (arr == null)
|
||||||
|
return null;
|
||||||
|
return arr[0].trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMovingAction() {
|
||||||
|
for (Object o : _settings.keySet()) {
|
||||||
|
if (!(o instanceof String))
|
||||||
|
continue;
|
||||||
|
String k = (String) o;
|
||||||
|
if (k.startsWith("move_") && k.endsWith(".x") && _settings.get(k) != null) {
|
||||||
|
_action = k.substring(0, k.length() - 2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -191,7 +191,8 @@ public class GraphHelper extends FormHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FIXME jrobin doesn't support setting the timezone, will have to mod TimeAxis.java
|
// 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();
|
||||||
}
|
}
|
||||||
|
@ -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 +
|
||||||
"";
|
"";
|
||||||
|
|
||||||
|
@ -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 & FAQ"))
|
.append(_("I2P Router Help & FAQ"))
|
||||||
.append("\">")
|
.append("\">")
|
||||||
.append(_("Help & FAQ"))
|
.append(_("Help & 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&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 */
|
||||||
|
@ -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 = " / ";
|
//static final String 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 & control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr class=\"b\"><div class=\"tunnels\">");
|
buf.append("<h3><a href=\"/i2ptunnelmgr\" target=\"_top\" title=\"").append(_("Add/remove/edit & control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr class=\"b\"><div class=\"tunnels\">");
|
||||||
if (!clients.isEmpty()) {
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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" %>
|
||||||
|
|
||||||
|
@ -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" %>
|
||||||
|
|
||||||
|
@ -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" %>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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\")%>" />
|
||||||
|
|
||||||
|
@ -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" %>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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" %>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
62
apps/routerconsole/jsp/configsidebar.jsp
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<%@page contentType="text/html"%>
|
||||||
|
<%@page pageEncoding="UTF-8"%>
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<html><head>
|
||||||
|
<%@include file="css.jsi" %>
|
||||||
|
<%=intl.title("config summary bar")%>
|
||||||
|
<style type='text/css'>
|
||||||
|
input.default {
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||||
|
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||||
|
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||||
|
</script>
|
||||||
|
</head><body onload="initAjax()">
|
||||||
|
|
||||||
|
<%@include file="summary.jsi" %>
|
||||||
|
<h1><%=intl._("I2P Summary Bar Configuration")%></h1>
|
||||||
|
<div class="main" id="main">
|
||||||
|
<%@include file="confignav.jsi" %>
|
||||||
|
|
||||||
|
<jsp:useBean class="net.i2p.router.web.ConfigSummaryHandler" id="formhandler" scope="request" />
|
||||||
|
<% formhandler.storeMethod(request.getMethod()); %>
|
||||||
|
<jsp:setProperty name="formhandler" property="*" />
|
||||||
|
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||||
|
<jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" />
|
||||||
|
<%
|
||||||
|
formhandler.setMovingAction();
|
||||||
|
%>
|
||||||
|
<jsp:getProperty name="formhandler" property="allMessages" />
|
||||||
|
<%
|
||||||
|
String pageNonce = formhandler.getNewNonce();
|
||||||
|
%>
|
||||||
|
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="summaryhelper" scope="request" />
|
||||||
|
<jsp:setProperty name="summaryhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||||
|
|
||||||
|
<h3><%=intl._("Refresh Interval")%></h3>
|
||||||
|
<form action="" method="POST">
|
||||||
|
<input type="hidden" name="nonce" value="<%=pageNonce%>" >
|
||||||
|
<input type="hidden" name="group" value="0">
|
||||||
|
<input type="text" name="refreshInterval" value="<jsp:getProperty name="intl" property="refresh" />" >
|
||||||
|
<%=intl._("seconds")%>
|
||||||
|
<input type="submit" name="action" class="accept" value="<%=intl._("Save")%>" >
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<h3><%=intl._("Customise Summary Bar")%></h3>
|
||||||
|
<form action="" method="POST">
|
||||||
|
<input type="hidden" name="nonce" value="<%=pageNonce%>" >
|
||||||
|
<input type="hidden" name="group" value="2">
|
||||||
|
<jsp:getProperty name="summaryhelper" property="configTable" />
|
||||||
|
<div class="formaction">
|
||||||
|
<input type="submit" class="reload" name="action" value="<%=intl._("Restore full default")%>" >
|
||||||
|
<input type="submit" class="reload" name="action" value="<%=intl._("Restore minimal default")%>" >
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div></body></html>
|
@ -6,10 +6,17 @@
|
|||||||
<html><head>
|
<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)
|
||||||
{
|
{
|
||||||
|
@ -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" %>
|
||||||
|
|
||||||
|
@ -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" %>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
<%
|
<%
|
||||||
|
@ -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())
|
||||||
|
@ -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">
|
||||||
|
78
apps/routerconsole/jsp/dns.jsp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<%@page contentType="text/html"%>
|
||||||
|
<%@page trimDirectiveWhitespaces="true"%>
|
||||||
|
<%@page pageEncoding="UTF-8"%>
|
||||||
|
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
|
||||||
|
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||||
|
<%
|
||||||
|
// CSSHelper is also pulled in by css.jsi below...
|
||||||
|
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
|
||||||
|
if (!testIFrame) {
|
||||||
|
response.setStatus(302, "Moved");
|
||||||
|
response.setHeader("Location", "/susidns/index");
|
||||||
|
} else {
|
||||||
|
%>
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<html><head>
|
||||||
|
<%@include file="css.jsi" %>
|
||||||
|
<%=intl.title("addressbook")%>
|
||||||
|
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||||
|
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||||
|
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||||
|
function injectClass(f) {
|
||||||
|
f.className += ' iframed';
|
||||||
|
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||||
|
doc.body.className += ' iframed';
|
||||||
|
}
|
||||||
|
function resizeFrame(f) {
|
||||||
|
// offsetHeight returns the height of the visible area for an object, in pixels.
|
||||||
|
// The value contains the height with the padding, scrollBar, and the border,
|
||||||
|
// but does not include the margin. Therefore, any content within the iframe
|
||||||
|
// should have no margins at the very top or very bottom to avoid a scrollbar.
|
||||||
|
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||||
|
var totalHeight = doc.body.offsetHeight;
|
||||||
|
|
||||||
|
// Detect if horizontal scrollbar is present, and add its width to height if so.
|
||||||
|
// This prevents a vertical scrollbar appearing when the min-width is passed.
|
||||||
|
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
|
||||||
|
if (true) {
|
||||||
|
// Create the measurement node
|
||||||
|
var scrollDiv = document.createElement("div");
|
||||||
|
scrollDiv.className = "scrollbar-measure";
|
||||||
|
scrollDiv.style.width = "100px";
|
||||||
|
scrollDiv.style.height = "100px";
|
||||||
|
scrollDiv.style.overflow = "scroll";
|
||||||
|
scrollDiv.style.position = "absolute";
|
||||||
|
scrollDiv.style.top = "-9999px";
|
||||||
|
document.body.appendChild(scrollDiv);
|
||||||
|
|
||||||
|
// Get the scrollbar width
|
||||||
|
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||||
|
totalHeight += scrollbarWidth;
|
||||||
|
|
||||||
|
// Delete the div
|
||||||
|
document.body.removeChild(scrollDiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
f.style.height = totalHeight + "px";
|
||||||
|
}
|
||||||
|
function setupFrame() {
|
||||||
|
f = document.getElementById("susidnsframe");
|
||||||
|
injectClass(f);
|
||||||
|
resizeFrame(f);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head><body onload="initAjax()">
|
||||||
|
|
||||||
|
<%@include file="summary.jsi" %>
|
||||||
|
|
||||||
|
<h1><%=intl._("I2P Addressbook")%> <span class="newtab"><a href="/susidns/index" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
|
||||||
|
<div class="main" id="main">
|
||||||
|
<iframe src="/susidns/index" width="100%" height="100%" frameborder="0" border="0" name="susidnsframe" id="susidnsframe" onload="setupFrame()" allowtransparency="true">
|
||||||
|
</iframe>
|
||||||
|
</div></body></html>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
@ -16,10 +16,16 @@
|
|||||||
<html><head>
|
<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%> <%=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%> <%=intl._("not found")%>.
|
||||||
</div></body></html>
|
</div></body></html>
|
||||||
|
@ -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">
|
||||||
|
@ -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">
|
||||||
|
@ -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 & Support</h1>
|
<h1>I2P Router Help & Support</h1>
|
||||||
<div class="main" id="main"><p>
|
<div class="main" id="main"><p>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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 & Support</h1>
|
<h1>I2P Router Help & Support</h1>
|
||||||
<div class="main" id="main"><p>
|
<div class="main" id="main"><p>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
96
apps/routerconsole/jsp/i2ptunnelmgr.jsp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
<%@page contentType="text/html"%>
|
||||||
|
<%@page trimDirectiveWhitespaces="true"%>
|
||||||
|
<%@page pageEncoding="UTF-8"%>
|
||||||
|
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
|
||||||
|
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||||
|
<%
|
||||||
|
// CSSHelper is also pulled in by css.jsi below...
|
||||||
|
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
|
||||||
|
if (!testIFrame) {
|
||||||
|
response.setStatus(302, "Moved");
|
||||||
|
response.setHeader("Location", "/i2ptunnel/");
|
||||||
|
} else {
|
||||||
|
%>
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<html><head>
|
||||||
|
<%@include file="css.jsi" %>
|
||||||
|
<%=intl.title("i2p tunnel manager")%>
|
||||||
|
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||||
|
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||||
|
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||||
|
function injectClass(f) {
|
||||||
|
f.className += ' iframed';
|
||||||
|
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||||
|
if (doc.getElementsByClassName == undefined) {
|
||||||
|
doc.getElementsByClassName = function(className)
|
||||||
|
{
|
||||||
|
var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
|
||||||
|
var allElements = document.getElementsByTagName("*");
|
||||||
|
var results = [];
|
||||||
|
|
||||||
|
var element;
|
||||||
|
for (var i = 0; (element = allElements[i]) != null; i++) {
|
||||||
|
var elementClass = element.className;
|
||||||
|
if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
|
||||||
|
results.push(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
doc.body.className += ' iframed';
|
||||||
|
doc.getElementsByClassName('panel')[0].className += ' iframed';
|
||||||
|
}
|
||||||
|
function resizeFrame(f) {
|
||||||
|
// offsetHeight returns the height of the visible area for an object, in pixels.
|
||||||
|
// The value contains the height with the padding, scrollBar, and the border,
|
||||||
|
// but does not include the margin. Therefore, any content within the iframe
|
||||||
|
// should have no margins at the very top or very bottom to avoid a scrollbar.
|
||||||
|
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||||
|
var totalHeight = doc.body.offsetHeight;
|
||||||
|
|
||||||
|
// Detect if horizontal scrollbar is present, and add its width to height if so.
|
||||||
|
// This prevents a vertical scrollbar appearing when the min-width is passed.
|
||||||
|
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
|
||||||
|
if (true) {
|
||||||
|
// Create the measurement node
|
||||||
|
var scrollDiv = document.createElement("div");
|
||||||
|
scrollDiv.className = "scrollbar-measure";
|
||||||
|
scrollDiv.style.width = "100px";
|
||||||
|
scrollDiv.style.height = "100px";
|
||||||
|
scrollDiv.style.overflow = "scroll";
|
||||||
|
scrollDiv.style.position = "absolute";
|
||||||
|
scrollDiv.style.top = "-9999px";
|
||||||
|
document.body.appendChild(scrollDiv);
|
||||||
|
|
||||||
|
// Get the scrollbar width
|
||||||
|
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||||
|
totalHeight += scrollbarWidth;
|
||||||
|
|
||||||
|
// Delete the div
|
||||||
|
document.body.removeChild(scrollDiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
f.style.height = totalHeight + "px";
|
||||||
|
}
|
||||||
|
function setupFrame() {
|
||||||
|
f = document.getElementById("i2ptunnelframe");
|
||||||
|
injectClass(f);
|
||||||
|
resizeFrame(f);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head><body onload="initAjax()">
|
||||||
|
|
||||||
|
<%@include file="summary.jsi" %>
|
||||||
|
|
||||||
|
<h1><%=intl._("I2P Tunnel Manager")%> <span class="newtab"><a href="/i2ptunnel/" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
|
||||||
|
<div class="main" id="main">
|
||||||
|
<iframe src="/i2ptunnel/" width="100%" height="100%" frameborder="0" border="0" name="i2ptunnelframe" id="i2ptunnelframe" onload="setupFrame()" allowtransparency="true">
|
||||||
|
</iframe>
|
||||||
|
</div></body></html>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
@ -5,7 +5,13 @@
|
|||||||
<html><head>
|
<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" />
|
||||||
|
@ -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" />
|
||||||
|
@ -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>
|
||||||
|
@ -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">
|
||||||
|
@ -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">
|
||||||
|
@ -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\")%>" />
|
||||||
|
@ -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">
|
||||||
|
@ -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" />
|
||||||
|
@ -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\")%>" />
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
@ -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");
|
||||||
|
@ -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();
|
|
||||||
%>
|
|
||||||
|
78
apps/routerconsole/jsp/torrents.jsp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<%@page contentType="text/html"%>
|
||||||
|
<%@page trimDirectiveWhitespaces="true"%>
|
||||||
|
<%@page pageEncoding="UTF-8"%>
|
||||||
|
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
|
||||||
|
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||||
|
<%
|
||||||
|
// CSSHelper is also pulled in by css.jsi below...
|
||||||
|
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
|
||||||
|
if (!testIFrame) {
|
||||||
|
response.setStatus(302, "Moved");
|
||||||
|
response.setHeader("Location", "/i2psnark/");
|
||||||
|
} else {
|
||||||
|
%>
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<html><head>
|
||||||
|
<%@include file="css.jsi" %>
|
||||||
|
<%=intl.title("torrents")%>
|
||||||
|
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||||
|
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||||
|
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||||
|
function injectClass(f) {
|
||||||
|
f.className += ' iframed';
|
||||||
|
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||||
|
doc.body.className += ' iframed';
|
||||||
|
}
|
||||||
|
function resizeFrame(f) {
|
||||||
|
// offsetHeight returns the height of the visible area for an object, in pixels.
|
||||||
|
// The value contains the height with the padding, scrollBar, and the border,
|
||||||
|
// but does not include the margin. Therefore, any content within the iframe
|
||||||
|
// should have no margins at the very top or very bottom to avoid a scrollbar.
|
||||||
|
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||||
|
var totalHeight = doc.body.offsetHeight;
|
||||||
|
|
||||||
|
// Detect if horizontal scrollbar is present, and add its width to height if so.
|
||||||
|
// This prevents a vertical scrollbar appearing when the min-width is passed.
|
||||||
|
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
|
||||||
|
if (true) {
|
||||||
|
// Create the measurement node
|
||||||
|
var scrollDiv = document.createElement("div");
|
||||||
|
scrollDiv.className = "scrollbar-measure";
|
||||||
|
scrollDiv.style.width = "100px";
|
||||||
|
scrollDiv.style.height = "100px";
|
||||||
|
scrollDiv.style.overflow = "scroll";
|
||||||
|
scrollDiv.style.position = "absolute";
|
||||||
|
scrollDiv.style.top = "-9999px";
|
||||||
|
document.body.appendChild(scrollDiv);
|
||||||
|
|
||||||
|
// Get the scrollbar width
|
||||||
|
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||||
|
totalHeight += scrollbarWidth;
|
||||||
|
|
||||||
|
// Delete the div
|
||||||
|
document.body.removeChild(scrollDiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
f.style.height = totalHeight + "px";
|
||||||
|
}
|
||||||
|
function setupFrame() {
|
||||||
|
f = document.getElementById("i2psnarkframe");
|
||||||
|
injectClass(f);
|
||||||
|
resizeFrame(f);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head><body onload="initAjax()">
|
||||||
|
|
||||||
|
<%@include file="summary.jsi" %>
|
||||||
|
|
||||||
|
<h1><%=intl._("I2P Torrent Downloader")%> <span class="newtab"><a href="/i2psnark/" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
|
||||||
|
<div class="main" id="main">
|
||||||
|
<iframe src="/i2psnark/" width="100%" height="100%" frameborder="0" border="0" name="i2psnarkframe" id="i2psnarkframe" onload="setupFrame()" allowtransparency="true">
|
||||||
|
</iframe>
|
||||||
|
</div></body></html>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
@ -6,7 +6,13 @@
|
|||||||
<html><head>
|
<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" />
|
||||||
|
@ -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">
|
||||||
|
78
apps/routerconsole/jsp/webmail.jsp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<%@page contentType="text/html"%>
|
||||||
|
<%@page trimDirectiveWhitespaces="true"%>
|
||||||
|
<%@page pageEncoding="UTF-8"%>
|
||||||
|
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
|
||||||
|
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||||
|
<%
|
||||||
|
// CSSHelper is also pulled in by css.jsi below...
|
||||||
|
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
|
||||||
|
if (!testIFrame) {
|
||||||
|
response.setStatus(302, "Moved");
|
||||||
|
response.setHeader("Location", "/susimail/susimail");
|
||||||
|
} else {
|
||||||
|
%>
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<html><head>
|
||||||
|
<%@include file="css.jsi" %>
|
||||||
|
<%=intl.title("webmail")%>
|
||||||
|
<script src="/js/ajax.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
|
||||||
|
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
|
||||||
|
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
|
||||||
|
function injectClass(f) {
|
||||||
|
f.className += ' iframed';
|
||||||
|
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||||
|
doc.body.className += ' iframed';
|
||||||
|
}
|
||||||
|
function resizeFrame(f) {
|
||||||
|
// offsetHeight returns the height of the visible area for an object, in pixels.
|
||||||
|
// The value contains the height with the padding, scrollBar, and the border,
|
||||||
|
// but does not include the margin. Therefore, any content within the iframe
|
||||||
|
// should have no margins at the very top or very bottom to avoid a scrollbar.
|
||||||
|
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
|
||||||
|
var totalHeight = doc.body.offsetHeight;
|
||||||
|
|
||||||
|
// Detect if horizontal scrollbar is present, and add its width to height if so.
|
||||||
|
// This prevents a vertical scrollbar appearing when the min-width is passed.
|
||||||
|
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
|
||||||
|
if (true) {
|
||||||
|
// Create the measurement node
|
||||||
|
var scrollDiv = document.createElement("div");
|
||||||
|
scrollDiv.className = "scrollbar-measure";
|
||||||
|
scrollDiv.style.width = "100px";
|
||||||
|
scrollDiv.style.height = "100px";
|
||||||
|
scrollDiv.style.overflow = "scroll";
|
||||||
|
scrollDiv.style.position = "absolute";
|
||||||
|
scrollDiv.style.top = "-9999px";
|
||||||
|
document.body.appendChild(scrollDiv);
|
||||||
|
|
||||||
|
// Get the scrollbar width
|
||||||
|
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||||
|
totalHeight += scrollbarWidth;
|
||||||
|
|
||||||
|
// Delete the div
|
||||||
|
document.body.removeChild(scrollDiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
f.style.height = totalHeight + "px";
|
||||||
|
}
|
||||||
|
function setupFrame() {
|
||||||
|
f = document.getElementById("susimailframe");
|
||||||
|
injectClass(f);
|
||||||
|
resizeFrame(f);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head><body onload="initAjax()">
|
||||||
|
|
||||||
|
<%@include file="summary.jsi" %>
|
||||||
|
|
||||||
|
<h1><%=intl._("I2P Webmail")%> <span class="newtab"><a href="/susimail/susimail" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
|
||||||
|
<div class="main" id="main">
|
||||||
|
<iframe src="/susimail/susimail" width="100%" height="100%" frameborder="0" border="0" name="susimailframe" id="susimailframe" onload="setupFrame()" allowtransparency="true">
|
||||||
|
</iframe>
|
||||||
|
</div></body></html>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
@ -1,24 +1,41 @@
|
|||||||
|
<%@page import="net.i2p.router.web.SummaryHelper" %>
|
||||||
|
<%
|
||||||
|
/*
|
||||||
|
* Note:
|
||||||
|
* This is included on every refresh, so keep whitespace etc. to a minimum.
|
||||||
|
*/
|
||||||
|
%>
|
||||||
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" />
|
<jsp: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();
|
||||||
|
%>
|
||||||
|
@ -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" %>
|
||||||
|
@ -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();
|
||||||
|
64
apps/susidns/src/java/src/i2p/susi/dns/BaseBean.java
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
package i2p.susi.dns;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds methods common to several Beans.
|
||||||
|
* @since 0.9.1
|
||||||
|
*/
|
||||||
|
public class BaseBean
|
||||||
|
{
|
||||||
|
protected final Properties properties;
|
||||||
|
|
||||||
|
private long configLastLoaded = 0;
|
||||||
|
private static final String PRIVATE_BOOK = "private_addressbook";
|
||||||
|
private static final String DEFAULT_PRIVATE_BOOK = "../privatehosts.txt";
|
||||||
|
|
||||||
|
public static final String PROP_THEME_NAME = "theme";
|
||||||
|
public static final String DEFAULT_THEME = "light";
|
||||||
|
public static final String BASE_THEME_PATH = "/themes/susidns/";
|
||||||
|
|
||||||
|
public BaseBean()
|
||||||
|
{
|
||||||
|
properties = new Properties();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void loadConfig()
|
||||||
|
{
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
if( !properties.isEmpty() && currentTime - configLastLoaded < 10000 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
FileInputStream fis = null;
|
||||||
|
try {
|
||||||
|
properties.clear();
|
||||||
|
fis = new FileInputStream( ConfigBean.configFileName );
|
||||||
|
properties.load( fis );
|
||||||
|
// added in 0.5, for compatibility with 0.4 config.txt
|
||||||
|
if( properties.getProperty(PRIVATE_BOOK) == null)
|
||||||
|
properties.setProperty(PRIVATE_BOOK, DEFAULT_PRIVATE_BOOK);
|
||||||
|
configLastLoaded = currentTime;
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
|
||||||
|
} finally {
|
||||||
|
if (fis != null)
|
||||||
|
try { fis.close(); } catch (IOException ioe) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the theme path
|
||||||
|
* @since 0.9.1
|
||||||
|
*/
|
||||||
|
public String getTheme() {
|
||||||
|
loadConfig();
|
||||||
|
String url = BASE_THEME_PATH;
|
||||||
|
String theme = properties.getProperty(PROP_THEME_NAME, DEFAULT_THEME);
|
||||||
|
url += theme + "/";
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
@ -36,38 +36,10 @@ import java.util.Properties;
|
|||||||
import net.i2p.I2PAppContext;
|
import net.i2p.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;
|
||||||
}
|
}
|
||||||
|
@ -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">
|
||||||
|
@ -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">
|
||||||
|
@ -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">
|
||||||
|
@ -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">
|
||||||
|
@ -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>
|
||||||
|
@ -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 = " ";
|
private static final String spacer = " ";
|
||||||
private static final String thSpacer = "<th> </th>\n";
|
private static final String thSpacer = "<th> </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 + " <a href=\"" + myself + "?" + name + "=up\"><img src=\"3up.png\" border=\"0\" alt=\"^\"></a><a href=\"" + myself + "?" + name + "=down\"><img src=\"3down.png\" border=\"0\" alt=\"v\"></a>";
|
return "" + label + " <a href=\"" + myself + "?" + name + "=up\"><img src=\"" + imgPath + "3up.png\" border=\"0\" alt=\"^\"></a><a href=\"" + myself + "?" + name + "=down\"><img src=\"" + imgPath + "3down.png\" border=\"0\" alt=\"v\"></a>";
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* check, if a given button "was pressed" in the received http request
|
* 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> </p>\n" +
|
"<div class=\"page\"><p><img src=\"" + sessionObject.imgPath + "susimail.png\" alt=\"Susimail\"><br> </p>\n" +
|
||||||
"<form method=\"POST\" enctype=\"multipart/form-data\" action=\"" + myself + "\">" );
|
"<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(); ) {
|
||||||
|
34
history.txt
@ -1,3 +1,37 @@
|
|||||||
|
2012-07-16 str4d
|
||||||
|
* console: work towards better integration
|
||||||
|
- Wrapped the bundled apps in iFrames (with a link in the page header to
|
||||||
|
open the app in a new tab):
|
||||||
|
- i2ptunnel
|
||||||
|
- i2psnark
|
||||||
|
- susimail
|
||||||
|
- susidns
|
||||||
|
- Theme improvements
|
||||||
|
- Added theme support to susimail and susidns
|
||||||
|
- "susimail.theme=foo" in susimail.config
|
||||||
|
- "theme=foo" on susidns config page
|
||||||
|
- Extensive work on dark console theme (dr|z3d)
|
||||||
|
- Improved integration of i2ptunnel in iframe
|
||||||
|
- General improvements
|
||||||
|
- New dark themes for i2psnark, susimail and susidns which integrate well
|
||||||
|
with dark console theme (dr|z3d)
|
||||||
|
- Tweaks to other themes (console and i2psnark) to work with the various
|
||||||
|
structural changes (dr|z3d)
|
||||||
|
- Added per-theme favicons
|
||||||
|
- Updated IE shim to fix some issues
|
||||||
|
- Summary bar improvements
|
||||||
|
- Updated every console page to use Ajax for the summary bar
|
||||||
|
- Falls back to iFrame if JS disabled
|
||||||
|
- Ajax refresh time is adjustable
|
||||||
|
- The summary bar is now customizable; sections can be added, removed and
|
||||||
|
reordered as desired
|
||||||
|
- Added/updated tooltips
|
||||||
|
- Added a new summary bar section to show news headings when the main news
|
||||||
|
display is hidden
|
||||||
|
- Changes to structure of /home to bring it in line with rest of console
|
||||||
|
* i2psnark
|
||||||
|
- Reworked the torrent info/file manager page to improve the layout
|
||||||
|
|
||||||
2012-07-15 zzz
|
2012-07-15 zzz
|
||||||
* XORComparator: Reduce object churn (Ticket #658)
|
* XORComparator: Reduce object churn (Ticket #658)
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
<li class="tidylist"><b>Invisible Internet & Public Web Browsing</b><br>On I2P you can access anonymous websites (eepsites) and other services (e.g. ssh over I2P, IRC, Jabber etc.) in addition to being able to host your own services. You can also access the normal web anonymously via I2P's built-in web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configure your browser</a> to use the HTTP proxy at <code>127.0.0.1 port 4444</code>, then browse to an eepsite or a normal, unencrypted <code>http://</code> address. If you wish to disable or change outproxy access to the normal internet, remove or modify the outproxy entry for <code>false.i2p</code> under the <i>Outproxies</i> option in the <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In the "Sites of Interest" section <a href="#eepsites">below</a>, we list a few of the sites hosted on I2P.</li>
|
<li class="tidylist"><b>Invisible Internet & Public Web Browsing</b><br>On I2P you can access anonymous websites (eepsites) and other services (e.g. ssh over I2P, IRC, Jabber etc.) in addition to being able to host your own services. You can also access the normal web anonymously via I2P's built-in web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configure your browser</a> to use the HTTP proxy at <code>127.0.0.1 port 4444</code>, then browse to an eepsite or a normal, unencrypted <code>http://</code> address. If you wish to disable or change outproxy access to the normal internet, remove or modify the outproxy entry for <code>false.i2p</code> under the <i>Outproxies</i> option in the <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In the "Sites of Interest" section <a href="#eepsites">below</a>, we list a few of the sites hosted on I2P.</li>
|
||||||
|
|
||||||
<li class="tidylist"><b>Anonymous E-Mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/susimail/susimail">I2P's built-in mail client</a>
|
<li class="tidylist"><b>Anonymous E-Mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/webmail">I2P's built-in mail client</a>
|
||||||
(susimail) or using any mail client that supports smtp and pop3.
|
(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>
|
||||||
|
@ -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ür Postmans Email-Service.
|
für Postmans Email-Service.
|
||||||
<br>Oder probier unser neues serverloses und Ende-zu-Ende-verschlüsseltes Emailsystem <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a> (mit Webinterface) aus, welches als Plugin erhältlich ist!</li>
|
<br>Oder probier unser neues serverloses und Ende-zu-Ende-verschlüsseltes Emailsystem <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a> (mit Webinterface) aus, welches als Plugin erhältlich ist!</li>
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<li class="tidylist"><b>navegar en internet</b> - I2P cuenta con un HTTP-"Outproxy". Para poder usarlo, puedes también utilizar el proxy HTTP en el puerto 4444 - Si configuras tu navegador web para usar este proxy, puedes visitar las páginas web de forma anónima. El tráfico será enrutado através de la red I2P.</li>
|
<li class="tidylist"><b>navegar en internet</b> - I2P cuenta con un HTTP-"Outproxy". Para poder usarlo, puedes también utilizar el proxy HTTP en el puerto 4444 - Si configuras tu navegador web para usar este proxy, puedes visitar las páginas web de forma anónima. El tráfico será enrutado através de la red I2P.</li>
|
||||||
<li class="tidylist"><b>intercambiar datos</b> - Hay una <a href="i2psnark/">adaptación</a> para I2P de la aplicación <a href="http://www.bittorrent.com/">BitTorrent</a>
|
<li class="tidylist"><b>intercambiar datos</b> - Hay una <a href="i2psnark/">adaptación</a> para I2P de la aplicación <a href="http://www.bittorrent.com/">BitTorrent</a>
|
||||||
<a href="http://www.klomp.org/snark/">Snark</a>.</li>
|
<a href="http://www.klomp.org/snark/">Snark</a>.</li>
|
||||||
<li class="tidylist"><b>correo electrónico anónimo</b> - Postman creó un sistema de correo electrónico que es compatible con las aplicaciones de correo comunes (POP3/SMTP), el cual permite enviar correos electrónicos tanto dentro de I2P como recibir y mandar correos de/a internet. Puedes registrar tu cuenta en <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. Junto a esto tenemos <a href="/susimail/susimail">susimail</a>, un cliente anónimo de correo que se abre en el navegador web. Ya está configurado para el servicio de Postman.<br>También te recomendamos nuestro nuevo sistema de correo electrónico sin servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe en forma de plugin. Viene con una interfaz web y cifra todos los mensajes de fin a fin.</li>
|
<li class="tidylist"><b>correo electrónico anónimo</b> - Postman creó un sistema de correo electrónico que es compatible con las aplicaciones de correo comunes (POP3/SMTP), el cual permite enviar correos electrónicos tanto dentro de I2P como recibir y mandar correos de/a internet. Puedes registrar tu cuenta en <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. Junto a esto tenemos <a href="/webmail">susimail</a>, un cliente anónimo de correo que se abre en el navegador web. Ya está configurado para el servicio de Postman.<br>También te recomendamos nuestro nuevo sistema de correo electrónico sin servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe en forma de plugin. Viene con una interfaz web y cifra todos los mensajes de fin a fin.</li>
|
||||||
<li class="tidylist"><b>chat anónimo</b> - Lanza tu cliente IRC preferido y conéctate con el servidor anónimo en
|
<li class="tidylist"><b>chat anónimo</b> - Lanza tu cliente IRC preferido y conéctate con el servidor anónimo en
|
||||||
<b>127.0.0.1 puerto 6668</b>. Esto te llevará a uno de dos servidores anónimos de IRC
|
<b>127.0.0.1 puerto 6668</b>. Esto te llevará a uno de dos servidores anónimos de IRC
|
||||||
- y ni tu ni los demás usuarios sabrán quien es el otro, ni siquiera el administrador del servidor.</li>
|
- y ni tu ni los demás usuarios sabrán quien es el otro, ni siquiera el administrador del servidor.</li>
|
||||||
|
@ -34,7 +34,7 @@ mandataire <code>127.0.0.1 sur le port 4444</code>, puis promenez-vous sur les s
|
|||||||
<a href="#eepsites">ci-dessous</a>, vous trouverez notre petite sélection de sites hébergés sur I2P.</li>
|
<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,
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
<li class="tidylist"><b>Invisible Internet & Public Web Browsing</b><br>Op I2P kan je toegang verkrijgen tot anonieme websites (eepsites) en andere diensten (zoals; SSH over I2P, IRC, Jabber etc.), daarnaast heb je ook de mogelijkheid om je eigen dienst aan te bieden. Je kan ook anoniem toegang krijgen tot het normale Internet via de ingebouwde web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configureer je browser</a> voor het gebruik van de HTTP proxy op <code>127.0.0.1 poort 4444</code>, waarna je naar zowel eepsites als normale, onversleutelde <code>http://</code> websites kan surfen. Als je een aanpassing wilt maken aan de outproxy of deze wilt uitschakelen kan je de 'client tunnel' voor <code>false.i2p</code> onder het <i>Outproxies</i> gedeelte in de <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In het "Interessante websites" gedeelte <a href="#eepsites">hier onder</a> staat een lijst met een paar van de bekende sites die op I2P gehost worden.</li>
|
<li class="tidylist"><b>Invisible Internet & Public Web Browsing</b><br>Op I2P kan je toegang verkrijgen tot anonieme websites (eepsites) en andere diensten (zoals; SSH over I2P, IRC, Jabber etc.), daarnaast heb je ook de mogelijkheid om je eigen dienst aan te bieden. Je kan ook anoniem toegang krijgen tot het normale Internet via de ingebouwde web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configureer je browser</a> voor het gebruik van de HTTP proxy op <code>127.0.0.1 poort 4444</code>, waarna je naar zowel eepsites als normale, onversleutelde <code>http://</code> websites kan surfen. Als je een aanpassing wilt maken aan de outproxy of deze wilt uitschakelen kan je de 'client tunnel' voor <code>false.i2p</code> onder het <i>Outproxies</i> gedeelte in de <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In het "Interessante websites" gedeelte <a href="#eepsites">hier onder</a> staat een lijst met een paar van de bekende sites die op I2P gehost worden.</li>
|
||||||
|
|
||||||
<li class="tidylist"><b>Anonieme E-Mail</b><br>Postman's I2P email systeem kan worden benaderd via <a href="/susimail/susimail">de ingebouwde email client</a>
|
<li class="tidylist"><b>Anonieme E-Mail</b><br>Postman's I2P email systeem kan worden benaderd via <a href="/webmail">de ingebouwde email client</a>
|
||||||
(susimail) of door het gebruik van elke andere normale email client die ondersteuning biedt voor SMTP en POP3.
|
(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>
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<li class="tidylist"><b>navegar na internet</b> - I2P dispõe de um "outproxy" http - para usâ-lo, também pode empregar o proxy http no porto 4444 - Se configurar o seu navegador web para usar este proxy, pode visitar as páginas web de maneira anônima e o trânsito será roteado atravez da rede I2P.</li>
|
<li class="tidylist"><b>navegar na internet</b> - I2P dispõe de um "outproxy" http - para usâ-lo, também pode empregar o proxy http no porto 4444 - Se configurar o seu navegador web para usar este proxy, pode visitar as páginas web de maneira anônima e o trânsito será roteado atravez da rede I2P.</li>
|
||||||
<li class="tidylist"><b>trocar dados</b> - Ha uma <a href="i2psnark/">adaptação</a> para I2P da aplicação <a href="http://www.bittorrent.com/">BitTorrent</a>
|
<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á configurado para o servício de Postman.<br>Também lhe recomendamos o nosso novo sistema de correio eletrônico sem servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe em forma de um plugin. Vem com uma interface web e criptografa todas as mensagens de final a final.</li>
|
<li class="tidylist"><b>correio eletrônico anônimo</b> - O Postman fez um sistema de correio eletrônico que é compatível com as aplicações de correio eletrônico comunes (POP3/SMTP), o qual permite de enviar correios eletrônicos tanto dentro de I2P como também receber e mandar correios desde a / para a internet. Pode registrar a sua conta aqui: <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. Junto com isso temos <a href="/webmail">susimail</a>, um cliente anônimo de correio que se abre com o navegador web. Já está configurado para o servício de Postman.<br>Também lhe recomendamos o nosso novo sistema de correio eletrônico sem servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe em forma de um plugin. Vem com uma interface web e criptografa todas as mensagens de final a final.</li>
|
||||||
<li class="tidylist"><b>bate-papo anônimo</b> - Lance o seu cliente IRC preferido e conécte-se com o servidor anônimamente en
|
<li class="tidylist"><b>bate-papo anônimo</b> - Lance o seu cliente IRC preferido e conécte-se com o servidor anônimamente en
|
||||||
<b>127.0.0.1 porto 6668</b>. Isto lhe levará a um dos dois servidores anônimos de IRC oficiales em I2P
|
<b>127.0.0.1 porto 6668</b>. Isto lhe levará a um dos dois servidores anônimos de IRC oficiales em I2P
|
||||||
- e nem você nem os outros usuários sabrão quem é o outro, nem mesmo o administrador do servidor!</li>
|
- e nem você nem os outros usuários sabrão quem é o outro, nem mesmo o administrador do servidor!</li>
|
||||||
|
@ -43,7 +43,7 @@ fungerar med vanliga email-klienter
|
|||||||
och från det vanliga Internet!
|
och frå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 är en webb-baserad anonymt inriktad pop3/smtp-klient, inställd
|
som är en webb-baserad anonymt inriktad pop3/smtp-klient, inställd
|
||||||
till att ansluta till postmans email-tjänst.</li>
|
till att ansluta till postmans email-tjä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
|
||||||
|
@ -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的其中一个本地 <a href="/i2psnark">端口</a> 用于内置的 <a href="http://www.klomp.org/snark/">Snark</a> <a href="http://www.bittorrent.com/">BitTorrent</a> 客户端。</li>
|
<li><b>文件交换</b> - I2P的其中一个本地 <a href="/i2psnark">端口</a> 用于内置的 <a href="http://www.klomp.org/snark/">Snark</a> <a href="http://www.bittorrent.com/">BitTorrent</a> 客户端。</li>
|
||||||
<li><b>匿名电邮</b> - 由POSTMAN维护的邮件系统支持普通邮件客户端(POP3 / SMTP),这个系统可以在 I2P 网络内部收发 Email 也可以收发来自外部 Internet 的邮件!建立I2P邮件帐户请到 <a href="http://hq.postman.i2p/">hq.postman.i2p</a> 申请。I2P中集成有Web界面的pop3/stmp邮件客户端 <a href="/susimail/susimail">SUSIMail</a>,并配置为使用POSTMAN 的邮件服务。</li>
|
<li><b>匿名电邮</b> - 由POSTMAN维护的邮件系统支持普通邮件客户端(POP3 / SMTP),这个系统可以在 I2P 网络内部收发 Email 也可以收发来自外部 Internet 的邮件!建立I2P邮件帐户请到 <a href="http://hq.postman.i2p/">hq.postman.i2p</a> 申请。I2P中集成有Web界面的pop3/stmp邮件客户端 <a href="/webmail">SUSIMail</a>,并配置为使用POSTMAN 的邮件服务。</li>
|
||||||
<li><b>匿名聊天</b> - 打开你的 IRC 聊天程序,连接至 <b>127.0.0.1:6668 </b>即可访问I2P的匿名聊天室,如果您的聊天客户端配置错误泄露IP(DDC,MSG)我们的匿名服务器会自动过滤掉这些数据不让对方发现你,如果您的IRC设置正确无论服务器还是其他聊天的人都不知道您在哪里。</li>
|
<li><b>匿名聊天</b> - 打开你的 IRC 聊天程序,连接至 <b>127.0.0.1:6668 </b>即可访问I2P的匿名聊天室,如果您的聊天客户端配置错误泄露IP(DDC,MSG)我们的匿名服务器会自动过滤掉这些数据不让对方发现你,如果您的IRC设置正确无论服务器还是其他聊天的人都不知道您在哪里。</li>
|
||||||
<li><b>匿名博客</b> - 参见 <a href="http://syndie.i2p2.de/">Syndie</a></li>
|
<li><b>匿名博客</b> - 参见 <a href="http://syndie.i2p2.de/">Syndie</a></li>
|
||||||
<li>以及其他服务。</li>
|
<li>以及其他服务。</li>
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
BIN
installer/resources/themes/console/classic/images/favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 326 B |
BIN
installer/resources/themes/console/classic/images/move_down.png
Normal file
After Width: | Height: | Size: 325 B |
BIN
installer/resources/themes/console/classic/images/move_top.png
Normal file
After Width: | Height: | Size: 325 B |
BIN
installer/resources/themes/console/classic/images/move_up.png
Normal file
After Width: | Height: | Size: 290 B |
After Width: | Height: | Size: 270 B |
BIN
installer/resources/themes/console/classic/images/newtab.png
Normal file
After Width: | Height: | Size: 337 B |
@ -1,6 +1,6 @@
|
|||||||
/* I2P Theme: Camo aka Dark */
|
/* 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;
|
||||||
|
}
|
||||||
|
91
installer/resources/themes/console/dark/console_ar.css
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/* I2P Theme: Camo aka Dark - Arabic override */
|
||||||
|
/* Description: Military Grade. */
|
||||||
|
/* Comment: Thanks to Florian Kuhlmann for the hatface images. [http://www.flickr.com/photos/floriankuhlmann/] */
|
||||||
|
/* Author: dr|z3d */
|
||||||
|
|
||||||
|
body {
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.main li {
|
||||||
|
margin: 5px 20px;
|
||||||
|
text-align: right;
|
||||||
|
line-height: 150%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.news {
|
||||||
|
margin: -1px 205px 0px 5px;
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.main {
|
||||||
|
margin: -1px 205px 5px 5px;
|
||||||
|
background: url("images/scarface.jpg") no-repeat scroll left bottom #000000 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0 205px 0 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,h2,h3,h4 {
|
||||||
|
direction: rtl;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.routersummary h3 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.routersummary td:last-child {
|
||||||
|
text-align: left;
|
||||||
|
margin-left: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tunnels {
|
||||||
|
padding: -3px 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tunnels table {
|
||||||
|
margin: 0 -7px 0 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.langbox {
|
||||||
|
float: left;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.formaction {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.routersummary form {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cells {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.joblog li, div.newsheadings li {
|
||||||
|
text-align: left;
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.newtab {
|
||||||
|
text-align: left;
|
||||||
|
font-size: 8pt;
|
||||||
|
float: left;
|
||||||
|
letter-spacing: 0;
|
||||||
|
}
|
@ -18,6 +18,11 @@ body {
|
|||||||
box-sizing: border-box;
|
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 {
|
||||||
|
@ -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
|
||||||
|
BIN
installer/resources/themes/console/dark/images/favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
installer/resources/themes/console/dark/images/move_bottom.png
Normal file
After Width: | Height: | Size: 497 B |
BIN
installer/resources/themes/console/dark/images/move_down.png
Normal file
After Width: | Height: | Size: 498 B |
BIN
installer/resources/themes/console/dark/images/move_top.png
Normal file
After Width: | Height: | Size: 519 B |
BIN
installer/resources/themes/console/dark/images/move_up.png
Normal file
After Width: | Height: | Size: 452 B |
After Width: | Height: | Size: 424 B |
BIN
installer/resources/themes/console/dark/images/newtab.png
Normal file
After Width: | Height: | Size: 489 B |
BIN
installer/resources/themes/console/dark/images/transparent.gif
Normal file
After Width: | Height: | Size: 43 B |
@ -182,6 +182,10 @@ div.routersummary h4 {
|
|||||||
box-shadow: 0px 0px 1px 1px #bdf;
|
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;
|
||||||
|