Selaa lähdekoodia

cosmetic updates

jrivard 10 vuotta sitten
vanhempi
commit
5bcb64b602
36 muutettua tiedostoa jossa 390 lisäystä ja 211 poistoa
  1. 1 1
      pwm/servlet/src/password/pwm/PwmApplication.java
  2. 5 1
      pwm/servlet/src/password/pwm/PwmConstants.java
  3. 115 0
      pwm/servlet/src/password/pwm/bean/AboutApplicationBean.java
  4. 11 0
      pwm/servlet/src/password/pwm/config/PwmSetting.xml
  5. 1 1
      pwm/servlet/src/password/pwm/config/StoredConfiguration.java
  6. 10 0
      pwm/servlet/src/password/pwm/http/ContextManager.java
  7. 25 25
      pwm/servlet/src/password/pwm/http/bean/HelpdeskBean.java
  8. 10 0
      pwm/servlet/src/password/pwm/http/filter/GZIPFilter.java
  9. 18 0
      pwm/servlet/src/password/pwm/http/servlet/AdminServlet.java
  10. 1 0
      pwm/servlet/src/password/pwm/http/servlet/ConfigManagerServlet.java
  11. 72 52
      pwm/servlet/src/password/pwm/http/servlet/HelpdeskServlet.java
  12. 1 1
      pwm/servlet/src/password/pwm/i18n/Config.properties
  13. 1 1
      pwm/servlet/src/password/pwm/ldap/UserStatusReader.java
  14. 1 1
      pwm/servlet/src/password/pwm/util/Helper.java
  15. 7 0
      pwm/servlet/src/password/pwm/ws/server/rest/RestStatusServer.java
  16. 3 4
      pwm/servlet/web/WEB-INF/jsp/configguide-app.jsp
  17. 3 4
      pwm/servlet/web/WEB-INF/jsp/configguide-cr_storage.jsp
  18. 3 4
      pwm/servlet/web/WEB-INF/jsp/configguide-end.jsp
  19. 3 4
      pwm/servlet/web/WEB-INF/jsp/configguide-ldap.jsp
  20. 3 4
      pwm/servlet/web/WEB-INF/jsp/configguide-ldap2.jsp
  21. 3 4
      pwm/servlet/web/WEB-INF/jsp/configguide-ldap3.jsp
  22. 3 4
      pwm/servlet/web/WEB-INF/jsp/configguide-ldap_schema.jsp
  23. 3 4
      pwm/servlet/web/WEB-INF/jsp/configguide-ldapcert.jsp
  24. 5 37
      pwm/servlet/web/WEB-INF/jsp/configguide-password.jsp
  25. 3 4
      pwm/servlet/web/WEB-INF/jsp/configguide-start.jsp
  26. 2 2
      pwm/servlet/web/WEB-INF/jsp/configguide-template.jsp
  27. 11 1
      pwm/servlet/web/WEB-INF/jsp/configmanager.jsp
  28. 24 22
      pwm/servlet/web/WEB-INF/jsp/helpdesk-detail.jsp
  29. 1 1
      pwm/servlet/web/WEB-INF/jsp/success.jsp
  30. 2 10
      pwm/servlet/web/WEB-INF/web.xml
  31. 1 1
      pwm/servlet/web/public/health.jsp
  32. 1 1
      pwm/servlet/web/public/index.jsp
  33. 1 1
      pwm/servlet/web/public/reference/referencedoc.jsp
  34. 5 0
      pwm/servlet/web/public/reference/rest.jsp
  35. 22 7
      pwm/servlet/web/public/resources/js/admin.js
  36. 9 9
      pwm/servlet/web/public/resources/js/configeditor-settings.js

+ 1 - 1
pwm/servlet/src/password/pwm/PwmApplication.java

