Преглед изворни кода

establish new system admin menu

Jason Rivard пре 3 година
родитељ
комит
e12b01cdbd

Разлика између датотеке није приказан због своје велике величине
+ 359 - 326
client/angular/package-lock.json


+ 3 - 3
client/angular/package.json

@@ -46,10 +46,10 @@
         "imports-loader": "0.8.0",
         "imports-loader": "0.8.0",
         "jasmine": "3.2.0",
         "jasmine": "3.2.0",
         "jasmine-core": "3.2.1",
         "jasmine-core": "3.2.1",
-        "jshint": "^2.13.1",
+        "jshint": "^2.13.4",
         "jshint-loader": "0.8.4",
         "jshint-loader": "0.8.4",
         "json-loader": "0.5.7",
         "json-loader": "0.5.7",
-        "karma": "^4.4.1",
+        "karma": "^6.3.16",
         "karma-chrome-launcher": "2.2.0",
         "karma-chrome-launcher": "2.2.0",
         "karma-jasmine": "1.1.2",
         "karma-jasmine": "1.1.2",
         "karma-jasmine-html-reporter": "1.3.1",
         "karma-jasmine-html-reporter": "1.3.1",
@@ -59,7 +59,7 @@
         "karma-webpack": "3.0.5",
         "karma-webpack": "3.0.5",
         "moment": "2.21.0",
         "moment": "2.21.0",
         "ngtemplate-loader": "2.0.1",
         "ngtemplate-loader": "2.0.1",
-        "node-sass": "^6.0.1",
+        "node-sass": "^7.0.0",
         "phantomjs": "2.1.7",
         "phantomjs": "2.1.7",
         "phantomjs-prebuilt": "2.1.16",
         "phantomjs-prebuilt": "2.1.16",
         "postcss-loader": "2.1.1",
         "postcss-loader": "2.1.1",

+ 144 - 40
server/src/main/java/password/pwm/http/IdleTimeoutCalculator.java

@@ -31,6 +31,7 @@ import password.pwm.config.PwmSetting;
 import password.pwm.config.profile.HelpdeskProfile;
 import password.pwm.config.profile.HelpdeskProfile;
 import password.pwm.config.profile.PeopleSearchProfile;
 import password.pwm.config.profile.PeopleSearchProfile;
 import password.pwm.config.profile.ProfileDefinition;
 import password.pwm.config.profile.ProfileDefinition;
+import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.servlet.PwmServletDefinition;
 import password.pwm.http.servlet.PwmServletDefinition;
 import password.pwm.ldap.UserInfo;
 import password.pwm.ldap.UserInfo;
@@ -39,6 +40,7 @@ import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
 import java.util.Collections;
 import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
 import java.util.Optional;
 import java.util.Set;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.SortedSet;
@@ -86,7 +88,6 @@ public class IdleTimeoutCalculator
                     }
                     }
                 }
                 }
             }
             }
-
         }
         }
         else
         else
         {
         {
@@ -141,7 +142,6 @@ public class IdleTimeoutCalculator
                             MaxIdleTimeoutResult.reasonFor( PwmSetting.PEOPLE_SEARCH_IDLE_TIMEOUT_SECONDS, peopleSearchID ),
                             MaxIdleTimeoutResult.reasonFor( PwmSetting.PEOPLE_SEARCH_IDLE_TIMEOUT_SECONDS, peopleSearchID ),
                             TimeDuration.of( peopleSearchIdleTimeout, TimeDuration.Unit.SECONDS ) ) );
                             TimeDuration.of( peopleSearchIdleTimeout, TimeDuration.Unit.SECONDS ) ) );
                 }
                 }
-
             }
             }
         }
         }
 
 
@@ -186,74 +186,178 @@ public class IdleTimeoutCalculator
             return figureMaxSessionTimeout( pwmDomain, pwmSession ).getIdleTimeout();
             return figureMaxSessionTimeout( pwmDomain, pwmSession ).getIdleTimeout();
         }
         }
 
 
-        final DomainConfig config = pwmDomain.getConfig();
-        if ( pwmURL.matches( PwmServletDefinition.Helpdesk ) )
+        for ( final IdleTimeoutCalculatorModule module : SERVLET_IDLE_CALCULATORS )
         {
         {
-            if ( config.readSettingAsBoolean( PwmSetting.HELPDESK_ENABLE ) )
+            for ( final PwmServletDefinition pwmServletDefinition : module.forServlets() )
             {
             {
-                final HelpdeskProfile helpdeskProfile = pwmRequest.getHelpdeskProfile( );
-                if ( helpdeskProfile != null )
+                if ( pwmURL.matches( pwmServletDefinition ) )
                 {
                 {
-                    final long helpdeskIdleTimeout = helpdeskProfile.readSettingAsLong( PwmSetting.HELPDESK_IDLE_TIMEOUT_SECONDS );
-                    if ( helpdeskIdleTimeout > 0 )
+                    final Optional<TimeDuration> calculatedDuration = module.calculate( pwmRequest );
+                    if ( calculatedDuration.isPresent() )
                     {
                     {
-                        return TimeDuration.of( helpdeskIdleTimeout, TimeDuration.Unit.SECONDS );
+                        return calculatedDuration.get();
                     }
                     }
                 }
                 }
             }
             }
         }
         }
 
 
