Browse Source

improve ldapbrowser profile selection

Jason Rivard 4 years ago
parent
commit
bd5663f32a

+ 1 - 11
server/src/main/java/password/pwm/PwmApplication.java

@@ -24,7 +24,6 @@ import password.pwm.bean.DomainID;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SmsItemBean;
 import password.pwm.config.AppConfig;
-import password.pwm.config.DomainConfig;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSettingMetaDataReader;
 import password.pwm.config.PwmSettingScope;
@@ -410,16 +409,7 @@ public class PwmApplication
     public PwmDomain getAdminDomain()
             throws PwmUnrecoverableException
     {
-        final Optional<DomainConfig> adminDomainConfig = getConfig().getDomainConfigs().values().stream()
-                .filter( DomainConfig::isAdministrativeDomain )
-                .findFirst();
-
-        if ( adminDomainConfig.isPresent() )
-        {
-            return domains().get( adminDomainConfig.get().getDomainID() );
-        }
-
-        throw PwmUnrecoverableException.newException( PwmError.ERROR_INTERNAL, "administrative domain is not defined" );
+        return domains().get( getConfig().getAdminDomainID() );
     }
 
     public void shutdown( )

+ 37 - 1
server/src/main/java/password/pwm/config/AppConfig.java

@@ -29,8 +29,10 @@ import password.pwm.config.option.DataStorageMethod;
 import password.pwm.config.profile.EmailServerProfile;
 import password.pwm.config.profile.ProfileDefinition;
 import password.pwm.config.stored.StoredConfiguration;
+import password.pwm.config.stored.StoredConfigurationFactory;
 import password.pwm.config.value.FileValue;
 import password.pwm.config.value.data.UserPermission;
+import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.i18n.PwmLocaleBundle;
 import password.pwm.util.PasswordData;
@@ -64,7 +66,24 @@ public class AppConfig implements SettingReader
     private final Map<DomainID, DomainConfig> domainConfigMap;
     private final Set<String> domainIDList;
 
-    private PwmSecurityKey tempInstanceKey = null;
+    private static final Supplier<AppConfig> DEFAULT_CONFIG = new LazySupplier<>( () -> makeDefaultConfig() );
+
+    private static AppConfig makeDefaultConfig()
+    {
+        try
+        {
+            return new AppConfig( StoredConfigurationFactory.newConfig() );
+        }
+        catch ( final PwmUnrecoverableException e )
+        {
+            throw new IllegalStateException( e );
+        }
+    }
+
+    public static AppConfig defaultConfig()
+    {
+        return DEFAULT_CONFIG.get();
+    }
 
     public AppConfig( final StoredConfiguration storedConfiguration )
     {
@@ -91,6 +110,23 @@ public class AppConfig implements SettingReader
         return domainConfigMap;
     }
 
