Skip to content

Commit a63f306

Browse files
committed
[AZURE-15] Getting all user groups
1 parent 1c4acd9 commit a63f306

File tree

3 files changed

+58
-27
lines changed

3 files changed

+58
-27
lines changed

src/main/java/net/tirasa/connid/bundles/azure/AzureConnector.java

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.microsoft.graph.models.AssignedLicense;
2020
import com.microsoft.graph.models.AssignedPlan;
2121
import com.microsoft.graph.models.DirectoryObject;
22+
import com.microsoft.graph.models.DirectoryObjectCollectionResponse;
2223
import com.microsoft.graph.models.Group;
2324
import com.microsoft.graph.models.GroupCollectionResponse;
2425
import com.microsoft.graph.models.ProvisionedPlan;
@@ -609,8 +610,21 @@ public void delete(final ObjectClass objectClass, final Uid uid, final Operation
609610

610611
if (ObjectClass.ACCOUNT.equals(objectClass)) {
611612
try {
612-
for (Group group : client.getAuthenticated().getAllGroupsForUser(uid.getUidValue())) {
613-
client.getAuthenticated().deleteUserFromGroup(uid.getUidValue(), group.getId());
613+
DirectoryObjectCollectionResponse groups =
614+
client.getAuthenticated().getAllGroupsForUser(uid.getUidValue());
615+
616+
while (groups != null) {
617+
groups.getValue().stream().filter(Group.class::isInstance).map(Group.class::cast).
618+
forEach(group -> client.getAuthenticated().
619+
deleteUserFromGroup(uid.getUidValue(), group.getId()));
620+
621+
// Get the next page
622+
String odataNextLink = groups.getOdataNextLink();
623+
if (odataNextLink == null || odataNextLink.isEmpty()) {
624+
break;
625+
} else {
626+
groups = client.getAuthenticated().getAllGroupsForUser(uid.getUidValue(), odataNextLink);
627+
}
614628
}
615629
} catch (Exception e) {
616630
LOG.error("Could not delete User {0} from Groups", uid.getUidValue());
@@ -695,10 +709,21 @@ public Uid update(
695709
// memberships
696710
Set<String> ownGroups = new HashSet<>();
697711
try {
698-
List<Group> ownGroupsResults =
699-
client.getAuthenticated().getAllGroupsForUser(returnUid.getUidValue());
700-
for (Group group : ownGroupsResults) {
701-
ownGroups.add(group.getId());
712+
DirectoryObjectCollectionResponse groups =
713+
client.getAuthenticated().getAllGroupsForUser(uid.getUidValue());
714+
715+
while (groups != null) {
716+
groups.getValue().stream().filter(Group.class::isInstance).map(Group.class::cast).
717+
forEach(group -> client.getAuthenticated().
718+
deleteUserFromGroup(uid.getUidValue(), group.getId()));
719+
720+
// Get the next page
721+
String odataNextLink = groups.getOdataNextLink();
722+
if (odataNextLink == null || odataNextLink.isEmpty()) {
723+
break;
724+
} else {
725+
groups = client.getAuthenticated().getAllGroupsForUser(uid.getUidValue(), odataNextLink);
726+
}
702727
}
703728
} catch (Exception ex) {
704729
LOG.error(ex, "Could not list groups for User {0}", uid.getUidValue());
@@ -1027,10 +1052,20 @@ private ConnectorObject fromUser(final User user, final Set<String> attributesTo
10271052
}
10281053

10291054
if (attributesToGet.contains(PredefinedAttributes.GROUPS_NAME)) {
1055+
DirectoryObjectCollectionResponse groups = client.getAuthenticated().getAllGroupsForUser(user.getId());
1056+
10301057
List<String> groupNames = new ArrayList<>();
1031-
List<Group> groups = client.getAuthenticated().getAllGroupsForUser(user.getId());
1032-
for (Group group : groups) {
1033-
groupNames.add(group.getMailNickname());
1058+
while (groups != null) {
1059+
groups.getValue().stream().filter(Group.class::isInstance).map(Group.class::cast).
1060+
forEach(group -> groupNames.add(group.getMailNickname()));
1061+
1062+
// Get the next page
1063+
String odataNextLink = groups.getOdataNextLink();
1064+
if (odataNextLink == null || odataNextLink.isEmpty()) {
1065+
break;
1066+
} else {
1067+
groups = client.getAuthenticated().getAllGroupsForUser(user.getId(), odataNextLink);
1068+
}
10341069
}
10351070
builder.addAttribute(AttributeBuilder.build(PredefinedAttributes.GROUPS_NAME, groupNames));
10361071
}

src/main/java/net/tirasa/connid/bundles/azure/service/AzureClient.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -212,24 +212,16 @@ public GroupCollectionResponse getAllGroupsNextPage(final String odataNextLink)
212212
return getGraphServiceClient().groups().withUrl(odataNextLink).get();
213213
}
214214

215-
/**
216-
*
217-
* @param userId
218-
* @return List of Groups for specified User
219-
*/
220-
public List<Group> getAllGroupsForUser(final String userId) {
215+
public DirectoryObjectCollectionResponse getAllGroupsForUser(final String userId) {
221216
LOG.ok("Get all groups user {0} is member", userId);
222217

223-
DirectoryObjectCollectionResponse result = getGraphServiceClient().users().byUserId(userId).memberOf().get();
218+
return getGraphServiceClient().users().byUserId(userId).memberOf().get();
219+
}
224220

225-
List<Group> groups = new ArrayList<>();
226-
if (result != null) {
227-
result.getValue().stream().
228-
filter(Group.class::isInstance).
229-
map(Group.class::cast).
230-
forEach(groups::add);
231-
}
232-
return groups;
221+
public DirectoryObjectCollectionResponse getAllGroupsForUser(final String userId, final String odataNextLink) {
222+
LOG.ok("Get all groups user {0} is member next page {1}", userId, odataNextLink);
223+
224+
return getGraphServiceClient().users().byUserId("userId").memberOf().withUrl(odataNextLink).get();
233225
}
234226

235227
/**

src/test/java/net/tirasa/connid/bundles/azure/AzureConnectorTests.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.Properties;
4242
import java.util.Set;
4343
import java.util.UUID;
44+
import java.util.stream.Collectors;
4445
import net.tirasa.connid.bundles.azure.service.AzureClient;
4546
import net.tirasa.connid.bundles.azure.utils.AzureAttributes;
4647
import net.tirasa.connid.bundles.azure.utils.AzureFilter;
@@ -332,7 +333,8 @@ public void crud() {
332333
// can't test password update here, Azure API always return '"passwordProfile": null'
333334

334335
// GET USER GROUPS
335-
List<Group> groupsForUser = client.getAuthenticated().getAllGroupsForUser(testUserUid);
336+
List<Group> groupsForUser = client.getAuthenticated().getAllGroupsForUser(testUserUid).getValue().stream().
337+
filter(Group.class::isInstance).map(Group.class::cast).collect(Collectors.toList());
336338

337339
assertNotNull(groupsForUser);
338340
assertEquals(1, groupsForUser.size());
@@ -360,7 +362,8 @@ public void crud() {
360362

361363
LOG.info("Updated Group with old name {0} and new name {1}", group.getDisplayName(), groupName);
362364

363-
List<Group> userGroups = client.getAuthenticated().getAllGroupsForUser(testUserUid);
365+
List<Group> userGroups = client.getAuthenticated().getAllGroupsForUser(testUserUid).getValue().stream().
366+
filter(Group.class::isInstance).map(Group.class::cast).collect(Collectors.toList());
364367
assertNotNull(userGroups);
365368
assertFalse(userGroups.isEmpty());
366369

@@ -683,7 +686,8 @@ public void serviceTest() {
683686
LOG.info("Members of Group : {0}", groupMembers);
684687

685688
// GET USER GROUPS
686-
List<Group> userGroups = client.getAuthenticated().getAllGroupsForUser(testUser);
689+
List<Group> userGroups = client.getAuthenticated().getAllGroupsForUser(testUser).getValue().stream().
690+
filter(Group.class::isInstance).map(Group.class::cast).collect(Collectors.toList());
687691
assertNotNull(userGroups);
688692
assertFalse(userGroups.isEmpty());
689693
LOG.info("User groups list : {0}", userGroups);

0 commit comments

Comments
 (0)