Skip to content

Commit 3a22835

Browse files
committed
wordlist disk space checking
1 parent c0d530d commit 3a22835

40 files changed

+223
-131
lines changed

server/src/main/java/password/pwm/AppProperty.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ public enum AppProperty
196196
HEALTHCHECK_MAX_FORCE_WAIT ( "healthCheck.maximumForceCheckWaitSeconds" ),
197197
HEALTH_SUPPORT_BUNDLE_WRITE_INTERVAL_SECONDS ( "health.supportBundle.file.writeIntervalSeconds" ),
198198
HEALTH_SUPPORT_BUNDLE_FILE_WRITE_COUNT ( "health.supportBundle.file.writeRetentionCount" ),
199+
HEALTH_DISK_MIN_FREE_WARNING ( "health.disk.minFreeWarning" ),
199200
HEALTH_CERTIFICATE_WARN_SECONDS ( "health.certificate.warnSeconds" ),
200201
HEALTH_LDAP_CAUTION_DURATION_MS ( "health.ldap.cautionDurationMS" ),
201202
HEALTH_LDAP_PROXY_WARN_PW_EXPIRE_SECONDS ( "health.ldap.proxy.pwExpireWarnSeconds" ),
@@ -363,6 +364,7 @@ public enum AppProperty
363364
WORDLIST_CHAR_LENGTH_MIN ( "wordlist.minCharLength" ),
364365
WORDLIST_IMPORT_AUTO_IMPORT_RECHECK_SECONDS ( "wordlist.import.autoImportRecheckSeconds" ),
365366
WORDLIST_IMPORT_DURATION_GOAL_MS ( "wordlist.import.durationGoalMS" ),
367+
WORDLIST_IMPORT_MIN_FREE_SPACE ( "wordlist.import.minFreeSpace" ),
366368
WORDLIST_IMPORT_MIN_TRANSACTIONS ( "wordlist.import.minTransactions" ),
367369
WORDLIST_IMPORT_MAX_TRANSACTIONS ( "wordlist.import.maxTransactions" ),
368370
WORDLIST_IMPORT_MAX_CHARS_TRANSACTIONS ( "wordlist.import.maxCharsTransactions" ),

server/src/main/java/password/pwm/config/profile/NewUserProfile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import password.pwm.error.PwmError;
3636
import password.pwm.error.PwmUnrecoverableException;
3737
import password.pwm.util.java.TimeDuration;
38-
import password.pwm.util.operations.PasswordUtility;
38+
import password.pwm.util.password.PasswordUtility;
3939

4040
import java.time.Instant;
4141
import java.util.HashMap;

server/src/main/java/password/pwm/health/ConfigurationChecker.java

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
import password.pwm.util.i18n.LocaleHelper;
4646
import password.pwm.util.java.StringUtil;
4747
import password.pwm.util.logging.PwmLogger;
48-
import password.pwm.util.operations.PasswordUtility;
48+
import password.pwm.util.password.PasswordUtility;
4949

