%@ page contentType="text/html; charset=UTF-8" %> <%-- - - Copyright (C) 2004-2008 Jive Software, 2016-2025 Ignite Realtime Foundation. All rights reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. --%> <%@ page import="java.io.*, org.jivesoftware.util.*, java.text.*, java.net.URLEncoder, org.jivesoftware.util.JiveGlobals, org.jivesoftware.openfire.user.*, java.util.*" %> <%@ page import="org.apache.logging.log4j.Level" %> <%@ page import="java.util.stream.Collectors" %> <%@ page import="java.nio.charset.StandardCharsets" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <% admin.init(request, response, session, application, out ); %> <%! static final String NONE = LocaleUtils.getLocalizedString("global.none"); static final String ASCENDING = "asc"; static final String[] LINES = {"50","100","250","500"}; static final String[] REFRESHES = {NONE,"10","30","60","90"}; private static HashMap parseCookie(Cookie cookie) { if (cookie == null || cookie.getValue() == null) { return new HashMap<>(); } StringTokenizer tokenizer = new StringTokenizer(cookie.getValue(),"&"); HashMap valueMap = new HashMap<>(); while (tokenizer.hasMoreTokens()) { String tok = tokenizer.nextToken(); int pos = tok.indexOf("="); if (pos > 0) { String name = tok.substring(0,pos); String value = tok.substring(pos+1); valueMap.put(name,value); } } return valueMap; } private static void saveCookie(HttpServletResponse response, HashMap cookie) { final String value = cookie.entrySet().stream() .map(entry -> entry.getKey() + "=" + entry.getValue()) .collect(Collectors.joining("&")); Cookie newCookie = new Cookie("jiveforums.admin.logviewer", value); newCookie.setPath("/"); newCookie.setMaxAge(60*60*24*30); // one month response.addCookie(newCookie); } private static boolean hasLogfileChanged(HttpServletRequest request, HttpServletResponse response, File logDir) { // Get the cookie associated with the log files HashMap cookie = parseCookie(CookieUtils.getCookie(request,"jiveforums.admin.logviewer")); HashMap newCookie = new HashMap<>(); // Check for the value in the cookie: String key = "logfile.size"; long savedSize = 0L; if (cookie.containsKey(key)) { try { savedSize = Long.parseLong(cookie.get(key)); } catch (NumberFormatException nfe) { } } // Update the size in the Map: File logFile = new File(logDir, "openfire.log"); long currentSize = logFile.length(); newCookie.put(key, "" + currentSize); saveCookie(response, newCookie); return currentSize != savedSize; } %> <% // Get parameters String log = ParamUtils.getParameter(request, "log"); String numLinesParam = ParamUtils.getParameter(request,"lines"); int numLines = -1; if ( !("All".equals(numLinesParam)) ) { numLines = ParamUtils.getIntParameter(request,"lines",50); } String refreshParam = ParamUtils.getParameter(request,"refresh"); String mode = ParamUtils.getParameter(request,"mode"); boolean clearLog = ParamUtils.getBooleanParameter(request,"clearLog"); boolean markLog = ParamUtils.getBooleanParameter(request,"markLog"); boolean saveLog = ParamUtils.getBooleanParameter(request,"saveLog"); boolean emailLog = ParamUtils.getBooleanParameter(request,"emailLog"); boolean traceEnabled = ParamUtils.getBooleanParameter(request,"traceEnabled"); Cookie csrfCookie = CookieUtils.getCookie(request, "csrf"); String csrfParam = ParamUtils.getParameter(request, "csrf"); // Enable/disable trace logging if (request.getParameter("traceEnabled") != null && traceEnabled != Log.getRootLogLevel().isLessSpecificThan(Level.TRACE)) { if (!(csrfCookie == null || csrfParam == null || !csrfCookie.getValue().equals(csrfParam))) { Log.TRACE_ENABLED.setValue(traceEnabled); // Log the event admin.logEvent((traceEnabled ? "enabled" : "disabled")+" trace logging", null); response.sendRedirect("logviewer.jsp"); return; } } // Sanitize variables to prevent vulnerabilities if (log != null) { log = StringUtils.escapeHTMLTags(log); } traceEnabled = Log.getRootLogLevel().isLessSpecificThan(Level.TRACE); User pageUser = admin.getUser(); if (clearLog) { if (!(csrfCookie == null || csrfParam == null || !csrfCookie.getValue().equals(csrfParam))) { Log.rotateOpenfireLogFile(); response.sendRedirect("logviewer.jsp"); return; } } else if (markLog) { if (!(csrfCookie == null || csrfParam == null || !csrfCookie.getValue().equals(csrfParam))) { Log.markOpenfireLogFile(pageUser.getUsername()); response.sendRedirect("logviewer.jsp"); return; } } else if (saveLog) { saveLog = false; File logDir = new File(Log.getLogDirectory()); String filename = "openfire.log"; response.setContentType("text/plain"); response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\""); try (final FileInputStream fileInputStream =new FileInputStream(new File(logDir, filename))) { int i; while((i=fileInputStream.read())!=-1) { out.write(i); } } return; } else if (emailLog) { response.sendRedirect("emaillog.jsp"); return; } // Set defaults if (log == null) { log = "all"; } if (mode == null) { mode = ASCENDING; } if (numLinesParam == null) { numLinesParam = "50"; } // Other vars File logDir = new File(Log.getLogDirectory()); String filename = "openfire.log"; File logFile = new File(logDir, filename); // Determine if any of the log files contents have been updated: boolean hasLogfileChanged = hasLogfileChanged(request, response, logDir); csrfParam = StringUtils.randomString(16); CookieUtils.setCookie(request, response, "csrf", csrfParam, -1); pageContext.setAttribute("csrf", csrfParam); %> <% if (refreshParam != null && !NONE.equals(refreshParam)) { %> "> <% } %> <%= (hasLogfileChanged?"*":"") %> <% ByteFormat byteFormatter = new ByteFormat(); Date lastMod = new Date(logFile.lastModified()); DateFormat dateFormatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); %> <%= StringUtils.escapeHTMLTags(logFile.getName()) %> (<%= byteFormatter.format(logFile.length()) %>) () onclick="this.form.submit();" id="rb01" > onclick="this.form.submit();" id="rb02" > <%= dateFormatter.format(lastMod) %> <% for (String aLINES : LINES) { String selected = (aLINES.equals(numLinesParam)) ? " selected" : ""; %> ><%= aLINES %> <% } %> > ')) {setLog('clearLog'); document.logViewer.submit(); return true;} else { return false; }">"> ')) {setLog('clearLog'); document.logViewer.submit(); return true;} else { return false; }" > "> > > > > > > : > > "> : <% for (String aREFRESHES : REFRESHES) { String selected = aREFRESHES.equals(refreshParam) ? " selected" : ""; %> ><%= aREFRESHES %> <% } %> () : <%= JiveGlobals.getHomePath() %><%= File.separator %>logs " frameborder="0" height="600" style="width: 100%" marginheight="0" marginwidth="0" scrolling="auto">