%@ page contentType="text/html; charset=UTF-8" %> <%-- - - Copyright (C) 2004-2008 Jive Software, 2017-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="org.jivesoftware.openfire.SessionManager, org.jivesoftware.openfire.SessionResultFilter, org.jivesoftware.util.JiveGlobals, org.jivesoftware.util.ParamUtils, org.jivesoftware.util.CookieUtils, org.jivesoftware.util.StringUtils" errorPage="error.jsp" %> <%@ page import="java.util.Date" %> <%@ page import="org.jivesoftware.util.ListPager" %> <%@ page import="java.util.function.Predicate" %> <%@ page import="java.net.UnknownHostException" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="org.jivesoftware.openfire.cluster.ClusterManager" %> <%@ page import="org.slf4j.LoggerFactory" %> <%@ page import="org.jivesoftware.openfire.session.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <%! private static final String NONE = LocaleUtils.getLocalizedString("global.none"); private static final int[] REFRESHES = {0, 10, 30, 60, 90}; private static final String[] REFRESHES_LABELS = {NONE,"10","30","60","90"}; %> <% webManager.init(request, response, session, application, out ); %> <% // Get parameters int refresh = ParamUtils.getIntParameter(request,"refresh",webManager.getRefreshValue("session-summary", 0)); pageContext.setAttribute("refresh", refresh); boolean close = ParamUtils.getBooleanParameter(request,"close"); int sortOrder = ParamUtils.getIntParameter(request, "sortOrder", webManager.getPageProperty("session-summary", "console.order", SessionResultFilter.ASCENDING)); int sortColumnNumber = ParamUtils.getIntParameter(request, "sortColumnNumber", webManager.getPageProperty("session-summary", "console.sortColumnNumber", SessionResultFilter.SORT_USER)); String jid = ParamUtils.getParameter(request,"jid"); if (request.getParameter("refresh") != null) { webManager.setRefreshValue("session-summary", refresh); } if (request.getParameter("sortOrder") != null) { webManager.setPageProperty("session-summary", "console.order", sortOrder); } if (request.getParameter("sortColumnNumber") != null) { webManager.setPageProperty("session-summary", "console.sortColumnNumber", sortColumnNumber); } // Get the user manager SessionManager sessionManager = webManager.getSessionManager(); Cookie csrfCookie = CookieUtils.getCookie(request, "csrf"); String csrfParam = ParamUtils.getParameter(request, "csrf"); if (close) { if (csrfCookie == null || csrfParam == null || !csrfCookie.getValue().equals(csrfParam)) { close = false; } } csrfParam = StringUtils.randomString(15); CookieUtils.setCookie(request, response, "csrf", csrfParam, -1); pageContext.setAttribute("csrf", csrfParam); // Close a connection if requested if (close) { JID address = new JID(jid); try { Session sess = sessionManager.getSession(address); sess.markNonResumable(); sess.close(); // Log the event webManager.logEvent("closed session for address "+address, null); // wait one second Thread.sleep(250L); } catch (Exception e) { // Session might have disappeared on its own LoggerFactory.getLogger("session-summary.jsp").warn("Unable to manually close session for address: {}", address, e); } // Redirect back to this page response.sendRedirect("session-summary.jsp?close=success"); return; } SessionResultFilter sessionResultFilter = SessionResultFilter.createDefaultSessionFilter(); sessionResultFilter.setSortField(sortColumnNumber); sessionResultFilter.setSortOrder(sortOrder); // Filter out the dodgy looking sessions List sessions = new ArrayList<>(sessionManager.getSessions( sessionResultFilter)); // By default, display all nodes Predicate filter = clientSession -> true; final String searchName = ParamUtils.getStringParameter(request, "searchName", ""); if(!searchName.trim().isEmpty()) { final String searchCriteria = searchName.trim(); filter = filter.and(clientSession -> StringUtils.containsIgnoringCase(clientSession.getAddress().getNode(), searchCriteria)); } final String searchResource = ParamUtils.getStringParameter(request, "searchResource", ""); if(!searchResource.trim().isEmpty()) { final String searchCriteria = searchResource.trim(); filter = filter.and(clientSession -> StringUtils.containsIgnoringCase(clientSession.getAddress().getResource(), searchCriteria)); } final String searchVersion = ParamUtils.getStringParameter(request, "searchVersion", ""); if(!searchVersion.trim().isEmpty()) { final String searchCriteria = searchVersion.trim(); filter = filter.and(clientSession -> { final String softwareName = clientSession.getSoftwareVersion().get("name"); final String softwareVersion = clientSession.getSoftwareVersion().get("version"); String softwareString = ""; if(softwareName != null && !softwareName.isBlank()){ softwareString += softwareName; } if(softwareVersion != null && !softwareVersion.isBlank()) { if (!softwareString.isBlank()) { softwareString += " - "; } softwareString += softwareVersion; }; return StringUtils.containsIgnoringCase(softwareString, searchCriteria); }); } final String searchNode = ParamUtils.getStringParameter(request, "searchNode", ""); if(searchNode.equals("local")) { filter = filter.and(LocalClientSession.class::isInstance); } else if (searchNode.equals("remote")) { filter = filter.and(clientSession -> !LocalClientSession.class.isInstance(clientSession)); } final String searchStatus = ParamUtils.getStringParameter(request, "searchStatus", ""); if(!searchStatus.isEmpty()) { filter = filter.and(clientSession -> { if (searchStatus.equals("detached")) { return clientSession.isDetached(); } return switch (clientSession.getStatus()) { case CLOSED -> "closed".equals(searchStatus); case CONNECTED -> "connected".equals(searchStatus); case AUTHENTICATED -> "authenticated".equals(searchStatus); default -> "unknown".equals(searchStatus); }; }); } final String searchPresence = ParamUtils.getStringParameter(request, "searchPresence", ""); if(!searchPresence.isEmpty()) { filter = filter.and(clientSession -> { final Presence presence = clientSession.getPresence(); if (!presence.isAvailable()) { return "offline".equals(searchPresence); } final Presence.Show show = presence.getShow(); if (show == null) { return "online".equals(searchPresence); } return switch (show) { case away -> "away".equals(searchPresence); case chat -> "chat".equals(searchPresence); case dnd -> "dnd".equals(searchPresence); case xa -> "xa".equals(searchPresence); default -> "unknown".equals(searchPresence); }; }); } final String searchHostAddress = ParamUtils.getStringParameter(request, "searchHostAddress", ""); if(!searchHostAddress.trim().isEmpty()) { final String searchCriteria = searchHostAddress.trim(); filter = filter.and(clientSession -> { try { return StringUtils.containsIgnoringCase(clientSession.getHostAddress(), searchCriteria); } catch (final UnknownHostException e) { return false; } }); } final boolean showName = webManager.getPageProperty("session-summary", "console.showNameColumn", 1) == 1; final boolean showResource = webManager.getPageProperty("session-summary", "console.showResourceColumn", 0) == 1; final boolean showVersion = webManager.getPageProperty("session-summary", "console.showVersionColumn", 1) == 1; final boolean showClusterNode = webManager.getPageProperty("session-summary", "console.showClusterNodeColumn", 1) == 1; final boolean showStatus = webManager.getPageProperty("session-summary", "console.showStatusColumn", 1) == 1; final boolean showPresence = webManager.getPageProperty("session-summary", "console.showPresenceColumn", 1) == 1; final boolean showRxTx = webManager.getPageProperty("session-summary", "console.showRxTxColumn", 1) == 1; final boolean showIp = webManager.getPageProperty("session-summary", "console.ShowIpColumn", 1) == 1; int totalColumns = 2; if (showName) totalColumns++; if (showResource) totalColumns++; if (showVersion) totalColumns++; if (showClusterNode && (ClusterManager.isClusteringStarted() || ClusterManager.isClusteringStarting())) totalColumns++; if (showStatus) { totalColumns++; totalColumns++; } if (showPresence) { totalColumns++; totalColumns++; } if (showRxTx) { totalColumns++; totalColumns++; } if (showIp) totalColumns++; final ArrayList additionalFormFields = new ArrayList<>(); additionalFormFields.add("refresh"); if (showName) additionalFormFields.add("searchName"); if (showResource) additionalFormFields.add("searchResource"); if (showVersion) additionalFormFields.add("searchVersion"); if (showClusterNode) additionalFormFields.add("searchNode"); if (showStatus) additionalFormFields.add("searchStatus"); if (showPresence) additionalFormFields.add("searchPresence"); if (showIp) additionalFormFields.add("searchHostAddress"); final ListPager listPager = new ListPager<>(request, response, sessions, filter, sessionResultFilter.getSortField(), sessionResultFilter.getSortOrder() == SessionResultFilter.DESCENDING, additionalFormFields.toArray(new String[0])); pageContext.setAttribute("listPager", listPager); pageContext.setAttribute("searchName", searchName); pageContext.setAttribute("searchResource", searchResource); pageContext.setAttribute("searchVersion", searchVersion); pageContext.setAttribute("searchNode", searchNode); pageContext.setAttribute("searchStatus", searchStatus); pageContext.setAttribute("searchPresence", searchPresence); pageContext.setAttribute("searchHostAddress", searchHostAddress); pageContext.setAttribute("clusteringEnabled", ClusterManager.isClusteringStarted() || ClusterManager.isClusteringStarting() ); pageContext.setAttribute("showName", showName); pageContext.setAttribute("showVersion", showVersion); pageContext.setAttribute("showResource", showResource); pageContext.setAttribute("showClusterNode", showClusterNode); pageContext.setAttribute("showStatus", showStatus); pageContext.setAttribute("showPresence", showPresence); pageContext.setAttribute("showRxTx", showRxTx); pageContext.setAttribute("showIp", showIp); pageContext.setAttribute("totalColumns", totalColumns); %> <% if ("success".equals(request.getParameter("close"))) { %> <% } %> : ${listPager.totalItemCount} : -- - : [ ${listPager.pageLinks} ] -- : ${listPager.pageSizeSelection} : <% for (int j=0; j ><%= REFRESHES_LABELS[j] %> <% } %> () "> "> "/> "/> "/> selected value=""> selected value="local"> selected value="remote"> selected value=""> selected value="closed"> selected value="connected"> selected value="authenticated"> selected value="detached"> & selected value="unknown"> selected value=""> selected value="online"> selected value="away"> selected value="xa"> selected value="offline"> selected value="chat"> selected value="dnd"> selected value="unknown"> "/> <% if (sessions.isEmpty()) { %> <% } %> <% // needed in session-row.jspf int count = listPager.getFirstItemNumberOnPage(); final boolean current = false; final String linkURL = "session-details.jsp"; for (final ClientSession sess : listPager.getItemsOnCurrentPage()) { %> <%@ include file="session-row.jspf" %> <% count++; } %> : [ ${listPager.pageLinks} ] : <%= JiveGlobals.formatDateTime(new Date()) %> ${listPager.jumpToPageForm}
: [ ${listPager.pageLinks} ]
: <%= JiveGlobals.formatDateTime(new Date()) %>