5050
import java.net.URI;
5151
import java.net.URISyntaxException;
@@ -194,30 +194,31 @@ private List<HealthRecord> passwordStrengthChecks(
194194

195195
for ( final PwmSetting setting : PwmSetting.values() )
196196
{
197-
if ( setting.getSyntax() == PwmSettingSyntax.PASSWORD )
197+
if (
198+
setting.getSyntax() == PwmSettingSyntax.PASSWORD
199+
&& !setting.getCategory().hasProfiles()
200+
&& !config.isDefaultValue( setting )
201+
)
198202
{
199-
if ( !setting.getCategory().hasProfiles() )
203+
try
200204
{
201-
if ( !config.isDefaultValue( setting ) )
205+
final PasswordData passwordValue = config.readSettingAsPassword( setting );
206+
final String stringValue = passwordValue.getStringValue();
207+
if ( !StringUtil.isEmpty( stringValue ) )
202208
{
203-
try
209+
final int strength = PasswordUtility.judgePasswordStrength( config, stringValue );
210+
if ( strength < 50 )
204211
{
205-
final PasswordData passwordValue = config.readSettingAsPassword( setting );
206-
final int strength = PasswordUtility.judgePasswordStrength( config,
207-
passwordValue.getStringValue() );
208-
if ( strength < 50 )
209-
{
210-
records.add( HealthRecord.forMessage( HealthMessage.Config_WeakPassword,
211-
setting.toMenuLocationDebug( null, locale ), String.valueOf( strength ) ) );
212-
}
213-
}
214-
catch ( Exception e )
215-
{
216-
LOGGER.error( SessionLabel.HEALTH_SESSION_LABEL, "error while inspecting setting "
217-
+ setting.toMenuLocationDebug( null, locale ) + ", error: " + e.getMessage() );
212+
records.add( HealthRecord.forMessage( HealthMessage.Config_WeakPassword,
213+
setting.toMenuLocationDebug( null, locale ), String.valueOf( strength ) ) );
218214
}
219215
}
220216
}
217+
catch ( Exception e )
218+
{
219+
LOGGER.error( SessionLabel.HEALTH_SESSION_LABEL, "error while inspecting setting "
220+
+ setting.toMenuLocationDebug( null, locale ) + ", error: " + e.getMessage() );
221+
}
221222
}
222223
}
223224
for ( final LdapProfile profile : config.getLdapProfiles().values() )

server/src/main/java/password/pwm/health/HealthMessage.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ public enum HealthMessage
8383
LocalDB_BAD( HealthStatus.WARN, HealthTopic.LocalDB ),
8484
LocalDB_NEW( HealthStatus.WARN, HealthTopic.LocalDB ),
8585
LocalDB_CLOSED( HealthStatus.WARN, HealthTopic.LocalDB ),
86+
LocalDB_LowDiskSpace( HealthStatus.WARN, HealthTopic.LocalDB ),
8687
LocalDBLogger_NOTOPEN( HealthStatus.CAUTION, HealthTopic.LocalDB ),
8788
LocalDBLogger_HighRecordCount( HealthStatus.CAUTION, HealthTopic.LocalDB ),
8889
LocalDBLogger_OldRecordPresent( HealthStatus.CAUTION, HealthTopic.LocalDB ),
@@ -91,7 +92,8 @@ public enum HealthMessage
9192
ServiceClosed_LocalDBUnavail( HealthStatus.CAUTION, HealthTopic.Application ),
9293
ServiceClosed_AppReadOnly( HealthStatus.CAUTION, HealthTopic.Application ),
9394
SMS_SendFailure( HealthStatus.WARN, HealthTopic.SMS ),
94-
Wordlist_AutoImportFailure( HealthStatus.WARN, HealthTopic.Configuration ),;
95+
Wordlist_AutoImportFailure( HealthStatus.WARN, HealthTopic.Configuration ),
96+
Wordlist_ImportInProgress( HealthStatus.CAUTION, HealthTopic.Application ),;
9597

9698
private final HealthStatus status;
9799
private final HealthTopic topic;

server/src/main/java/password/pwm/health/LDAPHealthChecker.java

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@
5454
import password.pwm.ldap.UserInfo;
5555
import password.pwm.ldap.UserInfoFactory;
5656
import password.pwm.util.PasswordData;
57-
import password.pwm.util.password.RandomPasswordGenerator;
5857
import password.pwm.util.i18n.LocaleHelper;
5958
import password.pwm.util.java.JavaHelper;
6059
import password.pwm.util.java.StringUtil;
6160
import password.pwm.util.java.TimeDuration;
6261
import password.pwm.util.logging.PwmLogger;
63-
import password.pwm.util.operations.PasswordUtility;
62+
import password.pwm.util.password.PasswordUtility;
63+
import password.pwm.util.password.RandomPasswordGenerator;
6464
import password.pwm.ws.server.rest.bean.HealthData;
6565

6666
import java.io.Serializable;
@@ -78,6 +78,7 @@
7878
import java.util.List;
7979
import java.util.Locale;
8080
import java.util.Map;
81+
import java.util.Optional;
8182
import java.util.Set;
8283

8384
public class LDAPHealthChecker implements HealthChecker
@@ -857,14 +858,11 @@ private static List<HealthRecord> checkLdapDNSyntaxValues( final PwmApplication
857858
final String value = config.getLdapProfiles().get( profile ).readSettingAsString( pwmSetting );
858859
if ( value != null && !value.isEmpty() )
859860
{
860-
final String errorMsg = validateDN( pwmApplication, value, profile );
861-
if ( errorMsg != null )
862-
{
863-
returnList.add( HealthRecord.forMessage(
864-
HealthMessage.Config_DNValueValidity,
865-
pwmSetting.toMenuLocationDebug( profile, PwmConstants.DEFAULT_LOCALE ), errorMsg )
866-
);
867-
}
861+
final Optional<String> errorMsg = validateDN( pwmApplication, value, profile );
862+
errorMsg.ifPresent( s -> returnList.add( HealthRecord.forMessage(
863+
HealthMessage.Config_DNValueValidity,
864+
pwmSetting.toMenuLocationDebug( profile, PwmConstants.DEFAULT_LOCALE ), s )
865+
) );
868866
}
869867
}
870868
else if ( pwmSetting.getSyntax() == PwmSettingSyntax.STRING_ARRAY )
@@ -874,14 +872,11 @@ else if ( pwmSetting.getSyntax() == PwmSettingSyntax.STRING_ARRAY )
874872
{
875873
for ( final String value : values )
876874
{
877-
final String errorMsg = validateDN( pwmApplication, value, profile );
878-
if ( errorMsg != null )
879-
{
880-
returnList.add( HealthRecord.forMessage(
881-
HealthMessage.Config_DNValueValidity,
882-
pwmSetting.toMenuLocationDebug( profile, PwmConstants.DEFAULT_LOCALE ), errorMsg )
883-
);
884-
}
875+
final Optional<String> errorMsg = validateDN( pwmApplication, value, profile );
876+
errorMsg.ifPresent( s -> returnList.add( HealthRecord.forMessage(
877+
HealthMessage.Config_DNValueValidity,
878+
pwmSetting.toMenuLocationDebug( profile, PwmConstants.DEFAULT_LOCALE ), s )
879+
) );
885880
}
886881
}
887882
}
@@ -985,7 +980,7 @@ private static List<HealthRecord> checkUserPermission(
985980
}
986981
else
987982
{
988-
if ( config.getLdapProfiles().keySet().contains( configuredLdapProfileID ) )
983+
if ( config.getLdapProfiles().containsKey( configuredLdapProfileID ) )
989984
{
990985
ldapProfilesToCheck.add( configuredLdapProfileID );
991986
}
@@ -1009,11 +1004,10 @@ private static List<HealthRecord> checkUserPermission(
10091004
final String groupDN = userPermission.getLdapBase();
10101005
if ( groupDN != null && !isExampleDN( groupDN ) )
10111006
{
1012-
final String errorMsg = validateDN( pwmApplication, groupDN, ldapProfileID );
1013-
if ( errorMsg != null )
1014-
{
1015-
returnList.add( HealthRecord.forMessage( HealthMessage.Config_UserPermissionValidity, settingDebugName, "groupDN: " + errorMsg ) );
1016-
}
1007+
final Optional<String> errorMsg = validateDN( pwmApplication, groupDN, ldapProfileID );
1008+
errorMsg.ifPresent( s -> returnList.add( HealthRecord.forMessage(
1009+
HealthMessage.Config_UserPermissionValidity,
1010+
settingDebugName, "groupDN: " + s ) ) );
10171011
}
10181012
}
10191013
break;
@@ -1023,11 +1017,10 @@ private static List<HealthRecord> checkUserPermission(
10231017
final String baseDN = userPermission.getLdapBase();
10241018
if ( baseDN != null && !isExampleDN( baseDN ) )
10251019
{
1026-
final String errorMsg = validateDN( pwmApplication, baseDN, ldapProfileID );
1027-
if ( errorMsg != null )
1028-
{
1029-
returnList.add( HealthRecord.forMessage( HealthMessage.Config_UserPermissionValidity, settingDebugName, "baseDN: " + errorMsg ) );
1030-
}
1020+
final Optional<String> errorMsg = validateDN( pwmApplication, baseDN, ldapProfileID );
1021+
errorMsg.ifPresent( s -> returnList.add( HealthRecord.forMessage(
1022+
HealthMessage.Config_UserPermissionValidity,
1023+
settingDebugName, "baseDN: " + s ) ) );
10311024
}
10321025
}
10331026
break;
@@ -1039,9 +1032,18 @@ private static List<HealthRecord> checkUserPermission(
10391032
return returnList;
10401033
}
10411034

1042-
private static String validateDN( final PwmApplication pwmApplication, final String dnValue, final String ldapProfileID )
1035+
private static Optional<String> validateDN(
1036+
final PwmApplication pwmApplication,
1037+
final String dnValue,
1038+
final String ldapProfileID
1039+
)
10431040
throws PwmUnrecoverableException
10441041
{
1042+
if ( StringUtil.isEmpty( dnValue ) )
1043+
{
1044+
return Optional.empty();
1045+
}
1046+
10451047
final ChaiProvider chaiProvider = pwmApplication.getProxyChaiProvider( ldapProfileID );
10461048
try
10471049
{
@@ -1050,15 +1052,15 @@ private static String validateDN( final PwmApplication pwmApplication, final Str
10501052
final ChaiEntry baseDNEntry = chaiProvider.getEntryFactory().newChaiEntry( dnValue );
10511053
if ( !baseDNEntry.exists() )
10521054
{
1053-
return "DN '" + dnValue + "' is invalid";
1055+
return Optional.of( "DN '" + dnValue + "' is invalid" );
10541056
}
10551057
else
10561058
{
10571059
final String canonicalDN = baseDNEntry.readCanonicalDN();
10581060
if ( !dnValue.equals( canonicalDN ) )
10591061
{
1060-
return "DN '" + dnValue + "' is not the correct canonical value, the server reports the canonical value as '"
1061-
+ canonicalDN + "'";
1062+
return Optional.of( "DN '" + dnValue + "' is not the correct canonical value, the server reports the canonical value as '"
1063+
+ canonicalDN + "'" );
10621064
}
10631065
}
10641066
}
@@ -1071,19 +1073,21 @@ private static String validateDN( final PwmApplication pwmApplication, final Str
10711073
{
10721074
LOGGER.error( "error while evaluating ldap DN '" + dnValue + "', error: " + e.getMessage() );
10731075
}
1074-
return null;
1076+
return Optional.empty();
10751077
}
10761078

10771079
private static boolean isExampleDN( final String dnValue )
10781080
{
1079-
if ( dnValue == null )
1081+
if ( StringUtil.isEmpty( dnValue ) )
10801082
{
10811083
return false;
10821084
}
1085+
10831086
final String[] exampleSuffixes = new String[] {
10841087
"DC=site,DC=example,DC=net",
10851088
"ou=groups,o=example",
10861089
};
1090+
10871091
for ( final String suffix : exampleSuffixes )
10881092
{
10891093
if ( dnValue.endsWith( suffix ) )

server/src/main/java/password/pwm/health/LocalDBHealthChecker.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,16 @@
2020

2121
package password.pwm.health;
2222

23+
import password.pwm.AppProperty;
2324
import password.pwm.PwmApplication;
25+
import password.pwm.config.Configuration;
26+
import password.pwm.util.java.FileSystemUtility;
27+
import password.pwm.util.java.JavaHelper;
28+
import password.pwm.util.java.StringUtil;
2429
import password.pwm.util.localdb.LocalDB;
2530

2631
import java.util.ArrayList;
32+
import java.util.Collections;
2733
import java.util.List;
2834

2935
public class LocalDBHealthChecker implements HealthChecker
@@ -58,11 +64,28 @@ public List<HealthRecord> doHealthCheck( final PwmApplication pwmApplication )
5864
return healthRecords;
5965
}
6066

67+
healthRecords.addAll( checkSpaceRemaining( pwmApplication ) );
68+
6169
if ( healthRecords.isEmpty() )
6270
{
6371
healthRecords.add( HealthRecord.forMessage( HealthMessage.LocalDB_OK ) );
6472
}
6573

6674
return healthRecords;
6775
}
76+
77+
private List<HealthRecord> checkSpaceRemaining( final PwmApplication pwmApplication )
78+
{
79+
final Configuration configuration = pwmApplication.getConfig();
80+
final long minFreeSpace = JavaHelper.silentParseLong( configuration.readAppProperty( AppProperty.HEALTH_DISK_MIN_FREE_WARNING ), 500_000_000 );
81+
final long freeSpace = FileSystemUtility.diskSpaceRemaining( pwmApplication.getLocalDB().getFileLocation() );
82+
83+
if ( freeSpace < minFreeSpace )
84+
{
85+
final String spaceValue = StringUtil.formatDiskSizeforDebug( freeSpace );
86+
return Collections.singletonList( HealthRecord.forMessage( HealthMessage.LocalDB_LowDiskSpace, spaceValue ) );
87+
}
88+
89+
return Collections.emptyList();
90+
}
6891
}

server/src/main/java/password/pwm/http/servlet/GuestRegistrationServlet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
import password.pwm.util.logging.PwmLogger;
6161
import password.pwm.util.macro.MacroMachine;
6262
import password.pwm.util.operations.ActionExecutor;
63-
import password.pwm.util.operations.PasswordUtility;
63+
import password.pwm.util.password.PasswordUtility;
6464

6565
import javax.servlet.ServletException;
6666
import javax.servlet.annotation.WebServlet;

server/src/main/java/password/pwm/http/servlet/admin/UserDebugDataReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
import password.pwm.svc.pwnotify.PwNotifyUserStatus;
4141
import password.pwm.util.logging.PwmLogger;
4242
import password.pwm.util.macro.MacroMachine;
43-
import password.pwm.util.operations.PasswordUtility;
43+
import password.pwm.util.password.PasswordUtility;
4444

4545
import java.util.Collections;
4646
import java.util.List;

server/src/main/java/password/pwm/http/servlet/changepw/ChangePasswordServlet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
import password.pwm.util.java.TimeDuration;
6060
import password.pwm.util.logging.PwmLogger;
6161
import password.pwm.util.macro.MacroMachine;
62-
import password.pwm.util.operations.PasswordUtility;
62+
import password.pwm.util.password.PasswordUtility;
6363
import password.pwm.util.password.PwmPasswordRuleValidator;
6464
import password.pwm.util.password.RandomPasswordGenerator;
6565
import password.pwm.ws.server.RestResultBean;

server/src/main/java/password/pwm/http/servlet/changepw/ChangePasswordServletUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import password.pwm.svc.event.AuditEvent;
4747
import password.pwm.util.PasswordData;
4848
import password.pwm.util.logging.PwmLogger;
49-
import password.pwm.util.operations.PasswordUtility;
49+
import password.pwm.util.password.PasswordUtility;
5050

5151
import java.util.Locale;
5252
import java.util.Map;

0 commit comments

Comments
 (0)