Browse Source

improve startup error handling

Jason Rivard 9 years ago
parent
commit
82eb742bfd
39 changed files with 299 additions and 229 deletions
  1. 3 11
      src/main/java/password/pwm/PwmApplication.java
  2. 31 0
      src/main/java/password/pwm/PwmApplicationMode.java
  3. 7 7
      src/main/java/password/pwm/PwmEnvironment.java
  4. 1 1
      src/main/java/password/pwm/VersionChecker.java
  5. 8 7
      src/main/java/password/pwm/config/stored/ConfigurationReader.java
  6. 2 1
      src/main/java/password/pwm/health/ConfigurationChecker.java
  7. 5 8
      src/main/java/password/pwm/http/ContextManager.java
  8. 40 16
      src/main/java/password/pwm/http/filter/AbstractPwmFilter.java
  9. 12 5
      src/main/java/password/pwm/http/filter/ApplicationModeFilter.java
  10. 0 61
      src/main/java/password/pwm/http/filter/ApplicationStatusFilter.java
  11. 8 3
      src/main/java/password/pwm/http/filter/AuthenticationFilter.java
  12. 8 0
      src/main/java/password/pwm/http/filter/AuthorizationFilter.java
  13. 7 0
      src/main/java/password/pwm/http/filter/CaptchaFilter.java
  14. 13 10
      src/main/java/password/pwm/http/filter/ConfigAccessFilter.java
  15. 48 11
      src/main/java/password/pwm/http/filter/RequestInitializationFilter.java
  16. 7 0
      src/main/java/password/pwm/http/filter/SessionFilter.java
  17. 2 5
      src/main/java/password/pwm/http/servlet/configeditor/ConfigEditorServlet.java
  18. 3 2
      src/main/java/password/pwm/http/servlet/configguide/ConfigGuideServlet.java
  19. 2 1
      src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerLocalDBServlet.java
  20. 6 0
      src/main/java/password/pwm/http/tag/PwmFormIDTag.java
  21. 11 13
      src/main/java/password/pwm/http/tag/PwmUrlTag.java
  22. 23 19
      src/main/java/password/pwm/http/tag/conditional/PwmIfTag.java
  23. 7 10
      src/main/java/password/pwm/http/tag/conditional/PwmIfTest.java
  24. 2 5
      src/main/java/password/pwm/http/tag/value/PwmValue.java
  25. 6 1
      src/main/java/password/pwm/http/tag/value/PwmValueTag.java
  26. 2 1
      src/main/java/password/pwm/svc/cache/CacheService.java
  27. 3 2
      src/main/java/password/pwm/svc/event/AuditService.java
  28. 2 1
      src/main/java/password/pwm/svc/report/ReportService.java
  29. 2 1
      src/main/java/password/pwm/svc/stats/StatisticsManager.java
  30. 2 1
      src/main/java/password/pwm/svc/wordlist/SharedHistoryManager.java
  31. 4 3
      src/main/java/password/pwm/util/Helper.java
  32. 4 3
      src/main/java/password/pwm/util/cli/MainClass.java
  33. 2 1
      src/main/java/password/pwm/util/db/DatabaseAccessorImpl.java
  34. 2 1
      src/main/java/password/pwm/util/logging/PwmLogManager.java
  35. 3 2
      src/main/java/password/pwm/util/queue/AbstractQueueManager.java
  36. 2 1
      src/main/java/password/pwm/ws/server/RestServerHelper.java
  37. 2 1
      src/main/java/password/pwm/ws/server/rest/RestHealthServer.java
  38. 5 13
      src/main/webapp/WEB-INF/web.xml
  39. 2 1
      src/test/java/password/pwm/tests/LdapOtpOperatorTest.java

+ 3 - 11
src/main/java/password/pwm/PwmApplication.java

@@ -195,7 +195,7 @@ public class PwmApplication {
         );
         );
 
 
         if (!pwmEnvironment.isInternalRuntimeInstance()) {
         if (!pwmEnvironment.isInternalRuntimeInstance()) {
-            if (getApplicationMode() == MODE.ERROR || getApplicationMode() == MODE.NEW) {
+            if (getApplicationMode() == PwmApplicationMode.ERROR || getApplicationMode() == PwmApplicationMode.NEW) {
                 LOGGER.warn("skipping LocalDB open due to application mode " + getApplicationMode());
                 LOGGER.warn("skipping LocalDB open due to application mode " + getApplicationMode());
             } else {
             } else {
                 this.localDB = Initializer.initializeLocalDB(this);
                 this.localDB = Initializer.initializeLocalDB(this);
@@ -406,7 +406,7 @@ public class PwmApplication {
         return pwmEnvironment.getConfig();
         return pwmEnvironment.getConfig();
     }
     }
 
 
-    public MODE getApplicationMode() {
+    public PwmApplicationMode getApplicationMode() {
         return pwmEnvironment.getApplicationMode();
         return pwmEnvironment.getApplicationMode();
     }
     }
 
 
@@ -579,7 +579,7 @@ public class PwmApplication {
 
 
             // initialize the localDB
             // initialize the localDB
             try {
             try {
-                final boolean readOnly = pwmApplication.getApplicationMode() == MODE.READ_ONLY;
+                final boolean readOnly = pwmApplication.getApplicationMode() == PwmApplicationMode.READ_ONLY;
                 return LocalDBFactory.getInstance(databaseDirectory, readOnly, pwmApplication, pwmApplication.getConfig());
                 return LocalDBFactory.getInstance(databaseDirectory, readOnly, pwmApplication, pwmApplication.getConfig());
             } catch (Exception e) {
             } catch (Exception e) {
                 pwmApplication.lastLocalDBFailure = new ErrorInformation(PwmError.ERROR_LOCALDB_UNAVAILABLE,"unable to initialize LocalDB: " + e.getMessage());
                 pwmApplication.lastLocalDBFailure = new ErrorInformation(PwmError.ERROR_LOCALDB_UNAVAILABLE,"unable to initialize LocalDB: " + e.getMessage());
@@ -593,14 +593,6 @@ public class PwmApplication {
         return pwmEnvironment;
         return pwmEnvironment;
     }
     }
 
 
-    public enum MODE {
-        NEW,
-        CONFIGURATION,
-        RUNNING,
-        READ_ONLY,
-        ERROR
-    }
-
     public String getInstanceNonce() {
     public String getInstanceNonce() {
         return instanceNonce;
         return instanceNonce;
     }
     }

+ 31 - 0
src/main/java/password/pwm/PwmApplicationMode.java

@@ -0,0 +1,31 @@
+package password.pwm;
+
+import password.pwm.http.ContextManager;
+
+import javax.servlet.http.HttpServletRequest;
+
+public enum PwmApplicationMode {
+    NEW,
+    CONFIGURATION,
+    RUNNING,
+    READ_ONLY,
+    ERROR;
+
+    public static PwmApplicationMode determineMode(final HttpServletRequest httpServletRequest) {
+        final ContextManager contextManager;
+        try {
+            contextManager = ContextManager.getContextManager(httpServletRequest.getServletContext());
+        } catch (Throwable t) {
+            return ERROR;
+        }
+
+        final PwmApplication pwmApplication;
+        try {
+            pwmApplication = contextManager.getPwmApplication();
+        } catch (Throwable t) {
+            return ERROR;
+        }
+
+        return pwmApplication.getApplicationMode();
+    }
+}

+ 7 - 7
src/main/java/password/pwm/PwmEnvironment.java

@@ -45,7 +45,7 @@ public class PwmEnvironment implements Serializable {
     private static final PwmLogger LOGGER = PwmLogger.forClass(PwmEnvironment.class);
     private static final PwmLogger LOGGER = PwmLogger.forClass(PwmEnvironment.class);
 
 
     // data elements
     // data elements
-    private final PwmApplication.MODE applicationMode;
+    private final PwmApplicationMode applicationMode;
     private final Configuration config;
     private final Configuration config;
     private final File applicationPath;
     private final File applicationPath;
     private final boolean internalRuntimeInstance;
     private final boolean internalRuntimeInstance;
@@ -116,7 +116,7 @@ public class PwmEnvironment implements Serializable {
     }
     }
 
 
     private PwmEnvironment(
     private PwmEnvironment(
-            final PwmApplication.MODE applicationMode,
+            final PwmApplicationMode applicationMode,
             final Configuration config,
             final Configuration config,
             final File applicationPath,
             final File applicationPath,
             final boolean internalRuntimeInstance,
             final boolean internalRuntimeInstance,
@@ -124,7 +124,7 @@ public class PwmEnvironment implements Serializable {
             final ContextManager contextManager,
             final ContextManager contextManager,
             final Collection<ApplicationFlag> flags
             final Collection<ApplicationFlag> flags
     ) {
     ) {
-        this.applicationMode = applicationMode == null ? PwmApplication.MODE.ERROR : applicationMode;
+        this.applicationMode = applicationMode == null ? PwmApplicationMode.ERROR : applicationMode;
         this.config = config;
         this.config = config;
         this.applicationPath = applicationPath;
         this.applicationPath = applicationPath;
         this.internalRuntimeInstance = internalRuntimeInstance;
         this.internalRuntimeInstance = internalRuntimeInstance;
@@ -137,7 +137,7 @@ public class PwmEnvironment implements Serializable {
         verify();
         verify();
     }
     }
 
 
-    public PwmApplication.MODE getApplicationMode() {
+    public PwmApplicationMode getApplicationMode() {
         return applicationMode;
         return applicationMode;
     }
     }
 
 
@@ -224,7 +224,7 @@ public class PwmEnvironment implements Serializable {
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
         return new Builder(this)
         return new Builder(this)
-                .setApplicationMode(PwmApplication.MODE.NEW)
+                .setApplicationMode(PwmApplicationMode.NEW)
                 .setInternalRuntimeInstance(true)
                 .setInternalRuntimeInstance(true)
                 .setConfigurationFile(null)
                 .setConfigurationFile(null)
                 .setConfig(configuration)
                 .setConfig(configuration)
@@ -330,7 +330,7 @@ public class PwmEnvironment implements Serializable {
 
 
 
 
     public static class Builder {
     public static class Builder {
-        private PwmApplication.MODE applicationMode;
+        private PwmApplicationMode applicationMode;
         private Configuration config;
         private Configuration config;
         private File applicationPath;
         private File applicationPath;
         private boolean internalRuntimeInstance;
         private boolean internalRuntimeInstance;
@@ -353,7 +353,7 @@ public class PwmEnvironment implements Serializable {
             this.applicationPath = applicationPath;
             this.applicationPath = applicationPath;
         }
         }
 
 
-        public Builder setApplicationMode(PwmApplication.MODE applicationMode) {
+        public Builder setApplicationMode(PwmApplicationMode applicationMode) {
             this.applicationMode = applicationMode;
             this.applicationMode = applicationMode;
             return this;
             return this;
         }
         }

+ 1 - 1
src/main/java/password/pwm/VersionChecker.java

@@ -84,7 +84,7 @@ public class VersionChecker implements PwmService {
             }
             }
         }
         }
 
 
-        if (pwmApplication.getApplicationMode() != PwmApplication.MODE.RUNNING && pwmApplication.getApplicationMode() != PwmApplication.MODE.CONFIGURATION ) {
+        if (pwmApplication.getApplicationMode() != PwmApplicationMode.RUNNING && pwmApplication.getApplicationMode() != PwmApplicationMode.CONFIGURATION ) {
             LOGGER.trace("skipping init due to application mode");
             LOGGER.trace("skipping init due to application mode");
             return;
             return;
         }
         }

+ 8 - 7
src/main/java/password/pwm/config/stored/ConfigurationReader.java

@@ -25,6 +25,7 @@ package password.pwm.config.stored;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FileUtils;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
@@ -63,7 +64,7 @@ public class ConfigurationReader {
 
 
     private Date configurationReadTime;
     private Date configurationReadTime;
 
 
-    private PwmApplication.MODE configMode = PwmApplication.MODE.NEW;
+    private PwmApplicationMode configMode = PwmApplicationMode.NEW;
 
 
     private volatile boolean saveInProgress;
     private volatile boolean saveInProgress;
 
 
@@ -86,7 +87,7 @@ public class ConfigurationReader {
         LOGGER.debug("configuration mode: " + configMode);
         LOGGER.debug("configuration mode: " + configMode);
     }
     }
 
 
-    public PwmApplication.MODE getConfigMode() {
+    public PwmApplicationMode getConfigMode() {
         return configMode;
         return configMode;
     }
     }
 
 
@@ -120,7 +121,7 @@ public class ConfigurationReader {
         } catch (Exception e) {
         } catch (Exception e) {
             final String errorMsg = "unable to read configuration file: " + e.getMessage();
             final String errorMsg = "unable to read configuration file: " + e.getMessage();
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_FORMAT_ERROR,null,new String[]{errorMsg});
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_FORMAT_ERROR,null,new String[]{errorMsg});
-            this.configMode = PwmApplication.MODE.ERROR;
+            this.configMode = PwmApplicationMode.ERROR;
             throw new PwmUnrecoverableException(errorInformation);
             throw new PwmUnrecoverableException(errorInformation);
         }
         }
 
 
@@ -131,7 +132,7 @@ public class ConfigurationReader {
         } catch (PwmUnrecoverableException e) {
         } catch (PwmUnrecoverableException e) {
             final String errorMsg = "unable to parse configuration file: " + e.getMessage();
             final String errorMsg = "unable to parse configuration file: " + e.getMessage();
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_FORMAT_ERROR,null,new String[]{errorMsg});
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_FORMAT_ERROR,null,new String[]{errorMsg});
-            this.configMode = PwmApplication.MODE.ERROR;
+            this.configMode = PwmApplicationMode.ERROR;
             throw new PwmUnrecoverableException(errorInformation);
             throw new PwmUnrecoverableException(errorInformation);
         }
         }
 
 
@@ -139,15 +140,15 @@ public class ConfigurationReader {
         if (validationErrorMsgs != null && !validationErrorMsgs.isEmpty()) {
         if (validationErrorMsgs != null && !validationErrorMsgs.isEmpty()) {
             final String errorMsg = "value error in config file, please investigate: " + validationErrorMsgs.get(0);
             final String errorMsg = "value error in config file, please investigate: " + validationErrorMsgs.get(0);
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_FORMAT_ERROR,null,new String[]{errorMsg});
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_FORMAT_ERROR,null,new String[]{errorMsg});
-            this.configMode = PwmApplication.MODE.ERROR;
+            this.configMode = PwmApplicationMode.ERROR;
             throw new PwmUnrecoverableException(errorInformation);
             throw new PwmUnrecoverableException(errorInformation);
         }
         }
 
 
         final String configIsEditable = storedConfiguration.readConfigProperty(ConfigurationProperty.CONFIG_IS_EDITABLE);
         final String configIsEditable = storedConfiguration.readConfigProperty(ConfigurationProperty.CONFIG_IS_EDITABLE);
         if (PwmConstants.TRIAL_MODE || (configIsEditable != null && configIsEditable.equalsIgnoreCase("true"))) {
         if (PwmConstants.TRIAL_MODE || (configIsEditable != null && configIsEditable.equalsIgnoreCase("true"))) {
-            this.configMode = PwmApplication.MODE.CONFIGURATION;
+            this.configMode = PwmApplicationMode.CONFIGURATION;
         } else {
         } else {
-            this.configMode = PwmApplication.MODE.RUNNING;
+            this.configMode = PwmApplicationMode.RUNNING;
         }
         }
 
 
         LOGGER.debug("configuration reading/parsing complete in " + TimeDuration.fromCurrent(startTime).asLongString());
         LOGGER.debug("configuration reading/parsing complete in " + TimeDuration.fromCurrent(startTime).asLongString());

