Jason Rivard 2 лет назад
Родитель
Сommit
5a28c6a366

+ 19 - 0
server/src/main/java/password/pwm/http/PwmSession.java

@@ -43,6 +43,7 @@ import password.pwm.ldap.UserInfoFactory;
 import password.pwm.ldap.auth.AuthenticationResult;
 import password.pwm.ldap.auth.AuthenticationType;
 import password.pwm.ldap.permission.UserPermissionUtility;
+import password.pwm.svc.report.ReportProcess;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.user.UserInfo;
@@ -57,6 +58,7 @@ import password.pwm.util.secure.PwmRandom;
 import password.pwm.util.secure.PwmSecurityKey;
 
 import java.io.Serializable;
+import java.lang.ref.SoftReference;
 import java.time.Instant;
 import java.util.Date;
 import java.util.LinkedHashMap;
@@ -64,6 +66,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
@@ -83,6 +86,9 @@ public class PwmSession implements Serializable
     @SuppressFBWarnings( "SE_TRANSIENT_FIELD_NOT_RESTORED" )
     private final transient UserSessionDataCacheBean userSessionDataCacheBean = new UserSessionDataCacheBean();
 
+    @SuppressFBWarnings( "SE_TRANSIENT_FIELD_NOT_RESTORED" )
+    private transient volatile SoftReference<ReportProcess> reportProcess = new SoftReference<>( null );
+
     private final DomainID domainID;
     private LoginInfoBean loginInfoBean;
     private transient UserInfo userInfo;
@@ -90,6 +96,8 @@ public class PwmSession implements Serializable
     private static final Lock CREATION_LOCK = new ReentrantLock();
 
     private final Lock securityKeyLock = new ReentrantLock();
+
+
     private transient ClientConnectionHolder clientConnectionHolder;
 
     public static PwmSession createPwmSession( final PwmDomain pwmDomain )
@@ -512,4 +520,15 @@ public class PwmSession implements Serializable
                 : null;
         return MacroRequest.forUser( pwmRequestContext.getPwmApplication(), pwmRequestContext.getSessionLabel(), userInfoBean, getLoginInfoBean() );
     }
+
+    public void setReportProcess( final ReportProcess reportProcess )
+    {
+        this.reportProcess = new SoftReference<>( reportProcess );
+    }
+
+    public Optional<ReportProcess> getReportProcess()
+    {
+        return Optional.ofNullable( this.reportProcess.get() );
+    }
+
 }

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

