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

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

View File

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

View File

@ -19,9 +19,10 @@
<title><%=intl._("I2P Tunnel Manager - Edit Client Tunnel")%></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
<% if (editBean.allowCSS()) {
%><link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
%><link rel="icon" href="<%=editBean.getTheme()%>images/favicon.ico">
<link href="<%=editBean.getTheme()%>default.css" rel="stylesheet" type="text/css" />
<link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
<% }

View File

@ -19,9 +19,10 @@
<title><%=intl._("I2P Tunnel Manager - Edit Server Tunnel")%></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
<% if (editBean.allowCSS()) {
%><link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
%><link rel="icon" href="<%=editBean.getTheme()%>images/favicon.ico">
<link href="<%=editBean.getTheme()%>default.css" rel="stylesheet" type="text/css" />
<link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
<% }

View File

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

View File

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

View File

@ -19,6 +19,8 @@ public class CSSHelper extends HelperBase {
private static final String FORCE = "classic";
public static final String PROP_REFRESH = "routerconsole.summaryRefresh";
public static final String DEFAULT_REFRESH = "60";
public static final int MIN_REFRESH = 3;
public static final String PROP_DISABLE_REFRESH = "routerconsole.summaryDisableRefresh";
private static final String PROP_XFRAME = "routerconsole.disableXFrame";
public String getTheme(String userAgent) {
@ -70,12 +72,42 @@ public class CSSHelper extends HelperBase {
/** change refresh and save it */
public void setRefresh(String r) {
try {
if (Integer.parseInt(r) < MIN_REFRESH)
r = "" + MIN_REFRESH;
} catch (Exception e) {
}
_context.router().saveConfig(PROP_REFRESH, r);
}
/** @return refresh time in seconds, as a string */
public String getRefresh() {
return _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH);
String r = _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH);
try {
if (Integer.parseInt(r) < MIN_REFRESH)
r = "" + MIN_REFRESH;
} catch (Exception e) {
}
return r;
}
/**
* change disable refresh boolean and save it
* @since 0.9.1
*/
public void setDisableRefresh(String r) {
String disableRefresh = "false";
if ("0".equals(r))
disableRefresh = "true";
_context.router().saveConfig(PROP_DISABLE_REFRESH, disableRefresh);
}
/**
* @return true if refresh is disabled
* @since 0.9.1
*/
public boolean getDisableRefresh() {
return _context.getBooleanProperty(PROP_DISABLE_REFRESH);
}
/** translate the title and display consistently */

View File

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

View File

@ -0,0 +1,168 @@
package net.i2p.router.web;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import net.i2p.data.DataHelper;
/**
* Simple summary bar configuration.
*
* @since 0.9.1
*/
public class ConfigSummaryHandler extends FormHandler {
private Map _settings;
@Override
protected void processForm() {
if (_action == null) return;
String group = getJettyString("group");
boolean deleting = _action.equals(_("Delete selected"));
boolean adding = _action.equals(_("Add item"));
boolean saving = _action.equals(_("Save order"));
boolean moving = _action.startsWith("move_");
if (_action.equals(_("Save")) && "0".equals(group)) {
try {
int refreshInterval = Integer.parseInt(getJettyString("refreshInterval"));
if (refreshInterval >= CSSHelper.MIN_REFRESH) {
_context.router().saveConfig(CSSHelper.PROP_REFRESH, "" + refreshInterval);
addFormNotice(_("Refresh interval changed"));
} else
addFormError(_("Refresh interval must be at least {0} seconds", CSSHelper.MIN_REFRESH));
} catch (java.lang.NumberFormatException e) {
addFormError(_("Refresh interval must be a number"));
return;
}
} else if (_action.equals(_("Restore full default"))) {
_context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR + "default", SummaryHelper.DEFAULT_FULL);
addFormNotice(_("Full summary bar default restored.") + " " +
_("Summary bar will refresh shortly."));
} else if (_action.equals(_("Restore minimal default"))) {
_context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR + "default", SummaryHelper.DEFAULT_MINIMAL);
addFormNotice(_("Minimal summary bar default restored.") + " " +
_("Summary bar will refresh shortly."));
} else if (adding || deleting || saving || moving) {
Map<Integer, String> sections = new TreeMap<Integer, String>();
for (Object o : _settings.keySet()) {
if (!(o instanceof String))
continue;
String k = (String) o;
if (!k.startsWith("order_"))
continue;
String v = getJettyString(k);
k = k.substring(6);
k = k.substring(k.indexOf('_') + 1);
try {
int order = Integer.parseInt(v);
sections.put(order, k);
} catch (java.lang.NumberFormatException e) {
addFormError(_("Order must be an integer"));
return;
}
}
if (adding) {
String name = getJettyString("name");
if (name == null || name.length() <= 0) {
addFormError(_("No section selected"));
return;
}
String order = getJettyString("order");
if (order == null || order.length() <= 0) {
addFormError(_("No order entered"));
return;
}
name = DataHelper.escapeHTML(name).replace(",", "&#44;");
order = DataHelper.escapeHTML(order).replace(",", "&#44;");
try {
int ki = Integer.parseInt(order);
sections.put(ki, name);
addFormNotice(_("Added") + ": " + name);
} catch (java.lang.NumberFormatException e) {
addFormError(_("Order must be an integer"));
return;
}
} else if (deleting) {
Set<Integer> toDelete = new HashSet();
for (Object o : _settings.keySet()) {
if (!(o instanceof String))
continue;
String k = (String) o;
if (!k.startsWith("delete_"))
continue;
k = k.substring(7);
try {
int ki = Integer.parseInt(k);
toDelete.add(ki);
} catch (java.lang.NumberFormatException e) {
continue;
}
}
for (Iterator<Integer> iter = sections.keySet().iterator(); iter.hasNext(); ) {
int i = iter.next();
if (toDelete.contains(i)) {
String removedName = sections.get(i);
iter.remove();
addFormNotice(_("Removed") + ": " + removedName);
}
}
} else if (moving) {
String parts[] = _action.split("_");
try {
int from = Integer.parseInt(parts[1]);
int to = 0;
if ("up".equals(parts[2]))
to = from - 1;
if ("down".equals(parts[2]))
to = from + 1;
if ("bottom".equals(parts[2]))
to = sections.size() - 1;
int n = -1;
if ("down".equals(parts[2]) || "bottom".equals(parts[2]))
n = 1;
for (int i = from; n * i < n * to; i += n) {
String temp = sections.get(i + n);
sections.put(i + n, sections.get(i));
sections.put(i, temp);
}
addFormNotice(_("Moved") + ": " + sections.get(to));
} catch (java.lang.NumberFormatException e) {
addFormError(_("Order must be an integer"));
return;
}
}
SummaryHelper.saveSummaryBarSections(_context, "default", sections);
addFormNotice(_("Saved order of sections.") + " " +
_("Summary bar will refresh shortly."));
} else {
addFormError(_("Unsupported"));
}
}
public void setSettings(Map settings) { _settings = new HashMap(settings); }
/** curses Jetty for returning arrays */
private String getJettyString(String key) {
String[] arr = (String[]) _settings.get(key);
if (arr == null)
return null;
return arr[0].trim();
}
public void setMovingAction() {
for (Object o : _settings.keySet()) {
if (!(o instanceof String))
continue;
String k = (String) o;
if (k.startsWith("move_") && k.endsWith(".x") && _settings.get(k) != null) {
_action = k.substring(0, k.length() - 2);
break;
}
}
}
}

View File

@ -191,7 +191,8 @@ public class GraphHelper extends FormHandler {
}
// FIXME jrobin doesn't support setting the timezone, will have to mod TimeAxis.java
_out.write("<p><i>" + _("All times are UTC.") + "</i></p>\n");
// 0.9.1 - all graphs currently state UTC on them, so this text blurb is unnecessary,
//_out.write("<p><i>" + _("All times are UTC.") + "</i></p>\n");
} catch (IOException ioe) {
ioe.printStackTrace();
}

View File

