forked from I2P_Developers/i2p.i2p
* Console: Show unavailable crypto on /logs
* Router: Log warnings for unavailable crypto at startup
This commit is contained in:
@ -9,6 +9,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.i2p.I2PAppContext;
|
import net.i2p.I2PAppContext;
|
||||||
|
import net.i2p.crypto.SigType;
|
||||||
import net.i2p.util.FileUtil;
|
import net.i2p.util.FileUtil;
|
||||||
import net.i2p.util.VersionComparator;
|
import net.i2p.util.VersionComparator;
|
||||||
|
|
||||||
@ -29,6 +30,17 @@ public class LogsHelper extends HelperBase {
|
|||||||
return Server.getVersion();
|
return Server.getVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @since 0.9.15 */
|
||||||
|
public String getUnavailableCrypto() {
|
||||||
|
StringBuilder buf = new StringBuilder(128);
|
||||||
|
for (SigType t : SigType.values()) {
|
||||||
|
if (!t.isAvailable()) {
|
||||||
|
buf.append("<b>Crypto:</b> ").append(t.toString()).append(" unavailable<br>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does not call logManager.flush(); call getCriticalLogs() first to flush
|
* Does not call logManager.flush(); call getCriticalLogs() first to flush
|
||||||
*/
|
*/
|
||||||
|
@ -60,9 +60,10 @@
|
|||||||
<p>
|
<p>
|
||||||
<b>I2P version:</b> <%=net.i2p.router.RouterVersion.FULL_VERSION%><br>
|
<b>I2P version:</b> <%=net.i2p.router.RouterVersion.FULL_VERSION%><br>
|
||||||
<b>Java version:</b> <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)<br>
|
<b>Java version:</b> <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)<br>
|
||||||
<b>Wrapper version:</b> <%=System.getProperty("wrapper.version", "none")%><br>
|
|
||||||
<jsp:useBean class="net.i2p.router.web.LogsHelper" id="logsHelper" scope="request" />
|
<jsp:useBean class="net.i2p.router.web.LogsHelper" id="logsHelper" scope="request" />
|
||||||
<jsp:setProperty name="logsHelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
<jsp:setProperty name="logsHelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||||
|
<jsp:getProperty name="logsHelper" property="unavailableCrypto" />
|
||||||
|
<b>Wrapper version:</b> <%=System.getProperty("wrapper.version", "none")%><br>
|
||||||
<b>Server version:</b> <jsp:getProperty name="logsHelper" property="jettyVersion" /><br>
|
<b>Server version:</b> <jsp:getProperty name="logsHelper" property="jettyVersion" /><br>
|
||||||
<b>Servlet version:</b> <%=getServletInfo()%><br>
|
<b>Servlet version:</b> <%=getServletInfo()%><br>
|
||||||
<b>Platform:</b> <%=System.getProperty("os.name")%> <%=System.getProperty("os.arch")%> <%=System.getProperty("os.version")%><br>
|
<b>Platform:</b> <%=System.getProperty("os.name")%> <%=System.getProperty("os.arch")%> <%=System.getProperty("os.version")%><br>
|
||||||
|
@ -24,16 +24,18 @@
|
|||||||
<p>
|
<p>
|
||||||
<b>I2P version:</b> <%=net.i2p.router.RouterVersion.FULL_VERSION%><br>
|
<b>I2P version:</b> <%=net.i2p.router.RouterVersion.FULL_VERSION%><br>
|
||||||
<b>Java version:</b> <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)<br>
|
<b>Java version:</b> <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)<br>
|
||||||
<b>Wrapper version:</b> <%=System.getProperty("wrapper.version", "none")%><br>
|
|
||||||
<jsp:useBean class="net.i2p.router.web.LogsHelper" id="logsHelper" scope="request" />
|
<jsp:useBean class="net.i2p.router.web.LogsHelper" id="logsHelper" scope="request" />
|
||||||
<jsp:setProperty name="logsHelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
<jsp:setProperty name="logsHelper" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
|
||||||
|
<jsp:getProperty name="logsHelper" property="unavailableCrypto" />
|
||||||
|
<b>Wrapper version:</b> <%=System.getProperty("wrapper.version", "none")%><br>
|
||||||
<b>Server version:</b> <jsp:getProperty name="logsHelper" property="jettyVersion" /><br>
|
<b>Server version:</b> <jsp:getProperty name="logsHelper" property="jettyVersion" /><br>
|
||||||
<b>Servlet version:</b> <%=getServletInfo()%><br>
|
<b>Servlet version:</b> <%=getServletInfo()%><br>
|
||||||
<b>Platform:</b> <%=System.getProperty("os.name")%> <%=System.getProperty("os.arch")%> <%=System.getProperty("os.version")%><br>
|
<b>Platform:</b> <%=System.getProperty("os.name")%> <%=System.getProperty("os.arch")%> <%=System.getProperty("os.version")%><br>
|
||||||
<b>Processor:</b> <%=net.i2p.util.NativeBigInteger.cpuModel()%> (<%=net.i2p.util.NativeBigInteger.cpuType()%>)<br>
|
<b>Processor:</b> <%=net.i2p.util.NativeBigInteger.cpuModel()%> (<%=net.i2p.util.NativeBigInteger.cpuType()%>)<br>
|
||||||
<b>Jbigi:</b> <%=net.i2p.util.NativeBigInteger.loadStatus()%><br>
|
<b>Jbigi:</b> <%=net.i2p.util.NativeBigInteger.loadStatus()%><br>
|
||||||
<b>Encoding:</b> <%=System.getProperty("file.encoding")%><br>
|
<b>Encoding:</b> <%=System.getProperty("file.encoding")%><br>
|
||||||
<b>Charset:</b> <%=java.nio.charset.Charset.defaultCharset().name()%></p>
|
<b>Charset:</b> <%=java.nio.charset.Charset.defaultCharset().name()%><br>
|
||||||
|
</p>
|
||||||
<p><%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%></p>
|
<p><%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%></p>
|
||||||
<h3><%=intl._("Critical Logs")%></h3><a name="criticallogs"> </a>
|
<h3><%=intl._("Critical Logs")%></h3><a name="criticallogs"> </a>
|
||||||
<jsp:getProperty name="logsHelper" property="criticalLogs" />
|
<jsp:getProperty name="logsHelper" property="criticalLogs" />
|
||||||
|
@ -26,6 +26,7 @@ public abstract class SystemVersion {
|
|||||||
|
|
||||||
private static final boolean _oneDotSix;
|
private static final boolean _oneDotSix;
|
||||||
private static final boolean _oneDotSeven;
|
private static final boolean _oneDotSeven;
|
||||||
|
private static final boolean _oneDotEight;
|
||||||
private static final int _androidSDK;
|
private static final int _androidSDK;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@ -60,9 +61,11 @@ public abstract class SystemVersion {
|
|||||||
if (_isAndroid) {
|
if (_isAndroid) {
|
||||||
_oneDotSix = _androidSDK >= 9;
|
_oneDotSix = _androidSDK >= 9;
|
||||||
_oneDotSeven = _androidSDK >= 19;
|
_oneDotSeven = _androidSDK >= 19;
|
||||||
|
_oneDotEight = false;
|
||||||
} else {
|
} else {
|
||||||
_oneDotSix = VersionComparator.comp(System.getProperty("java.version"), "1.6") >= 0;
|
_oneDotSix = VersionComparator.comp(System.getProperty("java.version"), "1.6") >= 0;
|
||||||
_oneDotSeven = VersionComparator.comp(System.getProperty("java.version"), "1.7") >= 0;
|
_oneDotSeven = _oneDotSix && VersionComparator.comp(System.getProperty("java.version"), "1.7") >= 0;
|
||||||
|
_oneDotEight = _oneDotSeven && VersionComparator.comp(System.getProperty("java.version"), "1.8") >= 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,6 +130,15 @@ public abstract class SystemVersion {
|
|||||||
return _oneDotSeven;
|
return _oneDotSeven;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return true if Java 1.8 or higher, false for Android.
|
||||||
|
* @since 0.9.15
|
||||||
|
*/
|
||||||
|
public static boolean isJava8() {
|
||||||
|
return _oneDotEight;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This isn't always correct.
|
* This isn't always correct.
|
||||||
* http://stackoverflow.com/questions/807263/how-do-i-detect-which-kind-of-jre-is-installed-32bit-vs-64bit
|
* http://stackoverflow.com/questions/807263/how-do-i-detect-which-kind-of-jre-is-installed-32bit-vs-64bit
|
||||||
|
@ -317,6 +317,7 @@ public class Router implements RouterClock.ClockShiftListener {
|
|||||||
if (f.exists())
|
if (f.exists())
|
||||||
SecureFileOutputStream.setPerms(f);
|
SecureFileOutputStream.setPerms(f);
|
||||||
}
|
}
|
||||||
|
CryptoChecker.warnUnavailableCrypto(_context);
|
||||||
|
|
||||||
_routerInfo = null;
|
_routerInfo = null;
|
||||||
_higherVersionSeen = false;
|
_higherVersionSeen = false;
|
||||||
|
77
router/java/src/net/i2p/router/tasks/CryptoChecker.java
Normal file
77
router/java/src/net/i2p/router/tasks/CryptoChecker.java
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
package net.i2p.router.tasks;
|
||||||
|
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
|
||||||
|
import net.i2p.crypto.SigType;
|
||||||
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.util.Log;
|
||||||
|
import net.i2p.util.SystemVersion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warn about unavailable crypto to router and wrapper logs
|
||||||
|
*
|
||||||
|
* @since 0.9.15
|
||||||
|
*/
|
||||||
|
public class CryptoChecker {
|
||||||
|
|
||||||
|
private static String JRE6 = "http://www.oracle.com/technetwork/java/javase/downloads/index.html";
|
||||||
|
private static String JRE7 = "http://www.oracle.com/technetwork/java/javase/documentation/java-se-7-doc-download-435117.html";
|
||||||
|
private static String JRE8 = "http://www.oracle.com/technetwork/java/javase/documentation/jdk8-doc-downloads-2133158.html";
|
||||||
|
|
||||||
|
public static void warnUnavailableCrypto(RouterContext ctx) {
|
||||||
|
if (SystemVersion.isAndroid())
|
||||||
|
return;
|
||||||
|
boolean unavail = false;
|
||||||
|
Log log = null;
|
||||||
|
for (SigType t : SigType.values()) {
|
||||||
|
if (!t.isAvailable()) {
|
||||||
|
if (!unavail) {
|
||||||
|
unavail = true;
|
||||||
|
log = ctx.logManager().getLog(CryptoChecker.class);
|
||||||
|
}
|
||||||
|
String s = "Crypto " + t + " is not available";
|
||||||
|
log.logAlways(log.WARN, s);
|
||||||
|
System.out.println("Warning: " + s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (unavail) {
|
||||||
|
if (!SystemVersion.isJava7()) {
|
||||||
|
String s = "Java version: " + System.getProperty("java.version") + " Please consider upgrading to Java 7";
|
||||||
|
log.logAlways(log.WARN, s);
|
||||||
|
System.out.println(s);
|
||||||
|
}
|
||||||
|
if (!isUnlimited()) {
|
||||||
|
String s = "Please consider installing the Java Cryptography Unlimited Strength Jurisdiction Policy Files from ";
|
||||||
|
if (SystemVersion.isJava8())
|
||||||
|
s += JRE8;
|
||||||
|
else if (SystemVersion.isJava7())
|
||||||
|
s += JRE7;
|
||||||
|
else
|
||||||
|
s += JRE6;
|
||||||
|
log.logAlways(log.WARN, s);
|
||||||
|
System.out.println(s);
|
||||||
|
}
|
||||||
|
String s = "This crypto will be required in a future release";
|
||||||
|
log.logAlways(log.WARN, s);
|
||||||
|
System.out.println("Warning: " + s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Following code adapted from Orchid
|
||||||
|
* According to http://www.subgraph.com/orchid.html ,
|
||||||
|
* "Orchid is licensed under a three-clause BSD license."
|
||||||
|
*/
|
||||||
|
private static boolean isUnlimited() {
|
||||||
|
try {
|
||||||
|
if (Cipher.getMaxAllowedKeyLength("AES") < 256)
|
||||||
|
return false;
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
return false;
|
||||||
|
} catch (NoSuchMethodError e) {
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user