diff --git a/application-home/dictionary/manager-messages.properties b/application-home/dictionary/manager-messages.properties index d9dba45..d68442e 100644 --- a/application-home/dictionary/manager-messages.properties +++ b/application-home/dictionary/manager-messages.properties @@ -135,7 +135,7 @@ lastLogin=Last login lastUpdated=Last updated latestRelease=Latest release latestSnapshot=Latest snapshot -ldap.disabled=LDAP Authentication is disabled. Set site property ''{0}'' to ''true'' to enable. +ldap.disabled=LDAP Authentication is disabled. Set site property ''{0}'' to ''false'' to enable. ldap.users=LDAP Users ldap.settings=LDAP Settings ldap.not.working=Unable to connect to LDAP server at {0}, please check configuration! @@ -320,6 +320,9 @@ session.expireAll=Expire all sessions=Sessions sessions.expired.global=Expired {0} sessions sessions.expired.site=Expired {0} sessions for site {1} +sessions.showing.max=Showing only first {0} of {1} sessions. +sessions.read.error=Error reading sessions. See log for details. +sessions.too.many=To many sessions to show: {0}, can only show {1}. site.alias.deleted=Alias "{0}" has been deleted. site.create.error=Failed to create the site. site.create=Create site diff --git a/src/main/java/org/appng/application/manager/business/LdapUsers.java b/src/main/java/org/appng/application/manager/business/LdapUsers.java index d2fa730..35b889b 100644 --- a/src/main/java/org/appng/application/manager/business/LdapUsers.java +++ b/src/main/java/org/appng/application/manager/business/LdapUsers.java @@ -62,9 +62,9 @@ public DataContainer getData(Site site, Application application, Environment env Boolean ldapDisabled = site.getProperties().getBoolean(LdapService.LDAP_DISABLED); if ("settings".equals(mode)) { List ldapProps = new ArrayList<>(); + ldapProps.add(getProperty(siteProps, LdapService.LDAP_DISABLED)); SimpleProperty ldapHost = getProperty(siteProps, LdapService.LDAP_HOST); ldapProps.add(ldapHost); - ldapProps.add(getProperty(siteProps, LdapService.LDAP_DISABLED)); ldapProps.add(getProperty(siteProps, LdapService.LDAP_DOMAIN)); ldapProps.add(getProperty(siteProps, LdapService.LDAP_GROUP_BASE_DN)); SimpleProperty ldapUser = getProperty(siteProps, LdapService.LDAP_USER); diff --git a/src/main/java/org/appng/application/manager/business/Sessions.java b/src/main/java/org/appng/application/manager/business/Sessions.java index 473a12e..b343247 100644 --- a/src/main/java/org/appng/application/manager/business/Sessions.java +++ b/src/main/java/org/appng/application/manager/business/Sessions.java @@ -28,6 +28,7 @@ import javax.servlet.ServletContext; import org.apache.catalina.Manager; +import org.apache.catalina.StoreManager; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOCase; import org.apache.commons.lang3.StringUtils; @@ -57,6 +58,7 @@ import org.appng.xml.platform.SelectionGroup; import org.appng.xml.platform.SelectionType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import lombok.Data; @@ -76,6 +78,8 @@ public class Sessions extends ServiceAware implements ActionProvider, Data private static final String F_LGN = "fLgn"; private static final String MM_DD_HH_MM = "yyyy-MM-dd HH:mm"; private final FastDateFormat hourMinutes = FastDateFormat.getInstance(MM_DD_HH_MM); + @Value("${maxSessions:250}") + private int maxSessions; @Autowired private SelectionFactory selectionFactory; @@ -87,7 +91,7 @@ public void perform(Site site, Application application, Environment environment, Integer siteId = options.getInteger("site", "id"); String siteName = null == siteId ? null : getService().getNameForSite(siteId); if (null == sessionId) { - List sessions = getSessionsFromManager(environment); + List sessions = getSessionsFromManager(request, fp); int cnt = 0; for (Session session : sessions) { if (expire(currentSession, session.getId(), siteName, getManager(environment))) { @@ -112,9 +116,9 @@ public void perform(Site site, Application application, Environment environment, } public DataContainer getData(Site site, Application application, Environment environment, Options options, - Request request, FieldProcessor fieldProcessor) { - DataContainer dataContainer = new DataContainer(fieldProcessor); - List immutableSessions = getSessionsFromManager(environment); + Request request, FieldProcessor fp) { + DataContainer dataContainer = new DataContainer(fp); + List immutableSessions = getSessionsFromManager(request, fp); String fDmn = request.getParameter(F_DMN); String fSess = request.getParameter(F_SESS); @@ -129,17 +133,38 @@ public DataContainer getData(Site site, Application application, Environment env Boolean currentSiteOnly = options.getBoolean("site", "currentSiteOnly"); List sessions = getSessions(options, request, currentSiteOnly, immutableSessions, userAgents, fDmn, fSess, fAgnt, fUsr, getDate(fCrBf), getDate(fCrAf), fLgn); + if (getManager(environment).getActiveSessions() <= maxSessions) { + addFilters(request, currentSiteOnly, dataContainer, userAgents, fAgnt, fDmn, fUsr); + } - addFilters(request, currentSiteOnly, dataContainer, userAgents, fAgnt, fDmn, fUsr); - - dataContainer.setPage(sessions, fieldProcessor.getPageable()); + dataContainer.setPage(sessions, fp.getPageable()); return dataContainer; } - protected List getSessionsFromManager(Environment env) { + protected List getSessionsFromManager(Request request, FieldProcessor fp) { List immutableSessions = new ArrayList<>(); - for (org.apache.catalina.Session session : getManager(env).findSessions()) { - immutableSessions.add(getSessionMetaData(session)); + Manager manager = getManager(request.getEnvironment()); + int activeSessions = manager.getActiveSessions(); + if (activeSessions > maxSessions) { + if (manager instanceof StoreManager) { + try { + String[] sessionsKeys = StoreManager.class.cast(manager).getStore().keys(); + for (int i = 0; i < maxSessions; i++) { + immutableSessions.add(getSessionMetaData(manager.findSession(sessionsKeys[i]))); + } + fp.addNoticeMessage(request.getMessage(MessageConstants.SESSIONS_SHOWING_MAX, maxSessions, + sessionsKeys.length)); + } catch (IOException e) { + log.error("error while retrieving sessions keys from store", e); + fp.addErrorMessage(request.getMessage(MessageConstants.SESSIONS_READ_ERROR)); + } + } else { + fp.addErrorMessage(request.getMessage(MessageConstants.SESSIONS_TOO_MANY, activeSessions, maxSessions)); + } + } else { + for (org.apache.catalina.Session session : manager.findSessions()) { + immutableSessions.add(getSessionMetaData(session)); + } } return immutableSessions; } diff --git a/src/test/java/org/appng/application/manager/business/SessionsTest.java b/src/test/java/org/appng/application/manager/business/SessionsTest.java index d4c63b0..dcae66a 100644 --- a/src/test/java/org/appng/application/manager/business/SessionsTest.java +++ b/src/test/java/org/appng/application/manager/business/SessionsTest.java @@ -19,11 +19,16 @@ import java.util.Arrays; import java.util.List; +import javax.servlet.ServletContext; + +import org.apache.catalina.session.PersistentManagerBase; import org.apache.commons.lang3.time.DateUtils; import org.appng.api.Scope; import org.appng.api.support.CallableAction; import org.appng.api.support.CallableDataSource; +import org.appng.api.support.environment.DefaultEnvironment; import org.appng.core.controller.Session; +import org.appng.core.controller.SessionListener; import org.junit.Assert; import org.junit.FixMethodOrder; import org.junit.Test; @@ -39,6 +44,10 @@ public class SessionsTest extends AbstractTest { public void testShowSessions() throws Exception { setSessions(); environment.setAttribute(Scope.SESSION, org.appng.api.Session.Environment.SID, "47124712"); + ServletContext servletCtx = ((DefaultEnvironment) environment).getServletContext(); + PersistentManagerBase manager = Mockito.mock(PersistentManagerBase.class); + Mockito.when(manager.getActiveSessions()).thenReturn(250); + servletCtx.setAttribute(SessionListener.SESSION_MANAGER, manager); CallableDataSource siteDatasource = getDataSource("sessions") .withParam("deleteLink", "/system?action=expire&sessid=").getCallableDataSource(); siteDatasource.perform("test"); diff --git a/src/test/java/org/appng/application/manager/business/SessionsTestBean.java b/src/test/java/org/appng/application/manager/business/SessionsTestBean.java index 38f2ae6..fcf642b 100644 --- a/src/test/java/org/appng/application/manager/business/SessionsTestBean.java +++ b/src/test/java/org/appng/application/manager/business/SessionsTestBean.java @@ -19,7 +19,8 @@ import java.util.List; import org.apache.catalina.Manager; -import org.appng.api.Environment; +import org.appng.api.FieldProcessor; +import org.appng.api.Request; import org.appng.core.controller.Session; import org.mockito.Mockito; @@ -28,7 +29,7 @@ public class SessionsTestBean extends Sessions { public static List SESSIONS; @Override - protected List getSessionsFromManager(Environment env) { + protected List getSessionsFromManager(Request request, FieldProcessor fp) { return SESSIONS; } diff --git a/src/test/resources/xml/LdapUsersTest-testSettings.xml b/src/test/resources/xml/LdapUsersTest-testSettings.xml index 6d0e9dd..48bb78d 100644 --- a/src/test/resources/xml/LdapUsersTest-testSettings.xml +++ b/src/test/resources/xml/LdapUsersTest-testSettings.xml @@ -15,18 +15,18 @@ - ldapHost + ldapDisabled - ldap://localhost:389 + true - ldapDisabled + ldapHost - true + ldap://localhost:389