+
+    public DomainID getAdminDomainID()
+            throws PwmUnrecoverableException
+    {
+        return getDomainConfigs().values().stream()
+                .filter( DomainConfig::isAdministrativeDomain )
+                .findFirst()
+                .map( DomainConfig::getDomainID )
+                .orElseThrow( () -> PwmUnrecoverableException.newException( PwmError.ERROR_INTERNAL, "administrative domain is not defined" ) );
+    }
+
+    public DomainConfig getAdminDomain()
+            throws PwmUnrecoverableException
+    {
+        return getDomainConfigs().get( getAdminDomainID() );
+    }
+
     public String readSettingAsString( final PwmSetting pwmSetting )
     {
         return settingReader.readSettingAsString( pwmSetting );

+ 1 - 1
server/src/main/java/password/pwm/config/function/SyslogCertImportFunction.java

@@ -81,7 +81,7 @@ public class SyslogCertImportFunction implements SettingUIFunction
                             final List<X509Certificate> certs = X509Utils.readRemoteCertificates(
                                     syslogConfig.getHost(),
                                     syslogConfig.getPort(),
-                                    new AppConfig( modifier.newStoredConfiguration() ) );
+                                    AppConfig.defaultConfig() );
                             if ( certs != null )
                             {
                                 resultCertificates.addAll( certs );

+ 14 - 3
server/src/main/java/password/pwm/http/servlet/configeditor/ConfigEditorServlet.java

@@ -878,14 +878,25 @@ public class ConfigEditorServlet extends ControlledPwmServlet
         final Instant startTime = Instant.now();
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final Map<String, String> inputMap = pwmRequest.readBodyAsJsonStringMap( PwmHttpRequestWrapper.Flag.BypassValidation );
-        final String profile = inputMap.get( LdapBrowser.PARAM_PROFILE );
-        final String dn = inputMap.getOrDefault( LdapBrowser.PARAM_DN, "" );
+
+        final StoredConfiguration storedConfiguration = configManagerBean.getStoredConfiguration();
         final DomainID domainID = DomainStateReader.forRequest( pwmRequest ).getDomainIDForDomainSetting(  );
 
+        final String profile;
+        {
+            final String selectedProfile = inputMap.get( LdapBrowser.PARAM_PROFILE );
+            final AppConfig appConfig = new AppConfig( storedConfiguration );
+            final DomainConfig domainConfig = appConfig.getDomainConfigs().getOrDefault( domainID, AppConfig.defaultConfig().getAdminDomain() );
+            profile = domainConfig.getLdapProfiles().containsKey( selectedProfile )
+                    ? selectedProfile
+                    : domainConfig.getLdapProfiles().keySet().iterator().next();
+        }
+        final String dn = inputMap.getOrDefault( LdapBrowser.PARAM_DN, "" );
+
         final LdapBrowser ldapBrowser = new LdapBrowser(
                 pwmRequest.getLabel(),
                 pwmRequest.getPwmDomain().getLdapConnectionService().getChaiProviderFactory(),
-                configManagerBean.getStoredConfiguration()
+                storedConfiguration
         );
 
         LdapBrowser.LdapBrowseResult result;

+ 4 - 3
server/src/main/java/password/pwm/ws/server/RestAuthenticationProcessor.java

@@ -74,14 +74,15 @@ public class RestAuthenticationProcessor
             final Optional<String> namedSecretName = readNamedSecretName();
             if ( namedSecretName.isPresent() )
             {
-                LOGGER.trace( sessionLabel, () -> "authenticating with named secret '" + namedSecretName + "'" );
+                final String name = namedSecretName.get();
+                LOGGER.trace( sessionLabel, () -> "authenticating with named secret '" + name + "'" );
                 final Set<WebServiceUsage> usages = CollectionUtil.copiedEnumSet( CollectionUtil.readEnumSetFromStringCollection(
                         WebServiceUsage.class,
-                        pwmDomain.getConfig().readSettingAsNamedPasswords( PwmSetting.WEBSERVICES_EXTERNAL_SECRET ).get( namedSecretName ).getUsage()
+                        pwmDomain.getConfig().readSettingAsNamedPasswords( PwmSetting.WEBSERVICES_EXTERNAL_SECRET ).get( name ).getUsage()
                 ), WebServiceUsage.class );
                 return new RestAuthentication(
                         RestAuthenticationType.NAMED_SECRET,
-                        namedSecretName.get(),
+                        name,
                         null,
                         Collections.unmodifiableSet( usages ),
                         true,

+ 1 - 1
server/src/main/resources/password/pwm/i18n/Config.properties

@@ -36,7 +36,7 @@ Button_Previous=Previous
 Button_CheckSettings=Check Settings
 Button_ShowAdvanced=Show %1% Advanced Settings
 Button_HideAdvanced=Hide Advanced Settings
-Button_AddPermission=Add Users
+Button_AddPermission=Add
 Confirm_ConfigPasswordStored=The configuration password has been changed; please click the "save" icon to store the new password.
 Confirm_RemoveDomain=Are you sure you want to remove the domain <code>%1%</code>?  All setting values associated with this domain will also be removed.
 Confirm_RemoveProfile=Are you sure you want to remove the profile <code>%1%</code>?  The setting values associated with this profile will also be removed.

+ 2 - 2
server/src/test/java/password/pwm/config/option/IdentityVerificationMethodEnumTest.java

@@ -29,9 +29,9 @@ import password.pwm.error.PwmUnrecoverableException;
 public class IdentityVerificationMethodEnumTest
 {
     @Test
-    public void testLabels() throws PwmUnrecoverableException
+    public void testLabels()
     {
-        final AppConfig appConfig = new AppConfig( StoredConfigurationFactory.newConfig() );
+        final AppConfig appConfig = AppConfig.defaultConfig();
         for ( final IdentityVerificationMethod method : IdentityVerificationMethod.values() )
         {
             method.getLabel( appConfig, PwmConstants.DEFAULT_LOCALE );