jrivard@gmail.com пре 6 година
родитељ
комит
c027f0e635

+ 7 - 7
server/src/main/java/password/pwm/svc/email/EmailService.java

@@ -85,13 +85,6 @@ public class EmailService implements PwmService
 
     private final ThreadLocal<EmailConnection> threadLocalTransport = new ThreadLocal<>();
 
-    enum SendFailureMode
-    {
-        RESEND,
-        REQUEUE,
-        DISCARD,
-    }
-
     public void init( final PwmApplication pwmApplication )
             throws PwmException
     {
@@ -100,6 +93,13 @@ public class EmailService implements PwmService
 
         servers.addAll( EmailServerUtil.makeEmailServersMap( pwmApplication.getConfig() ) );
 
+        if ( servers.isEmpty() )
+        {
+            status = STATUS.CLOSED;
+            LOGGER.debug( () -> "no email servers configured, will remain closed" );
+            return;
+        }
+
         for ( final EmailServer emailServer : servers )
         {
             serverErrors.put( emailServer, Optional.empty() );

+ 8 - 2
server/src/main/java/password/pwm/svc/node/DatabaseNodeDataService.java

@@ -25,6 +25,7 @@ package password.pwm.svc.node;
 import password.pwm.PwmApplication;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
+import password.pwm.svc.PwmService;
 import password.pwm.util.db.DatabaseAccessor;
 import password.pwm.util.db.DatabaseException;
 import password.pwm.util.db.DatabaseTable;
@@ -36,7 +37,7 @@ import password.pwm.util.logging.PwmLogger;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-public class DatabaseNodeDataService implements NodeDataServiceProvider
+class DatabaseNodeDataService implements NodeDataServiceProvider
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( DatabaseNodeDataService.class );
 
@@ -45,9 +46,14 @@ public class DatabaseNodeDataService implements NodeDataServiceProvider
 
     private final PwmApplication pwmApplication;
 
-    public DatabaseNodeDataService( final PwmApplication pwmApplication )
+    DatabaseNodeDataService( final PwmApplication pwmApplication ) throws PwmUnrecoverableException
     {
         this.pwmApplication = pwmApplication;
+
+        if ( pwmApplication.getDatabaseService().status() != PwmService.STATUS.OPEN )
+        {
+            throw new PwmUnrecoverableException( PwmError.ERROR_NODE_SERVICE_ERROR, "database service is not available" );
+        }
     }
 
     private DatabaseAccessor getDatabaseAccessor()

+ 25 - 2
server/src/main/java/password/pwm/svc/node/LDAPNodeDataService.java

@@ -28,6 +28,7 @@ import lombok.Value;
 import password.pwm.PwmApplication;
 import password.pwm.bean.UserIdentity;
 import password.pwm.config.PwmSetting;
+import password.pwm.config.profile.LdapProfile;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
@@ -39,16 +40,38 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
-public class LDAPNodeDataService implements NodeDataServiceProvider
+class LDAPNodeDataService implements NodeDataServiceProvider
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( LDAPNodeDataService.class );
 
     private final PwmApplication pwmApplication;
     private static final String VALUE_PREFIX = "0006#.#.#";
 
-    public LDAPNodeDataService( final PwmApplication pwmApplication )
+    LDAPNodeDataService( final PwmApplication pwmApplication ) throws PwmUnrecoverableException
     {
         this.pwmApplication = pwmApplication;
+
+        final UserIdentity testUser;
+        final String ldapProfileID;
+        try
+        {
+            final LdapProfile ldapProfile = pwmApplication.getConfig().getDefaultLdapProfile();
+            ldapProfileID = ldapProfile.getIdentifier();
+            testUser = ldapProfile.getTestUser( pwmApplication );
+        }
+        catch ( PwmUnrecoverableException e )
+        {
+            final String msg = "error checking ldap test user configuration for ldap node service: " + e.getMessage();
+            throw PwmUnrecoverableException.newException( PwmError.ERROR_INTERNAL, msg );
+        }
+
+        if ( testUser == null )
+        {
+            final String msg = "ldap node service requires that setting "
+                    + PwmSetting.LDAP_TEST_USER_DN.toMenuLocationDebug( ldapProfileID, null )
+                    + " is configured";
+            throw PwmUnrecoverableException.newException( PwmError.ERROR_NODE_SERVICE_ERROR, msg );
+        }
     }
 
     @Override

+ 1 - 1
server/src/main/java/password/pwm/svc/node/NodeDataServiceProvider.java

@@ -27,7 +27,7 @@ import password.pwm.util.java.TimeDuration;
 
 import java.util.Map;
 
-public interface NodeDataServiceProvider
+interface NodeDataServiceProvider
 {
     Map<String, StoredNodeData> readStoredData( ) throws PwmUnrecoverableException;
 

+ 7 - 1
server/src/main/java/password/pwm/svc/node/NodeService.java

@@ -111,10 +111,16 @@ public class NodeService implements PwmService
                 return;
             }
         }
-        catch ( Exception e )
+        catch ( PwmUnrecoverableException e )
         {
+            startupError = e.getErrorInformation();
             LOGGER.error( "error starting up cluster service: " + e.getMessage() );
         }
+        catch ( Exception e )
+        {
+            startupError = new ErrorInformation( PwmError.ERROR_NODE_SERVICE_ERROR, "error starting up cluster service: " + e.getMessage() );
+            LOGGER.error( startupError );
+        }
 
         status = STATUS.CLOSED;
     }

