|
@@ -22,65 +22,132 @@
|
|
|
|
|
|
package password.pwm.http;
|
|
|
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import lombok.Getter;
|
|
|
import password.pwm.AppProperty;
|
|
|
import password.pwm.Permission;
|
|
|
import password.pwm.PwmApplication;
|
|
|
import password.pwm.PwmApplicationMode;
|
|
|
+import password.pwm.PwmConstants;
|
|
|
import password.pwm.config.Configuration;
|
|
|
import password.pwm.config.PwmSetting;
|
|
|
import password.pwm.config.profile.HelpdeskProfile;
|
|
|
+import password.pwm.config.profile.ProfileType;
|
|
|
import password.pwm.error.PwmUnrecoverableException;
|
|
|
import password.pwm.http.servlet.PwmServletDefinition;
|
|
|
+import password.pwm.ldap.UserInfo;
|
|
|
+import password.pwm.util.java.StringUtil;
|
|
|
import password.pwm.util.java.TimeDuration;
|
|
|
import password.pwm.util.logging.PwmLogger;
|
|
|
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.SortedSet;
|
|
|
+import java.util.TreeSet;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
public class IdleTimeoutCalculator {
|
|
|
private static final PwmLogger LOGGER = PwmLogger.forClass(IdleTimeoutCalculator.class);
|
|
|
|
|
|
- public static TimeDuration figureMaxIdleTimeout(final PwmApplication pwmApplication, final PwmSession pwmSession) throws PwmUnrecoverableException
|
|
|
+ public static MaxIdleTimeoutResult figureMaxSessionTimeout(final PwmApplication pwmApplication, final PwmSession pwmSession)
|
|
|
+ throws PwmUnrecoverableException
|
|
|
{
|
|
|
final Configuration configuration = pwmApplication.getConfig();
|
|
|
- long idleSeconds = configuration.readSettingAsLong(PwmSetting.IDLE_TIMEOUT_SECONDS);
|
|
|
+ final SortedSet<MaxIdleTimeoutResult> results = new TreeSet<>();
|
|
|
+ {
|
|
|
+ final long idleSetting = configuration.readSettingAsLong(PwmSetting.IDLE_TIMEOUT_SECONDS);
|
|
|
+ results.add(new MaxIdleTimeoutResult(
|
|
|
+ MaxIdleTimeoutResult.reasonFor(PwmSetting.IDLE_TIMEOUT_SECONDS, null),
|
|
|
+ new TimeDuration(idleSetting, TimeUnit.SECONDS)));
|
|
|
+ }
|
|
|
|
|
|
if (!pwmSession.isAuthenticated()) {
|
|
|
+ if (pwmApplication.getApplicationMode() == PwmApplicationMode.NEW) {
|
|
|
+ final long configGuideIdleTimeout = Long.parseLong(configuration.readAppProperty(AppProperty.CONFIG_GUIDE_IDLE_TIMEOUT));
|
|
|
+ results.add(new MaxIdleTimeoutResult(
|
|
|
+ "Configuration Guide Idle Timeout",
|
|
|
+ new TimeDuration(configGuideIdleTimeout, TimeUnit.SECONDS)));
|
|
|
+ }
|
|
|
+
|
|
|
if (configuration.readSettingAsBoolean(PwmSetting.PEOPLE_SEARCH_ENABLE_PUBLIC)) {
|
|
|
final long peopleSearchIdleTimeout = configuration.readSettingAsLong(PwmSetting.PEOPLE_SEARCH_IDLE_TIMEOUT_SECONDS);
|
|
|
- idleSeconds = Math.max(idleSeconds, peopleSearchIdleTimeout);
|
|
|
+ if (peopleSearchIdleTimeout > 0) {
|
|
|
+ results.add(new MaxIdleTimeoutResult(
|
|
|
+ MaxIdleTimeoutResult.reasonFor(PwmSetting.PEOPLE_SEARCH_IDLE_TIMEOUT_SECONDS, null),
|
|
|
+ new TimeDuration(peopleSearchIdleTimeout, TimeUnit.SECONDS)));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- return TimeDuration.fromCurrent(idleSeconds);
|
|
|
+ } else {
|
|
|
+ final UserInfo userInfo= pwmSession.getUserInfo();
|
|
|
+ final boolean userIsAdmin = pwmSession.getSessionManager().checkPermission(pwmApplication, Permission.PWMADMIN);
|
|
|
+ final Set<MaxIdleTimeoutResult> loggedInResults = figureMaxAuthUserTimeout(configuration, userInfo, userIsAdmin);
|
|
|
+ results.addAll(loggedInResults);
|
|
|
+ }
|
|
|
+
|
|
|
+ return results.last();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Set<MaxIdleTimeoutResult> figureMaxAuthUserTimeout(
|
|
|
+ final Configuration configuration,
|
|
|
+ final UserInfo userInfo,
|
|
|
+ final boolean userIsAdmin
|
|
|
+ )
|
|
|
+ throws PwmUnrecoverableException
|
|
|
+ {
|
|
|
+ final Set<MaxIdleTimeoutResult> results = new TreeSet<>();
|
|
|
+ {
|
|
|
+ final long idleSetting = configuration.readSettingAsLong(PwmSetting.IDLE_TIMEOUT_SECONDS);
|
|
|
+ results.add(new MaxIdleTimeoutResult(
|
|
|
+ MaxIdleTimeoutResult.reasonFor(PwmSetting.IDLE_TIMEOUT_SECONDS, null),
|
|
|
+ new TimeDuration(idleSetting, TimeUnit.SECONDS)));
|
|
|
}
|
|
|
|
|
|
if (configuration.readSettingAsBoolean(PwmSetting.HELPDESK_ENABLE)) {
|
|
|
- final HelpdeskProfile helpdeskProfile = pwmSession.getSessionManager().getHelpdeskProfile(pwmApplication);
|
|
|
- if (helpdeskProfile != null) {
|
|
|
+ final String helpdeskProfileID = userInfo.getProfileIDs().get(ProfileType.Helpdesk);
|
|
|
+ if (!StringUtil.isEmpty(helpdeskProfileID)) {
|
|
|
+ final HelpdeskProfile helpdeskProfile = configuration.getHelpdeskProfiles().get(helpdeskProfileID);
|
|
|
final long helpdeskIdleTimeout = helpdeskProfile.readSettingAsLong(PwmSetting.HELPDESK_IDLE_TIMEOUT_SECONDS);
|
|
|
- idleSeconds = Math.max(idleSeconds, helpdeskIdleTimeout);
|
|
|
+ results.add(new MaxIdleTimeoutResult(
|
|
|
+ MaxIdleTimeoutResult.reasonFor(PwmSetting.HELPDESK_IDLE_TIMEOUT_SECONDS, helpdeskProfileID),
|
|
|
+ new TimeDuration(helpdeskIdleTimeout, TimeUnit.SECONDS)));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (configuration.readSettingAsBoolean(PwmSetting.PEOPLE_SEARCH_ENABLE)) {
|
|
|
final long peopleSearchIdleTimeout = configuration.readSettingAsLong(PwmSetting.PEOPLE_SEARCH_IDLE_TIMEOUT_SECONDS);
|
|
|
- idleSeconds = Math.max(idleSeconds, peopleSearchIdleTimeout);
|
|
|
+ if (peopleSearchIdleTimeout > 0) {
|
|
|
+ results.add(new MaxIdleTimeoutResult(
|
|
|
+ MaxIdleTimeoutResult.reasonFor(PwmSetting.PEOPLE_SEARCH_IDLE_TIMEOUT_SECONDS, null),
|
|
|
+ new TimeDuration(peopleSearchIdleTimeout, TimeUnit.SECONDS)));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- if (pwmApplication.getApplicationMode() == PwmApplicationMode.NEW) {
|
|
|
- final long configGuideIdleTimeout = Long.parseLong(configuration.readAppProperty(AppProperty.CONFIG_GUIDE_IDLE_TIMEOUT));
|
|
|
- idleSeconds = Math.max(idleSeconds, configGuideIdleTimeout);
|
|
|
+ if (userIsAdmin) {
|
|
|
+ final long configEditorIdleTimeout = Long.parseLong(configuration.readAppProperty(AppProperty.CONFIG_EDITOR_IDLE_TIMEOUT));
|
|
|
+ results.add(new MaxIdleTimeoutResult(
|
|
|
+ "Config Editor Idle Timeout",
|
|
|
+ new TimeDuration(configEditorIdleTimeout, TimeUnit.SECONDS)));
|
|
|
}
|
|
|
|
|
|
- try {
|
|
|
- if (pwmSession.getSessionManager().checkPermission(pwmApplication, Permission.PWMADMIN)) {
|
|
|
- final long configEditorIdleTimeout = Long.parseLong(configuration.readAppProperty(AppProperty.CONFIG_EDITOR_IDLE_TIMEOUT));
|
|
|
- idleSeconds = Math.max(idleSeconds, configEditorIdleTimeout);
|
|
|
- }
|
|
|
- } catch (PwmUnrecoverableException e) {
|
|
|
- LOGGER.error(pwmSession,"error while figuring max idle timeout for session: " + e.getMessage());
|
|
|
+ return Collections.unmodifiableSet(results);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Getter
|
|
|
+ @AllArgsConstructor
|
|
|
+ static class MaxIdleTimeoutResult implements Comparable<MaxIdleTimeoutResult> {
|
|
|
+ private final String reason;
|
|
|
+ private final TimeDuration idleTimeout;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int compareTo(MaxIdleTimeoutResult o)
|
|
|
+ {
|
|
|
+ return this.idleTimeout.compareTo(o.getIdleTimeout());
|
|
|
}
|
|
|
|
|
|
- return new TimeDuration(idleSeconds, TimeUnit.SECONDS);
|
|
|
+ static String reasonFor(final PwmSetting pwmSetting, final String profileID) {
|
|
|
+ return "Setting " + pwmSetting.toMenuLocationDebug(profileID, PwmConstants.DEFAULT_LOCALE);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public static TimeDuration idleTimeoutForRequest(final PwmRequest pwmRequest) throws PwmUnrecoverableException
|