@@ -362,7 +362,7 @@ public class PwmApplication {
             final String currentHash = configuration.configurationHash();
             if (previousHash == null || !previousHash.equals(currentHash)) {
                 writeAppAttribute(AppAttribute.CONFIG_HASH, currentHash);
-                LOGGER.warn("configuration has been modified since last startup");
+                LOGGER.warn("configuration checksum does not match previously seen checksum, configuration has been modified since last startup");
                 if (this.getAuditManager() != null) {
                     final String modifyMessage = "configuration was modified directly (not using ConfigEditor UI)";
                     this.getAuditManager().submit(SystemAuditRecord.create(

+ 5 - 1
pwm/servlet/src/password/pwm/PwmConstants.java

@@ -139,11 +139,15 @@ public abstract class PwmConstants {
         FormReadOnly,
         FormShowPasswordFields,
         FormData,
+
         ConfigFilename,
         ConfigLastModified,
         ConfigHasPassword,
+        ApplicationPath,
 
-        CaptchaClientUrl, CaptchaIframeUrl, CaptchaPublicKey,
+        CaptchaClientUrl,
+        CaptchaIframeUrl,
+        CaptchaPublicKey,
 
         ForgottenPasswordOptionalPageView
     }

+ 115 - 0
pwm/servlet/src/password/pwm/bean/AboutApplicationBean.java

@@ -59,6 +59,113 @@ public class AboutApplicationBean implements Serializable {
     private String localDbFreeSpace;
     
     private int configurationRestartCounter;
+
+    private JavaInformation javaInformation = new JavaInformation();
+
+    public static class JavaInformation implements Serializable {
+        private long memoryFree;
+        private long memoryAllocated;
+        private long memoryMax;
+        private long threadCount;
+        private String vmVendor;
+        private String vmLocation;
+        private String vmVersion;
+        private String runtimeVersion;
+        private String vmName;
+        private String osName;
+        private String osVersion;
+
+        public JavaInformation() {
+        }
+
+        public long getMemoryFree() {
+            return memoryFree;
+        }
+
+        public void setMemoryFree(long memoryFree) {
+            this.memoryFree = memoryFree;
+        }
+
+        public long getMemoryAllocated() {
+            return memoryAllocated;
+        }
+
+        public void setMemoryAllocated(long memoryAllocated) {
+            this.memoryAllocated = memoryAllocated;
+        }
+
+        public long getMemoryMax() {
+            return memoryMax;
+        }
+
+        public void setMemoryMax(long memoryMax) {
+            this.memoryMax = memoryMax;
+        }
+
+        public long getThreadCount() {
+            return threadCount;
+        }
+
+        public void setThreadCount(long threadCount) {
+            this.threadCount = threadCount;
+        }
+
+        public String getVmVendor() {
+            return vmVendor;
+        }
+
+        public void setVmVendor(String vmVendor) {
+            this.vmVendor = vmVendor;
+        }
+
+        public String getVmLocation() {
+            return vmLocation;
+        }
+
+        public void setVmLocation(String vmLocation) {
+            this.vmLocation = vmLocation;
+        }
+
+        public String getVmVersion() {
+            return vmVersion;
+        }
+
+        public void setVmVersion(String vmVersion) {
+            this.vmVersion = vmVersion;
+        }
+
+        public String getRuntimeVersion() {
+            return runtimeVersion;
+        }
+
+        public void setRuntimeVersion(String runtimeVersion) {
+            this.runtimeVersion = runtimeVersion;
+        }
+
+        public String getVmName() {
+            return vmName;
+        }
+
+        public void setVmName(String vmName) {
+            this.vmName = vmName;
+        }
+
+        public String getOsName() {
+            return osName;
+        }
+
+        public void setOsName(String osName) {
+            this.osName = osName;
+        }
+
+        public String getOsVersion() {
+            return osVersion;
+        }
+
+        public void setOsVersion(String osVersion) {
+            this.osVersion = osVersion;
+        }
+    }
     
     ///////////////////////////////
 
@@ -253,4 +360,12 @@ public class AboutApplicationBean implements Serializable {
     public void setConfigurationRestartCounter(int configurationRestartCounter) {
         this.configurationRestartCounter = configurationRestartCounter;
     }
+
+    public JavaInformation getJavaInformation() {
+        return javaInformation;
+    }
+
+    public void setJavaInformation(JavaInformation javaInformation) {
+        this.javaInformation = javaInformation;
+    }
 }

+ 11 - 0
pwm/servlet/src/password/pwm/config/PwmSetting.xml

@@ -3205,6 +3205,10 @@
             <value>{"name":"mail","minimumLength":1,"maximumLength":64,"type":"email","required":true,"confirmationRequired":false,"readonly":false,"labels":{"":"Email"},"regexErrors":{"":""},"description":{"":""},"selectOptions":{}}</value>
             <value>{"name":"userPrincipalName","minimumLength":1,"maximumLength":64,"type":"text","required":true,"confirmationRequired":false,"readonly":false,"labels":{"":"UPN"},"regexErrors":{"":""},"description":{"":""},"selectOptions":{}}</value>
         </default>
+        <options>
+            <option value="types">[]</option>
+            <option value="hideOptions">true</option>
+        </options>
     </setting>
     <setting key="helpdesk.detail.form" level="1" required="true">
         <label>Helpdesk Detail Form</label>
@@ -3231,6 +3235,13 @@
             <value>{"name":"employeeStatus","minimumLength":1,"maximumLength":64,"type":"text","required":true,"confirmationRequired":false,"readonly":false,"labels":{"":"Employee Status"},"regexErrors":{"":""},"description":{"":""},"selectOptions":{}}</value>
             <value>{"name":"WorkforceID","minimumLength":1,"maximumLength":64,"type":"text","required":true,"confirmationRequired":false,"readonly":false,"labels":{"":"Workforce ID"},"regexErrors":{"":""},"description":{"":""},"selectOptions":{}}</value>
         </default>
+        <options>
+            <option value="types">["text","email","userDN"]</option>
+            <option value="hideOptions">true</option>
+            <option value="required">hide</option>
+            <option value="type-userDN">show</option>
+            <option value="readonly">true</option>
+        </options>
     </setting>
     <setting key="helpdesk.searchBase" level="1">
         <label>LDAP Search base</label>

+ 1 - 1
pwm/servlet/src/password/pwm/config/StoredConfiguration.java

@@ -1002,7 +1002,7 @@ public class StoredConfiguration implements Serializable {
                         }
 
                         if (!profileStringDefinitions.contains(NEW_PROFILE_NAME)) {
-                            profileStringDefinitions.add(0,NEW_PROFILE_NAME);
+                            profileStringDefinitions.add(NEW_PROFILE_NAME);
                             storedConfiguration.writeSetting(profileSetting,new StringArrayValue(profileStringDefinitions),null);
                         }
                     }

+ 10 - 0
pwm/servlet/src/password/pwm/http/ContextManager.java

@@ -430,6 +430,16 @@ public class ContextManager implements Serializable {
             return null;
         }
 
+        // read system property.
+        {
+            final String propertyName = PwmConstants.PWM_APP_NAME.toLowerCase() + ".sspr.applicationPath";
+            final String propertyAppPath = System.getProperty(propertyName);
+            if (propertyAppPath != null && !propertyAppPath.isEmpty()) {
+                return new File(propertyAppPath);
+            }
+        }
+
+
         final String contextAppPathSetting = servletContext.getInitParameter(
                 ContextParameter.applicationPath.toString());
 

+ 25 - 25
pwm/servlet/src/password/pwm/http/bean/HelpdeskBean.java

@@ -35,11 +35,12 @@ import java.util.Map;
 public class HelpdeskBean implements PwmSessionBean {
     private String searchString;
     private Map<String,String> searchColumnHeaders = Collections.emptyMap();
-    private UserInfoBean userInfoBean = new UserInfoBean();
-    private AdditionalUserInfo additionalUserInfo = new AdditionalUserInfo();
-    private String userDisplayName;
+    private HelpdeskDetailInfo heldpdeskDetailInfo = new HelpdeskDetailInfo();
+
+    public static class HelpdeskDetailInfo implements Serializable {
+        private UserInfoBean userInfoBean = new UserInfoBean();
+        private String userDisplayName;
 
-    public static class AdditionalUserInfo implements Serializable {
         private boolean intruderLocked;
         private boolean accountEnabled;
         private boolean accountExpired;
@@ -49,6 +50,22 @@ public class HelpdeskBean implements PwmSessionBean {
         private Map<FormConfiguration, String> searchDetails;
         private String passwordSetDelta;
 
+        public String getUserDisplayName() {
+            return userDisplayName;
+        }
+
+        public void setUserDisplayName(String userDisplayName) {
+            this.userDisplayName = userDisplayName;
+        }
+
+        public UserInfoBean getUserInfoBean() {
+            return userInfoBean;
+        }
+
+        public void setUserInfoBean(UserInfoBean userInfoBean) {
+            this.userInfoBean = userInfoBean;
+        }
+
         public boolean isIntruderLocked() {
             return intruderLocked;
         }
@@ -108,14 +125,6 @@ public class HelpdeskBean implements PwmSessionBean {
         }
     }
 
-    public UserInfoBean getUserInfoBean() {
-        return userInfoBean;
-    }
-
-    public void setUserInfoBean(UserInfoBean userInfoBean) {
-        this.userInfoBean = userInfoBean;
-    }
-
     public String getSearchString() {
         return searchString;
     }
@@ -124,12 +133,12 @@ public class HelpdeskBean implements PwmSessionBean {
         this.searchString = searchString;
     }
 
-    public AdditionalUserInfo getAdditionalUserInfo() {
-        return additionalUserInfo;
+    public HelpdeskDetailInfo getHeldpdeskDetailInfo() {
+        return heldpdeskDetailInfo;
     }
 
-    public void setAdditionalUserInfo(AdditionalUserInfo additionalUserInfo) {
-        this.additionalUserInfo = additionalUserInfo;
+    public void setHeldpdeskDetailInfo(HelpdeskDetailInfo heldpdeskDetailInfo) {
+        this.heldpdeskDetailInfo = heldpdeskDetailInfo;
     }
 
     public Map<String, String> getSearchColumnHeaders()
@@ -142,15 +151,6 @@ public class HelpdeskBean implements PwmSessionBean {
         this.searchColumnHeaders = searchColumnHeaders;
     }
 
-    public String getUserDisplayName()
-    {
-        return userDisplayName;
-    }
 
-    public void setUserDisplayName(String userDisplayName)
-    {
-        this.userDisplayName = userDisplayName;
-    }
-    
     
 }

+ 10 - 0
pwm/servlet/src/password/pwm/http/filter/GZIPFilter.java

@@ -27,6 +27,7 @@ import password.pwm.PwmApplication;
 import password.pwm.PwmConstants;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.ContextManager;
+import password.pwm.http.PwmURL;
 import password.pwm.util.logging.PwmLogger;
 
 import javax.servlet.*;
@@ -72,6 +73,15 @@ public class GZIPFilter implements Filter {
 
     private boolean isEnabled(final ServletRequest servletRequest) {
 
+        try {
+            final PwmURL pwmURL = new PwmURL((HttpServletRequest) servletRequest);
+            if (pwmURL.isResourceURL() || pwmURL.isWebServiceURL()) {
+                return false;
+            }
+        } catch (Exception e) {
+            LOGGER.error("unable to parse request url, defaulting to non-gzip: " + e.getMessage());
+        }
+
         final PwmApplication pwmApplication;
         try {
             pwmApplication = ContextManager.getPwmApplication((HttpServletRequest) servletRequest);

+ 18 - 0
pwm/servlet/src/password/pwm/http/servlet/AdminServlet.java

@@ -278,6 +278,24 @@ public class AdminServlet extends PwmServlet {
         aboutBean.setLocalDbStorageSize(Helper.formatDiskSize(Helper.getFileDirectorySize(pwmApplication.getLocalDB().getFileLocation())));
         aboutBean.setLocalDbFreeSpace(Helper.formatDiskSize(Helper.diskSpaceRemaining(pwmApplication.getLocalDB().getFileLocation())));
 
+        { // java version
+            final Runtime runtime = Runtime.getRuntime();
+            final AboutApplicationBean.JavaInformation javaInformation = aboutBean.getJavaInformation();
+            javaInformation.setMemoryFree(runtime.freeMemory());
+            javaInformation.setMemoryAllocated(runtime.totalMemory());
+            javaInformation.setMemoryMax(runtime.maxMemory());
+            javaInformation.setThreadCount(Thread.activeCount());
+
+            javaInformation.setVmVendor(System.getProperty("java.vm.vendor"));
+            javaInformation.setRuntimeVersion(System.getProperty("java.runtime.version"));
+            javaInformation.setVmVersion(System.getProperty("java.vm.version"));
+            javaInformation.setVmName(System.getProperty("java.vm.name"));
+            javaInformation.setVmLocation(System.getProperty("java.home"));
+
+            javaInformation.setOsName(System.getProperty("os.name"));
+            javaInformation.setOsVersion(System.getProperty("os.version"));
+        }
+
         return aboutBean;
     }
 

+ 1 - 0
pwm/servlet/src/password/pwm/http/servlet/ConfigManagerServlet.java

@@ -162,6 +162,7 @@ public class ConfigManagerServlet extends PwmServlet {
     {
         final ConfigurationReader configurationReader = pwmRequest.getContextManager().getConfigReader();
         pwmRequest.setAttribute(PwmConstants.REQUEST_ATTR.PageTitle,LocaleHelper.getLocalizedMessage(Config.Title_ConfigManager, pwmRequest));
+        pwmRequest.setAttribute(PwmConstants.REQUEST_ATTR.ApplicationPath, pwmRequest.getPwmApplication().getApplicationPath().getAbsolutePath());
         pwmRequest.setAttribute(PwmConstants.REQUEST_ATTR.ConfigFilename, configurationReader.getConfigFile().getAbsolutePath());
         {
             final Date lastModifyTime = configurationReader.getStoredConfiguration().modifyTime();

+ 72 - 52
pwm/servlet/src/password/pwm/http/servlet/HelpdeskServlet.java

@@ -57,6 +57,7 @@ import password.pwm.ldap.UserSearchEngine;
 import password.pwm.ldap.UserStatusReader;
 import password.pwm.token.TokenService;
 import password.pwm.util.Helper;
+import password.pwm.util.JsonUtil;
 import password.pwm.util.TimeDuration;
 import password.pwm.util.intruder.IntruderManager;
 import password.pwm.util.intruder.RecordType;
@@ -126,7 +127,7 @@ public class HelpdeskServlet extends PwmServlet {
         final PwmSession pwmSession = pwmRequest.getPwmSession();
         final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
         final SessionStateBean ssBean = pwmSession.getSessionStateBean();
-        final HelpdeskBean helpdeskBean = (HelpdeskBean)pwmSession.getSessionBean(HelpdeskBean.class);
+        final HelpdeskBean helpdeskBean = pwmSession.getSessionBean(HelpdeskBean.class);
 
         if (!ssBean.isAuthenticated()) {
             pwmRequest.respondWithError(PwmError.ERROR_AUTHENTICATION_REQUIRED.toInfo());
@@ -218,7 +219,7 @@ public class HelpdeskServlet extends PwmServlet {
             return;
         }
 
-        if (helpdeskBean.getUserInfoBean() == null) {
+        if (helpdeskBean.getHeldpdeskDetailInfo() == null) {
             final String errorMsg = "no user selected: " + requestedName;
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNKNOWN,errorMsg);
             LOGGER.debug(pwmRequest, errorInformation.toDebugStr());
@@ -229,7 +230,7 @@ public class HelpdeskServlet extends PwmServlet {
 
         final boolean useProxy = helpdeskProfile.readSettingAsBoolean(PwmSetting.HELPDESK_USE_PROXY);
         try {
-            final UserIdentity userIdentity = helpdeskBean.getUserInfoBean().getUserIdentity();
+            final UserIdentity userIdentity = helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean().getUserIdentity();
             final PwmSession pwmSession = pwmRequest.getPwmSession();
             final ActionExecutor actionExecutor = new ActionExecutor(pwmRequest.getPwmApplication());
             final ActionExecutor.ActionExecutorSettings settings = new ActionExecutor.ActionExecutorSettings();
@@ -246,7 +247,7 @@ public class HelpdeskServlet extends PwmServlet {
                         AuditEvent.HELPDESK_ACTION,
                         pwmSession.getUserInfoBean().getUserIdentity(),
                         action.getName(),
-                        helpdeskBean.getUserInfoBean().getUserIdentity(),
+                        helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean().getUserIdentity(),
                         pwmSession.getSessionStateBean().getSrcAddress(),
                         pwmSession.getSessionStateBean().getSrcHostname()
                 );
@@ -284,7 +285,8 @@ public class HelpdeskServlet extends PwmServlet {
         LOGGER.info(pwmSession, "received deleteUser request by " + pwmSession.getUserInfoBean().getUserIdentity().toString() + " for user " + userIdentity.toString());
 
         // check user identity matches helpdesk bean user
-        if (helpdeskBean == null || helpdeskBean.getUserInfoBean() == null || !userIdentity.equals(helpdeskBean.getUserInfoBean().getUserIdentity())) {
+        final UserInfoBean detailUserInfo = helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean();
+        if (helpdeskBean == null || detailUserInfo == null || !userIdentity.equals(detailUserInfo.getUserIdentity())) {
             pwmRequest.setResponseError(new ErrorInformation(PwmError.ERROR_UNKNOWN,"requested user for delete  is not currently selected user"));
             pwmRequest.forwardToJsp(PwmConstants.JSP_URL.HELPDESK_SEARCH);
             return;
@@ -332,7 +334,7 @@ public class HelpdeskServlet extends PwmServlet {
     )
             throws ChaiUnavailableException, PwmUnrecoverableException, IOException, ServletException
     {
-        helpdeskBean.setUserInfoBean(null);
+        helpdeskBean.setHeldpdeskDetailInfo(null);
         final String userKey = pwmRequest.readParameterAsString("userKey");
         if (userKey.length() < 1) {
             pwmRequest.respondWithError(
@@ -371,7 +373,7 @@ public class HelpdeskServlet extends PwmServlet {
             return;
         }
 
-        populateHelpDeskBean(pwmRequest, helpdeskBean, helpdeskProfile, userIdentity);
+        helpdeskBean.setHeldpdeskDetailInfo(makeHelpdeskDetailInfo(pwmRequest, helpdeskProfile, userIdentity));
 
         StatisticsManager.incrementStat(pwmRequest, Statistic.HELPDESK_USER_LOOKUP);
         pwmRequest.forwardToJsp(PwmConstants.JSP_URL.HELPDESK_DETAIL);
@@ -389,7 +391,7 @@ public class HelpdeskServlet extends PwmServlet {
 
         final boolean useProxy = helpdeskProfile.readSettingAsBoolean(PwmSetting.HELPDESK_USE_PROXY);
         helpdeskBean.setSearchString(username);
-        helpdeskBean.setUserInfoBean(null);
+        helpdeskBean.setHeldpdeskDetailInfo(null);
         final List<FormConfiguration> searchForm = helpdeskProfile.readSettingAsForm(PwmSetting.HELPDESK_SEARCH_FORM);
         final int maxResults = (int)helpdeskProfile.readSettingAsLong(PwmSetting.HELPDESK_RESULT_LIMIT);
 
@@ -441,63 +443,62 @@ public class HelpdeskServlet extends PwmServlet {
 
 
 
-    private static void populateHelpDeskBean(
+    private static HelpdeskBean.HelpdeskDetailInfo makeHelpdeskDetailInfo(
             final PwmRequest pwmRequest,
-            final HelpdeskBean helpdeskBean,
             final HelpdeskProfile helpdeskProfile,
             final UserIdentity userIdentity
     )
             throws PwmUnrecoverableException, ChaiUnavailableException, IOException, ServletException
     {
+        final Date startTime = new Date();
+        LOGGER.trace(pwmRequest, "beginning to assemble detail data report for user " + userIdentity);
+        final Locale actorLocale = pwmRequest.getLocale();
         final ChaiUser theUser = getChaiUser(pwmRequest, helpdeskProfile, userIdentity);
 
         if (!theUser.isValid()) {
-            return;
+            return null;
         }
 
-        final UserInfoBean uiBean = new UserInfoBean();
-        final Locale userLocale = pwmRequest.getLocale();
+        final HelpdeskBean.HelpdeskDetailInfo detailInfo = new HelpdeskBean.HelpdeskDetailInfo();
+        final UserInfoBean uiBean = detailInfo.getUserInfoBean();
         final UserStatusReader userStatusReader = new UserStatusReader(pwmRequest.getPwmApplication(), pwmRequest.getSessionLabel());
-        userStatusReader.populateUserInfoBean(uiBean, userLocale, userIdentity, theUser.getChaiProvider());
-        helpdeskBean.setUserInfoBean(uiBean);
-        HelpdeskBean.AdditionalUserInfo additionalUserInfo = new HelpdeskBean.AdditionalUserInfo();
-        helpdeskBean.setAdditionalUserInfo(additionalUserInfo);
+        userStatusReader.populateUserInfoBean(uiBean, actorLocale, userIdentity, theUser.getChaiProvider());
 
         try {
-            additionalUserInfo.setIntruderLocked(theUser.isPasswordLocked());
+            detailInfo.setIntruderLocked(theUser.isPasswordLocked());
         } catch (Exception e) {
             LOGGER.error(pwmRequest, "unexpected error reading intruder lock status for user '" + userIdentity + "', " + e.getMessage());
         }
 
         try {
-            additionalUserInfo.setAccountEnabled(theUser.isAccountEnabled());
+            detailInfo.setAccountEnabled(theUser.isAccountEnabled());
         } catch (Exception e) {
             LOGGER.error(pwmRequest, "unexpected error reading account enabled status for user '" + userIdentity + "', " + e.getMessage());
         }
 
         try {
-            additionalUserInfo.setAccountExpired(theUser.isAccountExpired());
+            detailInfo.setAccountExpired(theUser.isAccountExpired());
         } catch (Exception e) {
             LOGGER.error(pwmRequest, "unexpected error reading account expired status for user '" + userIdentity + "', " + e.getMessage());
         }
 
         try {
-            additionalUserInfo.setLastLoginTime(theUser.readLastLoginTime());
+            detailInfo.setLastLoginTime(theUser.readLastLoginTime());
         } catch (Exception e) {
             LOGGER.error(pwmRequest, "unexpected error reading last login time for user '" + userIdentity + "', " + e.getMessage());
         }
 
         try {
-            additionalUserInfo.setUserHistory(pwmRequest.getPwmApplication().getAuditManager().readUserHistory(uiBean));
+            detailInfo.setUserHistory(pwmRequest.getPwmApplication().getAuditManager().readUserHistory(uiBean));
         } catch (Exception e) {
             LOGGER.error(pwmRequest, "unexpected error reading userHistory for user '" + userIdentity + "', " + e.getMessage());
         }
 
         if (uiBean.getPasswordLastModifiedTime() != null) {
             final TimeDuration passwordSetDelta = TimeDuration.fromCurrent(uiBean.getPasswordLastModifiedTime());
-            additionalUserInfo.setPasswordSetDelta(passwordSetDelta.asLongString(pwmRequest.getLocale()));
+            detailInfo.setPasswordSetDelta(passwordSetDelta.asLongString(pwmRequest.getLocale()));
         } else {
-            additionalUserInfo.setPasswordSetDelta(LocaleHelper.getLocalizedMessage(Display.Value_NotApplicable, pwmRequest));
+            detailInfo.setPasswordSetDelta(LocaleHelper.getLocalizedMessage(Display.Value_NotApplicable, pwmRequest));
         }
 
         final UserDataReader userDataReader = helpdeskProfile.readSettingAsBoolean(PwmSetting.HELPDESK_USE_PROXY)
@@ -511,15 +512,22 @@ public class HelpdeskServlet extends PwmServlet {
                 formData.put(formConfiguration,"");
             }
             UpdateProfileServlet.populateFormFromLdap(detailFormConfig, pwmRequest.getPwmSession().getLabel(), formData, userDataReader);
-            helpdeskBean.getAdditionalUserInfo().setSearchDetails(formData);
+            detailInfo.setSearchDetails(formData);
         }
 
         final String configuredDisplayName = helpdeskProfile.readSettingAsString(PwmSetting.HELPDESK_DETAIL_DISPLAY_NAME);
         if (configuredDisplayName != null && !configuredDisplayName.isEmpty()) {
-            final MacroMachine macroMachine = new MacroMachine(pwmRequest.getPwmApplication(), pwmRequest.getSessionLabel(), helpdeskBean.getUserInfoBean(), null, userDataReader);
+            final MacroMachine macroMachine = new MacroMachine(pwmRequest.getPwmApplication(), pwmRequest.getSessionLabel(), detailInfo.getUserInfoBean(), null, userDataReader);
             final String displayName = macroMachine.expandMacros(configuredDisplayName);
-            helpdeskBean.setUserDisplayName(displayName);
+            detailInfo.setUserDisplayName(displayName);
+        }
+
+        final TimeDuration timeDuration = TimeDuration.fromCurrent(startTime);
+        if (pwmRequest.getConfig().isDevDebugMode()) {
+            LOGGER.trace(pwmRequest, "completed assembly of detail data report for user " + userIdentity
+                    + " in " + timeDuration.asCompactString() + ", contents: " + JsonUtil.serialize(detailInfo));
         }
+        return detailInfo;
     }
 
     private void processUnlockPassword(
@@ -529,7 +537,7 @@ public class HelpdeskServlet extends PwmServlet {
     )
             throws PwmUnrecoverableException, ChaiUnavailableException, IOException, ServletException
     {
-        if (helpdeskBean.getUserInfoBean() == null) {
+        if (helpdeskBean.getHeldpdeskDetailInfo() == null) {
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNKNOWN, "password unlock request, but no user result in search");
             LOGGER.error(pwmRequest, errorInformation);
             pwmRequest.setResponseError(errorInformation);
@@ -538,22 +546,24 @@ public class HelpdeskServlet extends PwmServlet {
         }
 
         if (!helpdeskProfile.readSettingAsBoolean(PwmSetting.HELPDESK_ENABLE_UNLOCK)) {
-            final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_SERVICE_NOT_AVAILABLE, "password unlock request, but helpdesk unlock is not enabled");
+            final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNAUTHORIZED, "password unlock request, but helpdesk unlock is not enabled");
             LOGGER.error(pwmRequest, errorInformation);
             pwmRequest.setResponseError(errorInformation);
             pwmRequest.forwardToJsp(PwmConstants.JSP_URL.HELPDESK_DETAIL);
             return;
         }
 
+        final UserIdentity userIdentity = helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean().getUserIdentity();
+
         //clear pwm intruder setting.
-        final IntruderManager intruderManager = pwmRequest.getPwmApplication().getIntruderManager();
-        intruderManager.clear(RecordType.USERNAME, helpdeskBean.getUserInfoBean().getUsername());
-        intruderManager.convenience().clearUserIdentity(
-                helpdeskBean.getUserInfoBean().getUserIdentity());
+        {
+            final IntruderManager intruderManager = pwmRequest.getPwmApplication().getIntruderManager();
+            intruderManager.clear(RecordType.USERNAME, helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean().getUsername());
+            intruderManager.convenience().clearUserIdentity(userIdentity);
+        }
 
         final boolean useProxy = helpdeskProfile.readSettingAsBoolean(PwmSetting.HELPDESK_USE_PROXY);
         try {
-            final UserIdentity userIdentity = helpdeskBean.getUserInfoBean().getUserIdentity();
             final ChaiUser chaiUser = useProxy ?
                     pwmRequest.getPwmApplication().getProxiedChaiUser(userIdentity) :
                     pwmRequest.getPwmSession().getSessionManager().getActor(pwmRequest.getPwmApplication(), userIdentity);
@@ -579,11 +589,11 @@ public class HelpdeskServlet extends PwmServlet {
             final PwmError returnMsg = PwmError.forChaiError(e.getErrorCode()) == null ? PwmError.ERROR_UNKNOWN : PwmError.forChaiError(e.getErrorCode());
             final ErrorInformation error = new ErrorInformation(returnMsg, e.getMessage());
             pwmRequest.setResponseError(error);
-            LOGGER.warn(pwmRequest, "error resetting password for user '" + helpdeskBean.getUserInfoBean().getUserIdentity() + "'' " + error.toDebugStr() + ", " + e.getMessage());
+            LOGGER.warn(pwmRequest, "error resetting password for user '" + userIdentity.toDisplayString() + "'' " + error.toDebugStr() + ", " + e.getMessage());
         }
 
         Helper.pause(1000); // delay before re-reading data
-        populateHelpDeskBean(pwmRequest, helpdeskBean, helpdeskProfile, helpdeskBean.getUserInfoBean().getUserIdentity());
+        helpdeskBean.setHeldpdeskDetailInfo(makeHelpdeskDetailInfo(pwmRequest, helpdeskProfile, userIdentity));
         pwmRequest.forwardToJsp(PwmConstants.JSP_URL.HELPDESK_DETAIL);
     }
 
@@ -592,23 +602,33 @@ public class HelpdeskServlet extends PwmServlet {
             final HelpdeskBean helpdeskBean,
             final HelpdeskProfile helpdeskProfile
     )
-            throws IOException, PwmUnrecoverableException
-    {
+            throws IOException, PwmUnrecoverableException, ServletException {
         final long DELAY_MS = 1000;
         final Date startTime = new Date();
 
+        if (helpdeskBean.getHeldpdeskDetailInfo() == null) {
+            final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNKNOWN, "rest validate otp code request, but no user result in search");
+            LOGGER.error(pwmRequest, errorInformation);
+            pwmRequest.respondWithError(errorInformation);
+            return;
+        }
+
         if (!helpdeskProfile.readSettingAsBoolean(PwmSetting.HELPDESK_ENABLE_OTP_VERIFY)) {
-            pwmRequest.outputJsonResult(RestResultBean.fromError(PwmError.ERROR_SERVICE_NOT_AVAILABLE.toInfo()));
+            final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNAUTHORIZED, "password unlock request, but helpdesk otp verify is not enabled");
+            LOGGER.error(pwmRequest, errorInformation);
+            pwmRequest.respondWithError(errorInformation);
             return;
         }
 
+        final UserIdentity userIdentity = helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean().getUserIdentity();
+
         final Map<String,String> inputRecord = pwmRequest.readBodyAsJsonStringMap();
         final String code = inputRecord.get("code");
-        final OTPUserRecord otpUserRecord = helpdeskBean.getUserInfoBean().getOtpUserRecord();
+        final OTPUserRecord otpUserRecord = helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean().getOtpUserRecord();
         try {
             final boolean passed = pwmRequest.getPwmApplication().getOtpService().validateToken(
                     pwmRequest.getPwmSession(),
-                    helpdeskBean.getUserInfoBean().getUserIdentity(),
+                    userIdentity,
                     otpUserRecord,
                     code,
                     false
@@ -621,7 +641,7 @@ public class HelpdeskServlet extends PwmServlet {
                             AuditEvent.HELPDESK_VERIFY_OTP,
                             pwmSession.getUserInfoBean().getUserIdentity(),
                             null,
-                            helpdeskBean.getUserInfoBean().getUserIdentity(),
+                            userIdentity,
                             pwmSession.getSessionStateBean().getSrcAddress(),
                             pwmSession.getSessionStateBean().getSrcHostname()
                     );
@@ -673,7 +693,7 @@ public class HelpdeskServlet extends PwmServlet {
         }
 
 
-        final UserInfoBean userInfoBean = helpdeskBean.getUserInfoBean();
+        final UserInfoBean userInfoBean = helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean();
         final UserIdentity userIdentity = userInfoBean.getUserIdentity();
         final MacroMachine macroMachine = MacroMachine.forNonUserSpecific(pwmRequest.getPwmApplication(), pwmRequest.getSessionLabel());
         final String configuredTokenString = config.readAppProperty(AppProperty.HELPDESK_TOKEN_VALUE);
@@ -733,8 +753,8 @@ public class HelpdeskServlet extends PwmServlet {
     )
             throws ServletException, IOException, PwmUnrecoverableException, ChaiUnavailableException
     {
-        if (helpdeskBean.getUserInfoBean() == null) {
-            final String errorMsg = "password unlock request, but no user result in search";
+        if (helpdeskBean.getHeldpdeskDetailInfo() == null) {
+            final String errorMsg = "password clear otp request, but no user result in search";
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_UNKNOWN, errorMsg);
             LOGGER.error(pwmRequest, errorMsg);
             pwmRequest.setResponseError(errorInformation);
@@ -743,7 +763,7 @@ public class HelpdeskServlet extends PwmServlet {
         }
 
         if (!helpdeskProfile.readSettingAsBoolean(PwmSetting.HELPDESK_CLEAR_OTP_BUTTON)) {
-            final String errorMsg = "clear responses request, but helpdesk clear otp button is not enabled";
+            final String errorMsg = "clear otp request, but helpdesk clear otp button is not enabled";
             final ErrorInformation errorInformation = new ErrorInformation(PwmError.ERROR_SERVICE_NOT_AVAILABLE, errorMsg);
             LOGGER.error(pwmRequest, errorMsg);
             pwmRequest.setResponseError(errorInformation);
@@ -751,13 +771,13 @@ public class HelpdeskServlet extends PwmServlet {
             return;
         }
 
+        final UserIdentity userIdentity = helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean().getUserIdentity();
+
         //clear pwm intruder setting.
-        pwmRequest.getPwmApplication().getIntruderManager().clear(RecordType.USERNAME, helpdeskBean.getUserInfoBean().getUsername());
-        pwmRequest.getPwmApplication().getIntruderManager().convenience().clearUserIdentity(
-                helpdeskBean.getUserInfoBean().getUserIdentity());
+        pwmRequest.getPwmApplication().getIntruderManager().clear(RecordType.USERNAME, helpdeskBean.getHeldpdeskDetailInfo().getUserInfoBean().getUsername());
+        pwmRequest.getPwmApplication().getIntruderManager().convenience().clearUserIdentity(userIdentity);
 
         try {
-            final UserIdentity userIdentity = helpdeskBean.getUserInfoBean().getUserIdentity();
 
             OtpService service = pwmRequest.getPwmApplication().getOtpService();
             service.clearOTPUserConfiguration(pwmRequest.getPwmSession(), userIdentity);
@@ -777,11 +797,11 @@ public class HelpdeskServlet extends PwmServlet {
             final PwmError returnMsg = e.getError();
             final ErrorInformation error = new ErrorInformation(returnMsg, e.getMessage());
             pwmRequest.setResponseError(error);
-            LOGGER.warn(pwmRequest, "error clearing OTP secret for user '" + helpdeskBean.getUserInfoBean().getUserIdentity() + "'' " + error.toDebugStr() + ", " + e.getMessage());
+            LOGGER.warn(pwmRequest, "error clearing OTP secret for user '" + userIdentity + "'' " + error.toDebugStr() + ", " + e.getMessage());
         }
 
         Helper.pause(1000); // delay before re-reading data
-        populateHelpDeskBean(pwmRequest, helpdeskBean, helpdeskProfile, helpdeskBean.getUserInfoBean().getUserIdentity());
+        helpdeskBean.setHeldpdeskDetailInfo(makeHelpdeskDetailInfo(pwmRequest, helpdeskProfile, userIdentity));
         pwmRequest.forwardToJsp(PwmConstants.JSP_URL.HELPDESK_DETAIL);
     }
 

+ 1 - 1
pwm/servlet/src/password/pwm/i18n/Config.properties

@@ -63,7 +63,7 @@ MenuDisplay_DownloadConfig=Download the current configuration XML file.
 MenuDisplay_DownloadConfigRunning=Download the in memory configuration to a file.  You can save the <em>%1%</em> file to the <em>WEB-INF</em> directory to change the configuration.  In most cases, the configuration will take effect immediately.
 MenuDisplay_DownloadBundle=Generate a support ZIP file that contains information useful for troubleshooting.
 MenuDisplay_LockConfig=Close the configuration. Once closed, you must be logged in with administrative access to edit the configuration, or you can edit the configuration file directly at <em>%1%</em>.
-MenuDisplay_UnlockConfig=For security reasons, the configuration can not be opened through a web browser.  The configuration can be opened in either of the following ways: <ol><li>Edit the configuration with a text editor<ol><li>Use a UTF8 encoding compatible text editor (do not use Windows Notepad)</li><li>Open the file at <i>%1%</i></li><li>Locate the property <i>configIsEditable</i></li><li>Change the value to "true"</li></ol><li>In the same directory as the config file, </li><ol><li>Open a command prompt and change to <i>%2%</i> directory</li><li>Execute the <i>command.sh</i> or <i>command.bat</i> script as appropriate to your operating system.</li><li>Execute the script using the <i>ConfigUnlock</i> parameter.  Example: <i>./command.sh ConfigUnlock</i></li></ol></ol>
+MenuDisplay_UnlockConfig=For security reasons, the configuration can not be opened through a web browser.  The configuration can be opened in either of the following ways: <ol><li>Edit the configuration with a text editor<ol><li>Use a UTF8 encoding compatible text editor (do not use Windows Notepad)</li><li>Open the file at <i>%1%</i></li><li>Locate the property <i>configIsEditable</i></li><li>Change the value to "true"</li></ol><li>Use the command line tool</li><ol><li>Open a command prompt and change to the same directory as the configuration file</li><li>Execute the <i>command.sh</i> or <i>command.bat</i> script as appropriate to your operating system.</li><li>Execute the script using the <i>ConfigUnlock</i> parameter.  Example: <i>./command.sh ConfigUnlock</i></li></ol></ol>
 MenuDisplay_ExportLocalDB=Export the contents of the LocalDB.  Can be used for backup or to restore to another server.
 MenuDisplay_MainMenu=Return to the main menu to test the configuration.
 MenuDisplay_ManualConfig=Skip the configuration guide and manually configure the application.

+ 1 - 1
pwm/servlet/src/password/pwm/ldap/UserStatusReader.java

@@ -531,7 +531,7 @@ public class UserStatusReader {
                 LOGGER.debug(sessionLabel, "checkProfile: " + userIdentity + " has value for attributes, update profile will not be required");
                 return false;
             } catch (PwmDataValidationException e) {
-                LOGGER.debug(sessionLabel, "checkProfile: " + userIdentity + " does not have good attributes (" + e.getMessage() + "), update profile will br required");
+                LOGGER.debug(sessionLabel, "checkProfile: " + userIdentity + " does not have good attributes (" + e.getMessage() + "), update profile will be required");
                 return true;
             }
         }

+ 1 - 1
pwm/servlet/src/password/pwm/util/Helper.java

@@ -470,7 +470,7 @@ public class
         }
 
         final String testURI = sb.toString();
-        LOGGER.trace(sessionLabel, "will test parsed and decoded URL: " + testURI);
+        LOGGER.trace(sessionLabel, "preparing to whitelist test parsed and decoded URL: " + testURI);
 
         final String REGEX_PREFIX = "regex:";
         final List<String> whiteList = pwmApplication.getConfig().readSettingAsStringArray(PwmSetting.SECURITY_REDIRECT_WHITELIST);

+ 7 - 0
pwm/servlet/src/password/pwm/ws/server/rest/RestStatusServer.java

@@ -33,6 +33,9 @@ import password.pwm.error.PwmException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.tag.PasswordRequirementsTag;
 import password.pwm.ldap.UserStatusReader;
+import password.pwm.util.JsonUtil;
+import password.pwm.util.TimeDuration;
+import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.stats.Statistic;
 import password.pwm.util.stats.StatisticsManager;
 import password.pwm.ws.server.RestRequestBean;
@@ -52,6 +55,7 @@ import java.util.*;
 
 @Path("/status")
 public class RestStatusServer extends AbstractRestServer {
+    public static final PwmLogger LOGGER = PwmLogger.forClass(RestStatusServer.class);
 
     public static class JsonStatusData implements Serializable {
         public String userDN;
@@ -119,6 +123,7 @@ public class RestStatusServer extends AbstractRestServer {
     public Response doGetStatusData(
             @QueryParam("username") final String username
     ) {
+        final Date startTime = new Date();
         final RestRequestBean restRequestBean;
         try {
             final ServicePermissions servicePermissions = new ServicePermissions();
@@ -158,6 +163,8 @@ public class RestStatusServer extends AbstractRestServer {
                 }
             }
 
+            final TimeDuration timeDuration = TimeDuration.fromCurrent(startTime);
+            LOGGER.debug(restRequestBean.getPwmSession(),"completed REST status request in " + timeDuration.asCompactString() + ", result=" + JsonUtil.serialize(restRequestBean));
             return restResultBean.asJsonResponse();
         } catch (PwmException e) {
             return RestResultBean.fromError(e.getErrorInformation(), restRequestBean).asJsonResponse();

+ 3 - 4
pwm/servlet/web/WEB-INF/jsp/configguide-app.jsp

@@ -24,10 +24,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <% ConfigGuideBean configGuideBean = (ConfigGuideBean) JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);%>
 <% Map<String,String> DEFAULT_FORM = ConfigGuideServlet.defaultForm(configGuideBean.getStoredConfiguration().getTemplate()); %>
 <%@ taglib uri="pwm" prefix="pwm" %>
@@ -99,7 +99,6 @@
 
 </script>
 </pwm:script>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>

+ 3 - 4
pwm/servlet/web/WEB-INF/jsp/configguide-cr_storage.jsp

@@ -22,10 +22,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <% ConfigGuideBean configGuideBean = (ConfigGuideBean) JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);%>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <html dir="<pwm:LocaleOrientation/>">
@@ -107,7 +107,6 @@
     });
 </script>
 </pwm:script>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>

+ 3 - 4
pwm/servlet/web/WEB-INF/jsp/configguide-end.jsp

@@ -23,10 +23,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <% final ConfigGuideBean configGuideBean = (ConfigGuideBean) JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);%>
 <% final PwmRequest pwmRequest = PwmRequest.forRequest(request,response); %>
@@ -179,7 +179,6 @@
         });
     </script>
 </pwm:script>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>

+ 3 - 4
pwm/servlet/web/WEB-INF/jsp/configguide-ldap.jsp

@@ -23,10 +23,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <% ConfigGuideBean configGuideBean = (ConfigGuideBean) JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);%>
 <% Map<String,String> DEFAULT_FORM = ConfigGuideServlet.defaultForm(configGuideBean.getStoredConfiguration().getTemplate()); %>
 <%@ taglib uri="pwm" prefix="pwm" %>
@@ -282,7 +282,6 @@
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
 <%@ include file="fragment/footer.jsp" %>
 </body>
 </html>

+ 3 - 4
pwm/servlet/web/WEB-INF/jsp/configguide-ldap2.jsp

@@ -24,10 +24,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <% ConfigGuideBean configGuideBean = (ConfigGuideBean) JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);%>
 <% Map<String,String> DEFAULT_FORM = ConfigGuideServlet.defaultForm(configGuideBean.getStoredConfiguration().getTemplate()); %>
 <%@ taglib uri="pwm" prefix="pwm" %>
@@ -171,7 +171,6 @@
     }
 </script>
 </pwm:script>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>

+ 3 - 4
pwm/servlet/web/WEB-INF/jsp/configguide-ldap3.jsp

@@ -24,10 +24,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <% ConfigGuideBean configGuideBean = JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);%>
 <% Map<String,String> DEFAULT_FORM = ConfigGuideServlet.defaultForm(configGuideBean.getStoredConfiguration().getTemplate()); %>
 <%@ taglib uri="pwm" prefix="pwm" %>
@@ -141,7 +141,6 @@
     }
 </script>
 </pwm:script>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>

+ 3 - 4
pwm/servlet/web/WEB-INF/jsp/configguide-ldap_schema.jsp

@@ -23,10 +23,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <%
     final PwmRequest pwmRequest = PwmRequest.forRequest(request, response);
     ConfigGuideBean configGuideBean = JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);
@@ -127,7 +127,6 @@
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE);%>
 <%@ include file="fragment/footer.jsp" %>
 </body>
 </html>

+ 3 - 4
pwm/servlet/web/WEB-INF/jsp/configguide-ldapcert.jsp

@@ -27,10 +27,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <% ConfigGuideBean configGuideBean = JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);%>
 <% boolean enableNext = configGuideBean.isCertsTrustedbyKeystore() || configGuideBean.isUseConfiguredCerts() || configGuideBean.getLdapCertificates() == null; %>
 <%@ taglib uri="pwm" prefix="pwm" %>
@@ -186,7 +186,6 @@
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE);%>
 <%@ include file="fragment/footer.jsp" %>
 </body>
 </html>

+ 5 - 37
pwm/servlet/web/WEB-INF/jsp/configguide-password.jsp

@@ -22,10 +22,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <% ConfigGuideBean configGuideBean = JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);%>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <html dir="<pwm:LocaleOrientation/>">
@@ -58,50 +58,19 @@
                         <b>Configuration Password</b>
                         <br/>
                         <span class="fa fa-chevron-circle-right"></span>
-                        <input type="<pwm:value name="passwordFieldType"/>" id="<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD%>" name="<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD%>" class="passwordfield"/>
-                        <pwm:script>
-                            <script type="text/javascript">
-                                PWM_GLOBAL['startupFunctions'].push(function(){
-                                    require(["dijit/form/ValidationTextBox"],function(ValidationTextBox){
-                                        new ValidationTextBox({
-                                            id: '<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD%>',
-                                            name: '<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD%>',
-                                            required: true,
-                                            type: "password",
-                                            style: "width: 200px",
-                                            value: '<%=configGuideBean.getFormData().get(ConfigGuideServlet.PARAM_CONFIG_PASSWORD)%>'
-                                        }, "<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD%>");
-                                    });
-                                });
-                            </script>
-                        </pwm:script>
+                        <input type="<pwm:value name="passwordFieldType"/>" id="<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD%>" name="<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD%>" class="configStringInput passwordfield" style="width:200px" autofocus/>
                     </div>
                     <div class="setting_item">
                         <b>Verify Configuration Password</b>
                         <br/>
                         <span class="fa fa-chevron-circle-right"></span>
-                        <input type="<pwm:value name="passwordFieldType"/>" id="<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD_VERIFY%>" name="<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD_VERIFY%>" class="passwordfield"/>
+                        <input type="<pwm:value name="passwordFieldType"/>" id="<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD_VERIFY%>" name="<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD_VERIFY%>" class="configStringInput passwordfield" style="width:200px"/>
                         <div style="display: inline; padding-top:45px;">
                             <img style="visibility:hidden;" id="confirmCheckMark" alt="checkMark" height="15" width="15"
                                  src="<pwm:context/><pwm:url url='/public/resources/greenCheck.png'/>">
                             <img style="visibility:hidden;" id="confirmCrossMark" alt="crossMark" height="15" width="15"
                                  src="<pwm:context/><pwm:url url='/public/resources/redX.png'/>">
                         </div>
-                        <pwm:script>
-                        <script type="text/javascript">
-                            PWM_GLOBAL['startupFunctions'].push(function(){
-                                require(["dijit/form/ValidationTextBox"],function(ValidationTextBox){
-                                    new ValidationTextBox({
-                                        id: '<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD_VERIFY%>',
-                                        name: '<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD_VERIFY%>',
-                                        required: true,
-                                        type: "password",
-                                        style: "width: 200px"
-                                    }, "<%=ConfigGuideServlet.PARAM_CONFIG_PASSWORD_VERIFY%>");
-                                });
-                            });
-                        </script>
-                        </pwm:script>
                     </div>
                 </div>
             </div>
@@ -165,7 +134,6 @@
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE);%>
 <%@ include file="fragment/footer.jsp" %>
 </body>
 </html>

+ 3 - 4
pwm/servlet/web/WEB-INF/jsp/configguide-start.jsp

@@ -20,10 +20,10 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
-<%@ page language="java" session="true" isThreadSafe="true"
-         contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <html dir="<pwm:LocaleOrientation/>">
 <%@ include file="fragment/header.jsp" %>
@@ -125,7 +125,6 @@
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
 <%@ include file="fragment/footer.jsp" %>
 </body>
 </html>

+ 2 - 2
pwm/servlet/web/WEB-INF/jsp/configguide-template.jsp

@@ -22,8 +22,9 @@
   ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   --%>
 
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <!DOCTYPE html>
-
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <% ConfigGuideBean configGuideBean = JspUtility.getPwmSession(pageContext).getSessionBean(ConfigGuideBean.class);%>
@@ -120,7 +121,6 @@
 <pwm:script-ref url="/public/resources/js/configguide.js"/>
 <pwm:script-ref url="/public/resources/js/configmanager.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_LOCALE);%>
 <%@ include file="fragment/footer.jsp" %>
 </body>
 </html>

+ 11 - 1
pwm/servlet/web/WEB-INF/jsp/configmanager.jsp

@@ -92,7 +92,17 @@
             </tr>
             <tr>
                 <td>
-                    File Location
+                    Application Data Path
+                </td>
+                <td>
+                    <div style="max-width:398px; overflow-x: auto; white-space: nowrap">
+                        <%=StringUtil.escapeHtml((String) JspUtility.getAttribute(pageContext, PwmConstants.REQUEST_ATTR.ApplicationPath))%>
+                    </div>
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    Configuration File
                 </td>
                 <td>
                     <div style="max-width:398px; overflow-x: auto; white-space: nowrap">

+ 24 - 22
pwm/servlet/web/WEB-INF/jsp/helpdesk-detail.jsp

@@ -54,11 +54,13 @@
     final HelpdeskProfile helpdeskProfile = pwmSession.getSessionManager().getHelpdeskProfile(pwmApplication);
     final DateFormat dateFormatter = PwmConstants.DEFAULT_DATETIME_FORMAT;
     final HelpdeskUIMode SETTING_PW_UI_MODE = HelpdeskUIMode.valueOf(helpdeskProfile.readSettingAsString(PwmSetting.HELPDESK_SET_PASSWORD_MODE));
-    final ResponseInfoBean responseInfoBean = helpdeskBean.getUserInfoBean().getResponseInfoBean();
-    final String obfuscatedDN = helpdeskBean.getUserInfoBean().getUserIdentity().toObfuscatedKey(
-            pwmApplication.getConfig());
-    final UserInfoBean searchedUserInfo = helpdeskBean.getUserInfoBean();
-    final String displayName = helpdeskBean.getUserDisplayName();
+
+    // user info
+    final HelpdeskBean.HelpdeskDetailInfo helpdeskDetailInfo = helpdeskBean.getHeldpdeskDetailInfo();
+    final UserInfoBean searchedUserInfo = helpdeskDetailInfo.getUserInfoBean();
+    final ResponseInfoBean responseInfoBean = searchedUserInfo.getResponseInfoBean();
+    final String obfuscatedDN = searchedUserInfo.getUserIdentity().toObfuscatedKey(pwmApplication.getConfig());
+    final String displayName = helpdeskDetailInfo.getUserDisplayName();
     final Set<ViewStatusFields> viewStatusFields = helpdeskProfile.readSettingAsOptionList(PwmSetting.HELPDESK_VIEW_STATUS_VALUES,ViewStatusFields.class);
     final boolean hasOtp = searchedUserInfo.getOtpUserRecord() != null;
 %>
@@ -81,13 +83,13 @@
                         <div data-dojo-type="dijit.layout.ContentPane" title="<pwm:display key="Field_Profile"/>" class="tabContent">
                             <div style="max-height: 400px; overflow: auto;">
                                 <table class="nomargin">
-                                    <% for (FormConfiguration formItem : helpdeskBean.getAdditionalUserInfo().getSearchDetails().keySet()) { %>
+                                    <% for (FormConfiguration formItem : helpdeskBean.getHeldpdeskDetailInfo().getSearchDetails().keySet()) { %>
                                     <tr>
                                         <td class="key" id="key_<%=formItem.getName()%>">
                                             <%= formItem.getLabel(pwmSession.getSessionStateBean().getLocale())%>
                                         </td>
                                         <td id="value_<%=formItem.getName()%>">
-                                            <% final String loopValue = helpdeskBean.getAdditionalUserInfo().getSearchDetails().get(formItem); %>
+                                            <% final String loopValue = helpdeskBean.getHeldpdeskDetailInfo().getSearchDetails().get(formItem); %>
                                             <%= loopValue == null ? "" : StringUtil.escapeHtml(loopValue) %>
                                         </td>
                                     </tr>
@@ -163,7 +165,7 @@
                                         <pwm:display key="Field_AccountEnabled"/>
                                     </td>
                                     <td>
-                                        <%if (helpdeskBean.getAdditionalUserInfo().isAccountEnabled()) { %><pwm:display key="Value_True"/><% } else { %><pwm:display key="Value_False"/><% } %>
+                                        <%if (helpdeskBean.getHeldpdeskDetailInfo().isAccountEnabled()) { %><pwm:display key="Value_True"/><% } else { %><pwm:display key="Value_False"/><% } %>
                                     </td>
                                 </tr>
                                 <% } %>
@@ -173,7 +175,7 @@
                                         <pwm:display key="Field_AccountExpired"/>
                                     </td>
                                     <td>
-                                        <%if (helpdeskBean.getAdditionalUserInfo().isAccountExpired()) { %><pwm:display key="Value_True"/><% } else { %><pwm:display key="Value_False"/><% } %>
+                                        <%if (helpdeskBean.getHeldpdeskDetailInfo().isAccountExpired()) { %><pwm:display key="Value_True"/><% } else { %><pwm:display key="Value_False"/><% } %>
                                     </td>
                                 </tr>
                                 <% } %>
@@ -199,25 +201,25 @@
                                     <td class="key">
                                         <pwm:display key="Field_LastLoginTime"/>
                                     </td>
-                                    <% if (helpdeskBean.getAdditionalUserInfo().getLastLoginTime() == null) { %>
+                                    <% if (helpdeskBean.getHeldpdeskDetailInfo().getLastLoginTime() == null) { %>
                                     <td>
                                         <pwm:display key="Value_NotApplicable"/>
                                     </td>
                                     <% } else { %>
                                     <td class="timestamp">
-                                        <%= dateFormatter.format(helpdeskBean.getAdditionalUserInfo().getLastLoginTime()) %>
+                                        <%= dateFormatter.format(helpdeskBean.getHeldpdeskDetailInfo().getLastLoginTime()) %>
                                     </td>
                                     <% } %>
                                 </tr>
                                 <% } %>
                                 <% if (viewStatusFields.contains(ViewStatusFields.LastLoginTimeDelta)) { %>
-                                <% if (helpdeskBean.getAdditionalUserInfo().getLastLoginTime() != null) { %>
+                                <% if (helpdeskBean.getHeldpdeskDetailInfo().getLastLoginTime() != null) { %>
                                 <tr>
                                     <td class="key">
                                         <pwm:display key="Field_LastLoginTimeDelta"/>
                                     </td>
                                     <td>
-                                        <%= TimeDuration.fromCurrent(helpdeskBean.getAdditionalUserInfo().getLastLoginTime()).asLongString(pwmSession.getSessionStateBean().getLocale()) %>
+                                        <%= TimeDuration.fromCurrent(helpdeskBean.getHeldpdeskDetailInfo().getLastLoginTime()).asLongString(pwmSession.getSessionStateBean().getLocale()) %>
                                     </td>
                                 </tr>
                                 <% } %>
@@ -274,7 +276,7 @@
                                         <pwm:display key="Field_PasswordSetTimeDelta"/>
                                     </td>
                                     <td>
-                                        <%= helpdeskBean.getAdditionalUserInfo().getPasswordSetDelta() %>
+                                        <%= helpdeskBean.getHeldpdeskDetailInfo().getPasswordSetDelta() %>
                                     </td>
                                 </tr>
                                 <% } %>
@@ -299,7 +301,7 @@
                                     <td class="key">
                                         <pwm:display key="Field_PasswordLocked"/>
                                     </td>
-                                    <% if (helpdeskBean.getAdditionalUserInfo().isIntruderLocked()) { %>
+                                    <% if (helpdeskBean.getHeldpdeskDetailInfo().isIntruderLocked()) { %>
                                     <td class="health-WARN">
                                         <pwm:display key="Value_True"/>
                                     </td>
@@ -316,7 +318,7 @@
                                         <pwm:display key="Field_ResponsesStored"/>
                                     </td>
                                     <td>
-                                        <% if (helpdeskBean.getUserInfoBean().getResponseInfoBean() != null) { %>
+                                        <% if (responseInfoBean != null) { %>
                                         <pwm:display key="Value_True"/>
                                         <% } else { %>
                                         <pwm:display key="Value_False"/>
@@ -330,7 +332,7 @@
                                         <pwm:display key="Field_ResponsesNeeded"/>
                                     </td>
                                     <td>
-                                        <% if (helpdeskBean.getUserInfoBean().isRequiresResponseConfig()) { %>
+                                        <% if (searchedUserInfo.isRequiresResponseConfig()) { %>
                                         <pwm:display key="Value_True"/>
                                         <% } else { %>
                                         <pwm:display key="Value_False"/>
@@ -394,11 +396,11 @@
                                 <% } %>
                             </table>
                         </div>
-                        <% if (helpdeskBean.getAdditionalUserInfo().getUserHistory() != null && !helpdeskBean.getAdditionalUserInfo().getUserHistory().isEmpty()) { %>
+                        <% if (helpdeskBean.getHeldpdeskDetailInfo().getUserHistory() != null && !helpdeskBean.getHeldpdeskDetailInfo().getUserHistory().isEmpty()) { %>
                         <div data-dojo-type="dijit.layout.ContentPane" title="<pwm:display key="Title_UserEventHistory"/>" class="tabContent">
                             <div style="max-height: 400px; overflow: auto;">
                                 <table class="nomargin">
-                                    <% for (final UserAuditRecord record : helpdeskBean.getAdditionalUserInfo().getUserHistory()) { %>
+                                    <% for (final UserAuditRecord record : helpdeskBean.getHeldpdeskDetailInfo().getUserHistory()) { %>
                                     <tr>
                                         <td class="key timestamp" style="width:50%">
                                             <%= dateFormatter.format(record.getTimestamp()) %>
@@ -553,7 +555,7 @@
                         <br/>
                         <% } %>
                         <% if (helpdeskProfile.readSettingAsBoolean(PwmSetting.HELPDESK_ENABLE_UNLOCK)) { %>
-                        <% if (helpdeskBean.getAdditionalUserInfo().isIntruderLocked()) { %>
+                        <% if (helpdeskBean.getHeldpdeskDetailInfo().isIntruderLocked()) { %>
                         <button id="helpdesk_unlockBtn" class="btn" style="width:150px">
                             <pwm:if test="showIcons"><span class="btn-icon fa fa-unlock"></span></pwm:if>
                             <pwm:display key="Button_Unlock"/>
@@ -578,7 +580,7 @@
                         <br/>
                         <% } %>
                         <% if (helpdeskProfile.readSettingAsBoolean(PwmSetting.HELPDESK_CLEAR_RESPONSES_BUTTON)) { %>
-                        <% if (helpdeskBean.getUserInfoBean().getResponseInfoBean() != null) { %>
+                        <% if (responseInfoBean != null) { %>
                         <button id="helpdesk_clearResponsesBtn" class="btn" style="width:150px">
                            <pwm:if test="showIcons"><span class="btn-icon fa fa-eraser"></span></pwm:if>
                             <pwm:display key="Button_ClearResponses"/>
@@ -746,7 +748,7 @@
             require(["dojo/parser","dojo/domReady!","dijit/layout/TabContainer","dijit/layout/ContentPane"],function(dojoParser){
                 dojoParser.parse();
                 PWM_VAR['helpdesk_obfuscatedDN'] = '<%=StringUtil.escapeJS(obfuscatedDN)%>';
-                PWM_VAR['helpdesk_username'] = '<%=StringUtil.escapeJS(helpdeskBean.getUserInfoBean().getUsername())%>';
+                PWM_VAR['helpdesk_username'] = '<%=StringUtil.escapeJS(searchedUserInfo.getUsername())%>';
                 PWM_VAR['helpdesk_setting_clearResponses'] = '<%=helpdeskProfile.readSettingAsEnum(PwmSetting.HELPDESK_CLEAR_RESPONSES,HelpdeskClearResponseMode.class)%>';
                 PWM_VAR['helpdesk_setting_PwUiMode'] = '<%=helpdeskProfile.readSettingAsEnum(PwmSetting.HELPDESK_SET_PASSWORD_MODE,HelpdeskUIMode.class) %>';
             });

+ 1 - 1
pwm/servlet/web/WEB-INF/jsp/success.jsp

@@ -40,7 +40,7 @@
             <div class="buttonbar">
                 <input type="hidden" name="processAction" value="continue"/>
                 <input type="hidden" id="pwmFormID" name="pwmFormID" value="<pwm:FormID/>"/>
-                <button type="submit" name="button" class="btn" id="submitBtn">
+                <button type="submit" name="button" class="btn" id="submitBtn" autofocus>
                     <pwm:if test="showIcons"><span class="btn-icon fa fa-forward"></span></pwm:if>
                     <pwm:display key="Button_Continue"/>
                 </button>

+ 2 - 10
pwm/servlet/web/WEB-INF/web.xml

@@ -167,16 +167,7 @@
     </filter>
     <filter-mapping>
         <filter-name>GZIPFilter</filter-name>
-        <url-pattern>/public/NewUser</url-pattern>
-        <url-pattern>/public/ActivateUser</url-pattern>
-        <url-pattern>/public/ForgottenPassword</url-pattern>
-        <url-pattern>/public/ForgottenUsername</url-pattern>
-        <url-pattern>/public/CommandServlet</url-pattern>
-        <url-pattern>/public/Logout</url-pattern>
-        <url-pattern>/private/*</url-pattern>
-        <url-pattern>/config/*</url-pattern>
-        <url-pattern>/</url-pattern>
-        <url-pattern>*.jsp</url-pattern>
+        <url-pattern>*</url-pattern>
     </filter-mapping>
     <filter-mapping>
         <filter-name>RequestInitializationFilter</filter-name>
@@ -193,6 +184,7 @@
         <url-pattern>/public/ForgottenPassword</url-pattern>
         <url-pattern>/public/ForgottenUsername</url-pattern>
         <url-pattern>/public/CommandServlet</url-pattern>
+        <url-pattern>/public/oauth</url-pattern>
         <url-pattern>/public/Logout</url-pattern>
         <url-pattern>/private/*</url-pattern>
         <url-pattern>/config/*</url-pattern>

+ 1 - 1
pwm/servlet/web/public/health.jsp

@@ -112,7 +112,7 @@
                 }
 
                 var div = document.createElement('div');
-                div.innerHTML = passwordValue + ':' + PWM_GLOBAL['epsActivityCount'];
+                div.innerHTML = passwordValue;
                 div.id = divId;
                 div.setAttribute("class",'health-' + PWM_GLOBAL['pwm-health']);
 

+ 1 - 1
pwm/servlet/web/public/index.jsp

@@ -41,7 +41,7 @@
                     </a>
                 </td>
                 <td style="border: 0">
-                    <p><pwm:display key="Button_Login"/></p>
+                    <p><pwm:display key="Display_Login"/></p>
                 </td>
             </tr>
             <% if (ContextManager.getPwmApplication(session).getConfig() != null && ContextManager.getPwmApplication(session).getConfig().readSettingAsBoolean(PwmSetting.FORGOTTEN_PASSWORD_ENABLE)) { %>

+ 1 - 1
pwm/servlet/web/public/reference/referencedoc.jsp

@@ -36,6 +36,7 @@
 <% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
 <% JspUtility.setFlag(pageContext, PwmRequest.Flag.NO_REQ_COUNTER); %>
 <% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_HEADER_BUTTONS); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_FOOTER_TEXT); %>
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <%
@@ -362,7 +363,6 @@
         });
     </script>
 </pwm:script>
-<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_FOOTER_TEXT); %>
 <%@ include file="/WEB-INF/jsp/fragment/footer.jsp" %>
 </body>
 </html>

+ 5 - 0
pwm/servlet/web/public/reference/rest.jsp

@@ -22,6 +22,11 @@
   --%>
 
 <!DOCTYPE html>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_HEADER_WARNINGS); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_THEME); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.NO_REQ_COUNTER); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_HEADER_BUTTONS); %>
+<% JspUtility.setFlag(pageContext, PwmRequest.Flag.HIDE_FOOTER_TEXT); %>
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html; charset=UTF-8" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <html dir="<pwm:LocaleOrientation/>">

+ 22 - 7
pwm/servlet/web/public/resources/js/admin.js

@@ -49,17 +49,30 @@ PWM_ADMIN.initAdminOtherMenu=function() {
             }));
             pMenu.addChild(new MenuSeparator());
             pMenu.addChild(new MenuItem({
-                label: 'Software License Reference',
+                label: 'Full Page Health Status',
+                onClick: function() {
+                    PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/public/health.jsp');
+                }
+            }));
+            pMenu.addChild(new MenuSeparator());
+            pMenu.addChild(new MenuItem({
+                label: '<span class="fa fa-external-link"></span> Software License Reference',
                 onClick: function() {
                     PWM_MAIN.newWindowOpen(PWM_GLOBAL['url-context'] + '/public/reference/license.jsp','license');
                 }
             }));
             pMenu.addChild(new MenuItem({
-                label: 'Reference',
+                label: '<span class="fa fa-external-link"></span> Application Reference',
                 onClick: function() {
                     PWM_MAIN.newWindowOpen(PWM_GLOBAL['url-context'] + '/public/reference/referencedoc.jsp','referencedoc');
                 }
             }));
+            pMenu.addChild(new MenuItem({
+                label: '<span class="fa fa-external-link"></span> REST Web Services Reference',
+                onClick: function() {
+                    PWM_MAIN.newWindowOpen(PWM_GLOBAL['url-context'] + '/public/reference/rest.jsp','restreference');
+                }
+            }));
             if (PWM_GLOBAL['setting-displayEula'] == true) {
                 pMenu.addChild(new MenuItem({
                     label: 'View EULA',
@@ -68,6 +81,13 @@ PWM_ADMIN.initAdminOtherMenu=function() {
                     }
                 }));
             }
+            pMenu.addChild(new MenuSeparator());
+            pMenu.addChild(new MenuItem({
+                label: 'Configuration Manager',
+                onClick: function() {
+                    PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/private/config/ConfigManager');
+                }
+            }));
 
 
             var dropDownButton = new DropDownButton({
@@ -591,11 +611,6 @@ PWM_ADMIN.showAppHealth = function(parentDivID, options, refreshNow) {
     var refreshTime = inputOpts['refreshTime'] || 10 * 1000;
     var finishFunction = inputOpts['finishFunction'];
 
-    {
-        refreshUrl += refreshUrl.indexOf('?') == -1 ? '?' : '&';
-        refreshUrl += "pwmFormID=" + PWM_GLOBAL['pwmFormID'];
-    }
-
     console.log('starting showPwmHealth: refreshTime=' + refreshTime);
     require(["dojo"],function(dojo){
         var parentDiv = dojo.byId(parentDivID);

+ 9 - 9
pwm/servlet/web/public/resources/js/configeditor-settings.js

@@ -1389,7 +1389,7 @@ ActionHandler.redraw = function(keyName) {
     addItemButton.setAttribute("type", "button");
     addItemButton.setAttribute("class", "btn");
     addItemButton.setAttribute("id", "button-" + keyName + "-addValue");
-    addItemButton.innerHTML = '<span class="btn-icon fa fa-plus-square"></span>Add Value';
+    addItemButton.innerHTML = '<span class="btn-icon fa fa-plus-square"></span>Add Action';
     newTableData.appendChild(addItemButton);
 
     newTableRow.appendChild(newTableData);
@@ -1942,10 +1942,8 @@ ChallengeSettingHandler.draw = function(keyName) {
             bodyText += '<td onclick="' + editJsText + '"> ';
             if (rowCount > 0) {
                 for (var iteration in multiValues) {
-                    (function (rowKey) {
-                        var id = 'panel-value-' + keyName + '-' + localeKey + '-' + iteration;
-                        bodyText += '<div style="text-overflow:ellipsis; white-space:nowrap; overflow:hidden" id="' + id + '">text</div>';
-                    }(iteration));
+                    var id = 'panel-value-' + keyName + '-' + localeKey + '-' + iteration;
+                    bodyText += '<div style="text-overflow:ellipsis; white-space:nowrap; overflow:hidden" id="' + id + '">text</div>';
                 }
             } else {
                 bodyText += '[No Questions]';
@@ -1968,8 +1966,10 @@ ChallengeSettingHandler.draw = function(keyName) {
         } else {
             PWM_VAR['clientSettingCache'][keyName][localeValue] = [];
             PWM_VAR['clientSettingCache'][keyName][localeValue][0] = ChallengeSettingHandler.defaultItem;
-            ChallengeSettingHandler.write(keyName);
-            ChallengeSettingHandler.editLocale(keyName,localeValue);
+            ChallengeSettingHandler.write(keyName, function(){
+                ChallengeSettingHandler.init(keyName);
+            });
+            //ChallengeSettingHandler.editLocale(keyName,localeValue);
         }
     };
     var tableElement = document.createElement("table");
@@ -2134,8 +2134,8 @@ ChallengeSettingHandler.addRow = function(keyName, localeKey) {
     ChallengeSettingHandler.editLocale(keyName, localeKey);
 };
 
-ChallengeSettingHandler.write = function(keyName) {
-    PWM_CFGEDIT.writeSetting(keyName, PWM_VAR['clientSettingCache'][keyName]);
+ChallengeSettingHandler.write = function(keyName, nextFunction) {
+    PWM_CFGEDIT.writeSetting(keyName, PWM_VAR['clientSettingCache'][keyName], nextFunction);
 };
 
 // -------------------------- user permission handler ------------------------------------