forked from I2P_Developers/i2p.i2p
* Added support for 'dynamic keys' mode, where the router creates a new
router identity whenever it detects a substantial change in its public
address (read: SSU IP or port). This only offers minimal additional
protection against trivial attackers, but should provide functional
improvement for people who have periodic IP changes, since their new
router address would not be shitlisted while their old one would be.
* Added further infrastructure for restricted route operation, but its use
is not recommended.
220 lines
8.0 KiB
Java
220 lines
8.0 KiB
Java
package net.i2p.router.web;
|
|
|
|
import net.i2p.time.Timestamper;
|
|
import net.i2p.router.RouterContext;
|
|
import net.i2p.router.CommSystemFacade;
|
|
import net.i2p.data.RouterAddress;
|
|
import net.i2p.router.transport.udp.UDPAddress;
|
|
import net.i2p.router.transport.udp.UDPTransport;
|
|
import net.i2p.router.Router;
|
|
|
|
public class ConfigNetHelper {
|
|
private RouterContext _context;
|
|
/**
|
|
* Configure this bean to query a particular router context
|
|
*
|
|
* @param contextId begging few characters of the routerHash, or null to pick
|
|
* the first one we come across.
|
|
*/
|
|
public void setContextId(String contextId) {
|
|
try {
|
|
_context = ContextHelper.getContext(contextId);
|
|
} catch (Throwable t) {
|
|
t.printStackTrace();
|
|
}
|
|
}
|
|
|
|
public ConfigNetHelper() {}
|
|
|
|
/** copied from various private TCP components */
|
|
public final static String PROP_I2NP_TCP_HOSTNAME = "i2np.tcp.hostname";
|
|
public final static String PROP_I2NP_TCP_PORT = "i2np.tcp.port";
|
|
public final static String PROP_I2NP_UDP_PORT = "i2np.udp.port";
|
|
public final static String PROP_I2NP_INTERNAL_UDP_PORT = "i2np.udp.internalPort";
|
|
|
|
public String getHostname() {
|
|
return _context.getProperty(PROP_I2NP_TCP_HOSTNAME);
|
|
}
|
|
public String getTcpPort() {
|
|
int port = 8887;
|
|
String val = _context.getProperty(PROP_I2NP_TCP_PORT);
|
|
if (val != null) {
|
|
try {
|
|
port = Integer.parseInt(val);
|
|
} catch (NumberFormatException nfe) {
|
|
// ignore, use default from above
|
|
}
|
|
}
|
|
return "" + port;
|
|
}
|
|
|
|
public String getUdpAddress() {
|
|
RouterAddress addr = _context.router().getRouterInfo().getTargetAddress("SSU");
|
|
if (addr == null)
|
|
return "unknown";
|
|
UDPAddress ua = new UDPAddress(addr);
|
|
return ua.toString();
|
|
}
|
|
|
|
public String getEnableTimeSyncChecked() {
|
|
String disabled = _context.getProperty(Timestamper.PROP_DISABLED, "false");
|
|
if ( (disabled != null) && ("true".equalsIgnoreCase(disabled)) )
|
|
return "";
|
|
else
|
|
return " checked ";
|
|
}
|
|
|
|
public String getHiddenModeChecked() {
|
|
String enabled = _context.getProperty(Router.PROP_HIDDEN, "false");
|
|
if ( (enabled != null) && ("true".equalsIgnoreCase(enabled)) )
|
|
return " checked ";
|
|
else
|
|
return "";
|
|
}
|
|
|
|
public String getDynamicKeysChecked() {
|
|
String enabled = _context.getProperty(Router.PROP_DYNAMIC_KEYS, "false");
|
|
if ( (enabled != null) && ("true".equalsIgnoreCase(enabled)) )
|
|
return " checked ";
|
|
else
|
|
return "";
|
|
}
|
|
|
|
public String getRequireIntroductionsChecked() {
|
|
short status = _context.commSystem().getReachabilityStatus();
|
|
switch (status) {
|
|
case CommSystemFacade.STATUS_OK:
|
|
if ("true".equalsIgnoreCase(_context.getProperty(UDPTransport.PROP_FORCE_INTRODUCERS, "false")))
|
|
return "checked=\"true\"";
|
|
return "";
|
|
case CommSystemFacade.STATUS_DIFFERENT:
|
|
case CommSystemFacade.STATUS_REJECT_UNSOLICITED:
|
|
return "checked=\"true\"";
|
|
case CommSystemFacade.STATUS_UNKNOWN:
|
|
if ("true".equalsIgnoreCase(_context.getProperty(UDPTransport.PROP_FORCE_INTRODUCERS, "false")))
|
|
return "checked=\"true\"";
|
|
return "";
|
|
default:
|
|
return "checked=\"true\"";
|
|
}
|
|
}
|
|
|
|
public static final String PROP_INBOUND_KBPS = "i2np.bandwidth.inboundKBytesPerSecond";
|
|
public static final String PROP_OUTBOUND_KBPS = "i2np.bandwidth.outboundKBytesPerSecond";
|
|
public static final String PROP_INBOUND_BURST_KBPS = "i2np.bandwidth.inboundBurstKBytesPerSecond";
|
|
public static final String PROP_OUTBOUND_BURST_KBPS = "i2np.bandwidth.outboundBurstKBytesPerSecond";
|
|
public static final String PROP_INBOUND_BURST = "i2np.bandwidth.inboundBurstKBytes";
|
|
public static final String PROP_OUTBOUND_BURST = "i2np.bandwidth.outboundBurstKBytes";
|
|
public static final String PROP_SHARE_PERCENTAGE = "router.sharePercentage";
|
|
public static final int DEFAULT_SHARE_PERCENTAGE = 80;
|
|
|
|
public String getInboundRate() {
|
|
String rate = _context.getProperty(PROP_INBOUND_KBPS);
|
|
if (rate != null)
|
|
return rate;
|
|
else
|
|
return "16";
|
|
}
|
|
public String getOutboundRate() {
|
|
String rate = _context.getProperty(PROP_OUTBOUND_KBPS);
|
|
if (rate != null)
|
|
return rate;
|
|
else
|
|
return "16";
|
|
}
|
|
public String getInboundBurstRate() {
|
|
String rate = _context.getProperty(PROP_INBOUND_BURST_KBPS);
|
|
if (rate != null)
|
|
return rate;
|
|
else
|
|
return "32";
|
|
}
|
|
public String getOutboundBurstRate() {
|
|
String rate = _context.getProperty(PROP_OUTBOUND_BURST_KBPS);
|
|
if (rate != null)
|
|
return rate;
|
|
else
|
|
return "32";
|
|
}
|
|
public String getInboundBurstFactorBox() {
|
|
String rate = _context.getProperty(PROP_INBOUND_KBPS);
|
|
String burst = _context.getProperty(PROP_INBOUND_BURST);
|
|
int numSeconds = 1;
|
|
if ( (burst != null) && (rate != null) ) {
|
|
int rateKBps = 0;
|
|
int burstKB = 0;
|
|
try {
|
|
rateKBps = Integer.parseInt(rate);
|
|
burstKB = Integer.parseInt(burst);
|
|
} catch (NumberFormatException nfe) {
|
|
// ignore
|
|
}
|
|
if ( (rateKBps > 0) && (burstKB > 0) ) {
|
|
numSeconds = burstKB / rateKBps;
|
|
}
|
|
}
|
|
return getBurstFactor(numSeconds, "inboundburstfactor");
|
|
}
|
|
|
|
public String getOutboundBurstFactorBox() {
|
|
String rate = _context.getProperty(PROP_OUTBOUND_KBPS);
|
|
String burst = _context.getProperty(PROP_OUTBOUND_BURST);
|
|
int numSeconds = 1;
|
|
if ( (burst != null) && (rate != null) ) {
|
|
int rateKBps = 0;
|
|
int burstKB = 0;
|
|
try {
|
|
rateKBps = Integer.parseInt(rate);
|
|
burstKB = Integer.parseInt(burst);
|
|
} catch (NumberFormatException nfe) {
|
|
// ignore
|
|
}
|
|
if ( (rateKBps > 0) && (burstKB > 0) ) {
|
|
numSeconds = burstKB / rateKBps;
|
|
}
|
|
}
|
|
return getBurstFactor(numSeconds, "outboundburstfactor");
|
|
}
|
|
|
|
private static String getBurstFactor(int numSeconds, String name) {
|
|
StringBuffer buf = new StringBuffer(256);
|
|
buf.append("<select name=\"").append(name).append("\">\n");
|
|
boolean found = false;
|
|
for (int i = 10; i <= 60; i += 10) {
|
|
buf.append("<option value=\"").append(i).append("\" ");
|
|
if (i == numSeconds) {
|
|
buf.append("selected ");
|
|
found = true;
|
|
} else if ( (i == 60) && (!found) ) {
|
|
buf.append("selected ");
|
|
}
|
|
buf.append(">");
|
|
buf.append(i).append(" seconds</option>\n");
|
|
}
|
|
buf.append("</select>\n");
|
|
return buf.toString();
|
|
}
|
|
|
|
public String getSharePercentageBox() {
|
|
String pctStr = _context.getProperty(PROP_SHARE_PERCENTAGE);
|
|
int pct = DEFAULT_SHARE_PERCENTAGE;
|
|
if (pctStr != null)
|
|
try { pct = Integer.parseInt(pctStr); } catch (NumberFormatException nfe) {}
|
|
StringBuffer buf = new StringBuffer(256);
|
|
buf.append("<select name=\"sharePercentage\">\n");
|
|
boolean found = false;
|
|
for (int i = 30; i <= 100; i += 10) {
|
|
buf.append("<option value=\"").append(i).append("\" ");
|
|
if (pct == i) {
|
|
buf.append("selected=\"true\" ");
|
|
found = true;
|
|
} else if ( (i == DEFAULT_SHARE_PERCENTAGE) && (!found) ) {
|
|
buf.append("selected=\"true\" ");
|
|
}
|
|
buf.append(">Up to ").append(i).append("%</option>\n");
|
|
}
|
|
buf.append("</select>\n");
|
|
return buf.toString();
|
|
}
|
|
}
|