+ 2 - 1
src/main/java/password/pwm/health/ConfigurationChecker.java

@@ -24,6 +24,7 @@ package password.pwm.health;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
@@ -60,7 +61,7 @@ public class ConfigurationChecker implements HealthChecker {
 
 
         final List<HealthRecord> records = new ArrayList<>();
         final List<HealthRecord> records = new ArrayList<>();
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.CONFIGURATION) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.CONFIGURATION) {
             records.add(HealthRecord.forMessage(HealthMessage.Config_ConfigMode));
             records.add(HealthRecord.forMessage(HealthMessage.Config_ConfigMode));
         }
         }
 
 

+ 5 - 8
src/main/java/password/pwm/http/ContextManager.java

@@ -22,10 +22,7 @@
 
 
 package password.pwm.http;
 package password.pwm.http;
 
 
-import password.pwm.AppProperty;
-import password.pwm.PwmApplication;
-import password.pwm.PwmConstants;
-import password.pwm.PwmEnvironment;
+import password.pwm.*;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.stored.ConfigurationProperty;
 import password.pwm.config.stored.ConfigurationProperty;
 import password.pwm.config.stored.ConfigurationReader;
 import password.pwm.config.stored.ConfigurationReader;
@@ -143,7 +140,7 @@ public class ContextManager implements Serializable {
         }
         }
 
 
         Configuration configuration = null;
         Configuration configuration = null;
-        PwmApplication.MODE mode = PwmApplication.MODE.ERROR;
+        PwmApplicationMode mode = PwmApplicationMode.ERROR;
 
 
 
 
         final File applicationPath;
         final File applicationPath;
@@ -166,16 +163,16 @@ public class ContextManager implements Serializable {
             configuration = configReader.getConfiguration();
             configuration = configReader.getConfiguration();
 
 
             if (configReader == null) {
             if (configReader == null) {
-                mode = startupErrorInformation == null ? PwmApplication.MODE.ERROR : PwmApplication.MODE.ERROR;
+                mode = startupErrorInformation == null ? PwmApplicationMode.ERROR : PwmApplicationMode.ERROR;
             } else {
             } else {
-                mode = startupErrorInformation == null ? configReader.getConfigMode() : PwmApplication.MODE.ERROR;
+                mode = startupErrorInformation == null ? configReader.getConfigMode() : PwmApplicationMode.ERROR;
             }
             }
 
 
             if (startupErrorInformation == null) {
             if (startupErrorInformation == null) {
                 startupErrorInformation = configReader.getConfigFileError();
                 startupErrorInformation = configReader.getConfigFileError();
             }
             }
 
 
-            if (PwmApplication.MODE.ERROR == mode) {
+            if (PwmApplicationMode.ERROR == mode) {
                 outputError("Startup Error: " + (startupErrorInformation == null ? "un-specified error" : startupErrorInformation.toDebugStr()));
                 outputError("Startup Error: " + (startupErrorInformation == null ? "un-specified error" : startupErrorInformation.toDebugStr()));
             }
             }
         } catch (Throwable e) {
         } catch (Throwable e) {

+ 40 - 16
src/main/java/password/pwm/http/filter/AbstractPwmFilter.java

@@ -23,6 +23,7 @@
 package password.pwm.http.filter;
 package password.pwm.http.filter;
 
 
 
 
+import password.pwm.PwmApplicationMode;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmException;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmURL;
 import password.pwm.http.PwmURL;
@@ -52,36 +53,58 @@ public abstract class AbstractPwmFilter implements Filter {
     {
     {
         final HttpServletRequest req = (HttpServletRequest)servletRequest;
         final HttpServletRequest req = (HttpServletRequest)servletRequest;
         final HttpServletResponse resp = (HttpServletResponse)servletResponse;
         final HttpServletResponse resp = (HttpServletResponse)servletResponse;
+        final PwmApplicationMode mode = PwmApplicationMode.determineMode(req);
 
 
-        PwmRequest pwmRequest = null;
+        final boolean interested;
         try {
         try {
-            pwmRequest = PwmRequest.forRequest(req, resp);
-        } catch (PwmException e) {
             final PwmURL pwmURL = new PwmURL(req);
             final PwmURL pwmURL = new PwmURL(req);
-            if (pwmURL.isResourceURL()) {
-                filterChain.doFilter(req,resp);
-                return;
+            interested = isInterested(mode, pwmURL);
+        } catch (Exception e) {
+            LOGGER.error("unexpected error processing filter chain during isInterested(): " + e.getMessage(), e);
+            resp.sendError(500,"unexpected error processing filter chain during isInterested");
+            return;
+        }
+
+        if (interested) {
+            PwmRequest pwmRequest = null;
+            try {
+                pwmRequest = PwmRequest.forRequest(req, resp);
+            } catch (PwmException e) {
+                final PwmURL pwmURL = new PwmURL(req);
+                if (pwmURL.isResourceURL()) {
+                    filterChain.doFilter(req,resp);
+                    return;
+                }
+
+                LOGGER.error(pwmRequest, "unexpected error processing filter chain: " + e.getMessage(), e);
             }
             }
 
 
-            LOGGER.error(pwmRequest, "unexpected error processing filter chain: " + e.getMessage(), e);
-        }
+            try {
+                final PwmFilterChain pwmFilterChain = new PwmFilterChain(servletRequest, servletResponse, filterChain);
+                processFilter(mode, pwmRequest, pwmFilterChain);
+            } catch (PwmException e) {
+                LOGGER.error(pwmRequest, "unexpected error processing filter chain: " + e.getMessage(), e);
+            } catch (IOException e) {
+                LOGGER.debug(pwmRequest, "i/o error processing request: " + e.getMessage());
+            }
 
 
-        try {
-            final PwmFilterChain pwmFilterChain = new PwmFilterChain(servletRequest, servletResponse, filterChain);
-            processFilter(pwmRequest, pwmFilterChain);
-        } catch (PwmException e) {
-            LOGGER.error(pwmRequest, "unexpected error processing filter chain: " + e.getMessage(), e);
-        } catch (IOException e) {
-            LOGGER.debug(pwmRequest, "i/o error processing request: " + e.getMessage());
+        } else {
+            filterChain.doFilter(req, resp);
         }
         }
 
 
     }
     }
 
 
     abstract void processFilter(
     abstract void processFilter(
+            final PwmApplicationMode mode,
             final PwmRequest pwmRequest,
             final PwmRequest pwmRequest,
             final PwmFilterChain filterChain
             final PwmFilterChain filterChain
     )
     )
-        throws PwmException, IOException, ServletException;
+            throws PwmException, IOException, ServletException;
+
+    abstract boolean isInterested(
+            final PwmApplicationMode mode,
+            final PwmURL pwmURL
+    );
 
 
     @Override
     @Override
     public void destroy()
     public void destroy()
@@ -121,4 +144,5 @@ public abstract class AbstractPwmFilter implements Filter {
             return servletResponse;
             return servletResponse;
         }
         }
     }
     }