-        if (
-                (
-                        pwmURL.matches( PwmServletDefinition.PrivatePeopleSearch )
-                                || pwmURL.matches( PwmServletDefinition.PublicPeopleSearch )
-                )
-                        && pwmURL.isPrivateUrl()
-                )
+        final long idleTimeout = pwmRequest.getDomainConfig().readSettingAsLong( PwmSetting.IDLE_TIMEOUT_SECONDS );
+        return TimeDuration.of( idleTimeout, TimeDuration.Unit.SECONDS );
+    }
+
+    private static final List<IdleTimeoutCalculatorModule> SERVLET_IDLE_CALCULATORS = List.of(
+            new ConfigGuideIdleCalculator(),
+            new ConfigEditorIdleCalculator(),
+            new HelpdeskIdleCalculator(),
+            new PublicPeopleSearchIdleCalculator(),
+            new PrivatePeopleSearchIdleCalculator() );
+
+
+    interface IdleTimeoutCalculatorModule
+    {
+        List<PwmServletDefinition> forServlets();
+
+        Optional<TimeDuration> calculate( PwmRequest pwmRequest ) throws PwmUnrecoverableException;
+    }
+
+    static class ConfigGuideIdleCalculator implements IdleTimeoutCalculatorModule
+    {
+        @Override
+        public List<PwmServletDefinition> forServlets()
+        {
+            return Collections.singletonList( PwmServletDefinition.ConfigGuide );
+        }
+
+        @Override
+        public Optional<TimeDuration> calculate( final PwmRequest pwmRequest ) throws PwmUnrecoverableException
         {
         {
-            final PeopleSearchProfile peopleSearchProfile = pwmRequest.getPeopleSearchProfile( );
-            if ( peopleSearchProfile != null )
+            if ( pwmRequest.getPwmApplication().getApplicationMode() == PwmApplicationMode.NEW )
             {
             {
-                final long peopleSearchIdleTimeout = peopleSearchProfile.readSettingAsLong( PwmSetting.PEOPLE_SEARCH_IDLE_TIMEOUT_SECONDS );
-                if ( peopleSearchIdleTimeout > 0 )
+                final long configGuideIdleTimeout = Long.parseLong( pwmRequest.getDomainConfig().readAppProperty( AppProperty.CONFIG_GUIDE_IDLE_TIMEOUT ) );
+                if ( configGuideIdleTimeout > 0 )
                 {
                 {
-                    return TimeDuration.of( peopleSearchIdleTimeout, TimeDuration.Unit.SECONDS );
+                    return Optional.of( TimeDuration.of( configGuideIdleTimeout, TimeDuration.Unit.SECONDS ) );
                 }
                 }
             }
             }
+            return Optional.empty();
+        }
+    }
+
+    static class ConfigEditorIdleCalculator implements IdleTimeoutCalculatorModule
+    {
+        @Override
+        public List<PwmServletDefinition> forServlets()
+        {
+            return Collections.singletonList( PwmServletDefinition.ConfigEditor );
+        }
+
+        @Override
+        public Optional<TimeDuration> calculate( final PwmRequest pwmRequest ) throws PwmUnrecoverableException
+        {
+            final long configEditorIdleTimeout = Long.parseLong( pwmRequest.getDomainConfig().readAppProperty( AppProperty.CONFIG_EDITOR_IDLE_TIMEOUT ) );
+            if ( configEditorIdleTimeout > 0 )
+            {
+                return Optional.of( TimeDuration.of( configEditorIdleTimeout, TimeDuration.Unit.SECONDS ) );
+            }
+            return Optional.empty();
         }
         }
+    }
 
 
-        if ( pwmURL.matches( PwmServletDefinition.ConfigEditor ) )
+    static class HelpdeskIdleCalculator implements IdleTimeoutCalculatorModule
+    {
+        @Override
+        public List<PwmServletDefinition> forServlets()
         {
         {
-            try
+            return Collections.singletonList( PwmServletDefinition.Helpdesk );
+        }
+
+        @Override
+        public Optional<TimeDuration> calculate( final PwmRequest pwmRequest ) throws PwmUnrecoverableException
+        {
+            if ( !pwmRequest.isAuthenticated() )
+            {
+                return Optional.empty();
+            }
+
+            if ( !pwmRequest.getDomainConfig().readSettingAsBoolean( PwmSetting.HELPDESK_ENABLE ) )
+            {
+                return Optional.empty();
+            }
+
+            final HelpdeskProfile helpdeskProfile = pwmRequest.getHelpdeskProfile( );
+            if ( helpdeskProfile != null )
             {
             {
-                if ( pwmSession.getSessionManager().checkPermission( pwmDomain, Permission.PWMADMIN ) )
+                final long helpdeskIdleTimeout = helpdeskProfile.readSettingAsLong( PwmSetting.HELPDESK_IDLE_TIMEOUT_SECONDS );
+                if ( helpdeskIdleTimeout > 0 )
                 {
                 {
-                    final long configEditorIdleTimeout = Long.parseLong( config.readAppProperty( AppProperty.CONFIG_EDITOR_IDLE_TIMEOUT ) );
-                    if ( configEditorIdleTimeout > 0 )
-                    {
-                        return TimeDuration.of( configEditorIdleTimeout, TimeDuration.Unit.SECONDS );
-                    }
+                    return Optional.of( TimeDuration.of( helpdeskIdleTimeout, TimeDuration.Unit.SECONDS ) );
                 }
                 }
             }
             }
-            catch ( final PwmUnrecoverableException e )
+
+            return Optional.empty();
+        }
+    }
+
+    static class PublicPeopleSearchIdleCalculator implements IdleTimeoutCalculatorModule
+    {
+        @Override
+        public List<PwmServletDefinition> forServlets()
+        {
+            return Collections.singletonList( PwmServletDefinition.PublicPeopleSearch );
+        }
+
+        @Override
+        public Optional<TimeDuration> calculate( final PwmRequest pwmRequest ) throws PwmUnrecoverableException
+        {
+            if ( pwmRequest.getDomainConfig().readSettingAsBoolean( PwmSetting.PEOPLE_SEARCH_ENABLE_PUBLIC ) )
             {
             {
-                LOGGER.error( pwmRequest, () -> "error while figuring max idle timeout for session: " + e.getMessage() );
+                final PeopleSearchProfile peopleSearchProfile = pwmRequest.getDomainConfig().getPublicPeopleSearchProfile().orElseThrow(
+                        () -> PwmUnrecoverableException.newException( PwmError.ERROR_NO_PROFILE_ASSIGNED, "public peoplesearch profile not assigned" ) );
+
+                final long peopleSearchIdleTimeout = peopleSearchProfile.readSettingAsLong( PwmSetting.PEOPLE_SEARCH_IDLE_TIMEOUT_SECONDS );
+                if ( peopleSearchIdleTimeout > 0 )
+                {
+                    return Optional.of( TimeDuration.of( peopleSearchIdleTimeout, TimeDuration.Unit.SECONDS ) );
+                }
             }
             }
+
+            return Optional.empty();
         }
         }
+    }
+
 
 
-        if ( pwmURL.matches( PwmServletDefinition.ConfigGuide ) )
+    static class PrivatePeopleSearchIdleCalculator implements IdleTimeoutCalculatorModule
+    {
+        @Override
+        public List<PwmServletDefinition> forServlets()
         {
         {
-            if ( pwmDomain.getApplicationMode() == PwmApplicationMode.NEW )
+            return Collections.singletonList( PwmServletDefinition.PrivatePeopleSearch );
+        }
+
+        @Override
+        public Optional<TimeDuration> calculate( final PwmRequest pwmRequest ) throws PwmUnrecoverableException
+        {
+            if ( !pwmRequest.isAuthenticated() )
             {
             {
-                final long configGuideIdleTimeout = Long.parseLong( config.readAppProperty( AppProperty.CONFIG_GUIDE_IDLE_TIMEOUT ) );
-                if ( configGuideIdleTimeout > 0 )
+                return Optional.empty();
+            }
+
+            if ( !pwmRequest.getDomainConfig().readSettingAsBoolean( PwmSetting.PEOPLE_SEARCH_ENABLE ) )
+            {
+                return Optional.empty();
+            }
+
+            final PeopleSearchProfile peopleSearchProfile = pwmRequest.getPeopleSearchProfile();
+            if ( peopleSearchProfile != null )
+            {
+                final long peopleSearchIdleTimeout = peopleSearchProfile.readSettingAsLong( PwmSetting.PEOPLE_SEARCH_IDLE_TIMEOUT_SECONDS );
+                if ( peopleSearchIdleTimeout > 0 )
                 {
                 {
-                    return TimeDuration.of( configGuideIdleTimeout, TimeDuration.Unit.SECONDS );
+                    return Optional.of( TimeDuration.of( peopleSearchIdleTimeout, TimeDuration.Unit.SECONDS ) );
                 }
                 }
             }
             }
-        }
 
 
-        final long idleTimeout = config.readSettingAsLong( PwmSetting.IDLE_TIMEOUT_SECONDS );
-        return TimeDuration.of( idleTimeout, TimeDuration.Unit.SECONDS );
+            return Optional.empty();
+        }
     }
     }
 }
 }

