diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java index 1343a88cd2..00aa01f246 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java @@ -63,6 +63,7 @@ public class LocaleWebAppHandler extends HandlerWrapper pathInContext = "/index.jsp"; } else if (pathInContext.indexOf("/", 1) < 0 && (!pathInContext.endsWith(".jsp")) && + (!pathInContext.endsWith(".log")) && (!pathInContext.endsWith(".txt"))) { // add .jsp to pages at top level pathInContext += ".jsp"; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java index 106c666733..80c2fc8db3 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java @@ -75,7 +75,7 @@ public class LogsHelper extends HelperBase { */ public String getLogs() { String str = formatMessages(_context.logManager().getBuffer().getMostRecentMessages()); - return "

" + _t("File location") + ": " + _context.logManager().currentFile() + "

" + str; + return "

" + _t("File location") + ": " + _context.logManager().currentFile() + "

" + str; } /** @@ -88,9 +88,11 @@ public class LogsHelper extends HelperBase { /** * Does not necessarily exist. - * @since 0.9.1 + * + * @return non-null, doesn't necessarily exist + * @since 0.9.1, public since 0.9.27 */ - static File wrapperLogFile(I2PAppContext ctx) { + public static File wrapperLogFile(I2PAppContext ctx) { File f = null; if (ctx.hasWrapper()) { String wv = System.getProperty("wrapper.version"); @@ -129,7 +131,7 @@ public class LogsHelper extends HelperBase { return "

" + _t("File not found") + ": " + f.getAbsolutePath() + "

"; } else { str = str.replace("&", "&").replace("<", "<").replace(">", ">"); - return "

" + _t("File location") + ": " + f.getAbsolutePath() + "

" + str + "
"; + return "

" + _t("File location") + ": " + f.getAbsolutePath() + "

" + str + "
"; } } diff --git a/apps/routerconsole/jsp/viewhistory.jsp b/apps/routerconsole/jsp/viewhistory.jsp index 41ae6de3bd..7319c9080d 100644 --- a/apps/routerconsole/jsp/viewhistory.jsp +++ b/apps/routerconsole/jsp/viewhistory.jsp @@ -1,4 +1,4 @@ -<% +<%@page pageEncoding="UTF-8"%><% /* * USE CAUTION WHEN EDITING * Trailing whitespace OR NEWLINE on the last line will cause @@ -8,6 +8,9 @@ */ response.setContentType("text/plain"); response.setHeader("X-Content-Type-Options", "nosniff"); +response.setDateHeader("Expires", 0); +response.addHeader("Cache-Control", "no-store, max-age=0, no-cache, must-revalidate"); +response.addHeader("Pragma", "no-cache"); String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath(); try { net.i2p.util.FileUtil.readFile("history.txt", base, response.getOutputStream()); diff --git a/apps/routerconsole/jsp/viewrouterlog.jsp b/apps/routerconsole/jsp/viewrouterlog.jsp new file mode 100644 index 0000000000..766f43852c --- /dev/null +++ b/apps/routerconsole/jsp/viewrouterlog.jsp @@ -0,0 +1,46 @@ +<%@page pageEncoding="UTF-8"%><% +/* + * USE CAUTION WHEN EDITING + * Trailing whitespace OR NEWLINE on the last line will cause + * IllegalStateExceptions !!! + * + * Do not tag this file for translation. + */ +net.i2p.I2PAppContext ctx = net.i2p.I2PAppContext.getGlobalContext(); +net.i2p.util.LogManager mgr = ctx.logManager(); +mgr.flush(); +java.io.File f = new java.io.File(mgr.currentFile()); +long length = f.length(); +if (length <= 0 || !f.isFile()) { + response.sendError(404, "Not Found"); +} else { + response.setContentType("text/plain"); + response.setHeader("X-Content-Type-Options", "nosniff"); + response.setHeader("Content-Length", Long.toString(length)); + response.setDateHeader("Expires", 0); + response.addHeader("Cache-Control", "no-store, max-age=0, no-cache, must-revalidate"); + response.addHeader("Pragma", "no-cache"); + java.io.InputStream in = null; + try { + in = new java.io.FileInputStream(f); + java.io.OutputStream bout = response.getOutputStream(); + int read = 0; + byte buf[] = new byte[4*1024]; + while ((read = in.read(buf)) != -1) { + bout.write(buf, 0, read); + } + } catch (java.io.IOException ioe) { + // prevent 'Committed' IllegalStateException from Jetty + if (!response.isCommitted()) { + response.sendError(403, ioe.toString()); + } else { + // not an error, happens when the browser closes the stream + // Jetty doesn't log this + throw ioe; + } + } finally { + if (in != null) + try { in.close(); } catch (java.io.IOException ioe) {} + } +} +%> \ No newline at end of file diff --git a/apps/routerconsole/jsp/viewwrapperlog.jsp b/apps/routerconsole/jsp/viewwrapperlog.jsp new file mode 100644 index 0000000000..9a60a09317 --- /dev/null +++ b/apps/routerconsole/jsp/viewwrapperlog.jsp @@ -0,0 +1,44 @@ +<%@page pageEncoding="UTF-8"%><% +/* + * USE CAUTION WHEN EDITING + * Trailing whitespace OR NEWLINE on the last line will cause + * IllegalStateExceptions !!! + * + * Do not tag this file for translation. + */ +net.i2p.I2PAppContext ctx = net.i2p.I2PAppContext.getGlobalContext(); +java.io.File f = net.i2p.router.web.LogsHelper.wrapperLogFile(ctx); +long length = f.length(); +if (length <= 0 || !f.isFile()) { + response.sendError(404, "Not Found"); +} else { + response.setContentType("text/plain"); + response.setHeader("X-Content-Type-Options", "nosniff"); + response.setHeader("Content-Length", Long.toString(length)); + response.setDateHeader("Expires", 0); + response.addHeader("Cache-Control", "no-store, max-age=0, no-cache, must-revalidate"); + response.addHeader("Pragma", "no-cache"); + java.io.InputStream in = null; + try { + in = new java.io.FileInputStream(f); + java.io.OutputStream bout = response.getOutputStream(); + int read = 0; + byte buf[] = new byte[4*1024]; + while ((read = in.read(buf)) != -1) { + bout.write(buf, 0, read); + } + } catch (java.io.IOException ioe) { + // prevent 'Committed' IllegalStateException from Jetty + if (!response.isCommitted()) { + response.sendError(403, ioe.toString()); + } else { + // not an error, happens when the browser closes the stream + // Jetty doesn't log this + throw ioe; + } + } finally { + if (in != null) + try { in.close(); } catch (java.io.IOException ioe) {} + } +} +%> \ No newline at end of file diff --git a/apps/routerconsole/jsp/web.xml b/apps/routerconsole/jsp/web.xml index 44e40c86e5..68680810aa 100644 --- a/apps/routerconsole/jsp/web.xml +++ b/apps/routerconsole/jsp/web.xml @@ -43,6 +43,16 @@ /history.txt + + net.i2p.router.web.jsp.viewrouterlog_jsp + /router.log + + + + net.i2p.router.web.jsp.viewwrapperlog_jsp + /wrapper.log + + 30 diff --git a/core/java/src/net/i2p/util/FileLogWriter.java b/core/java/src/net/i2p/util/FileLogWriter.java index eab30a8cd9..3b3df88c17 100644 --- a/core/java/src/net/i2p/util/FileLogWriter.java +++ b/core/java/src/net/i2p/util/FileLogWriter.java @@ -37,6 +37,7 @@ class FileLogWriter extends LogWriter { /** * File may not exist or have old logs in it if not opened yet + * @return non-null */ public synchronized String currentFile() { if (_currentFile != null) diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java index 22229a0d40..09ef6f3514 100644 --- a/core/java/src/net/i2p/util/LogManager.java +++ b/core/java/src/net/i2p/util/LogManager.java @@ -264,6 +264,10 @@ public class LogManager implements Flushable { loadConfig(); } + /** + * File may not exist or have old logs in it if not opened yet + * @return non-null + */ public String currentFile() { if (_writer == null) return ("No log file created yet"); diff --git a/core/java/src/net/i2p/util/LogWriter.java b/core/java/src/net/i2p/util/LogWriter.java index f2e52e3566..1b585fb386 100644 --- a/core/java/src/net/i2p/util/LogWriter.java +++ b/core/java/src/net/i2p/util/LogWriter.java @@ -37,7 +37,12 @@ abstract class LogWriter implements Runnable { _lastReadConfig = Clock.getInstance().now(); } + /** + * File may not exist or have old logs in it if not opened yet + * @return non-null + */ public abstract String currentFile(); + /** * Write the provided LogRecord to the writer. * @param rec the LogRecord to write.