Skip to content

Commit cb8bcc3

Browse files
committed
correct ad pwd policy level merging
1 parent 2779cf9 commit cb8bcc3

File tree

5 files changed

+76
-31
lines changed

5 files changed

+76
-31
lines changed

server/src/main/java/password/pwm/config/Configuration.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -667,14 +667,16 @@ protected PwmPasswordPolicy initPasswordPolicy( final String profile, final Loca
667667
}
668668

669669
// set pwm-specific values
670-
final PwmPasswordPolicy passwordPolicy = PwmPasswordPolicy.createPwmPasswordPolicy( passwordPolicySettings );
671-
passwordPolicy.setProfileID( profile );
672-
{
673-
final List<UserPermission> queryMatch = ( List<UserPermission> ) storedConfiguration.readSetting( PwmSetting.PASSWORD_POLICY_QUERY_MATCH, profile ).toNativeObject();
674-
passwordPolicy.setUserPermissions( queryMatch );
675-
}
676-
passwordPolicy.setRuleText( JavaTypeConverter.valueToLocalizedString( storedConfiguration.readSetting( PwmSetting.PASSWORD_POLICY_RULE_TEXT, profile ), locale ) );
677-
return passwordPolicy;
670+
final List<UserPermission> queryMatch = ( List<UserPermission> ) storedConfiguration.readSetting( PwmSetting.PASSWORD_POLICY_QUERY_MATCH, profile ).toNativeObject();
671+
final String ruleText = JavaTypeConverter.valueToLocalizedString( storedConfiguration.readSetting( PwmSetting.PASSWORD_POLICY_RULE_TEXT, profile ), locale );
672+
673+
final PwmPasswordPolicy.PolicyMetaData policyMetaData = PwmPasswordPolicy.PolicyMetaData.builder()
674+
.profileID( profile )
675+
.userPermissions( queryMatch )
676+
.ruleText( ruleText )
677+
.build();
678+
679+
return PwmPasswordPolicy.createPwmPasswordPolicy( passwordPolicySettings, null, policyMetaData );
678680
}
679681

680682
public List<String> readSettingAsStringArray( final PwmSetting setting )

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

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@
2525
import com.novell.ldapchai.ChaiPasswordPolicy;
2626
import com.novell.ldapchai.ChaiPasswordRule;
2727
import com.novell.ldapchai.util.StringHelper;
28+
import lombok.Builder;
29+
import lombok.Value;
2830
import password.pwm.config.option.ADPolicyComplexity;
2931
import password.pwm.config.value.data.UserPermission;
3032
import password.pwm.health.HealthMessage;
3133
import password.pwm.health.HealthRecord;
34+
import password.pwm.util.java.JavaHelper;
3235
import password.pwm.util.java.JsonUtil;
3336
import password.pwm.util.java.StringUtil;
3437
import password.pwm.util.logging.PwmLogger;
@@ -44,6 +47,7 @@
4447
import java.util.Locale;
4548
import java.util.Map;
4649
import java.util.Set;
50+
import java.util.TreeSet;
4751
import java.util.regex.Pattern;
4852

4953

@@ -65,12 +69,26 @@ public class PwmPasswordPolicy implements Profile, Serializable
6569
private List<UserPermission> userPermissions;
6670
private String ruleText;
6771

72+
public static PwmPasswordPolicy createPwmPasswordPolicy( final Map<String, String> policyMap )
73+
{
74+
return createPwmPasswordPolicy( policyMap, null );
75+
}
76+
6877
public static PwmPasswordPolicy createPwmPasswordPolicy(
6978
final Map<String, String> policyMap,
7079
final ChaiPasswordPolicy chaiPasswordPolicy
7180
)
7281
{
73-
return new PwmPasswordPolicy( policyMap, chaiPasswordPolicy );
82+
return new PwmPasswordPolicy( policyMap, chaiPasswordPolicy, null );
83+
}
84+
85+
public static PwmPasswordPolicy createPwmPasswordPolicy(
86+
final Map<String, String> policyMap,
87+
final ChaiPasswordPolicy chaiPasswordPolicy,
88+
final PolicyMetaData policyMetaData
89+
)
90+
{
91+
return new PwmPasswordPolicy( policyMap, chaiPasswordPolicy, policyMetaData );
7492
}
7593