+ 7 - 6
server/src/main/java/password/pwm/http/filter/CookieManagementFilter.java

@@ -25,6 +25,8 @@ import password.pwm.PwmApplication;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.ContextManager;
 import password.pwm.http.ContextManager;
 import password.pwm.http.HttpHeader;
 import password.pwm.http.HttpHeader;
+import password.pwm.http.PwmRequest;
+import password.pwm.http.PwmSession;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
@@ -36,6 +38,7 @@ import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Collection;
 
 
@@ -73,7 +76,7 @@ public class CookieManagementFilter implements Filter
     {
     {
         filterChain.doFilter( servletRequest, servletResponse );
         filterChain.doFilter( servletRequest, servletResponse );
         addSameSiteCookieAttribute( ( HttpServletResponse ) servletResponse, value );
         addSameSiteCookieAttribute( ( HttpServletResponse ) servletResponse, value );
-        markSessionForRecycle( ( HttpServletRequest ) servletRequest );
+        markSessionForRecycle( ( HttpServletRequest ) servletRequest, ( HttpServletResponse ) servletResponse  );
     }
     }
 
 
     /**
     /**
@@ -82,9 +85,8 @@ public class CookieManagementFilter implements Filter
      *
      *
      * @param httpServletRequest The request to be marked
      * @param httpServletRequest The request to be marked
      */
      */
-    private void markSessionForRecycle( final HttpServletRequest httpServletRequest )
+    private void markSessionForRecycle( final HttpServletRequest httpServletRequest, final HttpServletResponse httpServletResponse )
     {
     {
-        /*
         if ( StringUtil.isEmpty( value ) )
         if ( StringUtil.isEmpty( value ) )
         {
         {
             return;
             return;
@@ -96,7 +98,8 @@ public class CookieManagementFilter implements Filter
             PwmSession pwmSession = null;
             PwmSession pwmSession = null;
             try
             try
             {
             {
-                pwmSession = PwmSessionFactory.readPwmSession( httpSession );
+                final PwmRequest pwmRequest = PwmRequest.forRequest( httpServletRequest, httpServletResponse );
+                pwmSession = pwmRequest.getPwmSession();
             }
             }
             catch ( final PwmUnrecoverableException e )
             catch ( final PwmUnrecoverableException e )
             {
             {
@@ -112,8 +115,6 @@ public class CookieManagementFilter implements Filter
                 }
                 }
             }
             }
         }
         }
-
-         */
     }
     }
 
 
     public static void addSameSiteCookieAttribute( final HttpServletResponse response, final String value )
     public static void addSameSiteCookieAttribute( final HttpServletResponse response, final String value )

+ 1 - 1
server/src/main/java/password/pwm/http/filter/ObsoleteUrlFilter.java