@ -24,14 +24,14 @@ public class HomeHelper extends HelperBase {
private static final String PROP_SEARCH = "routerconsole.showSearch";
static final String DEFAULT_SERVICES =
_x("Addressbook") + S + _x("Manage your I2P hosts file here (I2P domain name resolution)") + S + "/susidns/index" + S + I + "book_addresses.png" + S +
_x("Addressbook") + S + _x("Manage your I2P hosts file here (I2P domain name resolution)") + S + "/dns" + S + I + "book_addresses.png" + S +
_x("Configure Bandwidth") + S + _x("I2P Bandwidth Configuration") + S + "/config" + S + I + "wrench_orange.png" + S +
_x("Configure Language") + S + _x("Console Language Selection") + S + "/configui" + S + I + "wrench_orange.png" + S +
_x("Customize Home Page") + S + _x("I2P Home Page Configuration") + S + "/confighome" + S + I + "wrench_orange.png" + S +
_x("Email") + S + _x("Anonymous webmail client") + S + "/susimail/susimail" + S + I + "email.png" + S +
_x("Email") + S + _x("Anonymous webmail client") + S + "/webmail" + S + I + "email.png" + S +
_x("Help") + S + _x("I2P Router Help") + S + "/help" + S + I + "help.png" + S +
_x("Router Console") + S + _x("I2P Router Console") + S + "/console" + S + I + "wrench_orange.png" + S +
_x("Torrents") + S + _x("Built-in anonymous BitTorrent Client") + S + "/i2psnark/" + S + I + "film.png" + S +
_x("Torrents") + S + _x("Built-in anonymous BitTorrent Client") + S + "/torrents" + S + I + "film.png" + S +
_x("Website") + S + _x("Local web server") + S + "http://127.0.0.1:7658/" + S + I + "server.png" + S +
"";

View File

@ -3,6 +3,10 @@ package net.i2p.router.web;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.i2p.data.DataHelper;
import net.i2p.router.RouterContext;
@ -12,6 +16,36 @@ import net.i2p.router.RouterContext;
*
*/
public class SummaryBarRenderer {
// Commented out because broken. Replaced by if-elseif blob below.
/*static final Map<String, java.lang.reflect.Method> ALL_SECTIONS;
static {
Map<String, java.lang.reflect.Method> aMap = new HashMap<String, java.lang.reflect.Method>();;
try {
aMap.put("HelpAndFAQ", SummaryBarRenderer.class.getMethod("renderHelpAndFAQHTML"));
aMap.put("I2PServices", SummaryBarRenderer.class.getMethod("renderI2PServicesHTML"));
aMap.put("I2PInternals", SummaryBarRenderer.class.getMethod("renderI2PInternalsHTML"));
aMap.put("General", SummaryBarRenderer.class.getMethod("renderGeneralHTML"));
aMap.put("ShortGeneral", SummaryBarRenderer.class.getMethod("renderShortGeneralHTML"));
aMap.put("NetworkReachability", SummaryBarRenderer.class.getMethod("renderNetworkReachabilityHTML"));
aMap.put("UpdateStatus", SummaryBarRenderer.class.getMethod("renderUpdateStatusHTML"));
aMap.put("RestartStatus", SummaryBarRenderer.class.getMethod("renderRestartStatusHTMLHTML"));
aMap.put("Peers", SummaryBarRenderer.class.getMethod("renderPeersHTML"));
aMap.put("FirewallAndReseedStatus", SummaryBarRenderer.class.getMethod("renderFirewallAndReseedStatusHTML"));
aMap.put("Bandwidth", SummaryBarRenderer.class.getMethod("renderBandwidthHTML"));
aMap.put("Tunnels", SummaryBarRenderer.class.getMethod("renderTunnelsHTML"));
aMap.put("Congestion", SummaryBarRenderer.class.getMethod("renderCongestionHTML"));
aMap.put("TunnelStatus", SummaryBarRenderer.class.getMethod("renderTunnelStatusHTML"));
aMap.put("Destinations", SummaryBarRenderer.class.getMethod("renderDestinationsHTML"));
aMap.put("NewsHeadings", SummaryBarRenderer.class.getMethod("renderNewsHeadingsHTML"));
} catch (java.lang.NoSuchMethodException e) {
}
ALL_SECTIONS = Collections.unmodifiableMap(aMap);
}*/
static final String ALL_SECTIONS[] =
{"HelpAndFAQ", "I2PServices", "I2PInternals", "General", "ShortGeneral", "NetworkReachability",
"UpdateStatus", "RestartStatus", "Peers", "FirewallAndReseedStatus", "Bandwidth", "Tunnels",
"Congestion", "TunnelStatus", "Destinations", "NewsHeadings" };
private final RouterContext _context;
private final SummaryHelper _helper;
@ -25,155 +59,199 @@ public class SummaryBarRenderer {
* on lower-level directory errors.
*/
public void renderSummaryHTML(Writer out) throws IOException {
String requestURI = _helper.getRequestURI();
String page = requestURI.replace("/", "").replace(".jsp", "");
List<String> sections = _helper.getSummaryBarSections(page);
StringBuilder buf = new StringBuilder(8*1024);
String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
for (String section : sections) {
// Commented out because broken. Replaced by if-elseif blob below.
/*try {
String section = (String)ALL_SECTIONS.get(sections[i]).invoke(this);
if (section != null && section != "") {
out.write("<hr>" + i + "<hr>\n" + section);
}
} catch (Exception e) {
out.write("<hr>" +i + " - Exception<hr>\n" + e);
}*/
buf.setLength(0);
// TODO - the bar would render more cleanly if we specified the img height and width here,
// but unfortunately the images in the different themes are different sizes.
// They range in height from 37 to 43 px. But there's a -2 bottom margin...
// So put it in a div.
buf.append("<div style=\"height: 36px;\"><a href=\"/\" target=\"_top\"><img src=\"")
.append(CSSHelper.BASE_THEME_PATH)
.append(theme)
.append("/images/i2plogo.png\" alt=\"")
.append(_("I2P Router Console"))
.append("\" title=\"")
.append(_("I2P Router Console"))
.append("\"></a></div><hr>")
buf.append("<hr>\n");
if ("HelpAndFAQ".equals(section))
buf.append(renderHelpAndFAQHTML());
else if ("I2PServices".equals(section))
buf.append(renderI2PServicesHTML());
else if ("I2PInternals".equals(section))
buf.append(renderI2PInternalsHTML());
else if ("General".equals(section))
buf.append(renderGeneralHTML());
else if ("ShortGeneral".equals(section))
buf.append(renderShortGeneralHTML());
else if ("NetworkReachability".equals(section))
buf.append(renderNetworkReachabilityHTML());
else if ("UpdateStatus".equals(section))
buf.append(renderUpdateStatusHTML());
else if ("RestartStatus".equals(section))
buf.append(renderRestartStatusHTML());
else if ("Peers".equals(section))
buf.append(renderPeersHTML());
else if ("FirewallAndReseedStatus".equals(section))
buf.append(renderFirewallAndReseedStatusHTML());
else if ("Bandwidth".equals(section))
buf.append(renderBandwidthHTML());
else if ("Tunnels".equals(section))
buf.append(renderTunnelsHTML());
else if ("Congestion".equals(section))
buf.append(renderCongestionHTML());
else if ("TunnelStatus".equals(section))
buf.append(renderTunnelStatusHTML());
else if ("Destinations".equals(section))
buf.append(renderDestinationsHTML());
else if ("NewsHeadings".equals(section))
buf.append(renderNewsHeadingsHTML());
.append("<h3><a href=\"/help\" target=\"_top\" title=\"")
// Only output section if there's more than the <hr> to print
if (buf.length() > 5)
out.write(buf.toString());
}
}
public String renderHelpAndFAQHTML() {
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/help\" target=\"_top\" title=\"")
.append(_("I2P Router Help &amp; FAQ"))
.append("\">")
.append(_("Help &amp; FAQ"))
.append("</a></h3><hr>");
.append("</a></h3>");
return buf.toString();
}
File lpath = new File(_context.getBaseDir(), "docs/toolbar.html");
// you better have target="_top" for the links in there...
if (lpath.exists()) {
ContentHelper linkhelper = new ContentHelper();
linkhelper.setPage(lpath.getAbsolutePath());
linkhelper.setMaxLines("100");
buf.append(linkhelper.getContent());
} else {
buf.append("<h3><a href=\"/configclients\" target=\"_top\" title=\"")
.append(_("Configure startup of clients and webapps (services); manually start dormant services"))
.append("\">")
.append(_("I2P Services"))
.append("</a></h3>\n" +
public String renderI2PServicesHTML() {
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/configclients\" target=\"_top\" title=\"")
.append(_("Configure startup of clients and webapps (services); manually start dormant services"))
.append("\">")
.append(_("I2P Services"))
.append("</a></h3>\n" +
"<hr class=\"b\"><table><tr><td>" +
"<hr class=\"b\"><table><tr><td>" +
"<a href=\"/susimail/susimail\" target=\"blank\" title=\"")
.append(_("Anonymous webmail client"))
.append("\">")
.append(_("Email"))
.append("</a>\n" +
"<a href=\"/webmail\" target=\"_top\" title=\"")
.append(_("Anonymous webmail client"))
.append("\">")
.append(_("Email"))
.append("</a>\n" +
"<a href=\"/i2psnark/\" target=\"_blank\" title=\"")
.append(_("Built-in anonymous BitTorrent Client"))
.append("\">")
.append(_("Torrents"))
.append("</a>\n" +
"<a href=\"/torrents\" target=\"_top\" title=\"")
.append(_("Built-in anonymous BitTorrent Client"))
.append("\">")
.append(_("Torrents"))
.append("</a>\n" +
"<a href=\"http://127.0.0.1:7658/\" target=\"_blank\" title=\"")
.append(_("Local web server"))
.append("\">")
.append(_("Website"))
.append("</a>\n")
"<a href=\"http://127.0.0.1:7658/\" target=\"_blank\" title=\"")
.append(_("Local web server"))
.append("\">")
.append(_("Website"))
.append("</a>\n")
.append(NavHelper.getClientAppLinks(_context))
.append(NavHelper.getClientAppLinks(_context))
.append("</td></tr></table>\n" +
.append("</td></tr></table>\n");
return buf.toString();
}
"<hr><h3><a href=\"/config\" target=\"_top\" title=\"")
.append(_("Configure I2P Router"))
.append("\">")
.append(_("I2P Internals"))
.append("</a></h3><hr class=\"b\">\n" +
public String renderI2PInternalsHTML() {
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/config\" target=\"_top\" title=\"")
.append(_("Configure I2P Router"))
.append("\">")
.append(_("I2P Internals"))
.append("</a></h3><hr class=\"b\">\n" +
"<table><tr><td>\n" +
"<table><tr><td>\n" +
"<a href=\"/tunnels\" target=\"_top\" title=\"")
.append(_("View existing tunnels and tunnel build status"))
.append("\">")
.append(_("Tunnels"))
.append("</a>\n" +
"<a href=\"/tunnels\" target=\"_top\" title=\"")
.append(_("View existing tunnels and tunnel build status"))
.append("\">")
.append(_("Tunnels"))
.append("</a>\n" +
"<a href=\"/peers\" target=\"_top\" title=\"")
.append(_("Show all current peer connections"))
.append("\">")
.append(_("Peers"))
.append("</a>\n" +
"<a href=\"/peers\" target=\"_top\" title=\"")
.append(_("Show all current peer connections"))
.append("\">")
.append(_("Peers"))
.append("</a>\n" +
"<a href=\"/profiles\" target=\"_top\" title=\"")
.append(_("Show recent peer performance profiles"))
.append("\">")
.append(_("Profiles"))
.append("</a>\n" +
"<a href=\"/profiles\" target=\"_top\" title=\"")
.append(_("Show recent peer performance profiles"))
.append("\">")
.append(_("Profiles"))
.append("</a>\n" +
"<a href=\"/netdb\" target=\"_top\" title=\"")
.append(_("Show list of all known I2P routers"))
.append("\">")
.append(_("NetDB"))
.append("</a>\n" +
"<a href=\"/netdb\" target=\"_top\" title=\"")
.append(_("Show list of all known I2P routers"))
.append("\">")
.append(_("NetDB"))
.append("</a>\n" +
"<a href=\"/logs\" target=\"_top\" title=\"")
.append(_("Health Report"))
.append("\">")
.append(_("Logs"))
.append("</a>\n");
"<a href=\"/logs\" target=\"_top\" title=\"")
.append(_("Health Report"))
.append("\">")
.append(_("Logs"))
.append("</a>\n");
// "<a href=\"/jobs.jsp\" target=\"_top\" title=\"")
// .append(_("Show the router's workload, and how it's performing"))
// .append("\">")
// .append(_("Jobs"))
// .append("</a>\n" +
// "<a href=\"/jobs.jsp\" target=\"_top\" title=\"")
// .append(_("Show the router's workload, and how it's performing"))
// .append("\">")
// .append(_("Jobs"))
// .append("</a>\n" +
if (!StatSummarizer.isDisabled()) {
buf.append("<a href=\"/graphs\" target=\"_top\" title=\"")
if (!StatSummarizer.isDisabled()) {
buf.append("<a href=\"/graphs\" target=\"_top\" title=\"")
.append(_("Graph router performance"))
.append("\">")
.append(_("Graphs"))
.append("</a>\n");
}
buf.append("<a href=\"/stats\" target=\"_top\" title=\"")
.append(_("Textual router performance statistics"))
.append("\">")
.append(_("Stats"))
.append("</a>\n" +
"<a href=\"/i2ptunnel/\" target=\"_blank\" title=\"")
.append(_("Local Destinations"))
.append("\">")
.append(_("I2PTunnel"))
.append("</a>\n" +
"<a href=\"/susidns/index\" target=\"_blank\" title=\"")
.append(_("Manage your I2P hosts file here (I2P domain name resolution)"))
.append("\">")
.append(_("Addressbook"))
.append("</a>\n");
File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html");
if (javadoc.exists())
buf.append("<a href=\"/javadoc/index.html\" target=\"_blank\">Javadoc</a>\n");
buf.append("</td></tr></table>\n");
out.write(buf.toString());
buf.setLength(0);
}
buf.append("<a href=\"/stats\" target=\"_top\" title=\"")
.append(_("Textual router performance statistics"))
.append("\">")
.append(_("Stats"))
.append("</a>\n" +
"<a href=\"/i2ptunnelmgr\" target=\"_top\" title=\"")
.append(_("Local Destinations"))
.append("\">")
.append(_("I2PTunnel"))
.append("</a>\n" +
buf.append("<hr><h3><a href=\"/help\" target=\"_top\" title=\"")
"<a href=\"/dns\" target=\"_top\" title=\"")
.append(_("Manage your I2P hosts file here (I2P domain name resolution)"))
.append("\">")
.append(_("Addressbook"))
.append("</a>\n");
File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html");
if (javadoc.exists())
buf.append("<a href=\"/javadoc/index.html\" target=\"_blank\">Javadoc</a>\n");
buf.append("</td></tr></table>\n");
return buf.toString();
}
public String renderGeneralHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/help\" target=\"_top\" title=\"")
.append(_("I2P Router Help"))
.append("\">")
.append(_("General"))
.append("</a></h3><hr class=\"b\">\n" +
"<table><tr>" +
"<td align=\"left\"><b>")
"<td align=\"left\"><b title=\"")
.append(_("Your Local Identity is your unique I2P router identity, similar to an ip address but tailored to I2P. "))
.append(_("Never disclose this to anyone, as it can reveal your real world ip."))
.append("\">")
.append(_("Local Identity"))
.append(":</b></td>" +
"<td align=\"right\">" +
@ -187,7 +265,10 @@ public class SummaryBarRenderer {
.append(_("show"))
.append("</a></td></tr>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("The version of the I2P software we are running"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Version"))
.append(":</b></td>" +
"<td align=\"right\">")
@ -202,24 +283,74 @@ public class SummaryBarRenderer {
.append(":</b></td>" +
"<td align=\"right\">")
.append(_helper.getUptime())
.append("</td></tr></table>\n" +
.append("</td></tr></table>\n");
return buf.toString();
}
"<hr><h4><a href=\"/confignet#help\" target=\"_top\" title=\"")
public String renderShortGeneralHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<table>" +
"<tr title=\"")
.append(_("The version of the I2P software we are running"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Version"))
.append(":</b></td>" +
"<td align=\"right\">")
.append(_helper.getVersion())
.append("</td></tr>\n" +
"<tr title=\"")
.append(_("How long we've been running for this session"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Uptime"))
.append(":</b></td>" +
"<td align=\"right\">")
.append(_helper.getUptime())
.append("</td></tr></table>\n");
return buf.toString();
}
public String renderNetworkReachabilityHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h4><a href=\"/confignet#help\" target=\"_top\" title=\"")
.append(_("Help with configuring your firewall and router for optimal I2P performance"))
.append("\">")
.append(_("Network"))
.append(": ")
.append(_helper.getReachability())
.append("</a></h4><hr>\n")
.append("</a></h4>\n");
return buf.toString();
}
public String renderUpdateStatusHTML() {
if (_helper == null) return "";
String updateStatus = _helper.getUpdateStatus();
if ("".equals(updateStatus)) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/configupdate\" target=\"_top\" title=\"")
.append(_("Configure I2P Updates"))
.append("\">")
.append(_("I2P Update"))
.append("</a></h3><hr class=\"b\">\n");
buf.append(updateStatus);
return buf.toString();
}
.append(_helper.getUpdateStatus())
public String renderRestartStatusHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append(_helper.getRestartStatus());
return buf.toString();
}
.append(_helper.getRestartStatus())
.append("<hr><h3><a href=\"/peers\" target=\"_top\" title=\"")
public String renderPeersHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/peers\" target=\"_top\" title=\"")
.append(_("Show all current peer connections"))
.append("\">")
.append(_("Peers"))
@ -227,7 +358,10 @@ public class SummaryBarRenderer {
"<table>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("Peers we've been talking to in the last few minutes/last hour"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Active"))
.append(":</b></td><td align=\"right\">");
int active = _helper.getActivePeers();
@ -236,38 +370,56 @@ public class SummaryBarRenderer {
.append(Math.max(active, _helper.getActiveProfiles()))
.append("</td></tr>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("The number of peers available for building client tunnels"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Fast"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getFastPeers())
.append("</td></tr>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("The number of peers available for building exploratory tunnels"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("High capacity"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getHighCapacityPeers())
.append("</td></tr>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("The number of peers available for network database inquries"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Integrated"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getWellIntegratedPeers())
.append("</td></tr>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("The total number of peers in our network database"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Known"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getAllPeers())
.append("</td></tr>\n" +
"</table><hr>\n");
out.write(buf.toString());
buf.setLength(0);
"</table>\n");
return buf.toString();
}
public String renderFirewallAndReseedStatusHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append(_helper.getFirewallAndReseedStatus());
return buf.toString();
}
public String renderBandwidthHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/config\" title=\"")
.append(_("Configure router bandwidth allocation"))
.append("\" target=\"_top\">")
@ -303,82 +455,181 @@ public class SummaryBarRenderer {
.append(_helper.getInboundTransferred())
.append(SummaryHelper.THINSP)
.append(_helper.getOutboundTransferred())
.append("</td></tr></table>\n" +
.append("</td></tr>\n" +
"<hr><h3><a href=\"/tunnels\" target=\"_top\" title=\"")
"</table>\n");
return buf.toString();
}
public String renderTunnelsHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/tunnels\" target=\"_top\" title=\"")
.append(_("View existing tunnels and tunnel build status"))
.append("\">")
.append(_("Tunnels"))
.append("</a></h3><hr class=\"b\">" +
"<table>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("Used for building and testing tunnels, and communicating with floodfill peers"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Exploratory"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getInboundTunnels() + _helper.getOutboundTunnels())
.append("</td></tr>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("Tunnels we are using to provide or access services on the network"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Client"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getInboundClientTunnels() + _helper.getOutboundClientTunnels())
.append("</td></tr>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("Tunnels we are participating in, directly contributing bandwith to the network"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Participating"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getParticipatingTunnels())
.append("</td></tr>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("The ratio of tunnel hops we provide to tunnel hops we use - a value greater than 1.00 indicates a positive contribution to the network"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Share ratio"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getShareRatio())
.append("</td></tr>\n" +
"</table><hr><h3><a href=\"/jobs\" target=\"_top\" title=\"")
"</table>\n");
return buf.toString();
}
public String renderCongestionHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/jobs\" target=\"_top\" title=\"")
.append(_("What's in the router's job queue?"))
.append("\">")
.append(_("Congestion"))
.append("</a></h3><hr class=\"b\">" +
"<table>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("Indicates router performance"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Job lag"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getJobLag())
.append("</td></tr>\n" +
"<tr><td align=\"left\"><b>")
"<tr title=\"")
.append(_("Indicates how quickly outbound messages to other I2P routers are sent"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Message delay"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getMessageDelay())
.append("</td></tr>\n");
if (!_context.getBooleanPropertyDefaultTrue("router.disableTunnelTesting")) {
buf.append("<tr><td align=\"left\"><b>")
buf.append("<tr title=\"")
.append(_("Round trip time for a tunnel test"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Tunnel lag"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getTunnelLag())
.append("</td></tr>\n");
}
buf.append("<tr><td align=\"left\"><b>")
buf.append("<tr title=\"")
.append(_("Queued requests from other routers to participate in tunnels"))
.append("\">" +
"<td align=\"left\"><b>")
.append(_("Backlog"))
.append(":</b></td><td align=\"right\">")
.append(_helper.getInboundBacklog())
.append("</td></tr>\n" +
"</table><hr><h4>")
"</table>\n");
return buf.toString();
}
public String renderTunnelStatusHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(50);
buf.append("<h4>")
.append(_(_helper.getTunnelStatus()))
.append("</h4><hr>\n")
.append("</h4>\n");
return buf.toString();
}
.append(_helper.getDestinations())
.append("<hr>\n");
public String renderDestinationsHTML() {
if (_helper == null) return "";
StringBuilder buf = new StringBuilder(512);
buf.append(_helper.getDestinations());
return buf.toString();
}
out.write(buf.toString());
/** @since 0.9.1 */
public String renderNewsHeadingsHTML() {
if (_helper == null) return "";
NewsHelper newshelper = _helper.getNewsHelper();
if (newshelper == null || newshelper.shouldShowNews()) return "";
StringBuilder buf = new StringBuilder(512);
String consoleNonce = System.getProperty("router.consoleNonce");
if (consoleNonce != null) {
// Set up title and pre-headings stuff.
buf.append("<h3><a href=\"/configupdate\">")
.append(_("News & Updates"))
.append("</a></h3><hr class=\"b\"><div class=\"newsheadings\">\n");
// Get news content.
String newsContent = newshelper.getContent();
if (newsContent != "") {
buf.append("<ul>\n");
// Parse news content for headings.
int start = newsContent.indexOf("<h3>");
while (start >= 0) {
// Add offset to start:
// 4 - gets rid of <h3>
// 16 - gets rid of the date as well (assuming form "<h3>yyyy-mm-dd: Foobarbaz...")
newsContent = newsContent.substring(start+16, newsContent.length());
int end = newsContent.indexOf("</h3>");
if (end >= 0) {
String heading = newsContent.substring(0, end);
buf.append("<li>")
.append(heading)
.append("</li>\n");
}
start = newsContent.indexOf("<h3>");
}
buf.append("</ul>\n");
// Set up string containing <a> to show news.
String requestURI = _helper.getRequestURI();
if (requestURI.contains("/home")) {
buf.append("<a href=\"/?news=1&amp;consoleNonce=")
.append(consoleNonce)
.append("\">")
.append(_("Show news"))
.append("</a>\n");
}
} else {
buf.append("<center><i>")
.append(_("none"))
.append("</i></center>");
}
// Add post-headings stuff.
buf.append("</div>\n");
}
return buf.toString();
}
/** translate a string */

View File

@ -4,10 +4,13 @@ import java.io.IOException;
import java.text.Collator;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import net.i2p.data.DataHelper;
import net.i2p.data.Destination;
@ -17,6 +20,7 @@ import net.i2p.data.RouterAddress;
import net.i2p.data.RouterInfo;
import net.i2p.router.CommSystemFacade;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import net.i2p.router.RouterVersion;
import net.i2p.router.TunnelPoolSettings;
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
@ -35,6 +39,35 @@ public class SummaryHelper extends HelperBase {
// Opera 10.63 doesn't have the char, TODO check UA
//static final String THINSP = "&thinsp;/&thinsp;";
static final String THINSP = " / ";
private static final char S = ',';
static final String PROP_SUMMARYBAR = "routerconsole.summaryBar.";
static final String DEFAULT_FULL =
"HelpAndFAQ" + S +
"I2PServices" + S +
"I2PInternals" + S +
"General" + S +
"NetworkReachability" + S +
"UpdateStatus" + S +
"RestartStatus" + S +
"Peers" + S +
"FirewallAndReseedStatus" + S +
"Bandwidth" + S +
"Tunnels" + S +
"Congestion" + S +
"TunnelStatus" + S +
"Destinations" + S +
"";
static final String DEFAULT_MINIMAL =
"ShortGeneral" + S +
"NewsHeadings" + S +
"UpdateStatus" + S +
"NetworkReachability" + S +
"FirewallAndReseedStatus" + S +
"Destinations" + S +
"RestartStatus" + S +
"";
/**
* Retrieve the shortened 4 character ident for the router located within
@ -375,7 +408,7 @@ public class SummaryHelper extends HelperBase {
List<Destination> clients = new ArrayList(_context.clientManager().listClients());
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/i2ptunnel/\" target=\"_blank\" title=\"").append(_("Add/remove/edit &amp; control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr class=\"b\"><div class=\"tunnels\">");
buf.append("<h3><a href=\"/i2ptunnelmgr\" target=\"_top\" title=\"").append(_("Add/remove/edit &amp; control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr class=\"b\"><div class=\"tunnels\">");
if (!clients.isEmpty()) {
Collections.sort(clients, new AlphaComparator());
buf.append("<table>");
@ -618,7 +651,7 @@ public class SummaryHelper extends HelperBase {
// display all the time so we display the final failure message, and plugin update messages too
String status = UpdateHandler.getStatus();
if (status.length() > 0) {
buf.append("<h4>").append(status).append("</h4><hr>\n");
buf.append("<h4>").append(status).append("</h4>\n");
}
if (updateAvailable() || unsignedUpdateAvailable()) {
if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) {
@ -706,10 +739,31 @@ public class SummaryHelper extends HelperBase {
}
if (buf.length() <= 0)
return "";
buf.append("<hr>");
return buf.toString();
}
private NewsHelper _newshelper;
public void storeNewsHelper(NewsHelper n) { _newshelper = n; }
public NewsHelper getNewsHelper() { return _newshelper; }
public List<String> getSummaryBarSections(String page) {
String config = "";
if ("home".equals(page))
config = _context.getProperty(PROP_SUMMARYBAR + page, DEFAULT_MINIMAL);
else
config = _context.getProperty(PROP_SUMMARYBAR + page, null);
if (config == null)
config = _context.getProperty(PROP_SUMMARYBAR + "default", DEFAULT_FULL);
return Arrays.asList(config.split("" + S));
}
static void saveSummaryBarSections(RouterContext ctx, String page, Map<Integer, String> sections) {
StringBuilder buf = new StringBuilder(512);
for(String section : sections.values())
buf.append(section).append(S);
ctx.router().saveConfig(PROP_SUMMARYBAR + page, buf.toString());
}
/** output the summary bar to _out */
public void renderSummaryBar() throws IOException {
SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this);
@ -733,4 +787,91 @@ public class SummaryHelper extends HelperBase {
private String _requestURI;
public void setRequestURI(String s) { _requestURI = s; }
public String getRequestURI() { return _requestURI; }
public String getConfigTable() {
String[] allSections = SummaryBarRenderer.ALL_SECTIONS;
List<String> sections = getSummaryBarSections("default");
TreeSet<String> sortedSections = new TreeSet();
for (int i = 0; i < allSections.length; i++) {
String section = allSections[i];
if (!sections.contains(section))
sortedSections.add(section);
}
String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
String imgPath = CSSHelper.BASE_THEME_PATH + theme + "/images/";
StringBuilder buf = new StringBuilder(2048);
buf.append("<table class=\"sidebarconf\"><tr><th>")
.append(_("Remove"))
.append("</th><th>")
.append(_("Name"))
.append("</th><th colspan=\"2\">")
.append(_("Order"))
.append("</th></tr>\n");
for (String section : sections) {
int i = sections.indexOf(section);
buf.append("<tr><td align=\"center\"><input type=\"checkbox\" class=\"optbox\" name=\"delete_")
.append(i)
.append("\"></td><td align=\"left\">")
.append(section)
.append("</td><td align=\"right\"><input type=\"hidden\" name=\"order_")
.append(i + "_" + section)
.append("\" value=\"")
.append(i)
.append("\">");
if (i > 0) {
buf.append("<input type=\"image\" class=\"buttonTop\" name=\"move_")
.append(i)
.append("_top\" alt=\"")
.append(_("Top"))
.append("\" src=\"" + imgPath + "move_top.png\">");
buf.append("<input type=\"image\" class=\"buttonUp\" name=\"move_")
.append(i)
.append("_up\" alt=\"")
.append(_("Up"))
.append("\" src=\"" + imgPath + "move_up.png\">");
}
buf.append("</td><td align=\"left\">");
if (i < sections.size() - 1) {
buf.append("<input type=\"image\" class=\"buttonDown\" name=\"move_")
.append(i)
.append("_down\" alt=\"")
.append(_("Down"))
.append("\" src=\"" + imgPath + "move_down.png\">");
buf.append("<input type=\"image\" class=\"buttonBottom\" name=\"move_")
.append(i)
.append("_bottom\" alt=\"")
.append(_("Bottom"))
.append("\" src=\"" + imgPath + "move_bottom.png\">");
}
buf.append("</td></tr>\n");
}
buf.append("<tr><td align=\"center\">" +
"<input type=\"submit\" name=\"action\" class=\"delete\" value=\"")
.append(_("Delete selected"))
.append("\"></td><td align=\"left\"><b>")
.append(_("Add")).append(":</b> " +
"<select name=\"name\">\n" +
"<option value=\"\" selected=\"selected\">")
.append(_("Select a section to add"))
.append("</option>\n");
for (String s : sortedSections) {
buf.append("<option value=\"").append(s).append("\">")
.append(s).append("</option>\n");
}
buf.append("</select>\n" +
"<input type=\"hidden\" name=\"order\" value=\"")
.append(sections.size())
.append("\"></td>" +
"<td align=\"center\" colspan=\"2\">" +
"<input type=\"submit\" name=\"action\" class=\"add\" value=\"")
.append(_("Add item"))
.append("\"></td></tr>")
.append("</table>\n");
return buf.toString();
}
}

View File

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

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("configure bandwidth")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config advanced")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>

View File

@ -10,7 +10,14 @@ button span.hide{
display:none;
}
input.default { width: 1px; height: 1px; visibility: hidden; }
</style></head><body>
</style>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>

View File

@ -12,7 +12,13 @@ input.default {
visibility: hidden;
}
</style>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Home Page Configuration")%></h1>

View File

@ -5,7 +5,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config keyring")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Keyring Configuration")%></h1>

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config logging")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<jsp:useBean class="net.i2p.router.web.ConfigLoggingHelper" id="logginghelper" scope="request" />
<jsp:setProperty name="logginghelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />

View File

@ -5,7 +5,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config networking")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>

View File

@ -5,7 +5,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config peers")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Peer Configuration")%></h1>

