Skip to content

Commit cd835be

Browse files
committed
Update getApplicationSharedOrganizations service to include sharingInitiationMode for future-impacting policy-holder organizations
1 parent 9057587 commit cd835be

File tree

10 files changed

+280
-12
lines changed

10 files changed

+280
-12
lines changed

components/org.wso2.carbon.identity.organization.management.application/src/main/java/org/wso2/carbon/identity/organization/management/application/OrgApplicationManagerImpl.java

Lines changed: 97 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import org.wso2.carbon.identity.organization.management.application.model.SharedApplicationDO;
7575
import org.wso2.carbon.identity.organization.management.application.model.SharedApplicationOrganizationNode;
7676
import org.wso2.carbon.identity.organization.management.application.model.SharedApplicationOrganizationNodePage;
77+
import org.wso2.carbon.identity.organization.management.application.model.SharingInitiationModeDO;
7778
import org.wso2.carbon.identity.organization.management.application.model.operation.ApplicationShareRolePolicy;
7879
import org.wso2.carbon.identity.organization.management.application.model.operation.ApplicationShareUpdateOperation;
7980
import org.wso2.carbon.identity.organization.management.application.model.operation.GeneralApplicationShareOperation;
@@ -101,6 +102,7 @@
101102
import org.wso2.carbon.identity.role.v2.mgt.core.RoleConstants;
102103
import org.wso2.carbon.identity.role.v2.mgt.core.RoleManagementService;
103104
import org.wso2.carbon.identity.role.v2.mgt.core.exception.IdentityRoleManagementException;
105+
import org.wso2.carbon.identity.role.v2.mgt.core.model.Role;
104106
import org.wso2.carbon.identity.role.v2.mgt.core.model.RoleBasicInfo;
105107
import org.wso2.carbon.idp.mgt.IdentityProviderManagementClientException;
106108
import org.wso2.carbon.idp.mgt.IdentityProviderManagementException;
@@ -1022,8 +1024,7 @@ public SharedApplicationOrganizationNodePage getApplicationSharedOrganizations(S
10221024
mainOrganizationId, mainApplicationId, organizationIds, expressionNodeList, sortOrder, fetchLimit);
10231025

10241026
if (CollectionUtils.isEmpty(sharedApplications)) {
1025-
return new SharedApplicationOrganizationNodePage(
1026-
Collections.emptyList(), 0, 0);
1027+
return new SharedApplicationOrganizationNodePage(Collections.emptyList(), null, 0, 0);
10271028
}
10281029

10291030
// Check if we have more items than requested.
@@ -1073,9 +1074,12 @@ public SharedApplicationOrganizationNodePage getApplicationSharedOrganizations(S
10731074
SharedApplicationDO lastItem = sharedApplications.get(sharedApplications.size() - 1);
10741075
nextToken = lastItem.getAppId();
10751076
}
1077+
String mainOrgHandle = getOrganizationManager().resolveTenantDomain(mainOrganizationId);
1078+
SharingInitiationModeDO sharingInitiationModeDO = resolveSharingInitiationMode(mainOrganizationId,
1079+
mainOrganizationId, mainApplicationId, mainApplicationId, mainOrgHandle);
10761080

10771081
return new SharedApplicationOrganizationNodePage(
1078-
applicationSharedOrganizationsList, nextToken, previousToken);
1082+
applicationSharedOrganizationsList, sharingInitiationModeDO, nextToken, previousToken);
10791083
}
10801084