@@ -88,7 +88,7 @@ public class ObsoleteUrlFilter extends AbstractPwmFilter
         if ( optionalDefinition.isPresent() )
         if ( optionalDefinition.isPresent() )
         {
         {
             final PwmServletDefinition pwmServletDefinition = optionalDefinition.get();
             final PwmServletDefinition pwmServletDefinition = optionalDefinition.get();
-            if ( !pwmServletDefinition.servletUrl().equals( requestServletUrl ) )
+            if ( !requestServletUrl.startsWith( pwmServletDefinition.servletUrl() ) )
             {
             {
                 LOGGER.debug( pwmRequest, () -> "obsolete url of '"
                 LOGGER.debug( pwmRequest, () -> "obsolete url of '"
                         + requestServletUrl
                         + requestServletUrl

+ 2 - 2
server/src/main/java/password/pwm/http/servlet/PwmServletDefinition.java

@@ -40,10 +40,10 @@ import password.pwm.http.bean.ShortcutsBean;
 import password.pwm.http.bean.UpdateProfileBean;
 import password.pwm.http.bean.UpdateProfileBean;
 import password.pwm.http.servlet.accountinfo.AccountInformationServlet;
 import password.pwm.http.servlet.accountinfo.AccountInformationServlet;
 import password.pwm.http.servlet.activation.ActivateUserServlet;
 import password.pwm.http.servlet.activation.ActivateUserServlet;
-import password.pwm.http.servlet.admin.AdminReportServlet;
+import password.pwm.http.servlet.admin.domain.AdminReportServlet;
 import password.pwm.http.servlet.admin.AdminServlet;
 import password.pwm.http.servlet.admin.AdminServlet;
 import password.pwm.http.servlet.admin.SystemAdminServlet;
 import password.pwm.http.servlet.admin.SystemAdminServlet;
-import password.pwm.http.servlet.admin.AdminUserDebugServlet;
+import password.pwm.http.servlet.admin.domain.AdminUserDebugServlet;
 import password.pwm.http.servlet.changepw.PrivateChangePasswordServlet;
 import password.pwm.http.servlet.changepw.PrivateChangePasswordServlet;
 import password.pwm.http.servlet.changepw.PublicChangePasswordServlet;
 import password.pwm.http.servlet.changepw.PublicChangePasswordServlet;
 import password.pwm.http.servlet.command.PrivateCommandServlet;
 import password.pwm.http.servlet.command.PrivateCommandServlet;

+ 14 - 15
server/src/main/java/password/pwm/http/servlet/admin/SystemAdminServlet.java

@@ -89,6 +89,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Optional;
 import java.util.SortedMap;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.TreeMap;
+import java.util.stream.Stream;
 import java.util.zip.GZIPOutputStream;
 import java.util.zip.GZIPOutputStream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 import java.util.zip.ZipOutputStream;
@@ -380,7 +381,15 @@ public class SystemAdminServlet extends ControlledPwmServlet
 
 
     private void forwardToJsp( final PwmRequest pwmRequest ) throws ServletException, PwmUnrecoverableException, IOException
     private void forwardToJsp( final PwmRequest pwmRequest ) throws ServletException, PwmUnrecoverableException, IOException
     {
     {
-        final Page currentPage = Page.forUrl( pwmRequest.getURL() );
+        final Optional<Page> requestedPage = Page.forUrl( pwmRequest.getURL() );
+        if ( requestedPage.isEmpty() )
+        {
+            final String url = pwmRequest.getBasePath() + PwmServletDefinition.SystemAdmin.servletUrl() + Page.dashboard.getUrlSuffix();
+            pwmRequest.getPwmResponse().sendRedirect( url );
+            return;
+        }
+
+        final Page currentPage = requestedPage.get();
 
 
         if ( currentPage == Page.threads )
         if ( currentPage == Page.threads )
         {
         {
@@ -410,12 +419,7 @@ public class SystemAdminServlet extends ControlledPwmServlet
             pwmRequest.setAttribute( PwmRequestAttribute.AppDashboardData, appDashboardData );
             pwmRequest.setAttribute( PwmRequestAttribute.AppDashboardData, appDashboardData );
         }
         }
 
 
-        if ( currentPage != null )
-        {
             pwmRequest.forwardToJsp( currentPage.getJspURL() );
             pwmRequest.forwardToJsp( currentPage.getJspURL() );
-            return;
-        }
-        pwmRequest.getPwmResponse().sendRedirect( pwmRequest.getBasePath() + PwmServletDefinition.SystemAdmin.servletUrl() + Page.dashboard.getUrlSuffix() );
     }
     }
 
 
     private static int readMaxParameter( final PwmRequest pwmRequest, final int defaultValue, final int maxValue )
     private static int readMaxParameter( final PwmRequest pwmRequest, final int defaultValue, final int maxValue )
@@ -454,17 +458,12 @@ public class SystemAdminServlet extends ControlledPwmServlet
             return urlSuffix;
             return urlSuffix;
         }
         }
 
 
-        public static Page forUrl( final PwmURL pwmURL )
+        public static Optional<Page> forUrl( final PwmURL pwmURL )
         {
         {
             final String url = pwmURL.toString();
             final String url = pwmURL.toString();
-            for ( final Page page : Page.values() )
-            {
-                if ( url.endsWith( page.urlSuffix ) )
-                {
-                    return page;
-                }
-            }
-            return null;
+            return Stream.of( Page.values() )
+                    .filter( page -> url.endsWith( page.getUrlSuffix() ) )
+                    .findFirst();
         }
         }
     }
     }
 
 

+ 2 - 1
server/src/main/java/password/pwm/http/servlet/admin/AdminReportServlet.java → server/src/main/java/password/pwm/http/servlet/admin/domain/AdminReportServlet.java

@@ -18,7 +18,7 @@
  * limitations under the License.
  * limitations under the License.
  */
  */
 
 
-package password.pwm.http.servlet.admin;
+package password.pwm.http.servlet.admin.domain;
 
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
@@ -32,6 +32,7 @@ import password.pwm.http.PwmRequest;
 import password.pwm.http.servlet.AbstractPwmServlet;
 import password.pwm.http.servlet.AbstractPwmServlet;
 import password.pwm.http.servlet.ControlledPwmServlet;
 import password.pwm.http.servlet.ControlledPwmServlet;
 import password.pwm.http.servlet.PwmServletDefinition;
 import password.pwm.http.servlet.PwmServletDefinition;
+import password.pwm.http.servlet.admin.SystemAdminServlet;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.Message;
 import password.pwm.svc.report.ReportProcess;
 import password.pwm.svc.report.ReportProcess;
 import password.pwm.svc.report.ReportProcessRequest;
 import password.pwm.svc.report.ReportProcessRequest;

+ 2 - 1
server/src/main/java/password/pwm/http/servlet/admin/AdminUserDebugServlet.java → server/src/main/java/password/pwm/http/servlet/admin/domain/AdminUserDebugServlet.java

@@ -18,7 +18,7 @@
  * limitations under the License.
  * limitations under the License.
  */
  */
 
 
-package password.pwm.http.servlet.admin;
+package password.pwm.http.servlet.admin.domain;
 
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
@@ -39,6 +39,7 @@ import password.pwm.http.PwmRequestAttribute;
 import password.pwm.http.bean.AdminBean;
 import password.pwm.http.bean.AdminBean;
 import password.pwm.http.servlet.ControlledPwmServlet;
 import password.pwm.http.servlet.ControlledPwmServlet;
 import password.pwm.http.servlet.PwmServletDefinition;
 import password.pwm.http.servlet.PwmServletDefinition;
+import password.pwm.http.servlet.admin.SystemAdminServlet;
 import password.pwm.ldap.search.UserSearchEngine;
 import password.pwm.ldap.search.UserSearchEngine;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/admin/UserDebugDataBean.java → server/src/main/java/password/pwm/http/servlet/admin/domain/UserDebugDataBean.java

@@ -18,7 +18,7 @@
  * limitations under the License.
  * limitations under the License.
  */
  */
 
 
-package password.pwm.http.servlet.admin;
+package password.pwm.http.servlet.admin.domain;
 
 
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Value;
 import lombok.Value;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/admin/UserDebugDataReader.java → server/src/main/java/password/pwm/http/servlet/admin/domain/UserDebugDataReader.java

@@ -18,7 +18,7 @@
  * limitations under the License.
  * limitations under the License.
  */
  */
 
 
-package password.pwm.http.servlet.admin;
+package password.pwm.http.servlet.admin.domain;
 
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.Permission;
 import password.pwm.Permission;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordServlet.java

@@ -1247,7 +1247,7 @@ public class ForgottenPasswordServlet extends ControlledPwmServlet
             pwmSession.getLoginInfoBean().getLoginFlags().add( LoginInfoBean.LoginFlag.forcePwChange );
             pwmSession.getLoginInfoBean().getLoginFlags().add( LoginInfoBean.LoginFlag.forcePwChange );
 
 
             // redirect user to change password screen.
             // redirect user to change password screen.
-            pwmRequest.getPwmResponse().sendRedirect( PwmServletDefinition.PublicChangePassword.servletUrlName() );
+            pwmRequest.getPwmResponse().sendRedirect( PwmServletDefinition.PublicChangePassword );
         }
         }
         catch ( final PwmUnrecoverableException e )
         catch ( final PwmUnrecoverableException e )
         {
         {

+ 2 - 2
server/src/main/java/password/pwm/util/debug/LdapRecentUserDebugGenerator.java

@@ -23,8 +23,8 @@ package password.pwm.util.debug;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.PwmDomain;
 import password.pwm.PwmDomain;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.UserIdentity;
-import password.pwm.http.servlet.admin.UserDebugDataBean;
-import password.pwm.http.servlet.admin.UserDebugDataReader;
+import password.pwm.http.servlet.admin.domain.UserDebugDataBean;
+import password.pwm.http.servlet.admin.domain.UserDebugDataReader;
 import password.pwm.util.json.JsonProvider;
 import password.pwm.util.json.JsonProvider;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 
 

+ 82 - 196
webapp/src/main/webapp/WEB-INF/jsp/admin-analysis.jsp

@@ -69,205 +69,96 @@
     <div id="centerbody" class="wide">
     <div id="centerbody" class="wide">
         <h1 id="page-content-title"><pwm:display key="Title_DataAnalysis" bundle="Admin"/></h1>
         <h1 id="page-content-title"><pwm:display key="Title_DataAnalysis" bundle="Admin"/></h1>
         <%@ include file="fragment/admin-nav.jsp" %>
         <%@ include file="fragment/admin-nav.jsp" %>
-        <div class="tab-container" style="width: 100%; height: 100%;" id="analysis-topLevelTab">
-            <input name="tabs" type="radio" id="tab-1" checked="checked" class="input"/>
-            <label for="tab-1" class="label"><pwm:display key="Title_DirectoryReporting" bundle="Admin"/></label>
-            <div class="tab-content-pane" style="width: 100%; height: 100%;" title="<pwm:display key="Title_DirectoryReporting" bundle="Admin"/>">
-                <div class="tab-container" style="width: 100%; height: 100%;">
-                    <input name="dr_tabs" type="radio" id="tab-1.1" checked="checked" class="input"/>
-                    <label for="tab-1.1" class="label"><pwm:display key="Title_ReportEngineStatus" bundle="Admin"/></label>
-                    <div class="tab-content-pane" title="<pwm:display key="Title_ReportEngineStatus" bundle="Admin"/>" class="tabContent">
-                        <table style="width:450px" id="statusTable">
-                            <tr><td><pwm:display key="Display_PleaseWait"/></td></tr>
-                        </table>
-                        <table style="width:450px;">
-                            <tr><td style="text-align: center; cursor: pointer">
-                                <button id="reportStartButton" class="btn">
-                                    <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-play">&nbsp;</span></pwm:if>
-                                    <pwm:display key="Button_Report_Start" bundle="Admin"/>
-                                </button>
-                                &nbsp;&nbsp;
-                                <button id="reportStopButton" class="btn">
-                                    <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-stop">&nbsp;</span></pwm:if>
-                                    <pwm:display key="Button_Report_Stop" bundle="Admin"/>
-                                </button>
-                                &nbsp;&nbsp;
-                                <button id="reportClearButton" class="btn">
-                                    <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-trash-o">&nbsp;</span></pwm:if>
-                                    <pwm:display key="Button_Report_Clear" bundle="Admin"/>
-                                </button>
-                            </td></tr>
-                        </table>
-                    </div>
-
-                    <input name="dr_tabs" type="radio" id="tab-1.2" class="input"/>
-                    <label for="tab-1.2" class="label">Summary</label>
-                    <div class="tab-content-pane" title="Summary" class="tabContent">
-                        <div style="max-height: 500px; overflow-y: auto" id="summaryTableWrapper">
-                            <table id="summaryTable">
-                                <tr><td><pwm:display key="Display_PleaseWait"/></td></tr>
-                            </table>
-                        </div>
-                        <div class="noticebar">
-                            <pwm:display key="Notice_DynamicRefresh" bundle="Admin"/>
-                            <pwm:display key="Notice_ReportSummary" bundle="Admin"/>
-                        </div>
-                        <div style="text-align: center">
-                            <form class="submitToDownloadForm" action="<pwm:current-url/>" method="post">
-                                <button type="submit" class="btn" id="button-downloadUserSummaryCsv">
-                                    <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-download">&nbsp;</span></pwm:if>
-                                    <pwm:display key="Button_DownloadCSV" bundle="Admin"/>
-                                </button>
-                                <input type="hidden" name="processAction" value="downloadUserSummaryCsv"/>
-                                <input type="hidden" name="pwmFormID" value="<pwm:FormID/>"/>
-                            </form>
-                        </div>
-                    </div>
-
-                    <input name="dr_tabs" type="radio" id="tab-1.3" class="input"/>
-                    <label for="tab-1.3" class="label"><pwm:display key="Title_DataViewer" bundle="Admin"/></label>
-                    <div class="tab-content-pane" title="<pwm:display key="Title_DataViewer" bundle="Admin"/>" class="tabContent">
-                        <div id="grid">
-                        </div>
-                        <div style="text-align: center">
-                            <input name="maxResults" id="maxReportDataResults" value="1000" type="number" style="width: 70px"
-                                   min="10" max="50000" step="100"/>
-                            Rows
-                            <button class="btn" type="button" id="button-refreshReportDataGrid">
-                                <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-refresh">&nbsp;</span></pwm:if>
-                                <pwm:display key="Button_Refresh" bundle="Admin"/>
-                            </button>
-                            <form class="submitToDownloadForm" id="downloadUserReportCsvForm" action="<pwm:current-url/>" method="post">
-                                <button type="submit" class="btn" id="button-downloadUserReportCsv">
-                                    <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-download">&nbsp;</span></pwm:if>
-                                    <pwm:display key="Button_DownloadCSV" bundle="Admin"/>
-                                </button>
-                                <pwm:script>
-                                    <script type="application/javascript">
-                                        PWM_GLOBAL['startupFunctions'].push(function(){
-                                            PWM_MAIN.showTooltip({
-                                                id: 'button-downloadUserReportCsv',
-                                                text: '<pwm:display key="Tooltip_DownloadReportRecords" bundle="Admin"/>',
-                                                width: 350
-                                            });
-
-                                        });
-                                    </script>
-                                </pwm:script>
-                                <input type="hidden" name="processAction" value="downloadUserReportCsv"/>
-                                <input type="hidden" name="pwmFormID" value="<pwm:FormID/>"/>
-                                <input type="hidden" name="selectedColumns" value="" />
-                            </form>
-                        </div>
-                        <pwm:script>
-                            <script type="application/javascript">
-                                PWM_GLOBAL['startupFunctions'].push(function(){
-                                    PWM_ADMIN.initReportDataGrid();
-                                });
-                            </script>
-                        </pwm:script>
-                    </div>
-
-                    <div class="tab-end"></div>
+        <div class="tab-container" style="width: 100%; height: 100%;">
+            <input name="es_tabs" type="radio" id="tab-2.1" checked="checked" class="input"/>
+            <label for="tab-2.1" class="label"><pwm:display key="Title_RawStatistics" bundle="Admin"/></label>
+            <div class="tab-content-pane" title="<pwm:display key="Title_RawStatistics" bundle="Admin"/>" class="tabContent">
+                <div style="max-height: 500px; overflow-y: auto">
+                    <table>
+                        <tr>
+                            <td colspan="10" style="text-align: center">
+                                <form action="<pwm:current-url/>" method="GET" enctype="application/x-www-form-urlencoded"
+                                      name="statsUpdateForm" id="statsUpdateForm">
+                                    <select name="statsPeriodSelect"
+                                            style="width: 350px;">
+                                        <option value="<%=StatisticsService.KEY_CUMULATIVE%>" <%= StatisticsService.KEY_CUMULATIVE.equals(statsPeriodSelect) ? "selected=\"selected\"" : "" %>>
+                                            since installation - <span class="timestamp"><%= StringUtil.toIsoDate(analysis_pwmRequest.getPwmApplication().getInstallTime()) %></span>
+                                        </option>
+                                        <option value="<%=StatisticsService.KEY_CURRENT%>" <%= StatisticsService.KEY_CURRENT.equals(statsPeriodSelect) ? "selected=\"selected\"" : "" %>>
+                                            since startup - <span class="timestamp"><%= StringUtil.toIsoDate(analysis_pwmRequest.getPwmApplication().getStartupTime()) %></span>
+                                        </option>
+                                        <% final Map<DailyKey, String> availableKeys = statsManager.getAvailableKeys(locale); %>
+                                        <% for (final Map.Entry<DailyKey, String> entry : availableKeys.entrySet()) { %>
+                                        <% final DailyKey key = entry.getKey(); %>
+                                        <option value="<%=key%>" <%= key.toString().equals(statsPeriodSelect) ? "selected=\"selected\"" : "" %>>
+                                            <%=key.localDate().format(DateTimeFormatter.ISO_LOCAL_DATE)%>
+                                        </option>
+                                        <% } %>
+                                    </select>
+                                    <button class="btn" type="submit">
+                                        <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-refresh">&nbsp;</span></pwm:if>
+                                        <pwm:display key="Button_Refresh" bundle="Admin"/>
+                                    </button>
+                                </form>
+                            </td>
+                        </tr>
+                        <% for (final Statistic loopStat : Statistic.sortedValues(locale)) { %>
+                        <tr>
+                            <td >
+                                        <span id="Statistic_Key_<%=loopStat.getKey()%>"><%= loopStat.getLabel(locale) %><span/>
+                            </td>
+                            <td>
+                                <%= stats.getStatistic(loopStat) %>
+                            </td>
+                        </tr>
+                        <% } %>
+                        <% for (final AvgStatistic loopStat : AvgStatistic.values()) { %>
+                        <tr>
+                            <td >
+                                        <span id="Statistic_Key_<%=loopStat.getKey()%>"><%= loopStat.getLabel(locale) %><span/>
+                            </td>
+                            <td>
+                                <%= stats.getAvgStatistic(loopStat) %><%= loopStat.getUnit() %>
+                            </td>
+                        </tr>
+                        <% } %>
+                    </table>
+                </div>
+                <div class="noticebar">
+                    <pwm:display key="Notice_EventStatistics" bundle="Admin"/>
+                </div>
+                <div style="text-align: center">
+                    <form class="submitToDownloadForm" action="<pwm:current-url/>" method="post" enctype="application/x-www-form-urlencoded">
+                        <button type="submit" class="btn" id="button-downloadStatisticsLogCsv">
+                            <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-download"></span></pwm:if>
+                            <pwm:display key="Button_DownloadCSV" bundle="Admin"/>
+                        </button>
+                        <input type="hidden" name="processAction" value="downloadStatisticsLogCsv"/>
+                        <input type="hidden" name="pwmFormID" value="<pwm:FormID/>"/>
+                    </form>
                 </div>
                 </div>
             </div>
             </div>
 
 
-            <input name="tabs" type="radio" id="tab-2" class="input"/>
-            <label for="tab-2" class="label"><pwm:display key="Title_EventStatistics" bundle="Admin"/></label>
-            <div class="tab-content-pane" style="width: 100%; height: 100%;" title="<pwm:display key="Title_EventStatistics" bundle="Admin"/>">
-                <div class="tab-container" style="width: 100%; height: 100%;">
-                    <input name="es_tabs" type="radio" id="tab-2.1" checked="checked" class="input"/>
-                    <label for="tab-2.1" class="label"><pwm:display key="Title_RawStatistics" bundle="Admin"/></label>
-                    <div class="tab-content-pane" title="<pwm:display key="Title_RawStatistics" bundle="Admin"/>" class="tabContent">
-                        <div style="max-height: 500px; overflow-y: auto">
-                            <table>
-                                <tr>
-                                    <td colspan="10" style="text-align: center">
-                                        <form action="<pwm:current-url/>" method="GET" enctype="application/x-www-form-urlencoded"
-                                              name="statsUpdateForm" id="statsUpdateForm">
-                                            <select name="statsPeriodSelect"
-                                                    style="width: 350px;">
-                                                <option value="<%=StatisticsService.KEY_CUMULATIVE%>" <%= StatisticsService.KEY_CUMULATIVE.equals(statsPeriodSelect) ? "selected=\"selected\"" : "" %>>
-                                                    since installation - <span class="timestamp"><%= StringUtil.toIsoDate(analysis_pwmRequest.getPwmApplication().getInstallTime()) %></span>
-                                                </option>
-                                                <option value="<%=StatisticsService.KEY_CURRENT%>" <%= StatisticsService.KEY_CURRENT.equals(statsPeriodSelect) ? "selected=\"selected\"" : "" %>>
-                                                    since startup - <span class="timestamp"><%= StringUtil.toIsoDate(analysis_pwmRequest.getPwmApplication().getStartupTime()) %></span>
-                                                </option>
-                                                <% final Map<DailyKey, String> availableKeys = statsManager.getAvailableKeys(locale); %>
-                                                <% for (final Map.Entry<DailyKey, String> entry : availableKeys.entrySet()) { %>
-                                                <% final DailyKey key = entry.getKey(); %>
-                                                <option value="<%=key%>" <%= key.toString().equals(statsPeriodSelect) ? "selected=\"selected\"" : "" %>>
-                                                    <%=key.localDate().format(DateTimeFormatter.ISO_LOCAL_DATE)%>
-                                                </option>
-                                                <% } %>
-                                            </select>
-                                            <button class="btn" type="submit">
-                                                <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-refresh">&nbsp;</span></pwm:if>
-                                                <pwm:display key="Button_Refresh" bundle="Admin"/>
-                                            </button>
-                                        </form>
-                                    </td>
-                                </tr>
-                                <% for (final Statistic loopStat : Statistic.sortedValues(locale)) { %>
-                                <tr>
-                                    <td >
-                                        <span id="Statistic_Key_<%=loopStat.getKey()%>"><%= loopStat.getLabel(locale) %><span/>
-                                    </td>
-                                    <td>
-                                        <%= stats.getStatistic(loopStat) %>
-                                    </td>
-                                </tr>
-                                <% } %>
-                                <% for (final AvgStatistic loopStat : AvgStatistic.values()) { %>
-                                <tr>
-                                    <td >
-                                        <span id="Statistic_Key_<%=loopStat.getKey()%>"><%= loopStat.getLabel(locale) %><span/>
-                                    </td>
-                                    <td>
-                                        <%= stats.getAvgStatistic(loopStat) %><%= loopStat.getUnit() %>
-                                    </td>
-                                </tr>
-                                <% } %>
-                            </table>
-                        </div>
-                        <div class="noticebar">
-                            <pwm:display key="Notice_EventStatistics" bundle="Admin"/>
-                        </div>
-                        <div style="text-align: center">
-                            <form class="submitToDownloadForm" action="<pwm:current-url/>" method="post" enctype="application/x-www-form-urlencoded">
-                                <button type="submit" class="btn" id="button-downloadStatisticsLogCsv">
-                                    <pwm:if test="<%=PwmIfTest.showIcons%>"><span class="btn-icon pwm-icon pwm-icon-download"></span></pwm:if>
-                                    <pwm:display key="Button_DownloadCSV" bundle="Admin"/>
-                                </button>
-                                <input type="hidden" name="processAction" value="downloadStatisticsLogCsv"/>
-                                <input type="hidden" name="pwmFormID" value="<pwm:FormID/>"/>
-                            </form>
-                        </div>
+            <input name="es_tabs" type="radio" id="tab-2.2" class="input"/>
+            <label for="tab-2.2" class="label"><pwm:display key="Title_StatisticsCharts" bundle="Admin"/></label>
+            <div class="tab-content-pane" title="<pwm:display key="Title_StatisticsCharts" bundle="Admin"/>" class="tabContent">
+                <div style="height:100%; width: 100%">
+                    <div id="statsChartOptionsDiv" style="width:580px; text-align: center; margin:0 auto;">
+                        <label for="statsChartSelect">Statistic</label>
+                        <select name="statsChartSelect" id="statsChartSelect" style="width: 300px;">
+                            <% for (final Statistic loopStat : Statistic.sortedValues(locale)) { %>
+                            <option value="<%=loopStat %>"><%=loopStat.getLabel(locale)%></option>
+                            <% } %>
+                        </select>
+                        <label for="statsChartDays" style="padding-left: 10px">Days</label>
+                        <input id="statsChartDays" value="30" type="number" style="width: 60px" min="7" max="120"/>
                     </div>
                     </div>
-
-                    <input name="es_tabs" type="radio" id="tab-2.2" class="input"/>
-                    <label for="tab-2.2" class="label"><pwm:display key="Title_StatisticsCharts" bundle="Admin"/></label>
-                    <div class="tab-content-pane" title="<pwm:display key="Title_StatisticsCharts" bundle="Admin"/>" class="tabContent">
-                        <div style="height:100%; width: 100%">
-                            <div id="statsChartOptionsDiv" style="width:580px; text-align: center; margin:0 auto;">
-                                <label for="statsChartSelect">Statistic</label>
-                                <select name="statsChartSelect" id="statsChartSelect" style="width: 300px;">
-                                    <% for (final Statistic loopStat : Statistic.sortedValues(locale)) { %>
-                                    <option value="<%=loopStat %>"><%=loopStat.getLabel(locale)%></option>
-                                    <% } %>
-                                </select>
-                                <label for="statsChartDays" style="padding-left: 10px">Days</label>
-                                <input id="statsChartDays" value="30" type="number" style="width: 60px" min="7" max="120"/>
-                            </div>
-                            <div id="statsChart">
-                            </div>
-                        </div>
+                    <div id="statsChart">
                     </div>
                     </div>
-
-                    <div class="tab-end"></div>
                 </div>
                 </div>
             </div>
             </div>
 
 
+            <div class="tab-end"></div>
         </div>
         </div>
     </div>
     </div>
     <div class="push"></div>
     <div class="push"></div>
@@ -290,11 +181,6 @@
                     refreshChart();
                     refreshChart();
                 },5*1000);
                 },5*1000);
 
 