View File

@ -5,7 +5,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config reseeding")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>

View File

@ -5,7 +5,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config service")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Service Configuration")%></h1>

View File

@ -0,0 +1,62 @@
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config summary bar")%>
<style type='text/css'>
input.default {
width: 1px;
height: 1px;
visibility: hidden;
}
</style>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Summary Bar Configuration")%></h1>
<div class="main" id="main">
<%@include file="confignav.jsi" %>
<jsp:useBean class="net.i2p.router.web.ConfigSummaryHandler" id="formhandler" scope="request" />
<% formhandler.storeMethod(request.getMethod()); %>
<jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" />
<%
formhandler.setMovingAction();
%>
<jsp:getProperty name="formhandler" property="allMessages" />
<%
String pageNonce = formhandler.getNewNonce();
%>
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="summaryhelper" scope="request" />
<jsp:setProperty name="summaryhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<h3><%=intl._("Refresh Interval")%></h3>
<form action="" method="POST">
<input type="hidden" name="nonce" value="<%=pageNonce%>" >
<input type="hidden" name="group" value="0">
<input type="text" name="refreshInterval" value="<jsp:getProperty name="intl" property="refresh" />" >
<%=intl._("seconds")%>
<input type="submit" name="action" class="accept" value="<%=intl._("Save")%>" >
</form>
<h3><%=intl._("Customise Summary Bar")%></h3>
<form action="" method="POST">
<input type="hidden" name="nonce" value="<%=pageNonce%>" >
<input type="hidden" name="group" value="2">
<jsp:getProperty name="summaryhelper" property="configTable" />
<div class="formaction">
<input type="submit" class="reload" name="action" value="<%=intl._("Restore full default")%>" >
<input type="submit" class="reload" name="action" value="<%=intl._("Restore minimal default")%>" >
</div>
</form>
</div></body></html>