+ 47 - 47
server/src/main/java/password/pwm/util/secure/X509Utils.java

@@ -81,52 +81,6 @@ public abstract class X509Utils
         return readRemoteCertificates( host, port, configuration );
     }
 
-    public static List<X509Certificate> readRemoteHttpCertificates(
-            final PwmApplication pwmApplication,
-            final SessionLabel sessionLabel,
-            final URI uri,
-            final Configuration configuration
-    )
-            throws PwmUnrecoverableException
-    {
-        final CertReaderTrustManager certReaderTrustManager = new CertReaderTrustManager( readCertificateFlagsFromConfig( configuration ) );
-        final PwmHttpClientConfiguration pwmHttpClientConfiguration = PwmHttpClientConfiguration.builder()
-                .trustManager( certReaderTrustManager )
-                .build();
-        final PwmHttpClient pwmHttpClient = new PwmHttpClient( pwmApplication, sessionLabel, pwmHttpClientConfiguration );
-        final PwmHttpClientRequest request = new PwmHttpClientRequest( HttpMethod.GET, uri.toString(), "", Collections.emptyMap() );
-
-        LOGGER.debug( sessionLabel, () -> "beginning attempt to import certificates via httpclient" );
-
-        ErrorInformation requestError = null;
-        try
-        {
-            pwmHttpClient.makeRequest( request );
-        }
-        catch ( PwmException e )
-        {
-            requestError = e.getErrorInformation();
-        }
-
-        if ( certReaderTrustManager.getCertificates() != null )
-        {
-            return certReaderTrustManager.getCertificates();
-        }
-
-        {
-            final ErrorInformation finalError = requestError;
-            LOGGER.debug( sessionLabel, () -> "unable to read certificates from remote server via httpclient, error: " + finalError );
-        }
-
-        if ( requestError == null )
-        {
-            final String msg = "unable to read certificates via httpclient; check log files for more details";
-            throw PwmUnrecoverableException.newException( PwmError.ERROR_CERTIFICATE_ERROR, msg );
-        }
-
-        throw new PwmUnrecoverableException( requestError );
-    }
-
     public static List<X509Certificate> readRemoteCertificates(
             final String host,
             final int port,
@@ -189,6 +143,52 @@ public abstract class X509Utils
         return certs == null ? Collections.emptyList() : certs;
     }
 
+    public static List<X509Certificate> readRemoteHttpCertificates(
+            final PwmApplication pwmApplication,
+            final SessionLabel sessionLabel,
+            final URI uri,
+            final Configuration configuration
+    )
+            throws PwmUnrecoverableException
+    {
+        final CertReaderTrustManager certReaderTrustManager = new CertReaderTrustManager( readCertificateFlagsFromConfig( configuration ) );
+        final PwmHttpClientConfiguration pwmHttpClientConfiguration = PwmHttpClientConfiguration.builder()
+                .trustManager( certReaderTrustManager )
+                .build();
+        final PwmHttpClient pwmHttpClient = new PwmHttpClient( pwmApplication, sessionLabel, pwmHttpClientConfiguration );
+        final PwmHttpClientRequest request = new PwmHttpClientRequest( HttpMethod.GET, uri.toString(), "", Collections.emptyMap() );
+
+        LOGGER.debug( sessionLabel, () -> "beginning attempt to import certificates via httpclient" );
+
+        ErrorInformation requestError = null;
+        try
+        {
+            pwmHttpClient.makeRequest( request );
+        }
+        catch ( PwmException e )
+        {
+            requestError = e.getErrorInformation();
+        }
+
+        if ( certReaderTrustManager.getCertificates() != null )
+        {
+            return certReaderTrustManager.getCertificates();
+        }
+
+        {
+            final ErrorInformation finalError = requestError;
+            LOGGER.debug( sessionLabel, () -> "unable to read certificates from remote server via httpclient, error: " + finalError );
+        }
+
+        if ( requestError == null )
+        {
+            final String msg = "unable to read certificates via httpclient; check log files for more details";
+            throw PwmUnrecoverableException.newException( PwmError.ERROR_CERTIFICATE_ERROR, msg );
+        }
+
+        throw new PwmUnrecoverableException( requestError );
+    }
+
     private static ReadCertificateFlag[] readCertificateFlagsFromConfig( final Configuration configuration )
     {
         final CertificateMatchingMode mode = configuration.readCertificateMatchingMode();
@@ -523,7 +523,7 @@ public abstract class X509Utils
         for ( final X509Certificate certificate : certificates )
         {
             final boolean[] keyUsages = certificate.getKeyUsage();
-            if ( keyUsages.length > keyCertSignBitPosition - 1 )
+            if ( keyUsages != null && keyUsages.length > keyCertSignBitPosition - 1 )
             {
                 if ( keyUsages[keyCertSignBitPosition] )
                 {