-                PWM_ADMIN.refreshReportDataSummary();
-                PWM_ADMIN.refreshReportDataStatus();
-                setInterval(function () { PWM_ADMIN.refreshReportDataSummary() }, 5 * 1000);
-                setInterval(function () { PWM_ADMIN.refreshReportDataStatus() }, 5 * 1000);
-
                 <% for (final Statistic loopStat : Statistic.sortedValues(locale)) { %>
                 <% for (final Statistic loopStat : Statistic.sortedValues(locale)) { %>
                 PWM_MAIN.showTooltip({id:'Statistic_Key_<%=loopStat.getKey()%>',width:400,position:'above',text:PWM_ADMIN.showString("Statistic_Description.<%=loopStat.getKey()%>")});
                 PWM_MAIN.showTooltip({id:'Statistic_Key_<%=loopStat.getKey()%>',width:400,position:'above',text:PWM_ADMIN.showString("Statistic_Description.<%=loopStat.getKey()%>")});
                 <% } %>
                 <% } %>

+ 2 - 2
webapp/src/main/webapp/WEB-INF/jsp/admin-user-debug.jsp

@@ -31,14 +31,14 @@
 <%@ page import="password.pwm.config.profile.ProfileDefinition" %>
 <%@ page import="password.pwm.config.profile.ProfileDefinition" %>
 <%@ page import="password.pwm.config.profile.PwmPasswordPolicy" %>
 <%@ page import="password.pwm.config.profile.PwmPasswordPolicy" %>
 <%@ page import="password.pwm.config.profile.PwmPasswordRule" %>
 <%@ page import="password.pwm.config.profile.PwmPasswordRule" %>