View File

@ -6,10 +6,17 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config stats")%>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
<script type="text/javascript">
function init()
{
checkAll = false;
initAjax();
}
function toggleAll(category)
{

View File

@ -5,7 +5,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config tunnels")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config UI")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config update")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Update Configuration")%></h1>

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("home")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%
String consoleNonce = System.getProperty("router.consoleNonce");
if (consoleNonce == null) {
@ -15,16 +21,13 @@
}
%>
<%@include file="summary.jsi" %><h1><%=intl._("I2P Router Console")%></h1>
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Router Console")%></h1>
<div class="news" id="news">
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
if (newshelper.shouldShowNews()) {
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%>
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<jsp:getProperty name="newshelper" property="content" />
<hr>
<%

View File

@ -28,6 +28,7 @@
<link rel="shortcut icon" href="/themes/console/images/favicon.ico">
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" />
<jsp:setProperty name="intl" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<link rel="icon" href="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/favicon.ico">
<%
// clickjacking
if (intl.shouldSendXFrame())

View File

@ -9,7 +9,13 @@
%>
<html><head><title>I2P Router Console - Debug</title>
<%@include file="css.jsi" %>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1>Router SKM</h1>
<div class="main" id="main">

View File

@ -0,0 +1,78 @@
<%@page contentType="text/html"%>
<%@page trimDirectiveWhitespaces="true"%>
<%@page pageEncoding="UTF-8"%>
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
// CSSHelper is also pulled in by css.jsi below...
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
if (!testIFrame) {
response.setStatus(302, "Moved");
response.setHeader("Location", "/susidns/index");
} else {
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("addressbook")%>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
function injectClass(f) {
f.className += ' iframed';
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
doc.body.className += ' iframed';
}
function resizeFrame(f) {
// offsetHeight returns the height of the visible area for an object, in pixels.
// The value contains the height with the padding, scrollBar, and the border,
// but does not include the margin. Therefore, any content within the iframe
// should have no margins at the very top or very bottom to avoid a scrollbar.
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
var totalHeight = doc.body.offsetHeight;
// Detect if horizontal scrollbar is present, and add its width to height if so.
// This prevents a vertical scrollbar appearing when the min-width is passed.
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
if (true) {
// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
scrollDiv.style.width = "100px";
scrollDiv.style.height = "100px";
scrollDiv.style.overflow = "scroll";
scrollDiv.style.position = "absolute";
scrollDiv.style.top = "-9999px";
document.body.appendChild(scrollDiv);
// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
totalHeight += scrollbarWidth;
// Delete the div
document.body.removeChild(scrollDiv);
}
f.style.height = totalHeight + "px";
}
function setupFrame() {
f = document.getElementById("susidnsframe");
injectClass(f);
resizeFrame(f);
}
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Addressbook")%> <span class="newtab"><a href="/susidns/index" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
<div class="main" id="main">
<iframe src="/susidns/index" width="100%" height="100%" frameborder="0" border="0" name="susidnsframe" id="susidnsframe" onload="setupFrame()" allowtransparency="true">
</iframe>
</div></body></html>
<%
}
%>

View File

@ -16,10 +16,16 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("Page Not Found")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=ERROR_CODE%> <%=ERROR_MESSAGE%></h1>
<h1><%=ERROR_CODE%>&nbsp;<%=ERROR_MESSAGE%></h1>
<div class="sorry" id="warning">
<%=intl._("Sorry! You appear to be requesting a non-existent Router Console page or resource.")%><hr>
<%=intl._("Error 404")%>: <%=ERROR_URI%> <%=intl._("not found")%>.
<%=intl._("Error 404")%>: <%=ERROR_URI%>&nbsp;<%=intl._("not found")%>.
</div></body></html>

View File

@ -12,7 +12,13 @@
<%
graphHelper.storeWriter(out);
%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Performance Graphs")%></h1>
<div class="main" id="main">

View File

@ -19,7 +19,13 @@
out.print(graphHelper.getRefreshMeta());
}
%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Performance Graphs")%></h1>
<div class="main" id="main">