@@ -59,7 +59,7 @@ public class AuthorizationFilter extends AbstractPwmFilter
     {
         if ( mode == PwmApplicationMode.CONFIGURATION )
         {
-            final Optional<PwmServletDefinition> pwmServletDefinition = pwmRequest.getURL().forServletDefinition();
+            final Optional<PwmServletDefinition> pwmServletDefinition = pwmRequest.getURL().getServletDefinition();
             if ( pwmServletDefinition.isPresent() )
             {
                 if ( pwmServletDefinition.get().getFlags().contains( PwmServletDefinition.Flag.RequiresConfigAuth )

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

@@ -89,9 +89,9 @@ public class ShortcutServlet extends ControlledPwmServlet
     }
 
     @Override
-    public Class<? extends ProcessAction> getProcessActionsClass()
+    public Optional<Class<? extends ProcessAction>> getProcessActionsClass()
     {
-        return ShortcutAction.class;
+        return Optional.of( ShortcutAction.class );
     }
 
     @Override

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

@@ -163,7 +163,7 @@ public class SystemAdminServlet extends ControlledPwmServlet
             return ProcessStatus.Halt;
         }
 
-        if ( !pwmRequest.getPwmSession().getSessionManager().checkPermission( pwmRequest.getPwmDomain(), Permission.PWMADMIN ) )
+        if ( !pwmRequest.getPwmSession().checkPermission( pwmRequest.getPwmRequestContext(), Permission.PWMADMIN ) )
         {
             final ErrorInformation errorInformation = new ErrorInformation( PwmError.ERROR_UNAUTHORIZED );
             pwmRequest.respondWithError( errorInformation );
@@ -275,7 +275,7 @@ public class SystemAdminServlet extends ControlledPwmServlet
     )
             throws ChaiUnavailableException, PwmUnrecoverableException, IOException, ServletException
     {
-        if ( !pwmRequest.getPwmSession().getSessionManager().checkPermission( pwmRequest.getPwmDomain(), Permission.PWMADMIN ) )
+        if ( !pwmRequest.getPwmSession().checkPermission( pwmRequest.getPwmRequestContext(), Permission.PWMADMIN ) )
         {
             LOGGER.info( pwmRequest, () -> "unable to execute clear intruder records" );
             return ProcessStatus.Halt;

+ 3 - 3
server/src/main/java/password/pwm/http/servlet/admin/domain/AdminReportServlet.java

@@ -108,7 +108,7 @@ public class AdminReportServlet extends ControlledPwmServlet
     public ProcessStatus processReportProcessStatus( final PwmRequest pwmRequest )
             throws IOException
     {
-        final ReportProcessStatus reportProcessStatus = pwmRequest.getPwmSession().getSessionManager().getReportProcess()
+        final ReportProcessStatus reportProcessStatus = pwmRequest.getPwmSession().getReportProcess()
                 .map( process -> process.getStatus( pwmRequest.getLocale() ) )
                 .orElse( ReportProcessStatus.builder().build() );
 
@@ -123,7 +123,7 @@ public class AdminReportServlet extends ControlledPwmServlet
     public ProcessStatus processCancelDownload( final PwmRequest pwmRequest )
             throws IOException
     {
-        pwmRequest.getPwmSession().getSessionManager().getReportProcess().ifPresent( ReportProcess::close );
+        pwmRequest.getPwmSession().getReportProcess().ifPresent( ReportProcess::close );
         pwmRequest.outputJsonResult( RestResultBean.forSuccessMessage( pwmRequest, Message.Success_Unknown ) );
         return ProcessStatus.Halt;
     }
@@ -149,7 +149,7 @@ public class AdminReportServlet extends ControlledPwmServlet
             final ReportService reportService = pwmRequest.getPwmApplication().getReportService();
             try ( ReportProcess reportProcess = reportService.createReportProcess( pwmRequest.getLocale(), pwmRequest.getLabel() ) )
             {
-                pwmRequest.getPwmSession().getSessionManager().setReportProcess( reportProcess );
+                pwmRequest.getPwmSession().setReportProcess( reportProcess );
                 reportProcess.startReport( reportProcessRequest, outputStream );
             }
         }

+ 3 - 2
server/src/main/java/password/pwm/http/servlet/command/CommandServlet.java

@@ -44,6 +44,7 @@ import java.io.IOException;
 import java.time.Instant;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Optional;
 
 public abstract class CommandServlet extends ControlledPwmServlet
 {
@@ -51,9 +52,9 @@ public abstract class CommandServlet extends ControlledPwmServlet
     private static final PwmLogger LOGGER = PwmLogger.forClass( CommandServlet.class );
 
     @Override
-    public Class<? extends ProcessAction> getProcessActionsClass( )
+    public Optional<Class<? extends ProcessAction>> getProcessActionsClass( )
     {
-        return CommandAction.class;
+        return Optional.of( CommandAction.class );
     }
 
     public enum CommandAction implements ProcessAction

+ 9 - 4
server/src/main/java/password/pwm/svc/report/ReportProcess.java

@@ -36,9 +36,9 @@ import password.pwm.error.PwmInternalException;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.bean.DisplayElement;
-import password.pwm.ldap.UserInfo;
 import password.pwm.ldap.UserInfoFactory;
 import password.pwm.ldap.permission.UserPermissionUtility;
+import password.pwm.user.UserInfo;
 import password.pwm.util.EventRateMeter;
 import password.pwm.util.java.ConditionalTaskExecutor;
 import password.pwm.util.java.JavaHelper;
@@ -114,7 +114,7 @@ public class ReportProcess implements AutoCloseable
 
         this.debugOutputLogger = ConditionalTaskExecutor.forPeriodicTask(
                 () -> LOGGER.trace( sessionLabel, () -> "live report #" + reportId + " in progress: " + recordCounter.longValue() + " records exported",
-                        () -> TimeDuration.fromCurrent( startTime ) ),
+                        TimeDuration.fromCurrent( startTime ) ),
                 TimeDuration.MINUTE.asDuration() );
 
     }
@@ -224,7 +224,7 @@ public class ReportProcess implements AutoCloseable
         outputResult( reportProcessRequest, zipOutputStream, recordLimitReached );
 
         LOGGER.trace( sessionLabel, () -> "completed liveReport generation with " + recordCounter.longValue() + " records",
-                () -> TimeDuration.fromCurrent( startTime ) );
+                TimeDuration.fromCurrent( startTime ) );
 
     }
 
@@ -354,6 +354,11 @@ public class ReportProcess implements AutoCloseable
         recordCounter.incrementAndGet();
         processRateMeter.markEvents( 1 );
         debugOutputLogger.conditionallyExecuteTask();
+
+        LOGGER.trace( sessionLabel, () -> "live report #" + reportId + ": completed output of user " + UserIdentity.create(
+                userReportRecord.getUserDN(),
+                userReportRecord.getLdapProfile(),
+                userReportRecord.getDomainID() ).toDisplayString() );
     }
 
     private static void outputJsonSummaryToZip( final ReportSummaryData reportSummaryData, final OutputStream outputStream )
@@ -410,7 +415,7 @@ public class ReportProcess implements AutoCloseable
         LOGGER.trace(
                 sessionLabel,
                 () -> "completed ldap search process with for domain '" + pwmDomain.getDomainID() + "'",
-                () -> TimeDuration.fromCurrent( loopStartTime ) );
+                TimeDuration.fromCurrent( loopStartTime ) );
 
         processRateMeter.reset();
         return new LinkedList<>( searchResults );

+ 2 - 1
server/src/main/java/password/pwm/util/cli/commands/UserReportCommand.java

@@ -24,6 +24,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import password.pwm.PwmApplication;
 import password.pwm.PwmConstants;
 import password.pwm.bean.SessionLabel;
+import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.health.HealthRecord;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.report.ReportProcess;
@@ -78,7 +79,7 @@ public class UserReportCommand extends AbstractCliCommand
                 reportProcess.startReport( reportProcessRequest, outputFileStream );
             }
         }
-        catch ( final IOException e )
+        catch ( final IOException | PwmUnrecoverableException e )
         {
             out( "unable to open file '" + outputFile.getAbsolutePath() + "' for writing" );
             System.exit( -1 );

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

@@ -24,8 +24,8 @@ import password.pwm.PwmConstants;
 import password.pwm.PwmDomain;
 import password.pwm.bean.UserIdentity;
 import password.pwm.error.PwmUnrecoverableException;
-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.JsonFactory;
 import password.pwm.util.json.JsonProvider;