+
 }
 }

+ 12 - 5
src/main/java/password/pwm/http/filter/ApplicationModeFilter.java

@@ -23,6 +23,7 @@
 package password.pwm.http.filter;
 package password.pwm.http.filter;
 
 
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
@@ -42,6 +43,7 @@ public class ApplicationModeFilter extends AbstractPwmFilter {
 
 
     @Override
     @Override
     public void processFilter(
     public void processFilter(
+            final PwmApplicationMode mode,
             final PwmRequest pwmRequest,
             final PwmRequest pwmRequest,
             final PwmFilterChain chain
             final PwmFilterChain chain
     )
     )
@@ -70,17 +72,22 @@ public class ApplicationModeFilter extends AbstractPwmFilter {
         chain.doFilter();
         chain.doFilter();
     }
     }
 
 
+    @Override
+    boolean isInterested(PwmApplicationMode mode, PwmURL pwmURL) {
+        return !pwmURL.isResourceURL();
+    }
+
     private static boolean checkConfigModes(
     private static boolean checkConfigModes(
             final PwmRequest pwmRequest
             final PwmRequest pwmRequest
     )
     )
             throws IOException, ServletException, PwmUnrecoverableException
             throws IOException, ServletException, PwmUnrecoverableException
     {
     {
         final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
         final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
-        final PwmApplication.MODE mode = pwmApplication.getApplicationMode();
+        final PwmApplicationMode mode = pwmApplication.getApplicationMode();
 
 
         final PwmURL pwmURL = pwmRequest.getURL();
         final PwmURL pwmURL = pwmRequest.getURL();
 
 
-        if (mode == PwmApplication.MODE.NEW) {
+        if (mode == PwmApplicationMode.NEW) {
             // check if current request is actually for the config url, if it is, just do nothing.
             // check if current request is actually for the config url, if it is, just do nothing.
             if (pwmURL.isCommandServletURL() || pwmURL.isWebServiceURL()) {
             if (pwmURL.isCommandServletURL() || pwmURL.isWebServiceURL()) {
                 return false;
                 return false;
@@ -95,7 +102,7 @@ public class ApplicationModeFilter extends AbstractPwmFilter {
             }
             }
         }
         }
 
 
-        if (mode == PwmApplication.MODE.ERROR) {
+        if (mode == PwmApplicationMode.ERROR) {
             ErrorInformation rootError = ContextManager.getContextManager(pwmRequest.getHttpServletRequest().getSession()).getStartupErrorInformation();
             ErrorInformation rootError = ContextManager.getContextManager(pwmRequest.getHttpServletRequest().getSession()).getStartupErrorInformation();
             if (rootError == null) {
             if (rootError == null) {
                 rootError = new ErrorInformation(PwmError.ERROR_APP_UNAVAILABLE, "Application startup failed.");
                 rootError = new ErrorInformation(PwmError.ERROR_APP_UNAVAILABLE, "Application startup failed.");
@@ -112,11 +119,11 @@ public class ApplicationModeFilter extends AbstractPwmFilter {
         // block if public request and not running or in trial
         // block if public request and not running or in trial
         if (!PwmConstants.TRIAL_MODE) {
         if (!PwmConstants.TRIAL_MODE) {
             if (pwmURL.isPublicUrl() && !pwmURL.isLogoutURL() && !pwmURL.isCommandServletURL() && !pwmURL.isCaptchaURL())  {
             if (pwmURL.isPublicUrl() && !pwmURL.isLogoutURL() && !pwmURL.isCommandServletURL() && !pwmURL.isCaptchaURL())  {
-                if (mode == PwmApplication.MODE.CONFIGURATION) {
+                if (mode == PwmApplicationMode.CONFIGURATION) {
                     pwmRequest.respondWithError(new ErrorInformation(PwmError.ERROR_SERVICE_NOT_AVAILABLE,"public services are not available while configuration is open"));
                     pwmRequest.respondWithError(new ErrorInformation(PwmError.ERROR_SERVICE_NOT_AVAILABLE,"public services are not available while configuration is open"));
                     return true;
                     return true;
                 }
                 }
-                if (mode != PwmApplication.MODE.RUNNING) {
+                if (mode != PwmApplicationMode.RUNNING) {
                     pwmRequest.respondWithError(new ErrorInformation(PwmError.ERROR_SERVICE_NOT_AVAILABLE,"public services are not available while application is not in running mode"));
                     pwmRequest.respondWithError(new ErrorInformation(PwmError.ERROR_SERVICE_NOT_AVAILABLE,"public services are not available while application is not in running mode"));
                     return true;
                     return true;
                 }
                 }

+ 0 - 61
src/main/java/password/pwm/http/filter/ApplicationStatusFilter.java

@@ -1,61 +0,0 @@
-package password.pwm.http.filter;
-
-import password.pwm.PwmApplication;
-import password.pwm.PwmConstants;
-import password.pwm.error.ErrorInformation;
-import password.pwm.http.ContextManager;
-import password.pwm.http.PwmRequest;
-import password.pwm.http.PwmURL;
-import password.pwm.util.logging.PwmLogger;
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-public class ApplicationStatusFilter implements Filter {
-    private static final PwmLogger LOGGER = PwmLogger.forClass(ApplicationStatusFilter.class);
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
-
-    }
-
-    @Override
-    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
-
-        ErrorInformation startupError = null;
-        try {
-            final ServletContext servletContext = servletRequest.getServletContext();
-            final ContextManager contextManager = (ContextManager) servletContext.getAttribute(PwmConstants.CONTEXT_ATTR_CONTEXT_MANAGER);
-            if (contextManager != null) {
-                startupError = contextManager.getStartupErrorInformation();
-
-                PwmApplication pwmApplication = contextManager.getPwmApplication();
-                if (pwmApplication != null) {
-                    filterChain.doFilter(servletRequest, servletResponse);
-                    return;
-                }
-            }
-        } catch (Exception e) {
-            final PwmURL pwmURL = new PwmURL((HttpServletRequest)servletRequest);
-            if (pwmURL.isResourceURL()) {
-                filterChain.doFilter(servletRequest, servletResponse);
-                return;
-            }
-
-            LOGGER.error("error while trying to detect application status: " + e.getMessage());
-        }
-
-        LOGGER.error("unable to satisfy incoming request, application is not available");
-        servletRequest.setAttribute(PwmRequest.Attribute.PwmErrorInfo.toString(), startupError);
-        ((HttpServletResponse) servletResponse).setStatus(500);
-        final String url = PwmConstants.JSP_URL.APP_UNAVAILABLE.getPath();
-        servletRequest.getServletContext().getRequestDispatcher(url).forward(servletRequest, servletResponse);
-    }
-
-    @Override
-    public void destroy() {
-
-    }
-}

+ 8 - 3
src/main/java/password/pwm/http/filter/AuthenticationFilter.java

@@ -25,6 +25,7 @@ package password.pwm.http.filter;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserInfoBean;
 import password.pwm.bean.UserInfoBean;
@@ -73,6 +74,7 @@ public class AuthenticationFilter extends AbstractPwmFilter {
     private static final PwmLogger LOGGER = PwmLogger.getLogger(AuthenticationFilter.class.getName());
     private static final PwmLogger LOGGER = PwmLogger.getLogger(AuthenticationFilter.class.getName());
 
 
     public void processFilter(
     public void processFilter(
+            final PwmApplicationMode mode,
             final PwmRequest pwmRequest,
             final PwmRequest pwmRequest,
             final PwmFilterChain chain
             final PwmFilterChain chain
     )
     )
@@ -89,14 +91,14 @@ public class AuthenticationFilter extends AbstractPwmFilter {
             final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
             final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
             final PwmSession pwmSession = pwmRequest.getPwmSession();
             final PwmSession pwmSession = pwmRequest.getPwmSession();
 
 
-            if (pwmApplication.getApplicationMode() == PwmApplication.MODE.NEW) {
+            if (pwmApplication.getApplicationMode() == PwmApplicationMode.NEW) {
                 if (pwmRequest.getURL().isConfigGuideURL()) {
                 if (pwmRequest.getURL().isConfigGuideURL()) {
                     chain.doFilter();
                     chain.doFilter();
                     return;
                     return;
                 }
                 }
             }
             }
 
 
-            if (pwmApplication.getApplicationMode() == PwmApplication.MODE.CONFIGURATION) {
+            if (pwmApplication.getApplicationMode() == PwmApplicationMode.CONFIGURATION) {
                 if (pwmRequest.getURL().isConfigManagerURL()) {
                 if (pwmRequest.getURL().isConfigManagerURL()) {
                     chain.doFilter();
                     chain.doFilter();
                     return;
                     return;
@@ -115,7 +117,10 @@ public class AuthenticationFilter extends AbstractPwmFilter {
         }
         }
     }
     }
 
 
-// -------------------------- OTHER METHODS --------------------------
+    @Override
+    boolean isInterested(PwmApplicationMode mode, PwmURL pwmURL) {
+        return !pwmURL.isResourceURL();
+    }
 
 
     private void processAuthenticatedSession(
     private void processAuthenticatedSession(
             final PwmRequest pwmRequest,
             final PwmRequest pwmRequest,

+ 8 - 0
src/main/java/password/pwm/http/filter/AuthorizationFilter.java

@@ -24,9 +24,11 @@ package password.pwm.http.filter;
 
 
 import password.pwm.Permission;
 import password.pwm.Permission;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmSession;
 import password.pwm.http.PwmSession;
+import password.pwm.http.PwmURL;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
 import javax.servlet.FilterConfig;
 import javax.servlet.FilterConfig;
@@ -53,7 +55,13 @@ public class AuthorizationFilter extends AbstractPwmFilter {
             throws ServletException {
             throws ServletException {
     }
     }
 
 
+    @Override
+    boolean isInterested(PwmApplicationMode mode, PwmURL pwmURL) {
+        return true;
+    }
+
     public void processFilter(
     public void processFilter(
+            final PwmApplicationMode mode,
             final PwmRequest pwmRequest,
             final PwmRequest pwmRequest,
             final PwmFilterChain chain
             final PwmFilterChain chain
     )
     )

+ 7 - 0
src/main/java/password/pwm/http/filter/CaptchaFilter.java

@@ -22,6 +22,7 @@
 
 
 package password.pwm.http.filter;
 package password.pwm.http.filter;
 
 
+import password.pwm.PwmApplicationMode;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
@@ -41,7 +42,13 @@ public class CaptchaFilter extends AbstractPwmFilter {
 
 
     private static final PwmLogger LOGGER = PwmLogger.forClass(CaptchaFilter.class);
     private static final PwmLogger LOGGER = PwmLogger.forClass(CaptchaFilter.class);
 
 
+    @Override
+    boolean isInterested(PwmApplicationMode mode, PwmURL pwmURL) {
+        return true;
+    }
+
     public void processFilter(
     public void processFilter(
+            final PwmApplicationMode mode,
             final PwmRequest pwmRequest,
             final PwmRequest pwmRequest,
             final PwmFilterChain chain
             final PwmFilterChain chain
     )
     )

+ 13 - 10
src/main/java/password/pwm/http/filter/ConfigAccessFilter.java

@@ -1,9 +1,6 @@
 package password.pwm.http.filter;
 package password.pwm.http.filter;
 
 
-import password.pwm.AppProperty;
-import password.pwm.Permission;
-import password.pwm.PwmApplication;
-import password.pwm.PwmConstants;
+import password.pwm.*;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserIdentity;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.stored.ConfigurationProperty;
 import password.pwm.config.stored.ConfigurationProperty;
@@ -16,6 +13,7 @@ import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.ContextManager;
 import password.pwm.http.ContextManager;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmSession;
 import password.pwm.http.PwmSession;
+import password.pwm.http.PwmURL;
 import password.pwm.http.bean.ConfigManagerBean;
 import password.pwm.http.bean.ConfigManagerBean;
 import password.pwm.ldap.auth.AuthenticationType;
 import password.pwm.ldap.auth.AuthenticationType;
 import password.pwm.svc.intruder.RecordType;
 import password.pwm.svc.intruder.RecordType;
@@ -39,9 +37,9 @@ public class ConfigAccessFilter extends AbstractPwmFilter {
 
 
 
 
     @Override
     @Override
-    void processFilter(PwmRequest pwmRequest, PwmFilterChain filterChain) throws PwmException, IOException, ServletException {
-        final PwmApplication.MODE appMode = pwmRequest.getPwmApplication().getApplicationMode();
-        if (appMode == PwmApplication.MODE.NEW) {
+    void processFilter(PwmApplicationMode mode, PwmRequest pwmRequest, PwmFilterChain filterChain) throws PwmException, IOException, ServletException {
+        final PwmApplicationMode appMode = pwmRequest.getPwmApplication().getApplicationMode();
+        if (appMode == PwmApplicationMode.NEW) {
             filterChain.doFilter();
             filterChain.doFilter();
             return;
             return;
         }
         }
@@ -52,6 +50,11 @@ public class ConfigAccessFilter extends AbstractPwmFilter {
         }
         }
     }
     }
 
 
+    @Override
+    boolean isInterested(PwmApplicationMode mode, PwmURL pwmURL) {
+        return pwmURL.isConfigManagerURL();
+    }
+
     static boolean checkAuthentication(
     static boolean checkAuthentication(
             final PwmRequest pwmRequest,
             final PwmRequest pwmRequest,
             final ConfigManagerBean configManagerBean
             final ConfigManagerBean configManagerBean
@@ -68,7 +71,7 @@ public class ConfigAccessFilter extends AbstractPwmFilter {
             authRequired = true;
             authRequired = true;
         }
         }
 
 
-        if (PwmApplication.MODE.RUNNING == pwmRequest.getPwmApplication().getApplicationMode()) {
+        if (PwmApplicationMode.RUNNING == pwmRequest.getPwmApplication().getApplicationMode()) {
             if (!pwmRequest.isAuthenticated()) {
             if (!pwmRequest.isAuthenticated()) {
                 throw new PwmUnrecoverableException(PwmError.ERROR_AUTHENTICATION_REQUIRED);
                 throw new PwmUnrecoverableException(PwmError.ERROR_AUTHENTICATION_REQUIRED);
             }
             }
@@ -85,7 +88,7 @@ public class ConfigAccessFilter extends AbstractPwmFilter {
             }
             }
         }
         }
 
 
-        if (PwmApplication.MODE.CONFIGURATION != pwmRequest.getPwmApplication().getApplicationMode()) {
+        if (PwmApplicationMode.CONFIGURATION != pwmRequest.getPwmApplication().getApplicationMode()) {
             authRequired = true;
             authRequired = true;
         }
         }
 
 
@@ -113,7 +116,7 @@ public class ConfigAccessFilter extends AbstractPwmFilter {
             persistentLoginEnabled = true;
             persistentLoginEnabled = true;
             final PwmSecurityKey securityKey = pwmRequest.getConfig().getSecurityKey();
             final PwmSecurityKey securityKey = pwmRequest.getConfig().getSecurityKey();
 
 
-            if (PwmApplication.MODE.RUNNING == pwmRequest.getPwmApplication().getApplicationMode()) {
+            if (PwmApplicationMode.RUNNING == pwmRequest.getPwmApplication().getApplicationMode()) {
                 persistentLoginValue = SecureEngine.hash(
                 persistentLoginValue = SecureEngine.hash(
                         storedConfig.readConfigProperty(ConfigurationProperty.PASSWORD_HASH)
                         storedConfig.readConfigProperty(ConfigurationProperty.PASSWORD_HASH)
                                 + pwmSession.getUserInfoBean().getUserIdentity().toDelimitedKey(),
                                 + pwmSession.getUserInfoBean().getUserIdentity().toDelimitedKey(),

+ 48 - 11
src/main/java/password/pwm/http/filter/RequestInitializationFilter.java

@@ -24,6 +24,7 @@ package password.pwm.http.filter;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
@@ -67,17 +68,53 @@ public class RequestInitializationFilter implements Filter {
     {
     {
     }
     }
 
 
-    @Override
     public void doFilter(
     public void doFilter(
             final ServletRequest servletRequest,
             final ServletRequest servletRequest,
             final ServletResponse servletResponse,
             final ServletResponse servletResponse,
+            final FilterChain filterChain) throws IOException, ServletException {
+
+        final HttpServletRequest req = (HttpServletRequest)servletRequest;
+        final HttpServletResponse resp = (HttpServletResponse)servletResponse;
+        final PwmApplicationMode mode = PwmApplicationMode.determineMode(req);
+        final PwmURL pwmURL = new PwmURL(req);
+
+        if (pwmURL.isResourceURL()) {
+            filterChain.doFilter(req, resp);
+        } else {
+            if (mode == PwmApplicationMode.ERROR) {
+                try {
+                    final ContextManager contextManager = ContextManager.getContextManager(req.getServletContext());
+                    if (contextManager != null) {
+                        final ErrorInformation startupError = contextManager.getStartupErrorInformation();
+                        servletRequest.setAttribute(PwmRequest.Attribute.PwmErrorInfo.toString(), startupError);
+                    }
+                } catch (Exception e) {
+                    if (pwmURL.isResourceURL()) {
+                        filterChain.doFilter(servletRequest, servletResponse);
+                        return;
+                    }
+
+                    LOGGER.error("error while trying to detect application status: " + e.getMessage());
+                }
+
+                LOGGER.error("unable to satisfy incoming request, application is not available");
+                resp.setStatus(500);
+                final String url = PwmConstants.JSP_URL.APP_UNAVAILABLE.getPath();
+                servletRequest.getServletContext().getRequestDispatcher(url).forward(servletRequest, servletResponse);
+            } else {
+                initializeServletRequest(req, resp, filterChain);
+            }
+        }
+    }
+
+
+    private void initializeServletRequest(
+            final HttpServletRequest req,
+            final HttpServletResponse resp,
             final FilterChain filterChain
             final FilterChain filterChain
     )
     )
             throws IOException, ServletException
             throws IOException, ServletException
     {
     {
-        final HttpServletRequest req = (HttpServletRequest)servletRequest;
-        final HttpServletResponse resp = (HttpServletResponse)servletResponse;
-
         try {
         try {
             checkAndInitSessionState(req);
             checkAndInitSessionState(req);
             PwmRequest.forRequest(req,resp);
             PwmRequest.forRequest(req,resp);
@@ -86,16 +123,16 @@ public class RequestInitializationFilter implements Filter {
             if (!(new PwmURL(req).isResourceURL())) {
             if (!(new PwmURL(req).isResourceURL())) {
                 ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_APP_UNAVAILABLE);
                 ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_APP_UNAVAILABLE);
                 try {
                 try {
-                    ContextManager contextManager = ContextManager.getContextManager(servletRequest.getServletContext());
+                    ContextManager contextManager = ContextManager.getContextManager(req.getServletContext());
                     if (contextManager != null) {
                     if (contextManager != null) {
                         errorInformation = contextManager.getStartupErrorInformation();
                         errorInformation = contextManager.getStartupErrorInformation();
                     }
                     }
                 } catch (Throwable e2) {
                 } catch (Throwable e2) {
                     e2.getMessage();
                     e2.getMessage();
                 }
                 }
-                servletRequest.setAttribute(PwmRequest.Attribute.PwmErrorInfo.toString(),errorInformation);
+                req.setAttribute(PwmRequest.Attribute.PwmErrorInfo.toString(),errorInformation);
                 final String url = PwmConstants.JSP_URL.APP_UNAVAILABLE.getPath();
                 final String url = PwmConstants.JSP_URL.APP_UNAVAILABLE.getPath();
-                servletRequest.getServletContext().getRequestDispatcher(url).forward(req, resp);
+                req.getServletContext().getRequestDispatcher(url).forward(req, resp);
             }
             }
             return;
             return;
         }
         }
@@ -125,21 +162,21 @@ public class RequestInitializationFilter implements Filter {
             if (!(new PwmURL(req).isResourceURL())) {
             if (!(new PwmURL(req).isResourceURL())) {
                 ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_APP_UNAVAILABLE);
                 ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_APP_UNAVAILABLE);
                 try {
                 try {
-                    ContextManager contextManager = ContextManager.getContextManager(servletRequest.getServletContext());
+                    ContextManager contextManager = ContextManager.getContextManager(req.getServletContext());
                     if (contextManager != null) {
                     if (contextManager != null) {
                         errorInformation = contextManager.getStartupErrorInformation();
                         errorInformation = contextManager.getStartupErrorInformation();
                     }
                     }
                 } catch (Throwable e2) {
                 } catch (Throwable e2) {
                     e2.getMessage();
                     e2.getMessage();
                 }
                 }
-                servletRequest.setAttribute(PwmRequest.Attribute.PwmErrorInfo.toString(),errorInformation);
+                req.setAttribute(PwmRequest.Attribute.PwmErrorInfo.toString(),errorInformation);
                 final String url = PwmConstants.JSP_URL.APP_UNAVAILABLE.getPath();
                 final String url = PwmConstants.JSP_URL.APP_UNAVAILABLE.getPath();
-                servletRequest.getServletContext().getRequestDispatcher(url).forward(req, resp);
+                req.getServletContext().getRequestDispatcher(url).forward(req, resp);
             }
             }
             return;
             return;
         }
         }
 
 
-        filterChain.doFilter(servletRequest, servletResponse);
+        filterChain.doFilter(req, resp);
     }
     }
 
 
     private void checkAndInitSessionState(final HttpServletRequest request)
     private void checkAndInitSessionState(final HttpServletRequest request)

+ 7 - 0
src/main/java/password/pwm/http/filter/SessionFilter.java

@@ -24,6 +24,7 @@ package password.pwm.http.filter;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
@@ -59,7 +60,13 @@ public class SessionFilter extends AbstractPwmFilter {
 
 
     private static final PwmLogger LOGGER = PwmLogger.forClass(SessionFilter.class);
     private static final PwmLogger LOGGER = PwmLogger.forClass(SessionFilter.class);
 
 
+    @Override
+    boolean isInterested(PwmApplicationMode mode, PwmURL pwmURL) {
+        return true;
+    }
+
     public void processFilter(
     public void processFilter(
+            final PwmApplicationMode mode,
             final PwmRequest pwmRequest,
             final PwmRequest pwmRequest,
             final PwmFilterChain chain
             final PwmFilterChain chain
     )
     )

+ 2 - 5
src/main/java/password/pwm/http/servlet/configeditor/ConfigEditorServlet.java

@@ -23,10 +23,7 @@
 package password.pwm.http.servlet.configeditor;
 package password.pwm.http.servlet.configeditor;
 
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
-import password.pwm.AppProperty;
-import password.pwm.PwmApplication;
-import password.pwm.PwmConstants;
-import password.pwm.Validator;
+import password.pwm.*;
 import password.pwm.bean.SmsItemBean;
 import password.pwm.bean.SmsItemBean;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserIdentity;
 import password.pwm.config.*;
 import password.pwm.config.*;
@@ -949,7 +946,7 @@ public class ConfigEditorServlet extends AbstractPwmServlet {
             final LinkedHashMap<String, Object> varMap = new LinkedHashMap<>();
             final LinkedHashMap<String, Object> varMap = new LinkedHashMap<>();
             varMap.put("ldapProfileIds", configManagerBean.getStoredConfiguration().readSetting(PwmSetting.LDAP_PROFILE_LIST).toNativeObject());
             varMap.put("ldapProfileIds", configManagerBean.getStoredConfiguration().readSetting(PwmSetting.LDAP_PROFILE_LIST).toNativeObject());
             varMap.put("currentTemplate",configManagerBean.getStoredConfiguration().getTemplateSet());
             varMap.put("currentTemplate",configManagerBean.getStoredConfiguration().getTemplateSet());
-            if (pwmRequest.getPwmApplication().getApplicationMode() == PwmApplication.MODE.CONFIGURATION && !PwmConstants.TRIAL_MODE) {
+            if (pwmRequest.getPwmApplication().getApplicationMode() == PwmApplicationMode.CONFIGURATION && !PwmConstants.TRIAL_MODE) {
                 if (!configManagerBean.isConfigUnlockedWarningShown()) {
                 if (!configManagerBean.isConfigUnlockedWarningShown()) {
                     varMap.put("configUnlocked",true);
                     varMap.put("configUnlocked",true);
                     configManagerBean.setConfigUnlockedWarningShown(true);
                     configManagerBean.setConfigUnlockedWarningShown(true);

+ 3 - 2
src/main/java/password/pwm/http/servlet/configguide/ConfigGuideServlet.java

@@ -31,6 +31,7 @@ import com.novell.ldapchai.provider.ChaiSetting;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserIdentity;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
@@ -134,7 +135,7 @@ public class ConfigGuideServlet extends AbstractPwmServlet {
 
 
         final ConfigGuideBean configGuideBean = pwmApplication.getSessionStateService().getBean(pwmRequest, ConfigGuideBean.class);
         final ConfigGuideBean configGuideBean = pwmApplication.getSessionStateService().getBean(pwmRequest, ConfigGuideBean.class);
 
 
-        if (pwmApplication.getApplicationMode() != PwmApplication.MODE.NEW) {
+        if (pwmApplication.getApplicationMode() != PwmApplicationMode.NEW) {
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_SERVICE_NOT_AVAILABLE,"ConfigGuide unavailable unless in NEW mode");
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_SERVICE_NOT_AVAILABLE,"ConfigGuide unavailable unless in NEW mode");
             LOGGER.error(pwmSession, errorInformation.toDebugStr());
             LOGGER.error(pwmSession, errorInformation.toDebugStr());
             pwmRequest.respondWithError(errorInformation);
             pwmRequest.respondWithError(errorInformation);
@@ -222,7 +223,7 @@ public class ConfigGuideServlet extends AbstractPwmServlet {
         final PwmSession pwmSession = pwmRequest.getPwmSession();
         final PwmSession pwmSession = pwmRequest.getPwmSession();
         final HttpServletRequest req = pwmRequest.getHttpServletRequest();
         final HttpServletRequest req = pwmRequest.getHttpServletRequest();
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.RUNNING) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.RUNNING) {
             final String errorMsg = "config upload is not permitted when in running mode";
             final String errorMsg = "config upload is not permitted when in running mode";
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_UPLOAD_FAILURE,errorMsg,new String[]{errorMsg});
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_UPLOAD_FAILURE,errorMsg,new String[]{errorMsg});
             pwmRequest.respondWithError(errorInformation, true);
             pwmRequest.respondWithError(errorInformation, true);

+ 2 - 1
src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerLocalDBServlet.java

@@ -26,6 +26,7 @@ import com.novell.ldapchai.exception.ChaiUnavailableException;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
@@ -138,7 +139,7 @@ public class ConfigManagerLocalDBServlet extends AbstractPwmServlet {
         final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
         final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
         final HttpServletRequest req = pwmRequest.getHttpServletRequest();
         final HttpServletRequest req = pwmRequest.getHttpServletRequest();
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.RUNNING) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.RUNNING) {
             final String errorMsg = "database upload is not permitted when in running mode";
             final String errorMsg = "database upload is not permitted when in running mode";
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_UPLOAD_FAILURE,errorMsg,new String[]{errorMsg});
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.CONFIG_UPLOAD_FAILURE,errorMsg,new String[]{errorMsg});
             pwmRequest.respondWithError(errorInformation, true);
             pwmRequest.respondWithError(errorInformation, true);

+ 6 - 0
src/main/java/password/pwm/http/tag/PwmFormIDTag.java

@@ -22,11 +22,13 @@
 
 
 package password.pwm.http.tag;
 package password.pwm.http.tag;
 
 
+import password.pwm.PwmApplicationMode;
 import password.pwm.http.JspUtility;
 import password.pwm.http.JspUtility;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.util.Helper;
 import password.pwm.util.Helper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.jsp.tagext.TagSupport;
 import javax.servlet.jsp.tagext.TagSupport;
 import java.io.IOException;
 import java.io.IOException;
 
 
@@ -38,6 +40,10 @@ public class PwmFormIDTag extends TagSupport {
     public int doEndTag()
     public int doEndTag()
             throws javax.servlet.jsp.JspTagException
             throws javax.servlet.jsp.JspTagException
     {
     {
+        if (PwmApplicationMode.determineMode((HttpServletRequest) pageContext.getRequest()) == PwmApplicationMode.ERROR) {
+            return EVAL_PAGE;
+        }
+
         try {
         try {
             final PwmRequest pwmRequest = JspUtility.getPwmRequest(pageContext);
             final PwmRequest pwmRequest = JspUtility.getPwmRequest(pageContext);
             final String pwmFormID = Helper.buildPwmFormID(pwmRequest);
             final String pwmFormID = Helper.buildPwmFormID(pwmRequest);

+ 11 - 13
src/main/java/password/pwm/http/tag/PwmUrlTag.java

@@ -22,6 +22,7 @@
 
 
 package password.pwm.http.tag;
 package password.pwm.http.tag;
 
 
+import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
@@ -65,8 +66,6 @@ public class PwmUrlTag extends PwmAbstractTag {
             throws javax.servlet.jsp.JspTagException
             throws javax.servlet.jsp.JspTagException
     {
     {
         String outputURL = url;
         String outputURL = url;
-        //try {
-        outputURL = url;
         PwmRequest pwmRequest = null;
         PwmRequest pwmRequest = null;
         try {
         try {
             pwmRequest = PwmRequest.forRequest((HttpServletRequest)pageContext.getRequest(), (HttpServletResponse)pageContext.getResponse());
             pwmRequest = PwmRequest.forRequest((HttpServletRequest)pageContext.getRequest(), (HttpServletResponse)pageContext.getResponse());
@@ -74,27 +73,24 @@ public class PwmUrlTag extends PwmAbstractTag {
 
 
         String workingUrl;
         String workingUrl;
         if (THEME_URL.equals(url)) {
         if (THEME_URL.equals(url)) {
-            workingUrl = figureThemeURL(pwmRequest.getPwmApplication(), pwmRequest.getPwmSession(), false);
+            workingUrl = figureThemeURL(pwmRequest, false);
             workingUrl = insertContext(pageContext, workingUrl);
             workingUrl = insertContext(pageContext, workingUrl);
         } else if (MOBILE_THEME_URL.equals(url)) {
         } else if (MOBILE_THEME_URL.equals(url)) {
-            workingUrl = figureThemeURL(pwmRequest.getPwmApplication(), pwmRequest.getPwmSession(), true);
+            workingUrl = figureThemeURL(pwmRequest, true);
             workingUrl = insertContext(pageContext, workingUrl);
             workingUrl = insertContext(pageContext, workingUrl);
         } else {
         } else {
             workingUrl = url;
             workingUrl = url;
         }
         }
 
 
-        //workingUrl = SessionFilter.rewriteURL(workingUrl, pageContext.getRequest(), pageContext.getResponse());
         if (addContext) {
         if (addContext) {
             workingUrl = insertContext(pageContext, workingUrl);
             workingUrl = insertContext(pageContext, workingUrl);
         }
         }
         if (pwmRequest != null) {
         if (pwmRequest != null) {
             workingUrl = insertResourceNonce(pwmRequest.getPwmApplication(), workingUrl);
             workingUrl = insertResourceNonce(pwmRequest.getPwmApplication(), workingUrl);
         }
         }
-        //workingUrl = injectFormID(pwmSession, workingUrl);
+
         outputURL = workingUrl;
         outputURL = workingUrl;
-        //} catch (PwmUnrecoverableException e) {
-            /* application unavailable */
-        //}
+
         try {
         try {
             pageContext.getOut().write(outputURL);
             pageContext.getOut().write(outputURL);
         } catch (Exception e) {
         } catch (Exception e) {
@@ -157,15 +153,17 @@ public class PwmUrlTag extends PwmAbstractTag {
     }
     }
 
 
     private static String figureThemeURL(
     private static String figureThemeURL(
-            final PwmApplication pwmApplication,
-            final PwmSession pwmSession,
+            final PwmRequest pwmRequest,
             final boolean mobile
             final boolean mobile
     )
     )
     {
     {
         String themeURL = null;
         String themeURL = null;
-        String themeName = "default";
+        String themeName = AppProperty.CONFIG_GUIDE_THEME.getDefaultValue();
+
+        if (pwmRequest != null) {
+            final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
+            final PwmSession pwmSession = pwmRequest.getPwmSession();
 
 
-        if (pwmApplication != null && pwmSession != null) {
             themeName = figureThemeName(pwmApplication, pwmSession);
             themeName = figureThemeName(pwmApplication, pwmSession);
 
 
             if (themeName.equals("custom")) {
             if (themeName.equals("custom")) {

+ 23 - 19
src/main/java/password/pwm/http/tag/conditional/PwmIfTag.java

@@ -24,6 +24,7 @@ package password.pwm.http.tag.conditional;
 
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.Permission;
 import password.pwm.Permission;
+import password.pwm.PwmApplicationMode;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
@@ -72,28 +73,31 @@ public class PwmIfTag extends BodyTagSupport {
     public int doStartTag()
     public int doStartTag()
             throws JspException
             throws JspException
     {
     {
+
         boolean showBody = false;
         boolean showBody = false;
-        if (test != null) {
-            try {
-
-                final PwmRequest pwmRequest = PwmRequest.forRequest((HttpServletRequest) pageContext.getRequest(),
-                        (HttpServletResponse) pageContext.getResponse());
-                final PwmSession pwmSession = pwmRequest.getPwmSession();
-
-                PwmIfTest testEnum = test;
-                if (testEnum != null) {
-                    try {
-                        final PwmIfOptions options = new PwmIfOptions(negate, setting, permission, requestFlag);
-                        showBody = testEnum.passed(pwmRequest, options);
-                    } catch (ChaiUnavailableException e) {
-                        LOGGER.error("error testing jsp if '" + testEnum.toString() + "', error: " + e.getMessage());
+        if (PwmApplicationMode.determineMode((HttpServletRequest) pageContext.getRequest()) != PwmApplicationMode.ERROR) {
+            if (test != null) {
+                try {
+
+                    final PwmRequest pwmRequest = PwmRequest.forRequest((HttpServletRequest) pageContext.getRequest(),
+                            (HttpServletResponse) pageContext.getResponse());
+                    final PwmSession pwmSession = pwmRequest.getPwmSession();
+
+                    PwmIfTest testEnum = test;
+                    if (testEnum != null) {
+                        try {
+                            final PwmIfOptions options = new PwmIfOptions(negate, setting, permission, requestFlag);
+                            showBody = testEnum.passed(pwmRequest, options);
+                        } catch (ChaiUnavailableException e) {
+                            LOGGER.error("error testing jsp if '" + testEnum.toString() + "', error: " + e.getMessage());
+                        }
+                    } else {
+                        final String errorMsg = "unknown test name '" + test + "' in pwm:If jsp tag!";
+                        LOGGER.warn(pwmSession, errorMsg);
                     }
                     }
-                } else {
-                    final String errorMsg = "unknown test name '" + test + "' in pwm:If jsp tag!";
-                    LOGGER.warn(pwmSession, errorMsg);
+                } catch (PwmUnrecoverableException e) {
+                    LOGGER.error("error executing PwmIfTag for test '" + test + "', error: " + e.getMessage());
                 }
                 }
-            } catch (PwmUnrecoverableException e) {
-                LOGGER.error("error executing PwmIfTag for test '" + test + "', error: " + e.getMessage());
             }
             }
         }
         }
 
 

+ 7 - 10
src/main/java/password/pwm/http/tag/conditional/PwmIfTest.java

@@ -1,10 +1,7 @@
 package password.pwm.http.tag.conditional;
 package password.pwm.http.tag.conditional;
 
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
-import password.pwm.AppProperty;
-import password.pwm.Permission;
-import password.pwm.PwmApplication;
-import password.pwm.PwmConstants;
+import password.pwm.*;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.profile.ProfileType;
 import password.pwm.config.profile.ProfileType;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
@@ -147,8 +144,8 @@ public enum PwmIfTest {
     private static class ShowHeaderMenuTest implements Test {
     private static class ShowHeaderMenuTest implements Test {
         @Override
         @Override
         public boolean test(PwmRequest pwmRequest, PwmIfOptions options) throws ChaiUnavailableException, PwmUnrecoverableException {
         public boolean test(PwmRequest pwmRequest, PwmIfOptions options) throws ChaiUnavailableException, PwmUnrecoverableException {
-            final PwmApplication.MODE applicationMode = pwmRequest.getPwmApplication().getApplicationMode();
-            boolean configMode = applicationMode == PwmApplication.MODE.CONFIGURATION;
+            final PwmApplicationMode applicationMode = pwmRequest.getPwmApplication().getApplicationMode();
+            boolean configMode = applicationMode == PwmApplicationMode.CONFIGURATION;
             boolean adminUser = pwmRequest.getPwmSession().getSessionManager().checkPermission(pwmRequest.getPwmApplication(), Permission.PWMADMIN);
             boolean adminUser = pwmRequest.getPwmSession().getSessionManager().checkPermission(pwmRequest.getPwmApplication(), Permission.PWMADMIN);
             if (Boolean.parseBoolean(pwmRequest.getConfig().readAppProperty(AppProperty.CLIENT_WARNING_HEADER_SHOW))) {
             if (Boolean.parseBoolean(pwmRequest.getConfig().readAppProperty(AppProperty.CLIENT_WARNING_HEADER_SHOW))) {
                 if (configMode || PwmConstants.TRIAL_MODE) {
                 if (configMode || PwmConstants.TRIAL_MODE) {
@@ -222,7 +219,7 @@ public enum PwmIfTest {
         )
         )
                 throws ChaiUnavailableException, PwmUnrecoverableException
                 throws ChaiUnavailableException, PwmUnrecoverableException
         {
         {
-            return pwmRequest.getPwmApplication().getApplicationMode() == PwmApplication.MODE.CONFIGURATION;
+            return pwmRequest.getPwmApplication().getApplicationMode() == PwmApplicationMode.CONFIGURATION;
         }
         }
     }
     }
 
 
@@ -277,8 +274,8 @@ public enum PwmIfTest {
     private static class ConfigModeTest implements Test {
     private static class ConfigModeTest implements Test {
         @Override
         @Override
         public boolean test(PwmRequest pwmRequest, PwmIfOptions options) throws ChaiUnavailableException, PwmUnrecoverableException {
         public boolean test(PwmRequest pwmRequest, PwmIfOptions options) throws ChaiUnavailableException, PwmUnrecoverableException {
-            final PwmApplication.MODE applicationMode = pwmRequest.getPwmApplication().getApplicationMode();
-            return applicationMode == PwmApplication.MODE.CONFIGURATION;
+            final PwmApplicationMode applicationMode = pwmRequest.getPwmApplication().getApplicationMode();
+            return applicationMode == PwmApplicationMode.CONFIGURATION;
         }
         }
     }
     }
 
 
@@ -311,7 +308,7 @@ public enum PwmIfTest {
                 return true;
                 return true;
             }
             }
 
 
-            if (pwmRequest.getPwmApplication().getApplicationMode() != PwmApplication.MODE.RUNNING) {
+            if (pwmRequest.getPwmApplication().getApplicationMode() != PwmApplicationMode.RUNNING) {
                 return true;
                 return true;
             }
             }
 
 

+ 2 - 5
src/main/java/password/pwm/http/tag/value/PwmValue.java

@@ -1,10 +1,7 @@
 package password.pwm.http.tag.value;
 package password.pwm.http.tag.value;
 
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
-import password.pwm.AppProperty;
-import password.pwm.Permission;
-import password.pwm.PwmApplication;
-import password.pwm.PwmConstants;
+import password.pwm.*;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
@@ -144,7 +141,7 @@ public enum PwmValue {
         public String valueOutput(PwmRequest pwmRequest, PageContext pageContext) throws ChaiUnavailableException, PwmUnrecoverableException {
         public String valueOutput(PwmRequest pwmRequest, PageContext pageContext) throws ChaiUnavailableException, PwmUnrecoverableException {
             if (PwmConstants.TRIAL_MODE) {
             if (PwmConstants.TRIAL_MODE) {
                 return LocaleHelper.getLocalizedMessage(pwmRequest.getLocale(), "Header_TrialMode", pwmRequest.getConfig(), Admin.class, new String[]{PwmConstants.PWM_APP_NAME});
                 return LocaleHelper.getLocalizedMessage(pwmRequest.getLocale(), "Header_TrialMode", pwmRequest.getConfig(), Admin.class, new String[]{PwmConstants.PWM_APP_NAME});
-            } else if (pwmRequest.getPwmApplication().getApplicationMode() == PwmApplication.MODE.CONFIGURATION) {
+            } else if (pwmRequest.getPwmApplication().getApplicationMode() == PwmApplicationMode.CONFIGURATION) {
                 String output = "";
                 String output = "";
                 if (Boolean.parseBoolean(pwmRequest.getConfig().readAppProperty(AppProperty.CLIENT_JSP_SHOW_ICONS))) {
                 if (Boolean.parseBoolean(pwmRequest.getConfig().readAppProperty(AppProperty.CLIENT_JSP_SHOW_ICONS))) {
                     output += "<span id=\"icon-configModeHelp\" class=\"btn-icon pwm-icon pwm-icon-question-circle\"></span>";
                     output += "<span id=\"icon-configModeHelp\" class=\"btn-icon pwm-icon pwm-icon-question-circle\"></span>";

+ 6 - 1
src/main/java/password/pwm/http/tag/value/PwmValueTag.java

@@ -22,6 +22,7 @@
 
 
 package password.pwm.http.tag.value;
 package password.pwm.http.tag.value;
 
 
+import password.pwm.PwmApplicationMode;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.util.StringUtil;
 import password.pwm.util.StringUtil;
@@ -54,6 +55,10 @@ public class PwmValueTag extends TagSupport {
     public int doEndTag()
     public int doEndTag()
             throws JspTagException
             throws JspTagException
     {
     {
+        if (PwmApplicationMode.determineMode((HttpServletRequest) pageContext.getRequest()) == PwmApplicationMode.ERROR) {
+            return EVAL_PAGE;
+        }
+
         try {
         try {
             final HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
             final HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
             final PwmRequest pwmRequest = PwmRequest.forRequest(req, (HttpServletResponse) pageContext.getResponse());
             final PwmRequest pwmRequest = PwmRequest.forRequest(req, (HttpServletResponse) pageContext.getResponse());
@@ -67,7 +72,7 @@ public class PwmValueTag extends TagSupport {
                 LOGGER.error("can't output requested value name '" + getName() + "'");
                 LOGGER.error("can't output requested value name '" + getName() + "'");
             }
             }
         } catch (PwmUnrecoverableException e) {
         } catch (PwmUnrecoverableException e) {
-            LOGGER.error("error while processing PwmScriptTag: " + e.getMessage());
+            LOGGER.error("error while processing PwmValueTag: " + e.getMessage());
         } catch (Exception e) {
         } catch (Exception e) {
             throw new JspTagException(e.getMessage(),e);
             throw new JspTagException(e.getMessage(),e);
         }
         }

+ 2 - 1
src/main/java/password/pwm/svc/cache/CacheService.java

@@ -24,6 +24,7 @@ package password.pwm.svc.cache;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
@@ -70,7 +71,7 @@ public class CacheService implements PwmService {
             return;
             return;
         }
         }
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.READ_ONLY) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.READ_ONLY) {
             LOGGER.debug("skipping cache service init due to read-only application mode");
             LOGGER.debug("skipping cache service init due to read-only application mode");
             status = STATUS.CLOSED;
             status = STATUS.CLOSED;
             return;
             return;

+ 3 - 2
src/main/java/password/pwm/svc/event/AuditService.java

@@ -25,6 +25,7 @@ package password.pwm.svc.event;
 import org.apache.commons.csv.CSVPrinter;
 import org.apache.commons.csv.CSVPrinter;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.EmailItemBean;
 import password.pwm.bean.EmailItemBean;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
@@ -190,7 +191,7 @@ public class AuditService implements PwmService {
 
 
         settings = new AuditSettings(pwmApplication.getConfig());
         settings = new AuditSettings(pwmApplication.getConfig());
 
 
-        if (pwmApplication.getApplicationMode() == null || pwmApplication.getApplicationMode() == PwmApplication.MODE.READ_ONLY) {
+        if (pwmApplication.getApplicationMode() == null || pwmApplication.getApplicationMode() == PwmApplicationMode.READ_ONLY) {
             this.status = STATUS.CLOSED;
             this.status = STATUS.CLOSED;
             LOGGER.warn("unable to start - Application is in read-only mode");
             LOGGER.warn("unable to start - Application is in read-only mode");
             return;
             return;
@@ -256,7 +257,7 @@ public class AuditService implements PwmService {
                     maxRecordAge
                     maxRecordAge
             );
             );
 
 
-            if (pwmApplication.getLocalDB() != null && pwmApplication.getApplicationMode() != PwmApplication.MODE.READ_ONLY) {
+            if (pwmApplication.getLocalDB() != null && pwmApplication.getApplicationMode() != PwmApplicationMode.READ_ONLY) {
                 auditVault = new LocalDbAuditVault(pwmApplication, pwmApplication.getLocalDB());
                 auditVault = new LocalDbAuditVault(pwmApplication, pwmApplication.getLocalDB());
                 auditVault.init(settings);
                 auditVault.init(settings);
             }
             }

+ 2 - 1
src/main/java/password/pwm/svc/report/ReportService.java

@@ -28,6 +28,7 @@ import com.novell.ldapchai.provider.ChaiProvider;
 import org.apache.commons.csv.CSVPrinter;
 import org.apache.commons.csv.CSVPrinter;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserInfoBean;
 import password.pwm.bean.UserInfoBean;
@@ -99,7 +100,7 @@ public class ReportService implements PwmService {
         status = STATUS.OPENING;
         status = STATUS.OPENING;
         this.pwmApplication = pwmApplication;
         this.pwmApplication = pwmApplication;
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.READ_ONLY) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.READ_ONLY) {
             LOGGER.debug(PwmConstants.REPORTING_SESSION_LABEL,"application mode is read-only, will remain closed");
             LOGGER.debug(PwmConstants.REPORTING_SESSION_LABEL,"application mode is read-only, will remain closed");
             status = STATUS.CLOSED;
             status = STATUS.CLOSED;
             return;
             return;

+ 2 - 1
src/main/java/password/pwm/svc/stats/StatisticsManager.java

@@ -28,6 +28,7 @@ import org.apache.http.HttpStatus;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.entity.StringEntity;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.StatsPublishBean;
 import password.pwm.bean.StatsPublishBean;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
@@ -286,7 +287,7 @@ public class StatisticsManager implements PwmService {
             daemonTimer.schedule(new NightlyTask(), Helper.nextZuluZeroTime());
             daemonTimer.schedule(new NightlyTask(), Helper.nextZuluZeroTime());
         }
         }
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.RUNNING) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.RUNNING) {
             if (pwmApplication.getConfig().readSettingAsBoolean(PwmSetting.PUBLISH_STATS_ENABLE)) {
             if (pwmApplication.getConfig().readSettingAsBoolean(PwmSetting.PUBLISH_STATS_ENABLE)) {
                 long lastPublishTimestamp = pwmApplication.getInstallTime().getTime();
                 long lastPublishTimestamp = pwmApplication.getInstallTime().getTime();
                 {
                 {

+ 2 - 1
src/main/java/password/pwm/svc/wordlist/SharedHistoryManager.java

@@ -24,6 +24,7 @@ package password.pwm.svc.wordlist;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmException;
@@ -206,7 +207,7 @@ public class SharedHistoryManager implements PwmService {
         status = STATUS.OPEN;
         status = STATUS.OPEN;
         //populateFromWordlist();  //only used for debugging!!!
         //populateFromWordlist();  //only used for debugging!!!
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.RUNNING || pwmApplication.getApplicationMode() == PwmApplication.MODE.CONFIGURATION) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.RUNNING || pwmApplication.getApplicationMode() == PwmApplicationMode.CONFIGURATION) {
             long frequencyMs = maxAgeMs > MAX_CLEANER_FREQUENCY ? MAX_CLEANER_FREQUENCY : maxAgeMs;
             long frequencyMs = maxAgeMs > MAX_CLEANER_FREQUENCY ? MAX_CLEANER_FREQUENCY : maxAgeMs;
             frequencyMs = frequencyMs < MIN_CLEANER_FREQUENCY ? MIN_CLEANER_FREQUENCY : frequencyMs;
             frequencyMs = frequencyMs < MIN_CLEANER_FREQUENCY ? MIN_CLEANER_FREQUENCY : frequencyMs;
 
 

+ 4 - 3
src/main/java/password/pwm/util/Helper.java

@@ -27,6 +27,7 @@ import com.novell.ldapchai.exception.ChaiOperationException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import org.apache.commons.csv.CSVPrinter;
 import org.apache.commons.csv.CSVPrinter;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.FormNonce;
 import password.pwm.bean.FormNonce;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
@@ -411,11 +412,11 @@ public class
         if (pwmApplication == null) {
         if (pwmApplication == null) {
             return false;
             return false;
         }
         }
-        PwmApplication.MODE mode = pwmApplication.getApplicationMode();
-        if (mode == PwmApplication.MODE.CONFIGURATION || mode == PwmApplication.MODE.NEW) {
+        PwmApplicationMode mode = pwmApplication.getApplicationMode();
+        if (mode == PwmApplicationMode.CONFIGURATION || mode == PwmApplicationMode.NEW) {
             return true;
             return true;
         }
         }
-        if (mode == PwmApplication.MODE.RUNNING) {
+        if (mode == PwmApplicationMode.RUNNING) {
             if (pwmApplication.getConfig() != null) {
             if (pwmApplication.getConfig() != null) {
                 if (pwmApplication.getConfig().readSettingAsBoolean(PwmSetting.DISPLAY_SHOW_DETAILED_ERRORS)) {
                 if (pwmApplication.getConfig().readSettingAsBoolean(PwmSetting.DISPLAY_SHOW_DETAILED_ERRORS)) {
                     return true;
                     return true;

+ 4 - 3
src/main/java/password/pwm/util/cli/MainClass.java

@@ -28,6 +28,7 @@ import org.apache.log4j.Logger;
 import org.apache.log4j.PatternLayout;
 import org.apache.log4j.PatternLayout;
 import org.apache.log4j.varia.NullAppender;
 import org.apache.log4j.varia.NullAppender;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.PwmEnvironment;
 import password.pwm.PwmEnvironment;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
@@ -386,7 +387,7 @@ public class MainClass {
     static ConfigurationReader loadConfiguration(final File configurationFile) throws Exception {
     static ConfigurationReader loadConfiguration(final File configurationFile) throws Exception {
         final ConfigurationReader reader = new ConfigurationReader(configurationFile);
         final ConfigurationReader reader = new ConfigurationReader(configurationFile);
 
 
-        if (reader.getConfigMode() == PwmApplication.MODE.ERROR) {
+        if (reader.getConfigMode() == PwmApplicationMode.ERROR) {
             final String errorMsg = reader.getConfigFileError() == null ? "error" : reader.getConfigFileError().toDebugStr();
             final String errorMsg = reader.getConfigFileError() == null ? "error" : reader.getConfigFileError().toDebugStr();
             out("unable to load configuration: " + errorMsg);
             out("unable to load configuration: " + errorMsg);
             System.exit(-1);
             System.exit(-1);
@@ -404,7 +405,7 @@ public class MainClass {
     )
     )
             throws LocalDBException, PwmUnrecoverableException
             throws LocalDBException, PwmUnrecoverableException
     {
     {
-        final PwmApplication.MODE mode = readonly ? PwmApplication.MODE.READ_ONLY : PwmApplication.MODE.RUNNING;
+        final PwmApplicationMode mode = readonly ? PwmApplicationMode.READ_ONLY : PwmApplicationMode.RUNNING;
         final Collection<PwmEnvironment.ApplicationFlag> applicationFlags = flags == null
         final Collection<PwmEnvironment.ApplicationFlag> applicationFlags = flags == null
                 ? PwmEnvironment.ParseHelper.readApplicationFlagsFromSystem(null)
                 ? PwmEnvironment.ParseHelper.readApplicationFlagsFromSystem(null)
                 : flags;
                 : flags;
@@ -415,7 +416,7 @@ public class MainClass {
                 .setFlags(applicationFlags)
                 .setFlags(applicationFlags)
                 .createPwmEnvironment();
                 .createPwmEnvironment();
         final PwmApplication pwmApplication = new PwmApplication(pwmEnvironment);
         final PwmApplication pwmApplication = new PwmApplication(pwmEnvironment);
-        final PwmApplication.MODE runningMode = pwmApplication.getApplicationMode();
+        final PwmApplicationMode runningMode = pwmApplication.getApplicationMode();
 
 
         if (runningMode != mode) {
         if (runningMode != mode) {
             out("unable to start application in required state '" + mode + "', current state: " + runningMode);
             out("unable to start application in required state '" + mode + "', current state: " + runningMode);

+ 2 - 1
src/main/java/password/pwm/util/db/DatabaseAccessorImpl.java

@@ -26,6 +26,7 @@ import org.xeustechnologies.jcl.JarClassLoader;
 import org.xeustechnologies.jcl.JclObjectFactory;
 import org.xeustechnologies.jcl.JclObjectFactory;
 import password.pwm.PwmAboutProperty;
 import password.pwm.PwmAboutProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
@@ -779,7 +780,7 @@ public class DatabaseAccessorImpl implements PwmService, DatabaseAccessor {
     }
     }
 
 
     private void updateStats(boolean readOperation, boolean writeOperation) {
     private void updateStats(boolean readOperation, boolean writeOperation) {
-        if (pwmApplication != null && pwmApplication.getApplicationMode() == PwmApplication.MODE.RUNNING) {
+        if (pwmApplication != null && pwmApplication.getApplicationMode() == PwmApplicationMode.RUNNING) {
             final StatisticsManager statisticsManager = pwmApplication.getStatisticsManager();
             final StatisticsManager statisticsManager = pwmApplication.getStatisticsManager();
             if (statisticsManager != null && statisticsManager.status() == STATUS.OPEN) {
             if (statisticsManager != null && statisticsManager.status() == STATUS.OPEN) {
                 if (readOperation) {
                 if (readOperation) {

+ 2 - 1
src/main/java/password/pwm/util/logging/PwmLogManager.java

@@ -27,6 +27,7 @@ import org.apache.log4j.*;
 import org.apache.log4j.xml.DOMConfigurator;
 import org.apache.log4j.xml.DOMConfigurator;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
@@ -174,7 +175,7 @@ public class PwmLogManager {
     public static LocalDBLogger initializeLocalDBLogger(final PwmApplication pwmApplication) {
     public static LocalDBLogger initializeLocalDBLogger(final PwmApplication pwmApplication) {
         final LocalDB localDB = pwmApplication.getLocalDB();
         final LocalDB localDB = pwmApplication.getLocalDB();
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.READ_ONLY) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.READ_ONLY) {
             LOGGER.trace("skipping initialization of LocalDBLogger due to read-only mode");
             LOGGER.trace("skipping initialization of LocalDBLogger due to read-only mode");
             return null;
             return null;
         }
         }

+ 3 - 2
src/main/java/password/pwm/util/queue/AbstractQueueManager.java

@@ -24,6 +24,7 @@ package password.pwm.util.queue;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.error.*;
 import password.pwm.error.*;
 import password.pwm.health.HealthMessage;
 import password.pwm.health.HealthMessage;
@@ -192,7 +193,7 @@ public abstract class AbstractQueueManager implements PwmService {
             return;
             return;
         }
         }
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.READ_ONLY) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.READ_ONLY) {
             status = STATUS.CLOSED;
             status = STATUS.CLOSED;
             return;
             return;
         }
         }
@@ -264,7 +265,7 @@ public abstract class AbstractQueueManager implements PwmService {
             return Collections.singletonList(HealthRecord.forMessage(HealthMessage.ServiceClosed_LocalDBUnavail, serviceName));
             return Collections.singletonList(HealthRecord.forMessage(HealthMessage.ServiceClosed_LocalDBUnavail, serviceName));
         }
         }
 
 
-        if (pwmApplication.getApplicationMode() == PwmApplication.MODE.READ_ONLY) {
+        if (pwmApplication.getApplicationMode() == PwmApplicationMode.READ_ONLY) {
             return Collections.singletonList(HealthRecord.forMessage(HealthMessage.ServiceClosed_AppReadOnly,serviceName));
             return Collections.singletonList(HealthRecord.forMessage(HealthMessage.ServiceClosed_AppReadOnly,serviceName));
         }
         }
 
 

+ 2 - 1
src/main/java/password/pwm/ws/server/RestServerHelper.java

@@ -25,6 +25,7 @@ package password.pwm.ws.server;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.Permission;
 import password.pwm.Permission;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserIdentity;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
@@ -95,7 +96,7 @@ public abstract class RestServerHelper {
 
 
 
 
         if (servicePermissions.isPublicDuringConfig()) {
         if (servicePermissions.isPublicDuringConfig()) {
-            if (pwmApplication.getApplicationMode() == PwmApplication.MODE.NEW || pwmApplication.getApplicationMode() == PwmApplication.MODE.CONFIGURATION) {
+            if (pwmApplication.getApplicationMode() == PwmApplicationMode.NEW || pwmApplication.getApplicationMode() == PwmApplicationMode.CONFIGURATION) {
                 return restRequestBean;
                 return restRequestBean;
             }
             }
         }
         }

+ 2 - 1
src/main/java/password/pwm/ws/server/rest/RestHealthServer.java

@@ -25,6 +25,7 @@ package password.pwm.ws.server.rest;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.Permission;
 import password.pwm.Permission;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
@@ -132,7 +133,7 @@ public class RestHealthServer extends AbstractRestServer {
     )
     )
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
-        boolean allowImmediate = pwmApplication.getApplicationMode() == PwmApplication.MODE.CONFIGURATION
+        boolean allowImmediate = pwmApplication.getApplicationMode() == PwmApplicationMode.CONFIGURATION
                 && pwmSession.getSessionManager().checkPermission(pwmApplication, Permission.PWMADMIN);
                 && pwmSession.getSessionManager().checkPermission(pwmApplication, Permission.PWMADMIN);
 
 
         return refreshImmediate && allowImmediate
         return refreshImmediate && allowImmediate

+ 5 - 13
src/main/webapp/WEB-INF/web.xml

@@ -137,10 +137,6 @@
         <url-pattern>/proxyCallback</url-pattern>
         <url-pattern>/proxyCallback</url-pattern>
     </filter-mapping>
     </filter-mapping>
     -->
     -->
-    <filter>
-        <filter-name>ApplicationStatusFilter</filter-name>
-        <filter-class>password.pwm.http.filter.ApplicationStatusFilter</filter-class>
-    </filter>
     <filter>
     <filter>
         <filter-name>GZIPFilter</filter-name>
         <filter-name>GZIPFilter</filter-name>
         <filter-class>password.pwm.http.filter.GZIPFilter</filter-class>
         <filter-class>password.pwm.http.filter.GZIPFilter</filter-class>
@@ -173,29 +169,25 @@
         <filter-name>ConfigAuthorizationFilter</filter-name>
         <filter-name>ConfigAuthorizationFilter</filter-name>
         <filter-class>password.pwm.http.filter.ConfigAccessFilter</filter-class>
         <filter-class>password.pwm.http.filter.ConfigAccessFilter</filter-class>
     </filter>
     </filter>
-    <filter-mapping>
-        <filter-name>ApplicationStatusFilter</filter-name>
-        <url-pattern>*</url-pattern>
-    </filter-mapping>
     <filter-mapping>
     <filter-mapping>
         <filter-name>GZIPFilter</filter-name>
         <filter-name>GZIPFilter</filter-name>
-        <url-pattern>*</url-pattern>
+        <url-pattern>/*</url-pattern>
     </filter-mapping>
     </filter-mapping>
     <filter-mapping>
     <filter-mapping>
         <filter-name>RequestInitializationFilter</filter-name>
         <filter-name>RequestInitializationFilter</filter-name>
-        <url-pattern>*</url-pattern>
+        <url-pattern>/*</url-pattern>
     </filter-mapping>
     </filter-mapping>
     <filter-mapping>
     <filter-mapping>
         <filter-name>ApplicationModeFilter</filter-name>
         <filter-name>ApplicationModeFilter</filter-name>
-        <url-pattern>*</url-pattern>
+        <url-pattern>/*</url-pattern>
     </filter-mapping>
     </filter-mapping>
     <filter-mapping>
     <filter-mapping>
         <filter-name>SessionFilter</filter-name>
         <filter-name>SessionFilter</filter-name>
-        <url-pattern>*</url-pattern>
+        <url-pattern>/*</url-pattern>
     </filter-mapping>
     </filter-mapping>
     <filter-mapping>
     <filter-mapping>
         <filter-name>CaptchaFilter</filter-name>
         <filter-name>CaptchaFilter</filter-name>
-        <url-pattern>*</url-pattern>
+        <url-pattern>/*</url-pattern>
     </filter-mapping>
     </filter-mapping>
     <filter-mapping>
     <filter-mapping>
         <filter-name>AuthenticationFilter</filter-name>
         <filter-name>AuthenticationFilter</filter-name>

+ 2 - 1
src/test/java/password/pwm/tests/LdapOtpOperatorTest.java

@@ -29,6 +29,7 @@ package password.pwm.tests;
 import junit.framework.TestCase;
 import junit.framework.TestCase;
 import org.junit.*;
 import org.junit.*;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmApplicationMode;
 import password.pwm.PwmEnvironment;
 import password.pwm.PwmEnvironment;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.stored.ConfigurationReader;
 import password.pwm.config.stored.ConfigurationReader;
@@ -69,7 +70,7 @@ public class LdapOtpOperatorTest extends TestCase {
         final ConfigurationReader reader = new ConfigurationReader(configFileLocation);
         final ConfigurationReader reader = new ConfigurationReader(configFileLocation);
         final PwmEnvironment pwmEnvironment = new PwmEnvironment.Builder(config,configFileLocation)
         final PwmEnvironment pwmEnvironment = new PwmEnvironment.Builder(config,configFileLocation)
                 .setInternalRuntimeInstance(true)
                 .setInternalRuntimeInstance(true)
-                .setApplicationMode(PwmApplication.MODE.RUNNING)
+                .setApplicationMode(PwmApplicationMode.RUNNING)
                 .createPwmEnvironment();
                 .createPwmEnvironment();
         final PwmApplication pwmApplication = new PwmApplication(pwmEnvironment);
         final PwmApplication pwmApplication = new PwmApplication(pwmEnvironment);
         config = reader.getConfiguration();
         config = reader.getConfiguration();