View File

@ -9,7 +9,13 @@
%>
<html><head><title>I2P Router Console - help</title>
<%@include file="css.jsi" %>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1>I2P Router Help &amp; Support</h1>
<div class="main" id="main"><p>

View File

@ -9,7 +9,13 @@
%>
<html><head><title>I2P مساعدة لوحة التحكم</title>
<%@include file="css.jsi" %>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1>I2P مساعدة لوحة التحكم</h1>
<div class="main" id="main" dir="rtl" lang="ar"><p>

View File

@ -9,7 +9,13 @@
%>
<html><head><title>Console du routeur I2P - Aide</title>
<%@include file="css.jsi" %>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
Traduction de mars 2011 (magma@mail.i2p)
<h1>Aide et assistance du routeur I2P</h1>

View File

@ -9,7 +9,13 @@
%>
<html><head><title>I2P Router Console - help</title>
<%@include file="css.jsi" %>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1>I2P Router Help &amp; Support</h1>
<div class="main" id="main"><p>

View File

@ -9,7 +9,13 @@
%>
<html><head><title>Консоль маршрутизатора I2P - справка</title>
<%@include file="css.jsi" %>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1>Справка маршрутизатора I2P</h1>

View File

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

View File

@ -0,0 +1,96 @@
<%@page contentType="text/html"%>
<%@page trimDirectiveWhitespaces="true"%>
<%@page pageEncoding="UTF-8"%>
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
// CSSHelper is also pulled in by css.jsi below...
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
if (!testIFrame) {
response.setStatus(302, "Moved");
response.setHeader("Location", "/i2ptunnel/");
} else {
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("i2p tunnel manager")%>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
function injectClass(f) {
f.className += ' iframed';
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
if (doc.getElementsByClassName == undefined) {
doc.getElementsByClassName = function(className)
{
var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
var allElements = document.getElementsByTagName("*");
var results = [];
var element;
for (var i = 0; (element = allElements[i]) != null; i++) {
var elementClass = element.className;
if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
results.push(element);
}
return results;
}
}
doc.body.className += ' iframed';
doc.getElementsByClassName('panel')[0].className += ' iframed';
}
function resizeFrame(f) {
// offsetHeight returns the height of the visible area for an object, in pixels.
// The value contains the height with the padding, scrollBar, and the border,
// but does not include the margin. Therefore, any content within the iframe
// should have no margins at the very top or very bottom to avoid a scrollbar.
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
var totalHeight = doc.body.offsetHeight;
// Detect if horizontal scrollbar is present, and add its width to height if so.
// This prevents a vertical scrollbar appearing when the min-width is passed.
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
if (true) {
// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
scrollDiv.style.width = "100px";
scrollDiv.style.height = "100px";
scrollDiv.style.overflow = "scroll";
scrollDiv.style.position = "absolute";
scrollDiv.style.top = "-9999px";
document.body.appendChild(scrollDiv);
// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
totalHeight += scrollbarWidth;
// Delete the div
document.body.removeChild(scrollDiv);
}
f.style.height = totalHeight + "px";
}
function setupFrame() {
f = document.getElementById("i2ptunnelframe");
injectClass(f);
resizeFrame(f);
}
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Tunnel Manager")%> <span class="newtab"><a href="/i2ptunnel/" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
<div class="main" id="main">
<iframe src="/i2ptunnel/" width="100%" height="100%" frameborder="0" border="0" name="i2ptunnelframe" id="i2ptunnelframe" onload="setupFrame()" allowtransparency="true">
</iframe>
</div></body></html>
<%
}
%>

View File

@ -5,7 +5,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("Jar File Dump")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %><h1>Jar File Dump</h1>
<div class="main" id="main">
<jsp:useBean class="net.i2p.router.web.FileDumpHelper" id="dumpHelper" scope="request" />

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("job queue")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %><h1><%=intl._("I2P Router Job Queue")%></h1>
<div class="main" id="main">
<jsp:useBean class="net.i2p.router.web.JobQueueHelper" id="jobQueueHelper" scope="request" />

View File

@ -5,7 +5,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("logs")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Router Logs")%></h1>
<div class="main" id="main">
@ -33,8 +39,10 @@
<p><%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%></p>
<h3><%=intl._("Critical Logs")%></h3><a name="criticallogs"> </a>
<jsp:getProperty name="logsHelper" property="criticalLogs" />
<hr>
<h3><%=intl._("Router Logs")%> (<a href="configlogging"><%=intl._("configure")%></a>)</h3>
<jsp:getProperty name="logsHelper" property="logs" />
<hr>
<h3><%=intl._("Service (Wrapper) Logs")%></h3><a name="servicelogs"> </a>
<jsp:getProperty name="logsHelper" property="serviceLogs" />
</div><hr></div></body></html>

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("network database")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Network Database")%></h1>
<div class="main" id="main">

View File

@ -7,7 +7,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("WebApp Not Found")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("Web Application Not Running")%></h1>
<div class="sorry" id="warning">

View File

@ -9,7 +9,13 @@
%>
<html><head><title>I2P Router Console - internals</title>
<%@include file="css.jsi" %>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="conhelper" scope="request" />
<jsp:setProperty name="conhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("peer connections")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Network Peers")%></h1>
<div class="main" id="main"><div class="wideload">

View File

@ -6,7 +6,14 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("peer profiles")%>
</head><body><%@include file="summary.jsi" %>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Network Peer Profiles")%></h1>
<div class="main" id="main"><div class="wideload">
<jsp:useBean class="net.i2p.router.web.ProfilesHelper" id="profilesHelper" scope="request" />

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("statistics")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<jsp:useBean class="net.i2p.router.web.OldConsoleHelper" id="oldhelper" scope="request" />
<jsp:setProperty name="oldhelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />

View File

