*) added the only changes from r7557 which actualy made sense

*) caught potential exception (occured when user entered a string which did not contain digits only for the maximum number of lines)
*) use prop.putHTML to avoid potential XSS attack in case an attacker manages to cause something to end up in the logs which contains a string which was defined by the attacker

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@7562 6c8d7289-2bf4-0310-a012-ef5d649a1542
pull/1/head
low012 14 years ago
parent 27ecdb5444
commit 0da3b6489e

@ -1,124 +1,146 @@
//ViewLog_p.java //ViewLog_p.java
//----------------------- //-----------------------
//part of the AnomicHTTPD caching proxy //part of the AnomicHTTPD caching proxy
//(C) by Michael Peter Christen; mc@yacy.net //(C) by Michael Peter Christen; mc@yacy.net
//first published on http://www.anomic.de //first published on http://www.anomic.de
//Frankfurt, Germany, 2004 //Frankfurt, Germany, 2004
// //
//This File is contributed by Alexander Schier //This File is contributed by Alexander Schier
//last major change: 14.12.2004 //
// // $LastChangedDate$
//This program is free software; you can redistribute it and/or modify // $LastChangedRevision$
//it under the terms of the GNU General Public License as published by // $LastChangedBy$
//the Free Software Foundation; either version 2 of the License, or //
//(at your option) any later version. //This program is free software; you can redistribute it and/or modify
// //it under the terms of the GNU General Public License as published by
//This program is distributed in the hope that it will be useful, //the Free Software Foundation; either version 2 of the License, or
//but WITHOUT ANY WARRANTY; without even the implied warranty of //(at your option) any later version.
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
//GNU General Public License for more details. //This program is distributed in the hope that it will be useful,
// //but WITHOUT ANY WARRANTY; without even the implied warranty of
//You should have received a copy of the GNU General Public License //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//along with this program; if not, write to the Free Software //GNU General Public License for more details.
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//You must compile this file with //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//javac -classpath .:../classes ViewLog_p.java
//if the shell's current path is HTROOT
//You must compile this file with
import java.util.logging.Handler; //javac -classpath .:../classes ViewLog_p.java
import java.util.logging.Logger; //if the shell's current path is HTROOT
import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.logging.Handler;
import java.util.regex.PatternSyntaxException; import java.util.logging.Logger;
import java.util.regex.Matcher;
import net.yacy.cora.protocol.RequestHeader; import java.util.regex.Pattern;
import net.yacy.kelondro.logging.GuiHandler; import java.util.regex.PatternSyntaxException;
import net.yacy.kelondro.logging.Log;
import net.yacy.kelondro.logging.LogalizerHandler; import net.yacy.cora.protocol.RequestHeader;
import net.yacy.kelondro.logging.GuiHandler;
import de.anomic.server.serverObjects; import net.yacy.kelondro.logging.Log;
import de.anomic.server.serverSwitch; import net.yacy.kelondro.logging.LogalizerHandler;
public class ViewLog_p { import de.anomic.server.serverObjects;
import de.anomic.server.serverSwitch;
public static serverObjects respond(final RequestHeader header, final serverObjects post, final serverSwitch env) {
final serverObjects prop = new serverObjects(); public class ViewLog_p {
String[] log = new String[0];
boolean reversed = false; public static serverObjects respond(final RequestHeader header, final serverObjects post, final serverSwitch env) {
boolean json = false; final serverObjects prop = new serverObjects();
int maxlines = 400, lines = 200; String[] log = new String[0];
String filter = ".*.*"; boolean reversed = false;
boolean json = false;
if(post != null){ int maxlines = 400, lines = 200;
if(post.containsKey("mode") && (post.get("mode")).equals("reversed")){ /* Usually a regex like this would make no sense, ".*" would be
reversed=true; * sufficient, but ".*.*" makes it a little bit more convenient
} * for the user to input regexes like ".*FOO.*" in the HTML
if(post.containsKey("lines")){ * interface.
lines = Integer.parseInt(post.get("lines")); */
} String filter = ".*.*";
if(post.containsKey("filter")){
filter = post.get("filter"); if(post != null){
} reversed = (post.containsKey("mode") && "reversed".equals(post.get("mode")));
if(post.containsKey("json")){ json = post.containsKey("json");
json = true;
} if(post.containsKey("lines")){
} try {
lines = Integer.parseInt(post.get("lines"));
} catch (NumberFormatException e) {
final Logger logger = Logger.getLogger(""); Log.logException(e);
final Handler[] handlers = logger.getHandlers(); }
boolean displaySubmenu = false; }
for (int i=0; i<handlers.length; i++) {
if (handlers[i] instanceof GuiHandler) { if(post.containsKey("filter")){
maxlines = ((GuiHandler)handlers[i]).getSize(); filter = post.get("filter");
if (lines > maxlines) lines = maxlines; }
log = ((GuiHandler)handlers[i]).getLogLines(reversed,lines); }
} else if (handlers[i] instanceof LogalizerHandler) {
displaySubmenu = true;
} final Logger logger = Logger.getLogger("");
} final Handler[] handlers = logger.getHandlers();
boolean displaySubmenu = false;
prop.put("submenu", displaySubmenu ? "1" : "0"); for (final Handler handler : handlers) {
prop.put("reverseChecked", reversed ? "1" : "0"); if (handler instanceof GuiHandler) {
prop.put("lines", lines); maxlines = ((GuiHandler)handler).getSize();
prop.put("maxlines",maxlines); if (lines > maxlines) lines = maxlines;
prop.putHTML("filter", filter); log = ((GuiHandler)handler).getLogLines(reversed,lines);
} else if (handler instanceof LogalizerHandler) {
// trying to compile the regular expression filter expression displaySubmenu = true;
Matcher filterMatcher = null; }
try { }
final Pattern filterPattern = Pattern.compile(filter,Pattern.MULTILINE);
filterMatcher = filterPattern.matcher(""); prop.put("submenu", displaySubmenu ? "1" : "0");
} catch (final PatternSyntaxException e) { prop.put("reverseChecked", reversed ? "1" : "0");
Log.logException(e); prop.put("lines", lines);
} prop.put("maxlines",maxlines);
prop.putHTML("filter", filter);
int level = 0; // trying to compile the regular expression filter expression
int lc = 0; Matcher filterMatcher = null;
for (int i=0; i < log.length; i++) { try {
final String nextLogLine = log[i].trim(); final Pattern filterPattern = Pattern.compile(filter,Pattern.MULTILINE);
filterMatcher = filterPattern.matcher("");
if (filterMatcher != null) { } catch (final PatternSyntaxException e) {
filterMatcher.reset(nextLogLine); Log.logException(e);
if (!filterMatcher.find()) continue; }
}
if (nextLogLine.startsWith("E ")) level = 4; int level = 0;
else if (nextLogLine.startsWith("W ")) level = 3; int lc = 0;
else if (nextLogLine.startsWith("S ")) level = 2; for (final String logLine : log) {
else if (nextLogLine.startsWith("I ")) level = 1; final String nextLogLine = logLine.trim();
else if (nextLogLine.startsWith("D ")) level = 0;
prop.put("log_" + lc + "_level", level); if (filterMatcher != null) {
if (json) prop.putJSON("log_" + lc + "_line", nextLogLine); filterMatcher.reset(nextLogLine);
else prop.put("log_" + lc + "_line", nextLogLine); if (!filterMatcher.find()) continue;
lc++; }
}
prop.put("log", lc); if (nextLogLine.startsWith("E ")) {
level = 4;
// return rewrite properties } else if (nextLogLine.startsWith("W ")) {
return prop; level = 3;
} } else if (nextLogLine.startsWith("S ")) {
} level = 2;
} else if (nextLogLine.startsWith("I ")) {
level = 1;
} else if (nextLogLine.startsWith("D ")) {
level = 0;
}
prop.put("log_" + lc + "_level", level);
if (json) {
prop.putJSON("log_" + lc + "_line", nextLogLine);
} else {
prop.putHTML("log_" + lc + "_line", nextLogLine);
}
lc++;
}
prop.put("log", lc);
// return rewrite properties
return prop;
}
}

Loading…
Cancel
Save