10811085
private List<String> getExcludedAttributes(String excludedAttributes) {
@@ -1109,8 +1113,9 @@ private SharedApplicationOrganizationNode getApplicationSharedOrganizationNode(
11091113
// Resolve has children with above information
11101114
// 3. Get the role sharing config.
11111115
// 4. Get the depth from root.
1112-
String mainOrgName = getOrganizationManager().resolveTenantDomain(mainOrgId);
1116+
String mainOrgHandle = getOrganizationManager().resolveTenantDomain(mainOrgId);
11131117
String subOrgId = sharedApplicationDO.getOrganizationId();
1118+
String subOrgHandle = getOrganizationManager().resolveTenantDomain(subOrgId);
11141119
String sharedAppResourceId = sharedApplicationDO.getFragmentApplicationId();
11151120
Organization organization = getOrganizationManager().getOrganization(subOrgId, true, false);
11161121
String subOrgName = organization.getName();
@@ -1124,16 +1129,101 @@ private SharedApplicationOrganizationNode getApplicationSharedOrganizationNode(
11241129
String organizationHandle = organization.getOrganizationHandle();
11251130
String parentOrganizationId = organization.getParent().getId();
11261131
int depthFromRoot = getOrganizationManager().getOrganizationDepthInHierarchy(subOrgId);
1132+
SharingInitiationModeDO sharingInitiationModeDO =
1133+
resolveSharingInitiationMode(mainOrgId, subOrgId, mainApplicationId, sharedAppResourceId, subOrgHandle);
1134+
11271135
if (!excludedAttributesList.contains(SP_SHARED_ROLE_EXCLUDED_KEY)) {
1128-
List<RoleWithAudienceDO> sharedAppRoles = getSharedAppRoles(mainOrgName, mainApplicationId, subOrgId,
1136+
List<RoleWithAudienceDO> sharedAppRoles = getSharedAppRoles(mainOrgHandle, mainApplicationId, subOrgId,
11291137
sharedApplicationDO.getFragmentApplicationId());
11301138
return new SharedApplicationOrganizationNode(sharedAppResourceId, subOrgId, subOrgName, organizationStatus,
1131-
parentOrganizationId, organizationHandle, sharedAppRoles, hasChildren, depthFromRoot);
1139+
parentOrganizationId, organizationHandle, sharedAppRoles, hasChildren, depthFromRoot,
1140+
sharingInitiationModeDO);
11321141
}
11331142
// If roles are excluded, we do not need to fetch roles and returning null so it will differentiate
11341143
// not having any roles and not need to fetch roles.
11351144
return new SharedApplicationOrganizationNode(sharedAppResourceId, subOrgId, subOrgName, organizationStatus,
1136-
parentOrganizationId, organizationHandle, null, hasChildren, depthFromRoot);
1145+
parentOrganizationId, organizationHandle, null, hasChildren, depthFromRoot,
1146+
sharingInitiationModeDO);
1147+
}
1148+
1149+
private SharingInitiationModeDO resolveSharingInitiationMode(String initiatingOrgId, String orgId,
1150+
String mainAppId, String appId, String orgHandle)
1151+
throws OrganizationManagementException {
1152+
1153+
try {
1154+
Map<ResourceSharingPolicy, List<SharedResourceAttribute>> result = getResourceSharingPolicyHandlerService()
1155+
.getResourceSharingPolicyByInitiatingOrgId(initiatingOrgId, B2B_APPLICATION, mainAppId);
1156+
1157+
if (result != null && !result.isEmpty()) {
1158+
Map.Entry<ResourceSharingPolicy, List<SharedResourceAttribute>> entry
1159+
= result.entrySet().iterator().next();
1160+
ResourceSharingPolicy resourceSharingPolicy = entry.getKey();
1161+
List<SharedResourceAttribute> resourceAttributes = entry.getValue();
1162+
1163+
ServiceProvider application = getApplicationManagementService()
1164+
.getApplicationByResourceId(appId, orgHandle);
1165+
boolean isPolicyHolderOrg = Objects.equals(resourceSharingPolicy.getPolicyHoldingOrgId(), orgId);
1166+
1167+
if ((resourceSharingPolicy.getSharingPolicy()
1168+
== PolicyEnum.SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN
1169+
&& isPolicyHolderOrg) ||
1170+
(resourceSharingPolicy.getSharingPolicy() == PolicyEnum.ALL_EXISTING_AND_FUTURE_ORGS
1171+
|| OrgApplicationManagerUtil.isShareWithAllChildren(application.getSpProperties()))) {
1172+
1173+
//Get Role MODE.
1174+
ApplicationShareRolePolicy.Mode mode =
1175+
OrgApplicationManagerUtil.getAppAssociatedRoleSharingMode(application);
1176+
1177+
ApplicationShareRolePolicy applicationShareRolePolicy;
1178+
if (ApplicationShareRolePolicy.Mode.SELECTED.ordinal() == mode.ordinal()) {
1179+
List<RoleWithAudienceDO> roleWithAudienceDOList = null;
1180+
1181+
//Get the list of Roles.
1182+
if (resourceAttributes != null && resourceAttributes.get(0) != null) {
1183+
roleWithAudienceDOList = new ArrayList<>();
1184+
String roleAudience = getApplicationManagementService()
1185+
.getAllowedAudienceForRoleAssociation(appId, orgHandle);
1186+
RoleWithAudienceDO.AudienceType audienceType =
1187+
StringUtils.equalsIgnoreCase(RoleConstants.APPLICATION, roleAudience)
1188+
? RoleWithAudienceDO.AudienceType.APPLICATION
1189+
: RoleWithAudienceDO.AudienceType.ORGANIZATION;
1190+
1191+
for (SharedResourceAttribute attribute : resourceAttributes) {
1192+
if (attribute.getSharedAttributeType() == SharedAttributeType.ROLE) {
1193+
try {
1194+
Role role = getRoleManagementServiceV2()
1195+
.getRole(attribute.getSharedAttributeId());
1196+
if (role != null) {
1197+
roleWithAudienceDOList.add(new RoleWithAudienceDO(
1198+
role.getName(), role.getAudienceName(), audienceType));
1199+
}
1200+
} catch (Exception e) {
1201+
if (LOG.isDebugEnabled()) {
1202+
LOG.debug("Empty or blank attribute found in excluded attributes.");
1203+
}
1204+
}
1205+
}
1206+
}
1207+
}
1208+
applicationShareRolePolicy = new ApplicationShareRolePolicy.Builder()
1209+
.mode(mode)
1210+
.roleWithAudienceDOList(roleWithAudienceDOList)
1211+
.build();
1212+
} else {
1213+
applicationShareRolePolicy = new ApplicationShareRolePolicy.Builder()
1214+
.mode(mode)
1215+
.build();
1216+
}
1217+
return new SharingInitiationModeDO(resourceSharingPolicy.getSharingPolicy(),
1218+
applicationShareRolePolicy);
1219+
}
1220+
}
1221+
} catch (ResourceSharingPolicyMgtException e) {
1222+
throw new OrganizationManagementException(e.getMessage(), e.getDescription(), e.getErrorCode());
1223+
} catch (IdentityApplicationManagementException e) {
1224+
throw new OrganizationManagementException(e.getMessage(), e.getDescription(), e.getErrorCode());
1225+
}
1226+
return null;
11371227
}
11381228

11391229
private List<RoleWithAudienceDO> getSharedAppRoles(String mainOrgName, String mainApplicationId, String subOrgId,

components/org.wso2.carbon.identity.organization.management.application/src/main/java/org/wso2/carbon/identity/organization/management/application/model/SharedApplicationOrganizationNode.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ public class SharedApplicationOrganizationNode {
3333
private final List<RoleWithAudienceDO> roleWithAudienceDOList;
3434
private final boolean hasChildren;
3535
private final int depthFromRoot;
36-
36+
private final SharingInitiationModeDO sharingInitiationModeDO;
3737

3838
public SharedApplicationOrganizationNode(String applicationResourceId, String organizationId,
3939
String organizationName, String organizationStatus,
4040
String parentOrganizationId, String organizationHandle,
4141
List<RoleWithAudienceDO> roleWithAudienceDOList, boolean hasChildren,
42-
int depthFromRoot) {
42+
int depthFromRoot, SharingInitiationModeDO sharingInitiationModeDO) {
4343

4444
this.applicationResourceId = applicationResourceId;
4545
this.organizationId = organizationId;
@@ -50,6 +50,7 @@ public SharedApplicationOrganizationNode(String applicationResourceId, String or
5050
this.roleWithAudienceDOList = roleWithAudienceDOList;
5151
this.hasChildren = hasChildren;
5252
this.depthFromRoot = depthFromRoot;
53+
this.sharingInitiationModeDO = sharingInitiationModeDO;
5354
}
5455

5556
public String getApplicationResourceId() {
@@ -96,4 +97,9 @@ public int getDepthFromRoot() {
9697

9798
return depthFromRoot;
9899
}
100+
101+
public SharingInitiationModeDO getSharingInitiationModeDO() {
102+
103+
return sharingInitiationModeDO;
104+
}
99105
}

components/org.wso2.carbon.identity.organization.management.application/src/main/java/org/wso2/carbon/identity/organization/management/application/model/SharedApplicationOrganizationNodePage.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,17 @@
2525
public class SharedApplicationOrganizationNodePage {
2626

2727
private final List<SharedApplicationOrganizationNode> sharedApplicationOrganizationNodes;
28+
private final SharingInitiationModeDO sharingInitiationModeDO;
2829
private final int nextPageCursor;
2930
private final int previousPageCursor;
3031

3132
public SharedApplicationOrganizationNodePage(List<SharedApplicationOrganizationNode>
32-
sharedApplicationOrganizationNodes, int nextPageCursor,
33-
int previousPageCursor) {
33+
sharedApplicationOrganizationNodes,
34+
SharingInitiationModeDO sharingInitiationModeDO,
35+
int nextPageCursor, int previousPageCursor) {
3436

3537
this.sharedApplicationOrganizationNodes = sharedApplicationOrganizationNodes;
38+
this.sharingInitiationModeDO = sharingInitiationModeDO;
3639
this.nextPageCursor = nextPageCursor;
3740
this.previousPageCursor = previousPageCursor;
3841
}
@@ -51,4 +54,9 @@ public int getPreviousPageCursor() {
5154

5255
return previousPageCursor;
5356
}
57+
58+
public SharingInitiationModeDO getSharingInitiationModeDO() {
59+
60+
return sharingInitiationModeDO;
61+
}
5462
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright (c) 2025, WSO2 LLC. (http://www.wso2.com).
3+
*
4+
* WSO2 LLC. licenses this file to you under the Apache License,
5+
* Version 2.0 (the "License"); you may not use this file except
6+
* in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing,
12+
* software distributed under the License is distributed on an
13+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
* KIND, either express or implied. See the License for the
15+
* specific language governing permissions and limitations
16+
* under the License.
17+
*/
18+
19+
package org.wso2.carbon.identity.organization.management.application.model;
20+
21+
import org.wso2.carbon.identity.organization.management.application.model.operation.ApplicationShareRolePolicy;
22+
import org.wso2.carbon.identity.organization.resource.sharing.policy.management.constant.PolicyEnum;
23+
24+
public class SharingInitiationModeDO {
25+
26+
private final PolicyEnum policy;
27+
private final ApplicationShareRolePolicy applicationShareRolePolicy;
28+
29+
public SharingInitiationModeDO(PolicyEnum policy, ApplicationShareRolePolicy applicationShareRolePolicy) {
30+
31+
this.policy = policy;
32+
this.applicationShareRolePolicy = applicationShareRolePolicy;
33+
}
34+
35+
public PolicyEnum getPolicy() {
36+
37+
return policy;
38+
}
39+
40+
public ApplicationShareRolePolicy getApplicationShareRolePolicy() {
41+
42+
return applicationShareRolePolicy;
43+
}
44+
}

components/org.wso2.carbon.identity.organization.management.application/src/main/java/org/wso2/carbon/identity/organization/management/application/util/OrgApplicationManagerUtil.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,21 @@ public static void setShareWithAllChildrenProperty(ServiceProvider serviceProvid
9494
}
9595
}
9696

97+
/**
98+
* Checks whether the application is configured to be shared with all child organizations.
99+
*
100+
* @param properties The array of service provider properties.
101+
* @return true if SHARE_WITH_ALL_CHILDREN property is set to true, false otherwise.
102+
*/
103+
public static boolean isShareWithAllChildren(ServiceProviderProperty[] properties) {
104+
105+
if (properties == null) {
106+
return false;
107+
}
108+
return Arrays.stream(properties).anyMatch(property -> SHARE_WITH_ALL_CHILDREN
109+
.equalsIgnoreCase(property.getName()) && Boolean.parseBoolean(property.getValue()));
110+
}
111+
97112
/**
98113
* Set property value to service provider indicating the role sharing mode of the application. We only set the
99114
* property if the role sharing mode is ALL.

components/org.wso2.carbon.identity.organization.resource.sharing.policy.management/src/main/java/org/wso2/carbon/identity/organization/resource/sharing/policy/management/ResourceSharingPolicyHandlerService.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,4 +312,26 @@ default void deleteResourceSharingPoliciesAndAttributesByOrganizationId(String o
312312
"deleteResourceSharingPoliciesAndAttributesByOrganizationId method is not implemented in " +
313313
this.getClass());
314314
}
315+
316+
/**
317+
* Retrieves a map of resource sharing policies and their associated shared resource attributes
318+
* for a given initiating organization ID, resource type, and resource ID.
319+
*
320+
* @param initiatingOrganizationId The ID of the organization initiating the resource sharing. Must be a valid ID.
321+
* @param resourceType The type of the resource being shared. Must not be {@code null}.
322+
* @param resourceId The unique identifier of the resource being shared. Must not be {@code null}.
323+
* @return A map where:
324+
* - The key is the {@link ResourceSharingPolicy} applicable to the initiating organization for the given resource.
325+
* - The value is a list of {@link SharedResourceAttribute} associated with the policy.
326+
* If no matching policies or attributes are found, an empty map will be returned.
327+
* @throws ResourceSharingPolicyMgtException If an error occurs while retrieving the resource sharing
328+
* policies or shared attributes.
329+
*/
330+
default Map<ResourceSharingPolicy, List<SharedResourceAttribute>>
331+
getResourceSharingPolicyByInitiatingOrgId(String initiatingOrganizationId, String resourceType, String resourceId)
332+
throws ResourceSharingPolicyMgtException {
333+
334+
throw new NotImplementedException(
335+
"getResourceSharingPolicyByInitiatingOrgId method is not implemented in " + this.getClass());
336+
}
315337
}

components/org.wso2.carbon.identity.organization.resource.sharing.policy.management/src/main/java/org/wso2/carbon/identity/organization/resource/sharing/policy/management/ResourceSharingPolicyHandlerServiceImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,15 @@ public void deleteResourceSharingPoliciesAndAttributesByOrganizationId(String or
268268
RESOURCE_SHARING_POLICY_HANDLER_DAO.deleteResourceSharingPoliciesAndAttributesByOrganizationId(organizationId);
269269
}
270270

271+
@Override
272+
public Map<ResourceSharingPolicy, List<SharedResourceAttribute>> getResourceSharingPolicyByInitiatingOrgId(
273+
String initiatingOrganizationId, String resourceType, String resourceId)
274+
throws ResourceSharingPolicyMgtException {
275+
276+
return RESOURCE_SHARING_POLICY_HANDLER_DAO.getResourceSharingPolicyByInitiatingOrgId(
277+
initiatingOrganizationId, resourceType, resourceId);
278+
}
279+
271280
private boolean isValidAttributeForTheResource(ResourceSharingPolicy resourceSharingPolicy,
272281
SharedResourceAttribute sharedResourceAttribute) {
273282

0 commit comments

Comments
 (0)