@ -1,3 +1,10 @@
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%>
<jsp:setProperty name="newshelper" property="page" value="<%=newspath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<div class="routersummaryouter">
<%
// The refresh delay, 0 to disable
@ -13,9 +20,11 @@
d = net.i2p.data.DataHelper.stripHTML(d); // XSS
// pass the new delay parameter to the iframe
newDelay = "?refresh=" + d;
// update disable boolean
intl.setDisableRefresh(d);
}
if (!"0".equals(d))
out.print("<iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\">\n");
if (!intl.getDisableRefresh())
out.print("<noscript><iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\"></noscript>\n");
}
%>
<div class="routersummary">
@ -33,12 +42,12 @@
}
// d and allowIFrame defined above
if (!"0".equals(d)) {
out.print("</div></iframe>\n");
if (!intl.getDisableRefresh()) {
out.print("</div><noscript></iframe></noscript>\n");
} else if (allowIFrame) {
// since we don't have an iframe this will reload the base page, and
// the new delay will be passed to the iframe above
out.print("<div class=\"refresh\"><form action=\"" + request.getRequestURI() + "\" method=\"POST\">\n" +
out.print("<noscript><div class=\"refresh\"><form action=\"" + request.getRequestURI() + "\" method=\"POST\">\n" +
"<b>");
// We have intl defined when this is included, but not when compiled standalone.
out.print(intl._("Refresh (s)"));
@ -47,7 +56,7 @@
// ditto
out.print(intl._("Enable"));
out.print("</button>\n" +
"</form></div></div>\n");
"</form></div></noscript></div>\n");
} else {
out.print("</div>\n");
}

View File

@ -26,10 +26,11 @@
} else {
d = net.i2p.data.DataHelper.stripHTML(d); // XSS
intl.setRefresh(d);
intl.setDisableRefresh(d);
}
// we probably don't get here if d == "0" since caught in summary.jsi, but just
// to be sure...
if (!"0".equals(d)) {
if (!intl.getDisableRefresh()) {
// doesn't work for restart or shutdown with no expl. tunnels,
// since the call to ConfigRestartBean.renderStatus() hasn't happened yet...
// So we delay slightly
@ -52,12 +53,19 @@
}
%>
</head><body style="margin: 0;"><div class="routersummary">
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%>
<jsp:setProperty name="newshelper" property="page" value="<%=newspath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<%@include file="summarynoframe.jsi" %>
<%
// d and shutdownSoon defined above
if (!shutdownSoon) {
out.print("<div class=\"refresh\"><form action=\"summaryframe.jsp\" method=\"POST\">\n");
if ("0".equals(d)) {
out.print("<hr>\n<div class=\"refresh\"><form action=\"summaryframe.jsp\" method=\"POST\">\n");
if (intl.getDisableRefresh()) {
out.print("<b>");
out.print(intl._("Refresh (s)"));
out.print(":</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" >\n");

View File

@ -1,35 +1,17 @@
<%@page import="net.i2p.router.web.SummaryHelper" %>
<%
/*
* Note:
* This is included almost 30 times, so keep whitespace etc. to a minimum.
* TODO - the bar would render more cleanly if we specified the img height and width here,
* but unfortunately the images in the different themes are different sizes.
* They range in height from 37 to 43 px. But there's a -2 bottom margin...
* So put it in a div.
*/
%>
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" />
<jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<jsp:setProperty name="helper" property="action" value="<%=request.getParameter(\"action\")%>" />
<jsp:setProperty name="helper" property="updateNonce" value="<%=request.getParameter(\"updateNonce\")%>" />
<jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" />
<jsp:setProperty name="helper" property="requestURI" value="<%=request.getRequestURI()%>" />
<% helper.storeWriter(out); %>
<%
/*
* The following is required for the reseed button to work, although we probably
* only need the reseedNonce property.
*/
%>
<jsp:useBean class="net.i2p.router.web.ReseedHandler" id="reseed" scope="request" />
<jsp:setProperty name="reseed" property="*" />
<%
/*
* The following is required for the update buttons to work, although we probably
* only need the updateNonce property.
*/
%>
<jsp:useBean class="net.i2p.router.web.UpdateHandler" id="update" scope="request" />
<jsp:setProperty name="update" property="*" />
<jsp:setProperty name="update" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
// moved to java for ease of translation and to avoid 30 copies
helper.renderSummaryBar();
%>
<div style="height: 36px;">
<a href="/" target="_top">
<img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/i2plogo.png" alt="<%=intl._("I2P Router Console")%>" title="<%=intl._("I2P Router Console")%>">
</a>
</div>
<div id="xhr">
<!-- for non-script -->
<%@include file="xhr1.jsi" %>
</div>

View File

@ -0,0 +1,78 @@
<%@page contentType="text/html"%>
<%@page trimDirectiveWhitespaces="true"%>
<%@page pageEncoding="UTF-8"%>
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
// CSSHelper is also pulled in by css.jsi below...
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
if (!testIFrame) {
response.setStatus(302, "Moved");
response.setHeader("Location", "/i2psnark/");
} else {
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("torrents")%>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
function injectClass(f) {
f.className += ' iframed';
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
doc.body.className += ' iframed';
}
function resizeFrame(f) {
// offsetHeight returns the height of the visible area for an object, in pixels.
// The value contains the height with the padding, scrollBar, and the border,
// but does not include the margin. Therefore, any content within the iframe
// should have no margins at the very top or very bottom to avoid a scrollbar.
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
var totalHeight = doc.body.offsetHeight;
// Detect if horizontal scrollbar is present, and add its width to height if so.
// This prevents a vertical scrollbar appearing when the min-width is passed.
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
if (true) {
// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
scrollDiv.style.width = "100px";
scrollDiv.style.height = "100px";
scrollDiv.style.overflow = "scroll";
scrollDiv.style.position = "absolute";
scrollDiv.style.top = "-9999px";
document.body.appendChild(scrollDiv);
// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
totalHeight += scrollbarWidth;
// Delete the div
document.body.removeChild(scrollDiv);
}
f.style.height = totalHeight + "px";
}
function setupFrame() {
f = document.getElementById("i2psnarkframe");
injectClass(f);
resizeFrame(f);
}
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Torrent Downloader")%> <span class="newtab"><a href="/i2psnark/" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
<div class="main" id="main">
<iframe src="/i2psnark/" width="100%" height="100%" frameborder="0" border="0" name="i2psnarkframe" id="i2psnarkframe" onload="setupFrame()" allowtransparency="true">
</iframe>
</div></body></html>
<%
}
%>

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("tunnel summary")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %><h1><%=intl._("I2P Tunnel Summary")%></h1>
<div class="main" id="main">
<jsp:useBean class="net.i2p.router.web.TunnelHelper" id="tunnelHelper" scope="request" />

View File

@ -6,7 +6,13 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("Peer Profile")%>
</head><body>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("Peer Profile")%></h1>
<div class="main" id="main"><div class="wideload">

View File

@ -0,0 +1,78 @@
<%@page contentType="text/html"%>
<%@page trimDirectiveWhitespaces="true"%>
<%@page pageEncoding="UTF-8"%>
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="tester" scope="request" />
<jsp:setProperty name="tester" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
// CSSHelper is also pulled in by css.jsi below...
boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent"));
if (!testIFrame) {
response.setStatus(302, "Moved");
response.setHeader("Location", "/susimail/susimail");
} else {
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("webmail")%>
<script src="/js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
var failMessage = "<hr><b><%=intl._("Router is down")%><\/b>";
function requestAjax1() { ajax("/xhr1.jsp?requestURI=<%=request.getRequestURI()%>", "xhr", <%=intl.getRefresh()%>000); }
function initAjax() { setTimeout(requestAjax1, <%=intl.getRefresh()%>000); }
function injectClass(f) {
f.className += ' iframed';
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
doc.body.className += ' iframed';
}
function resizeFrame(f) {
// offsetHeight returns the height of the visible area for an object, in pixels.
// The value contains the height with the padding, scrollBar, and the border,
// but does not include the margin. Therefore, any content within the iframe
// should have no margins at the very top or very bottom to avoid a scrollbar.
var doc = 'contentDocument' in f? f.contentDocument : f.contentWindow.document;
var totalHeight = doc.body.offsetHeight;
// Detect if horizontal scrollbar is present, and add its width to height if so.
// This prevents a vertical scrollbar appearing when the min-width is passed.
// FIXME: How to detect horizontal scrollbar in iframe? Always apply for now.
if (true) {
// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
scrollDiv.style.width = "100px";
scrollDiv.style.height = "100px";
scrollDiv.style.overflow = "scroll";
scrollDiv.style.position = "absolute";
scrollDiv.style.top = "-9999px";
document.body.appendChild(scrollDiv);
// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
totalHeight += scrollbarWidth;
// Delete the div
document.body.removeChild(scrollDiv);
}
f.style.height = totalHeight + "px";
}
function setupFrame() {
f = document.getElementById("susimailframe");
injectClass(f);
resizeFrame(f);
}
</script>
</head><body onload="initAjax()">
<%@include file="summary.jsi" %>
<h1><%=intl._("I2P Webmail")%> <span class="newtab"><a href="/susimail/susimail" target="_blank" title="<%=intl._("Open in new tab")%>"><img src="<%=intl.getTheme(request.getHeader("User-Agent"))%>images/newtab.png" /></a></span></h1>
<div class="main" id="main">
<iframe src="/susimail/susimail" width="100%" height="100%" frameborder="0" border="0" name="susimailframe" id="susimailframe" onload="setupFrame()" allowtransparency="true">
</iframe>
</div></body></html>
<%
}
%>

View File

@ -1,24 +1,41 @@
<%@page import="net.i2p.router.web.SummaryHelper" %>
<%
/*
* Note:
* This is included on every refresh, so keep whitespace etc. to a minimum.
*/
%>
<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" />
<jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<jsp:setProperty name="helper" property="action" value="<%=request.getParameter(\"action\")%>" />
<table><tr><td align="left"><b><%=intl._("Version")%>:</b></td><td align="right">
<jsp:getProperty name="helper" property="version" />
</td></tr><tr><td align="left"><b><%=intl._("Uptime")%>:</b></td><td align="right">
<jsp:getProperty name="helper" property="uptime" />
</td></tr></table><hr>
<jsp:setProperty name="helper" property="updateNonce" value="<%=request.getParameter(\"updateNonce\")%>" />
<jsp:setProperty name="helper" property="consoleNonce" value="<%=request.getParameter(\"consoleNonce\")%>" />
<%
String reqURI = request.getRequestURI();
if (reqURI != null)
reqURI = reqURI.replace("/xhr1.jsp", "/home");
if (reqURI.contains("/xhr1"))
reqURI = request.getParameter("requestURI");
helper.setRequestURI(reqURI);
%>
<h4><a href="/confignet#help" title="<%=intl._("Help with configuring your firewall and router for optimal I2P performance")%>"><%=intl._("Network")%>:
<jsp:getProperty name="helper" property="reachability" /></a></h4>
<hr>
<jsp:getProperty name="helper" property="updateStatus" />
<jsp:getProperty name="helper" property="restartStatus" />
<hr>
<jsp:getProperty name="helper" property="firewallAndReseedStatus" />
<jsp:getProperty name="helper" property="destinations" />
<% helper.storeWriter(out); %>
<% helper.storeNewsHelper(newshelper); %>
<%
/*
* The following is required for the reseed button to work, although we probably
* only need the reseedNonce property.
*/
%>
<jsp:useBean class="net.i2p.router.web.ReseedHandler" id="reseed" scope="request" />
<jsp:setProperty name="reseed" property="*" />
<%
/*
* The following is required for the update buttons to work, although we probably
* only need the updateNonce property.
*/
%>
<jsp:useBean class="net.i2p.router.web.UpdateHandler" id="update" scope="request" />
<jsp:setProperty name="update" property="*" />
<jsp:setProperty name="update" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
// moved to java for ease of translation
helper.renderSummaryBar();
%>

View File

@ -11,4 +11,11 @@
%>
<jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" />
<jsp:setProperty name="intl" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<jsp:useBean class="net.i2p.router.web.NewsHelper" id="newshelper" scope="request" />
<jsp:setProperty name="newshelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
<%
java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml");
%>
<jsp:setProperty name="newshelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
<jsp:setProperty name="newshelper" property="maxLines" value="300" />
<%@include file="xhr1.jsi" %>

View File

@ -40,11 +40,10 @@ import net.i2p.data.DataHelper;
import net.i2p.data.Destination;
import net.i2p.util.SecureFileOutputStream;
public class AddressbookBean
public class AddressbookBean extends BaseBean
{
protected String book, action, serial, lastSerial, filter, search, hostname, destination;
protected int beginIndex, endIndex;
protected final Properties properties;
private Properties addressbook;
private int trClass;
protected final LinkedList<String> deletionMarks;
@ -82,41 +81,12 @@ public class AddressbookBean
public AddressbookBean()
{
properties = new Properties();
super();
deletionMarks = new LinkedList();
beginIndex = 0;
endIndex = DISPLAY_SIZE - 1;
}
private long configLastLoaded = 0;
private static final String PRIVATE_BOOK = "private_addressbook";
private static final String DEFAULT_PRIVATE_BOOK = "../privatehosts.txt";
protected void loadConfig()
{
long currentTime = System.currentTimeMillis();
if( !properties.isEmpty() && currentTime - configLastLoaded < 10000 )
return;
FileInputStream fis = null;
try {
properties.clear();
fis = new FileInputStream( ConfigBean.configFileName );
properties.load( fis );
// added in 0.5, for compatibility with 0.4 config.txt
if( properties.getProperty(PRIVATE_BOOK) == null)
properties.setProperty(PRIVATE_BOOK, DEFAULT_PRIVATE_BOOK);
configLastLoaded = currentTime;
}
catch (Exception e) {
Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
} finally {
if (fis != null)
try { fis.close(); } catch (IOException ioe) {}
}
}
public String getFileName()
{
loadConfig();

View File

@ -0,0 +1,64 @@
package i2p.susi.dns;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
/**
* Holds methods common to several Beans.
* @since 0.9.1
*/
public class BaseBean
{
protected final Properties properties;
private long configLastLoaded = 0;
private static final String PRIVATE_BOOK = "private_addressbook";
private static final String DEFAULT_PRIVATE_BOOK = "../privatehosts.txt";
public static final String PROP_THEME_NAME = "theme";
public static final String DEFAULT_THEME = "light";
public static final String BASE_THEME_PATH = "/themes/susidns/";
public BaseBean()
{
properties = new Properties();
}
protected void loadConfig()
{
long currentTime = System.currentTimeMillis();
if( !properties.isEmpty() && currentTime - configLastLoaded < 10000 )
return;
FileInputStream fis = null;
try {
properties.clear();
fis = new FileInputStream( ConfigBean.configFileName );
properties.load( fis );
// added in 0.5, for compatibility with 0.4 config.txt
if( properties.getProperty(PRIVATE_BOOK) == null)
properties.setProperty(PRIVATE_BOOK, DEFAULT_PRIVATE_BOOK);
configLastLoaded = currentTime;
}
catch (Exception e) {
Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
} finally {
if (fis != null)
try { fis.close(); } catch (IOException ioe) {}
}
}
/**
* Returns the theme path
* @since 0.9.1
*/
public String getTheme() {
loadConfig();
String url = BASE_THEME_PATH;
String theme = properties.getProperty(PROP_THEME_NAME, DEFAULT_THEME);
url += theme + "/";
return url;
}
}

View File

@ -36,38 +36,10 @@ import java.util.Properties;
import net.i2p.I2PAppContext;
import net.i2p.util.SecureFileOutputStream;
public class SubscriptionsBean
public class SubscriptionsBean extends BaseBean
{
private String action, fileName, content, serial, lastSerial;
Properties properties;
public SubscriptionsBean()
{
properties = new Properties();
}
private long configLastLoaded = 0;
private void loadConfig()
{
long currentTime = System.currentTimeMillis();
if( !properties.isEmpty() && currentTime - configLastLoaded < 10000 )
return;
FileInputStream fis = null;
try {
properties.clear();
fis = new FileInputStream( ConfigBean.configFileName );
properties.load( fis );
configLastLoaded = currentTime;
}
catch (Exception e) {
Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
} finally {
if (fis != null)
try { fis.close(); } catch (IOException ioe) {}
}
}
public String getAction() {
return action;
}

View File

@ -47,12 +47,12 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${book.book} <%=intl._("address book")%> - susidns</title>
<link rel="stylesheet" type="text/css" href="css.css">
<link rel="stylesheet" type="text/css" href="<%=book.getTheme()%>susidns.css">
</head>
<body>
<div class="page">
<div id="logo">
<a href="index"><img src="images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
<a href="index"><img src="<%=book.getTheme()%>images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
</div>
<hr>
<div id="navi">

View File

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

View File

@ -41,12 +41,12 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${book.book} <%=intl._("addressbook")%> - susidns</title>
<link rel="stylesheet" type="text/css" href="css.css">
<link rel="stylesheet" type="text/css" href="<%=book.getTheme()%>susidns.css">
</head>
<body>
<div class="page">
<div id="logo">
<a href="index"><img src="images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
<a href="index"><img src="<%=book.getTheme()%>images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
</div>
<hr>
<div id="navi">

View File

@ -35,18 +35,19 @@
<%@ page contentType="text/html"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
<jsp:useBean id="base" class="i2p.susi.dns.BaseBean" scope="session" />
<jsp:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=intl._("Introduction")%> - SusiDNS</title>
<link rel="stylesheet" type="text/css" href="css.css">
<link rel="stylesheet" type="text/css" href="<%=base.getTheme()%>susidns.css">
</head>
<body>
<div class="page">
<div id="logo">
<img src="images/logo.png" alt="susidns logo" border="0">
<img src="<%=base.getTheme()%>images/logo.png" alt="susidns logo" border="0">
</div>
<hr>
<div id="navi">
@ -85,7 +86,7 @@
<%=intl._("Hosts in the private address book can be accessed by you but their addresses are never distributed to others.")%>
<%=intl._("The private address book can also be used for aliases of hosts in your other address books.")%>
</p>
<center><img src="images/how.png" border="0" alt="address book working scheme" title="How the address book works" class="illustrate" /></center>
<center><img src="/themes/susidns/images/how.png" border="0" alt="address book working scheme" title="How the address book works" class="illustrate" /></center>
</div>
<hr>
<div id="footer">

View File

@ -43,12 +43,12 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=intl._("subscriptions")%> - susidns</title>
<link rel="stylesheet" type="text/css" href="css.css">
<link rel="stylesheet" type="text/css" href="<%=subs.getTheme()%>susidns.css">
</head>
<body>
<div class="page">
<div id="logo">
<a href="index"><img src="images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
<a href="index"><img src="<%=subs.getTheme()%>images/logo.png" alt="" title="<%=intl._("Overview")%>" border="0"/></a>
</div><hr>
<div id="navi">
<p>

View File

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

View File

@ -1,3 +1,37 @@
2012-07-16 str4d
* console: work towards better integration
- Wrapped the bundled apps in iFrames (with a link in the page header to
open the app in a new tab):
- i2ptunnel
- i2psnark
- susimail
- susidns
- Theme improvements
- Added theme support to susimail and susidns
- "susimail.theme=foo" in susimail.config
- "theme=foo" on susidns config page
- Extensive work on dark console theme (dr|z3d)
- Improved integration of i2ptunnel in iframe
- General improvements
- New dark themes for i2psnark, susimail and susidns which integrate well
with dark console theme (dr|z3d)
- Tweaks to other themes (console and i2psnark) to work with the various
structural changes (dr|z3d)
- Added per-theme favicons
- Updated IE shim to fix some issues
- Summary bar improvements
- Updated every console page to use Ajax for the summary bar
- Falls back to iFrame if JS disabled
- Ajax refresh time is adjustable
- The summary bar is now customizable; sections can be added, removed and
reordered as desired
- Added/updated tooltips
- Added a new summary bar section to show news headings when the main news
display is hidden
- Changes to structure of /home to bring it in line with rest of console
* i2psnark
- Reworked the torrent info/file manager page to improve the layout
2012-07-15 zzz
* XORComparator: Reduce object churn (Ticket #658)

View File

@ -9,7 +9,7 @@
<li class="tidylist"><b>Invisible Internet &amp; Public Web Browsing</b><br>On I2P you can access anonymous websites (eepsites) and other services (e.g. ssh over I2P, IRC, Jabber etc.) in addition to being able to host your own services. You can also access the normal web anonymously via I2P's built-in web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configure your browser</a> to use the HTTP proxy at <code>127.0.0.1 port 4444</code>, then browse to an eepsite or a normal, unencrypted <code>http://</code> address. If you wish to disable or change outproxy access to the normal internet, remove or modify the outproxy entry for <code>false.i2p</code> under the <i>Outproxies</i> option in the <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In the "Sites of Interest" section <a href="#eepsites">below</a>, we list a few of the sites hosted on I2P.</li>
<li class="tidylist"><b>Anonymous E-Mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/susimail/susimail">I2P's built-in mail client</a>
<li class="tidylist"><b>Anonymous E-Mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/webmail">I2P's built-in mail client</a>
(susimail) or using any mail client that supports smtp and pop3.
Accounts can send and receive mail from the normal internet. For an
account, visit <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Additionally, <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> is a new I2P-internal serverless, secure (end-to-end encrypted) e-mail system with an integrated anonymous/pseudonymous remailer, providing a web interface and a built-in addressbook. It is developed by HungryHobo, and can be installed as a <a href="#plugins">plugin</a>.</li>

View File

@ -25,7 +25,7 @@
kompatibel zu normalen Email-Klienten (POP3/SMTP) ist, und welches es erlaubt,
Emails innerhalb von I2P sowie Emails von und ins normale Internet zu
schicken. Hole Dir Dein Emailkonto auf <a href="http://hq.postman.i2p/">hq.postman.i2p</a>.
Im Verbund damit gibt es <a href="/susimail/susimail">susimail</a>, einen
Im Verbund damit gibt es <a href="/webmail">susimail</a>, einen
browserbasierten anonymen POP3/SMTP-Klienten, fertig eingerichtet
f&uuml;r Postmans Email-Service.
<br>Oder probier unser neues serverloses und Ende-zu-Ende-verschl&uuml;sseltes Emailsystem <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a> (mit Webinterface) aus, welches als Plugin erh&auml;ltlich ist!</li>

View File

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

View File

@ -34,7 +34,7 @@ mandataire <code>127.0.0.1 sur le port 4444</code>, puis promenez-vous sur les s
<a href="#eepsites">ci-dessous</a>, vous trouverez notre petite sélection de sites hébergés sur I2P.</li>
<li class="tidylist"><b>Messagerie anonyme</b><br>Le système de messagerie basé sur I2P de Postman est utilisable soit
par le <a href="/susimail/susimail">client de messagerie I2P intégré</a> dans la console du routeur (susimail), soit en
par le <a href="/webmail">client de messagerie I2P intégré</a> dans la console du routeur (susimail), soit en
configurant n'importe quel logiciel client de messagerie compatible SMTP et POP3. Les comptes peuvent recevoir et
envoyer du courrier de/vers l'Internet normal. Créez au moins votre compte sur
<a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. En complément,

View File

@ -9,7 +9,7 @@
<li class="tidylist"><b>Invisible Internet &amp; Public Web Browsing</b><br>Op I2P kan je toegang verkrijgen tot anonieme websites (eepsites) en andere diensten (zoals; SSH over I2P, IRC, Jabber etc.), daarnaast heb je ook de mogelijkheid om je eigen dienst aan te bieden. Je kan ook anoniem toegang krijgen tot het normale Internet via de ingebouwde web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configureer je browser</a> voor het gebruik van de HTTP proxy op <code>127.0.0.1 poort 4444</code>, waarna je naar zowel eepsites als normale, onversleutelde <code>http://</code> websites kan surfen. Als je een aanpassing wilt maken aan de outproxy of deze wilt uitschakelen kan je de 'client tunnel' voor <code>false.i2p</code> onder het <i>Outproxies</i> gedeelte in de <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In het "Interessante websites" gedeelte <a href="#eepsites">hier onder</a> staat een lijst met een paar van de bekende sites die op I2P gehost worden.</li>
<li class="tidylist"><b>Anonieme E-Mail</b><br>Postman's I2P email systeem kan worden benaderd via <a href="/susimail/susimail">de ingebouwde email client</a>
<li class="tidylist"><b>Anonieme E-Mail</b><br>Postman's I2P email systeem kan worden benaderd via <a href="/webmail">de ingebouwde email client</a>
(susimail) of door het gebruik van elke andere normale email client die ondersteuning biedt voor SMTP en POP3.
Deze accounts kunnen tevens email versturen en ontvangen naar en van het normale Internet. Voor een account, bezoek <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Daarnaast is er <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a>, dit is een nieuw end-to-end versleuteld email systeem zonder centrale servers welke een webinterface en geïntegreerd adressen boek bied. Het is ontwikkeld door HungryHobo en kan worden geïnstalleerd als <a href="#plugins">plugin</a>.</li>

View File

@ -17,7 +17,7 @@
<li class="tidylist"><b>navegar na internet</b> - I2P dispõe de um "outproxy" http - para usâ-lo, tamb&eacute;m pode empregar o proxy http no porto 4444 - Se configurar o seu navegador web para usar este proxy, pode visitar as p&aacute;ginas web de maneira anônima e o trânsito ser&aacute; roteado atravez da rede I2P.</li>
<li class="tidylist"><b>trocar dados</b> - Ha uma <a href="i2psnark/">adaptação</a> para I2P da aplicação <a href="http://www.bittorrent.com/">BitTorrent</a>
<a href="http://www.klomp.org/snark/">Snark</a>.</li>
<li class="tidylist"><b>correio eletrônico anônimo</b> - O Postman fez um sistema de correio eletrônico que é compatível com as aplicações de correio eletrônico comunes (POP3/SMTP), o qual permite de enviar correios eletrônicos tanto dentro de I2P como também receber e mandar correios desde a / para a internet. Pode registrar a sua conta aqui: <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. Junto com isso temos <a href="/susimail/susimail">susimail</a>, um cliente anônimo de correio que se abre com o navegador web. Já est&aacute; configurado para o servício de Postman.<br>Tamb&eacute;m lhe recomendamos o nosso novo sistema de correio eletrônico sem servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe em forma de um plugin. Vem com uma interface web e criptografa todas as mensagens de final a final.</li>
<li class="tidylist"><b>correio eletrônico anônimo</b> - O Postman fez um sistema de correio eletrônico que é compatível com as aplicações de correio eletrônico comunes (POP3/SMTP), o qual permite de enviar correios eletrônicos tanto dentro de I2P como também receber e mandar correios desde a / para a internet. Pode registrar a sua conta aqui: <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. Junto com isso temos <a href="/webmail">susimail</a>, um cliente anônimo de correio que se abre com o navegador web. Já est&aacute; configurado para o servício de Postman.<br>Tamb&eacute;m lhe recomendamos o nosso novo sistema de correio eletrônico sem servidor <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a>, que existe em forma de um plugin. Vem com uma interface web e criptografa todas as mensagens de final a final.</li>
<li class="tidylist"><b>bate-papo anônimo</b> - Lance o seu cliente IRC preferido e con&eacute;cte-se com o servidor anônimamente en
<b>127.0.0.1 porto 6668</b>. Isto lhe levar&aacute; a um dos dois servidores anônimos de IRC oficiales em I2P
- e nem você nem os outros usuários sabrão quem é o outro, nem mesmo o administrador do servidor!</li>

View File

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

View File

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

View File

@ -216,6 +216,10 @@ div.routersummary h3 a, div.routersummary h4 a {
text-decoration: none;
}
div.routersummary ul {
text-align: left !important;
}
div.routersummary table {
border: 0;
text-align: center !important;
@ -234,6 +238,16 @@ div.routersummary tr {
border: 0 !important;
}
div.newsheadings {
text-align: right;
margin: 0 0 0 10px;
}
div.newsheadings li {
list-style: none outside url('images/newsbullet_mini.png');
margin: 0 -4px 2px 8px;
}
div.tunnels table {
margin: 0 -7px !important;
width: 193px;
@ -501,6 +515,45 @@ div.configure h2:first-child {
margin-top: 15px;
}
.sidebarconf input[type="image"] {
margin: 2px;
padding: 1px;
}
.sidebarconf th:nth-child(1) {
text-align: center;
}
.sidebarconf th:nth-child(2) {
text-align: left;
}
.sidebarconf td:first-child {
width: 60px;
text-align: right;
padding-right: 50px;
}
.sidebarconf td {
font-weight: bold;
font-size: 9pt;
}
.sidebarconf td:nth-child(3), .sidebarconf td:nth-child(4) {
width: 70px;
padding: 0;
}
.sidebarconf td:nth-child(3) {
text-align: right;
padding-left: 50px;
}
.sidebarconf td:nth-child(4) {
text-align: left;
padding-right: 50px;
}
.topshimten {
margin-top: 15px;
margin-bottom: 15px;
@ -543,13 +596,24 @@ h1 {
line-height: 93%;
text-transform: uppercase;
letter-spacing: 0.3em;
background: #fff;
background: #fff url(images/titlebg.png) center right no-repeat !important;
min-width: 500px;
-moz-border-radius: 0 3px 0 0;
-khtml-border-radius: 0 3px 0 0;
border-radius: 0 3px 0 0;
}
span.newtab {
text-align: right;
font-size: 8pt;
float: right;
letter-spacing: 0;
}
/* opera targetted hack */
x:-o-prefocus, span.newtab {
margin-top: -25px;
}
h2 {
font-size: 14pt;
padding: 10px;

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

View File

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

View File

@ -0,0 +1,91 @@
/* I2P Theme: Camo aka Dark - Arabic override */
/* Description: Military Grade. */
/* Comment: Thanks to Florian Kuhlmann for the hatface images. [http://www.flickr.com/photos/floriankuhlmann/] */
/* Author: dr|z3d */
body {
direction: rtl;
}
div.main li {
margin: 5px 20px;
text-align: right;
line-height: 150%;
}
table {
direction: rtl;
}
td {
text-align: right;
}
div.news {
margin: -1px 205px 0px 5px;
direction: ltr;
}
div.main {
margin: -1px 205px 5px 5px;
background: url("images/scarface.jpg") no-repeat scroll left bottom #000000 !important;
}
h1 {
margin: 0 205px 0 5px !important;
}
h1,h2,h3,h4 {
direction: rtl;
text-align: right;
}
div.routersummary h3 {
text-align: center;
}
div.routersummary td:last-child {
text-align: left;
margin-left: 3px;
}
div.tunnels {
padding: -3px 0 !important;
}
div.tunnels table {
margin: 0 -7px 0 5px !important;
}
.langbox {
float: left;
text-align: left;
}
.formaction {
text-align: left;
}
form {
text-align: right;
}
div.routersummary form {
text-align: center;
}
.cells {
text-align: center;
}
div.joblog li, div.newsheadings li {
text-align: left;
direction: ltr;
}
span.newtab {
text-align: left;
font-size: 8pt;
float: left;
letter-spacing: 0;
}

View File

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

View File

@ -92,6 +92,16 @@
#tunnelListPage .footer .control {
margin-left: 2px;
color: #494 !important;
background: #000 !important;
}
#tunnelListPage .footer .control:hover {
color: #F60 !important;
}
#tunnelListPage .footer .control:active {
color: #EE9 !important;
}
#tunnelListPage .footer label {
@ -102,6 +112,7 @@
margin-top: 6px;
margin-right: 5px;
}
/* Use Leary and Langridge content replacement methods (LIR)
** to embed accessibility information into the document.
** Should allow the lists to be rendered nicely by

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

View File

@ -182,6 +182,10 @@ div.routersummary h4 {
box-shadow: 0px 0px 1px 1px #bdf;
}
div.routersummary ul {
text-align: left !important;
}
div.routersummary table {
border: 0;
text-align: center !important;
@ -239,6 +243,16 @@ div.routersummary img:hover:first-child {
opacity: 1;
}
div.newsheadings {
text-align: right;
margin: 0 0 0 10px;
}
div.newsheadings li {
list-style: none outside url('images/newsbullet_mini.png');
margin: 0 -4px 2px 8px;
}
div.tunnels {
margin-top: 6px !important;
margin-left: -2px !important;
@ -495,6 +509,45 @@ div.configure h3, div.graphspanel h3 {
text-align: left;
}
.sidebarconf input[type="image"] {
margin: 2px;
padding: 1px;
}
.sidebarconf th:nth-child(1) {
text-align: center;
}
.sidebarconf th:nth-child(2) {
text-align: left;
}
.sidebarconf td:first-child {
width: 60px;
text-align: right;
padding-right: 50px;
}
.sidebarconf td {
font-weight: bold;
font-size: 9pt;
}
.sidebarconf td:nth-child(3), .sidebarconf td:nth-child(4) {
width: 70px;
padding: 0;
}
.sidebarconf td:nth-child(3) {
text-align: right;
padding-left: 50px;
}
.sidebarconf td:nth-child(4) {
text-align: left;
padding-right: 50px;
}
div.graphspanel {
text-align: center !important;
margin: 15px 0px -15px;
@ -844,6 +897,18 @@ h1 {
min-width: 500px;
}
span.newtab {
text-align: right;
font-size: 8pt;
float: right;
letter-spacing: 0;
}
/* opera targetted hack */
x:-o-prefocus, span.newtab {
margin-top: -25px;
}
h2 {
font-size: 13pt;
color: #115;

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