38
38
import java .util .List ;
39
39
import java .util .Map ;
40
40
import java .util .Set ;
41
+ import javax .naming .directory .SearchControls ;
41
42
42
43
/**
43
44
* Allow to directly call some operations against LDAPIdentityStore.
@@ -167,30 +168,10 @@ public static LDAPObject createLDAPGroup(LDAPStorageProvider ldapProvider, Strin
167
168
* @param memberChildAttrName used just if membershipType is UID. Usually 'uid'
168
169
* @param ldapParent role or group
169
170
* @param ldapChild usually user (or child group or child role)
170
- * @param sendLDAPUpdateRequest if true, the method will send LDAP update request too. Otherwise it will skip it
171
171
*/
172
- public static void addMember (LDAPStorageProvider ldapProvider , MembershipType membershipType , String memberAttrName , String memberChildAttrName , LDAPObject ldapParent , LDAPObject ldapChild , boolean sendLDAPUpdateRequest ) {
173
-
174
- Set <String > memberships = getExistingMemberships (memberAttrName , ldapParent );
175
-
176
- // Remove membership placeholder if present
177
- if (membershipType == MembershipType .DN ) {
178
- for (String membership : memberships ) {
179
- if (LDAPConstants .EMPTY_MEMBER_ATTRIBUTE_VALUE .equals (membership )) {
180
- memberships .remove (membership );
181
- break ;
182
- }
183
- }
184
- }
185
-
172
+ public static void addMember (LDAPStorageProvider ldapProvider , MembershipType membershipType , String memberAttrName , String memberChildAttrName , LDAPObject ldapParent , LDAPObject ldapChild ) {
186
173
String membership = getMemberValueOfChildObject (ldapChild , membershipType , memberChildAttrName );
187
-
188
- memberships .add (membership );
189
- ldapParent .setAttribute (memberAttrName , memberships );
190
-
191
- if (sendLDAPUpdateRequest ) {
192
- ldapProvider .getLdapIdentityStore ().update (ldapParent );
193
- }
174
+ ldapProvider .getLdapIdentityStore ().addMemberToGroup (ldapParent .getDn ().toString (), memberAttrName , membership );
194
175
}
195
176
196
177
/**
@@ -204,29 +185,20 @@ public static void addMember(LDAPStorageProvider ldapProvider, MembershipType me
204
185
* @param ldapChild usually user (or child group or child role)
205
186
*/
206
187
public static void deleteMember (LDAPStorageProvider ldapProvider , MembershipType membershipType , String memberAttrName , String memberChildAttrName , LDAPObject ldapParent , LDAPObject ldapChild ) {
207
- Set <String > memberships = getExistingMemberships (memberAttrName , ldapParent );
208
-
209
188
String userMembership = getMemberValueOfChildObject (ldapChild , membershipType , memberChildAttrName );
210
-
211
- memberships .remove (userMembership );
212
-
213
- // Some membership placeholder needs to be always here as "member" is mandatory attribute on some LDAP servers. But not on active directory! (Placeholder, which not matches any real object is not allowed here)
214
- if (memberships .size () == 0 && membershipType == MembershipType .DN && !ldapProvider .getLdapIdentityStore ().getConfig ().isActiveDirectory ()) {
215
- memberships .add (LDAPConstants .EMPTY_MEMBER_ATTRIBUTE_VALUE );
216
- }
217
-
218
- ldapParent .setAttribute (memberAttrName , memberships );
219
- ldapProvider .getLdapIdentityStore ().update (ldapParent );
189
+ ldapProvider .getLdapIdentityStore ().removeMemberFromGroup (ldapParent .getDn ().toString (), memberAttrName , userMembership );
220
190
}
221
191
222
192
/**
223
193
* Return all existing memberships (values of attribute 'member' ) from the given ldapRole or ldapGroup
224
194
*
195
+ * @param ldapProvider The ldap provider
225
196
* @param memberAttrName usually 'member'
226
197
* @param ldapRole
227
198
* @return
228
199
*/
229
- public static Set <String > getExistingMemberships (String memberAttrName , LDAPObject ldapRole ) {
200
+ public static Set <String > getExistingMemberships (LDAPStorageProvider ldapProvider , String memberAttrName , LDAPObject ldapRole ) {
201
+ LDAPUtils .fillRangedAttribute (ldapProvider , ldapRole , memberAttrName );
230
202
Set <String > memberships = ldapRole .getAttributeAsSet (memberAttrName );
231
203
if (memberships == null ) {
232
204
memberships = new HashSet <>();
@@ -298,4 +270,27 @@ public static void validateCustomLdapFilter(String customFilter) throws Componen
298
270
}
299
271
}
300
272
}
273
+
274
+ private static LDAPQuery createLdapQueryForRangeAttribute (LDAPStorageProvider ldapProvider , LDAPObject ldapObject , String name ) {
275
+ LDAPQuery q = new LDAPQuery (ldapProvider );
276
+ q .setSearchDn (ldapObject .getDn ().toString ());
277
+ q .setSearchScope (SearchControls .OBJECT_SCOPE );
278
+ q .addReturningLdapAttribute (name + ";range=" + (ldapObject .getCurrentRange (name ) + 1 ) + "-*" );
279
+ return q ;
280
+ }
281
+
282
+ /**
283
+ * Performs iterative searches over an LDAPObject to return an attribute that is ranged.
284
+ * @param ldapProvider The provider to use
285
+ * @param ldapObject The current object with the ranged attribute not complete
286
+ * @param name The attribute name
287
+ */
288
+ public static void fillRangedAttribute (LDAPStorageProvider ldapProvider , LDAPObject ldapObject , String name ) {
289
+ LDAPObject newObject = ldapObject ;
290
+ while (!newObject .isRangeComplete (name )) {
291
+ LDAPQuery q = createLdapQueryForRangeAttribute (ldapProvider , ldapObject , name );
292
+ newObject = q .getFirstResult ();
293
+ ldapObject .populateRangedAttribute (newObject , name );
294
+ }
295
+ }
301
296
}
0 commit comments