-<%@ page import="password.pwm.http.servlet.admin.UserDebugDataBean" %>
+<%@ page import="password.pwm.http.servlet.admin.domain.UserDebugDataBean" %>
 <%@ page import="password.pwm.i18n.Display" %>
 <%@ page import="password.pwm.i18n.Display" %>
 <%@ page import="java.util.Map" %>
 <%@ page import="java.util.Map" %>
 <%@ page import="password.pwm.util.java.TimeDuration" %>
 <%@ page import="password.pwm.util.java.TimeDuration" %>
 <%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.config.PwmSetting" %>
 <%@ page import="password.pwm.config.PwmSetting" %>
 <%@ page import="password.pwm.svc.PwmService" %>
 <%@ page import="password.pwm.svc.PwmService" %>
-<%@ page import="password.pwm.http.servlet.admin.AdminUserDebugServlet" %>
+<%@ page import="password.pwm.http.servlet.admin.domain.AdminUserDebugServlet" %>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html" %>
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <%@ taglib uri="pwm" prefix="pwm" %>

+ 1 - 3
webapp/src/main/webapp/WEB-INF/jsp/fragment/admin-nav.jsp

@@ -29,7 +29,7 @@
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.JspUtility" %>
 
 
 <%@ taglib uri="pwm" prefix="pwm" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
