|
@@ -27,20 +27,24 @@ import password.pwm.PwmConstants;
|
|
|
import password.pwm.config.Configuration;
|
|
|
import password.pwm.config.PwmSetting;
|
|
|
import password.pwm.config.PwmSettingSyntax;
|
|
|
-import password.pwm.config.profile.ChangePasswordProfile;
|
|
|
-import password.pwm.config.value.StoredValue;
|
|
|
import password.pwm.config.option.DataStorageMethod;
|
|
|
import password.pwm.config.option.MessageSendMethod;
|
|
|
import password.pwm.config.profile.ActivateUserProfile;
|
|
|
+import password.pwm.config.profile.ChangePasswordProfile;
|
|
|
import password.pwm.config.profile.ForgottenPasswordProfile;
|
|
|
import password.pwm.config.profile.HelpdeskProfile;
|
|
|
import password.pwm.config.profile.LdapProfile;
|
|
|
import password.pwm.config.profile.NewUserProfile;
|
|
|
import password.pwm.config.profile.PwmPasswordPolicy;
|
|
|
import password.pwm.config.stored.StoredConfigItemKey;
|
|
|
+import password.pwm.config.stored.StoredConfiguration;
|
|
|
+import password.pwm.config.value.StoredValue;
|
|
|
+import password.pwm.config.value.ValueTypeConverter;
|
|
|
import password.pwm.config.value.data.FormConfiguration;
|
|
|
+import password.pwm.config.value.data.UserPermission;
|
|
|
import password.pwm.error.PwmUnrecoverableException;
|
|
|
import password.pwm.i18n.Config;
|
|
|
+import password.pwm.ldap.permission.UserPermissionUtility;
|
|
|
import password.pwm.util.PasswordData;
|
|
|
import password.pwm.util.i18n.LocaleHelper;
|
|
|
import password.pwm.util.java.StringUtil;
|
|
@@ -49,13 +53,13 @@ import password.pwm.util.password.PasswordUtility;
|
|
|
|
|
|
import java.net.URI;
|
|
|
import java.net.URISyntaxException;
|
|
|
-import java.time.Instant;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.Collections;
|
|
|
import java.util.LinkedHashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Locale;
|
|
|
+import java.util.NoSuchElementException;
|
|
|
import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -141,7 +145,8 @@ public class ConfigurationChecker implements HealthChecker
|
|
|
VerifyIfDeprecatedSendMethodValuesUsed.class,
|
|
|
VerifyIfDeprecatedJsFormOptionUsed.class,
|
|
|
VerifyNewUserLdapProfile.class,
|
|
|
- VerifyPasswordWaitTimes.class
|
|
|
+ VerifyPasswordWaitTimes.class,
|
|
|
+ VerifyUserPermissionSettings.class
|
|
|
) );
|
|
|
|
|
|
static class VerifyBasicConfigs implements ConfigHealthCheck
|
|
@@ -240,7 +245,6 @@ public class ConfigurationChecker implements HealthChecker
|
|
|
{
|
|
|
for ( final StoredConfigItemKey key : config.getStoredConfiguration().modifiedItems() )
|
|
|
{
|
|
|
- final Instant startTime = Instant.now();
|
|
|
if ( key.getRecordType() == StoredConfigItemKey.RecordType.SETTING )
|
|
|
{
|
|
|
final PwmSetting pwmSetting = key.toPwmSetting();
|
|
@@ -288,7 +292,7 @@ public class ConfigurationChecker implements HealthChecker
|
|
|
{
|
|
|
PwmSetting.FORGOTTEN_PASSWORD_READ_PREFERENCE,
|
|
|
PwmSetting.FORGOTTEN_PASSWORD_WRITE_PREFERENCE,
|
|
|
- };
|
|
|
+ };
|
|
|
for ( final PwmSetting loopSetting : interestedSettings )
|
|
|
{
|
|
|
if ( config.getResponseStorageLocations( loopSetting ).contains( DataStorageMethod.LDAP ) )
|
|
@@ -326,7 +330,7 @@ public class ConfigurationChecker implements HealthChecker
|
|
|
PwmSetting.FORGOTTEN_PASSWORD_WRITE_PREFERENCE,
|
|
|
PwmSetting.INTRUDER_STORAGE_METHOD,
|
|
|
PwmSetting.EVENTS_USER_STORAGE_METHOD,
|
|
|
- };
|
|
|
+ };
|
|
|
|
|
|
for ( final PwmSetting loopSetting : settingsToCheck )
|
|
|
{
|
|
@@ -570,9 +574,81 @@ public class ConfigurationChecker implements HealthChecker
|
|
|
) );
|
|
|
}
|
|
|
}
|
|
|
+ return records;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
|
|
|
- return records;
|
|
|
+
|
|
|
+ static class VerifyUserPermissionSettings implements ConfigHealthCheck
|
|
|
+ {
|
|
|
+ @Override
|
|
|
+ public List<HealthRecord> healthCheck( final Configuration config, final Locale locale )
|
|
|
+ {
|
|
|
+ final List<HealthRecord> records = new ArrayList<>();
|
|
|
+
|
|
|
+ final StoredConfiguration storedConfiguration = config.getStoredConfiguration();
|
|
|
+ for ( final StoredConfigItemKey configItemKey : StoredConfigItemKey.filterBySettingSyntax(
|
|
|
+ PwmSettingSyntax.USER_PERMISSION,
|
|
|
+ storedConfiguration.modifiedItems() ) )
|
|
|
+ {
|
|
|
+ final StoredValue storedValue = storedConfiguration.readStoredValue( configItemKey ).orElseThrow( NoSuchElementException::new );
|
|
|
+ final List<UserPermission> permissions = ValueTypeConverter.valueToUserPermissions( storedValue );
|
|
|
+ for ( final UserPermission permission : permissions )
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ UserPermissionUtility.validatePermissionSyntax( permission );
|
|
|
+ }
|
|
|
+ catch ( final PwmUnrecoverableException e )
|
|
|
+ {
|
|
|
+ final PwmSetting pwmSetting = configItemKey.toPwmSetting();
|
|
|
+ records.add( HealthRecord.forMessage(
|
|
|
+ HealthMessage.Config_SettingIssue,
|
|
|
+ pwmSetting.toMenuLocationDebug( configItemKey.getProfileID(), locale ),
|
|
|
+ e.getMessage() ) );
|
|
|
+ }
|
|
|
+
|
|
|
+ records.addAll( checkLdapProfile( config, configItemKey, locale, permission ) );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return Collections.unmodifiableList( records );
|
|
|
+ }
|
|
|
+
|
|
|
+ private static List<HealthRecord> checkLdapProfile(
|
|
|
+ final Configuration configuration,
|
|
|
+ final StoredConfigItemKey storedConfigItemKey,
|
|
|
+ final Locale locale,
|
|
|
+ final UserPermission permission
|
|
|
+ )
|
|
|
+ {
|
|
|
+ final List<LdapProfile> ldapProfiles = ldapProfilesForLdapProfileSetting( configuration, permission.getLdapProfileID() );
|
|
|
+ if ( ldapProfiles.isEmpty() )
|
|
|
+ {
|
|
|
+ final PwmSetting pwmSetting = storedConfigItemKey.toPwmSetting();
|
|
|
+ return Collections.singletonList( HealthRecord.forMessage(
|
|
|
+ HealthMessage.Config_ProfileValueValidity,
|
|
|
+ pwmSetting.toMenuLocationDebug( storedConfigItemKey.getProfileID(), locale ),
|
|
|
+ permission.getLdapProfileID() ) );
|
|
|
+ }
|
|
|
+
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static List<LdapProfile> ldapProfilesForLdapProfileSetting( final Configuration configuration, final String profileID )
|
|
|
+ {
|
|
|
+ if ( UserPermissionUtility.isAllProfiles( profileID ) )
|
|
|
+ {
|
|
|
+ return Collections.unmodifiableList( new ArrayList<>( configuration.getLdapProfiles().values() ) );
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( configuration.getLdapProfiles().containsKey( profileID ) )
|
|
|
+ {
|
|
|
+ return Collections.singletonList( configuration.getLdapProfiles().get( profileID ) );
|
|
|
+ }
|
|
|
+
|
|
|
+ return Collections.emptyList();
|
|
|
}
|
|
|
}
|
|
|
|