7694
public String getIdentifier( )
@@ -110,7 +128,8 @@ public static PwmPasswordPolicy defaultPolicy( )
110128

111129
private PwmPasswordPolicy(
112130
final Map<String, String> policyMap,
113-
final ChaiPasswordPolicy chaiPasswordPolicy
131+
final ChaiPasswordPolicy chaiPasswordPolicy,
132+
final PolicyMetaData policyMetaData
114133
)
115134
{
116135
if ( policyMap != null )
@@ -129,6 +148,12 @@ else if ( Boolean.parseBoolean( chaiPasswordPolicy.getValue( ChaiPasswordRule.AD
129148
}
130149
}
131150
this.chaiPasswordPolicy = chaiPasswordPolicy;
151+
if ( policyMetaData != null )
152+
{
153+
this.ruleText = policyMetaData.getRuleText();
154+
this.userPermissions = policyMetaData.getUserPermissions();
155+
this.profileID = policyMetaData.getProfileID();
156+
}
132157
}
133158

134159
@Override
@@ -152,31 +177,18 @@ public String getValue( final PwmPasswordRule rule )
152177
return policyMap.get( rule.getKey() );
153178
}
154179

155-
public void setProfileID( final String profileID )
156-
{
157-
this.profileID = profileID;
158-
}
180+
159181

160182
public List<UserPermission> getUserPermissions( )
161183
{
162184
return userPermissions;
163185
}
164186

165-
public void setUserPermissions( final List<UserPermission> userPermissions )
166-
{
167-
this.userPermissions = userPermissions;
168-
}
169-
170187
public String getRuleText( )
171188
{
172189
return ruleText;
173190
}
174191

175-
public void setRuleText( final String ruleText )
176-
{
177-
this.ruleText = ruleText;
178-
}
179-
180192
public PwmPasswordPolicy merge( final PwmPasswordPolicy otherPolicy )
181193
{
182194
if ( otherPolicy == null )
@@ -230,6 +242,10 @@ public PwmPasswordPolicy merge( final PwmPasswordPolicy otherPolicy )
230242
newPasswordPolicies.put( ruleKey, mergeMin( minimumLifetimeLocalValue, minimumLifetimeOtherValue ) );
231243
break;
232244

245+
case ADComplexityLevel:
246+
newPasswordPolicies.put( ruleKey, mergeADComplexityLevel( policyMap.get( ruleKey ), otherPolicy.policyMap.get( ruleKey ) ) );
247+
break;
248+
233249
default:
234250
final String localValueString = StringUtil.defaultString( policyMap.get( ruleKey ), rule.getDefaultValue() );
235251
final String otherValueString = StringUtil.defaultString( otherPolicy.policyMap.get( ruleKey ), rule.getDefaultValue() );
@@ -269,10 +285,18 @@ public PwmPasswordPolicy merge( final PwmPasswordPolicy otherPolicy )
269285
final ChaiPasswordPolicy backingPolicy = this.chaiPasswordPolicy != null ? chaiPasswordPolicy : otherPolicy.chaiPasswordPolicy;
270286
final PwmPasswordPolicy returnPolicy = createPwmPasswordPolicy( newPasswordPolicies, backingPolicy );
271287
final String newRuleText = ( ruleText != null && !ruleText.isEmpty() ) ? ruleText : otherPolicy.ruleText;
272-
returnPolicy.setRuleText( newRuleText );
288+
returnPolicy.ruleText = ( newRuleText );
273289
return returnPolicy;
274290
}
275291