-<% final SystemAdminServlet.Page currentPage = SystemAdminServlet.Page.forUrl(JspUtility.getPwmRequest(pageContext).getURL()); %>
+<% final SystemAdminServlet.Page currentPage = SystemAdminServlet.Page.forUrl(JspUtility.getPwmRequest(pageContext).getURL()).orElseThrow(); %>
 <pwm:script-ref url="/public/resources/js/uilibrary.js"/>
 <pwm:script-ref url="/public/resources/js/uilibrary.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>
 <link href="<pwm:url url='/public/resources/webjars/dijit/themes/nihilo/nihilo.css' addContext="true"/>" rel="stylesheet" type="text/css"/>
 <link href="<pwm:url url='/public/resources/webjars/dijit/themes/nihilo/nihilo.css' addContext="true"/>" rel="stylesheet" type="text/css"/>
@@ -68,5 +68,3 @@
     <div style="display: inline" id="admin-nav-menu-container">
     <div style="display: inline" id="admin-nav-menu-container">
     </div>
     </div>
 </div>
 </div>
-
-

+ 1 - 0
webapp/src/main/webapp/WEB-INF/pwm-taglib.tld

@@ -27,6 +27,7 @@
     <tlib-version>1.2</tlib-version>
     <tlib-version>1.2</tlib-version>
     <jsp-version>1.2</jsp-version>
     <jsp-version>1.2</jsp-version>
     <short-name>pwm-taglib</short-name>
     <short-name>pwm-taglib</short-name>
+    <uri>pwm</uri>
     <tag>
     <tag>
         <name>ErrorMessage</name>
         <name>ErrorMessage</name>
         <tag-class>password.pwm.http.tag.ErrorMessageTag</tag-class>
         <tag-class>password.pwm.http.tag.ErrorMessageTag</tag-class>

Неке датотеке нису приказане због велике количине промена