292+
private static String mergeADComplexityLevel( final String value1, final String value2 )
293+
{
294+
final TreeSet<ADPolicyComplexity> seenValues = new TreeSet<>();
295+
seenValues.add( JavaHelper.readEnumFromString( ADPolicyComplexity.class, ADPolicyComplexity.NONE, value1 ) );
296+
seenValues.add( JavaHelper.readEnumFromString( ADPolicyComplexity.class, ADPolicyComplexity.NONE, value2 ) );
297+
return seenValues.last().name();
298+
}
299+
276300
protected static String mergeMin( final String value1, final String value2 )
277301
{
278302
final int iValue1 = StringHelper.convertStrToInt( value1, 0 );
@@ -304,11 +328,6 @@ protected static String mergeMax( final String value1, final String value2 )
304328
return returnValue;
305329
}
306330

307-
public static PwmPasswordPolicy createPwmPasswordPolicy( final Map<String, String> policyMap )
308-
{
309-
return createPwmPasswordPolicy( policyMap, null );
310-
}
311-
312331
public Map<String, String> getPolicyMap( )
313332
{
314333
return Collections.unmodifiableMap( policyMap );
@@ -372,4 +391,13 @@ public List<HealthRecord> health( final Locale locale )
372391

373392
return Collections.unmodifiableList( returnList );
374393
}
394+
395+
@Value
396+
@Builder
397+
public static class PolicyMetaData
398+
{
399+
private String profileID;
400+
private List<UserPermission> userPermissions;
401+
private String ruleText;
402+
}
375403
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,14 @@
3030
import password.pwm.util.i18n.LocaleHelper;
3131
import password.pwm.util.logging.PwmLogger;
3232

33+
import java.util.ArrayList;
34+
import java.util.Collections;
3335
import java.util.HashSet;
36+
import java.util.List;
3437
import java.util.Locale;
3538
import java.util.MissingResourceException;
3639
import java.util.Set;
40+
import java.util.TreeMap;
3741

3842
/**
3943
* Password rules.
@@ -518,4 +522,14 @@ public String getLabel( final Locale locale, final Configuration config )
518522
return "MissingKey-" + key;
519523
}
520524
}
525+
526+
public static List<PwmPasswordRule> sortedByLabel ( final Locale locale, final Configuration config )
527+
{
528+
final TreeMap<String, PwmPasswordRule> sortedMap = new TreeMap<>();
529+
for ( final PwmPasswordRule rule : PwmPasswordRule.values() )
530+
{
531+
sortedMap.put( rule.getLabel( locale, config ), rule );
532+
}
533+
return Collections.unmodifiableList( new ArrayList<>( sortedMap.values() ) );
534+
}
521535
}

server/src/main/resources/password/pwm/i18n/Message.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ Rule_AllowUserChange=Permit Admin Change Password
152152
Rule_AllowAdminChange=Permit User Change Password
153153
Rule_ADComplexityLevel=AD Complexity Level
154154
Rule_ADComplexityMaxViolations=Maximum AD Complexity Violations
155+
Rule_AllowMacroInRegExSetting=Regular Expressions Allow Macros
155156
Success_ActivateUser=Your user account has been successfully activated. Be sure to complete the process, or you will not be able to access your account.
156157
Success_ConfigFileUpload=The configuration file has been successfully uploaded.
157158
Success_ClearResponse=Your secret questions and answers have been successfully removed.

webapp/src/main/webapp/WEB-INF/jsp/admin-user-debug.jsp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@
357357
<td><%=JspUtility.friendlyWrite(pageContext, ldapPolicy.getDisplayName(JspUtility.locale(request)))%></td>
358358
<td><%=JspUtility.friendlyWrite(pageContext, userPolicy.getDisplayName(JspUtility.locale(request)))%></td>
359359
</tr>
360-
<% for (final PwmPasswordRule rule : PwmPasswordRule.values()) { %>
360+
<% for (final PwmPasswordRule rule : PwmPasswordRule.sortedByLabel(JspUtility.locale(request), JspUtility.getPwmRequest(pageContext).getConfig())) { %>
361361
<tr>
362362
<td><span title="<%=rule.getKey()%>"><%=rule.getLabel(JspUtility.locale(request), JspUtility.getPwmRequest(pageContext).getConfig())%></span></td>
363363
<td><%=rule.getRuleType()%></td>

0 commit comments

Comments
 (0)