Skip to content

Commit f785041

Browse files
committed
Add review suggestions and bump organization management core version
1 parent 6d77d67 commit f785041

File tree

5 files changed

+124
-113
lines changed

5 files changed

+124
-113
lines changed

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,12 @@
204204
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ErrorMessages.ERROR_CODE_INVALID_DELETE_SHARE_REQUEST;
205205
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ErrorMessages.ERROR_CODE_INVALID_FILTER_FORMAT;
206206
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ErrorMessages.ERROR_CODE_INVALID_ORGANIZATION;
207+
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ErrorMessages.ERROR_CODE_INVALID_SHARE_OPERATION_TYPE;
207208
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ErrorMessages.ERROR_CODE_UNAUTHORIZED_APPLICATION_SHARE;
208209
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ErrorMessages.ERROR_CODE_UNAUTHORIZED_FRAGMENT_APP_ACCESS;
209210
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ErrorMessages.ERROR_CODE_UNSUPPORTED_COMPLEX_QUERY_IN_FILTER;
210211
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ErrorMessages.ERROR_CODE_UNSUPPORTED_FILTER_ATTRIBUTE;
212+
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ErrorMessages.ERROR_CODE_UNSUPPORTED_SHARE_OPERATION_PATH;
211213
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.IS_APP_SHARED;
212214
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ORGANIZATION_ATTRIBUTES_FIELD;
213215
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.ORGANIZATION_ATTRIBUTES_FIELD_PREFIX;
@@ -548,14 +550,12 @@ public void updateSharedApplication(String mainOrganizationId, String mainApplic
548550
ApplicationShareUpdateOperation.Operation operation = updateOperation.getOperation();
549551
if (!(ApplicationShareUpdateOperation.Operation.ADD.ordinal() == operation.ordinal() ||
550552
ApplicationShareUpdateOperation.Operation.REMOVE.ordinal() == operation.ordinal())) {
551-
LOG.warn("Invalid operation type: " + operation);
552-
continue;
553+
throw handleClientException(ERROR_CODE_INVALID_SHARE_OPERATION_TYPE, operation.name());
553554
}
554555
OrgApplicationScimFilterParser.ParsedFilterResult parsedFilterResult = parseFilter(
555556
updateOperation.getPath());
556557
if (!parsedFilterResult.hasPathAttribute()) {
557-
LOG.warn("Unsupported path attribute: " + updateOperation.getPath());
558-
continue;
558+
throw handleClientException(ERROR_CODE_UNSUPPORTED_SHARE_OPERATION_PATH, updateOperation.getPath());
559559
}
560560
String orgId = parsedFilterResult.getOrganizationId();
561561
List<RoleWithAudienceDO> roleChanges = (List<RoleWithAudienceDO>) updateOperation.getValues();
@@ -1596,11 +1596,6 @@ public void shareApplicationWithPolicy(String ownerOrgId, ServiceProvider mainAp
15961596
String operationId) throws OrganizationManagementException {
15971597

15981598
String mainApplicationId = mainApplication.getApplicationResourceId();
1599-
if (StringUtils.equals(ownerOrgId, sharingOrgId)) {
1600-
LOG.error("Application: " + mainApplicationId + " can't be shared with the same organization: "
1601-
+ ownerOrgId);
1602-
return;
1603-
}
16041599
try {
16051600
getListener().preShareApplication(ownerOrgId, mainApplicationId, sharingOrgId, applicationShareRolePolicy);
16061601
// Use tenant of the organization to whom the application getting shared. When the consumer application is

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

Lines changed: 68 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@
6868
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.IS_APP_SHARED;
6969
import static org.wso2.carbon.identity.organization.management.service.constant.OrganizationManagementConstants.SUPER_ORG_ID;
7070
import static org.wso2.carbon.identity.organization.management.service.util.Utils.getAuthenticatedUsername;
71-
import static org.wso2.carbon.identity.organization.management.service.util.Utils.getTenantDomain;
7271

7372
/**
7473
* This class contains the implementation of the handler for post organization creation.
@@ -145,25 +144,11 @@ private void addSharedApplicationsToOrganization(Organization organization)
145144
String mainTenantDomain = getOrganizationManager().resolveTenantDomain(mainOrganizationId);
146145
String mainApplicationId = resourceSharingPolicy.getResourceId();
147146
boolean isMainOrganization = parentOrgId.equals(mainOrganizationId);
148-
String sharedAppId;
149-
150-
// Check whether the shared application is present in the immediate parent organization.
151-
if (isMainOrganization) {
152-
// The original application is available in the parent organization. Not a fragment application.
153-
sharedAppId = mainApplicationId;
154-
} else {
155-
Optional<String> sharedAppIdOptional = resolveSharedApp(mainApplicationId, mainOrganizationId,
156-
parentOrgId);
157-
if (!sharedAppIdOptional.isPresent()) {
158-
LOG.error("No shared application found in the parent organization for organization: " + orgId +
159-
". Skipping sharing of the main application with ID: " + mainApplicationId);
160-
continue;
161-
}
162-
sharedAppId = sharedAppIdOptional.get();
147+
ServiceProvider sharedApplication = resolveSharedApplication(orgId, parentOrgId, parentOrgHandle,
148+
mainOrganizationId, mainApplicationId);
149+
if (sharedApplication == null) {
150+
continue;
163151
}
164-
ServiceProvider sharedApplication = getApplicationManagementService().getApplicationByResourceId(
165-
sharedAppId, parentOrgHandle);
166-
167152
ApplicationShareRolePolicy.Mode roleSharingMode = getAppAssociatedRoleSharingMode(sharedApplication);
168153
ApplicationShareRolePolicy.Builder roleSharingConfigBuilder = new ApplicationShareRolePolicy.Builder()
169154
.mode(roleSharingMode);
@@ -207,7 +192,7 @@ private void addSharedApplicationsToOrganization(Organization organization)
207192
}
208193
getOrgApplicationManager().shareApplicationWithPolicy(mainOrganizationId, mainApplication, orgId,
209194
PolicyEnum.SELECTED_ORG_ONLY, roleSharingConfigBuilder.build(), null);
210-
alreadyHandledSharedAppIds.add(sharedAppId);
195+
alreadyHandledSharedAppIds.add(mainApplicationId);
211196

212197
if (isMainOrganization) {
213198
boolean isAppShared = isAppShared(mainApplication);
@@ -220,51 +205,83 @@ private void addSharedApplicationsToOrganization(Organization organization)
220205

221206
// NOTE: The below code is to handle the backward compatibility of the applications that are shared with
222207
// all children organizations using the `shareWithAllChildren` property.
208+
String primaryOrganizationId = getOrganizationManager().getPrimaryOrganizationId(organization.getId());
209+
if (primaryOrganizationId == null) {
210+
primaryOrganizationId = SUPER_ORG_ID;
211+
}
223212
ApplicationBasicInfo[] applicationBasicInfos;
224213
applicationBasicInfos = getApplicationManagementService().getApplicationBasicInfoBySPProperty(
225-
getOrganizationManager().resolveTenantDomain(parentOrgId), getAuthenticatedUsername(),
214+
getOrganizationManager().resolveTenantDomain(primaryOrganizationId), getAuthenticatedUsername(),
226215
SHARE_WITH_ALL_CHILDREN, "true");
227216

228217
for (ApplicationBasicInfo applicationBasicInfo : applicationBasicInfos) {
229-
if (alreadyHandledSharedAppIds.contains(applicationBasicInfo.getUuid())) {
218+
String mainApplicationId = applicationBasicInfo.getUuid();
219+
if (alreadyHandledSharedAppIds.contains(mainApplicationId)) {
230220
continue;
231221
}
232-
String mainOrganizationId;
233-
String mainApplicationId;
234-
String ownerTenantDomain;
235-
if (getOrgApplicationMgtDAO().isFragmentApplication(applicationBasicInfo.getApplicationId())) {
236-
mainApplicationId = getApplicationManagementService()
237-
.getMainAppId(applicationBasicInfo.getUuid());
238-
ownerTenantDomain = getTenantDomain(getApplicationManagementService()
239-
.getTenantIdByApp(mainApplicationId));
240-
mainOrganizationId = getOrganizationManager().resolveOrganizationId(ownerTenantDomain);
241-
} else {
242-
mainApplicationId = applicationBasicInfo.getUuid();
243-
mainOrganizationId = parentOrgId;
244-
ownerTenantDomain = parentOrgHandle;
245-
}
246-
ServiceProvider mainApplication = getApplicationManagementService().getApplicationByResourceId(
247-
mainApplicationId, ownerTenantDomain);
248-
ApplicationShareRolePolicy.Builder roleSharingConfigBuilder = new ApplicationShareRolePolicy.Builder()
249-
.mode(ApplicationShareRolePolicy.Mode.ALL);
222+
ServiceProvider mainApplication;
223+
mainApplication = getApplicationManagementService()
224+
.getServiceProvider(applicationBasicInfo.getApplicationId());
225+
if (mainApplication != null) {
226+
// Check whether the application is shared with the parent organization.
227+
ServiceProvider sharedApplication = resolveSharedApplication(orgId, parentOrgId, parentOrgHandle,
228+
primaryOrganizationId, mainApplicationId);
229+
if (sharedApplication == null) {
230+
continue;
231+
}
232+
ApplicationShareRolePolicy roleSharingConfigBuilder = new ApplicationShareRolePolicy.Builder()
233+
.mode(ApplicationShareRolePolicy.Mode.ALL).build();
250234

251-
// Share the application to the newly created organization.
252-
getOrgApplicationManager().shareApplicationWithPolicy(mainOrganizationId, mainApplication, orgId,
253-
PolicyEnum.SELECTED_ORG_ONLY, roleSharingConfigBuilder.build(), null);
235+
// Share the application to the newly created organization.
236+
getOrgApplicationManager().shareApplicationWithPolicy(primaryOrganizationId, mainApplication, orgId,
237+
PolicyEnum.SELECTED_ORG_ONLY, roleSharingConfigBuilder, null);
254238

255-
// Add the resource sharing policy for the main application.
256-
getOrgApplicationManager().addOrUpdatePolicy(mainApplication.getApplicationResourceId(),
257-
mainOrganizationId, mainOrganizationId, ownerTenantDomain,
258-
PolicyEnum.ALL_EXISTING_AND_FUTURE_ORGS, roleSharingConfigBuilder.build());
239+
// Add the resource sharing policy for the main application.
240+
String ownerTenantDomain = getOrganizationManager().resolveTenantDomain(primaryOrganizationId);
241+
getOrgApplicationManager().addOrUpdatePolicy(mainApplication.getApplicationResourceId(),
242+
primaryOrganizationId, primaryOrganizationId, ownerTenantDomain,
243+
PolicyEnum.ALL_EXISTING_AND_FUTURE_ORGS, roleSharingConfigBuilder);
259244

260-
boolean isAppShared = isAppShared(mainApplication);
261-
if (!isAppShared) {
262-
// Update the `isAppShared` property of the main application to true.
263-
updateApplicationWithIsAppSharedProperty(true, mainApplication);
245+
// Check whether the application is shared with any child organization using `isAppShared` property.
246+
boolean isAppShared = isAppShared(mainApplication);
247+
if (!isAppShared) {
248+
// Update the `isAppShared` property of the main application to true if it hasn't been shared
249+
// previously.
250+
updateApplicationWithIsAppSharedProperty(true, mainApplication);
251+
}
264252
}
265253
}
266254
}
267255

256+
private ServiceProvider resolveSharedApplication(String orgId, String parentOrgId, String parentOrgHandle,
257+
String mainOrganizationId, String mainApplicationId)
258+
throws IdentityApplicationManagementException, OrganizationManagementException {
259+
260+
String sharedAppId;
261+
boolean isMainOrganization = parentOrgId.equals(mainOrganizationId);
262+
263+
if (isMainOrganization) {
264+
// The original application is available in the parent organization. Not a fragment application.
265+
sharedAppId = mainApplicationId;
266+
} else {
267+
Optional<String> sharedAppIdOptional = resolveSharedApp(mainApplicationId, mainOrganizationId, parentOrgId);
268+
if (!sharedAppIdOptional.isPresent()) {
269+
LOG.error("No shared application found in the parent organization for organization: " + orgId +
270+
". Skipping sharing of the main application with ID: " + mainApplicationId);
271+
return null;
272+
}
273+
sharedAppId = sharedAppIdOptional.get();
274+
}
275+
ServiceProvider sharedApplication = getApplicationManagementService().getApplicationByResourceId(
276+
sharedAppId, parentOrgHandle);
277+
if (sharedApplication == null) {
278+
LOG.error("No shared application found in the parent organization for organization: " + orgId +
279+
". Skipping sharing of the main application with ID: " + mainApplicationId);
280+
return null;
281+
}
282+
return sharedApplication;
283+
}
284+
268285
private boolean isValidApplicationSharePolicy(PolicyEnum policyEnum) {
269286

270287
return PolicyEnum.SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN.equals(policyEnum) ||

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

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -81,24 +81,26 @@ public boolean hasPathAttribute() {
8181
}
8282

8383
// Regex to strictly match the desired filter format:
84-
// organizations[orgId eq "<orgIdValue>"]
84+
// organizations[orgId eq <orgIdValue>]
8585
// or
86-
// organizations[orgId eq "<orgIdValue>"].roles
86+
// organizations[orgId eq <orgIdValue>].roles
87+
//
8788
// Breakdown:
88-
// ^ - Start of the string
89-
// organizations - Literal "organizations"
90-
// \[ - Literal opening square bracket
91-
// orgId - Literal "orgId"
92-
// \s+eq\s+ - "eq" operator surrounded by one or more spaces
93-
// \"([^\"]+)\" - Quoted organization ID. Group 1 captures the ID itself (without quotes).
94-
// [^\"]+ matches one or more characters that are not a double quote.
95-
// \] - Literal closing square bracket
96-
// ( - Start of optional group for the path
97-
// \.roles - Literal ".roles"
98-
// )? - Makes the entire path group optional. Group 2 captures ".roles".
99-
// $ - End of the string
89+
// ^ - Start of the string
90+
// organizations - Literal "organizations"
91+
// \[ - Literal opening square bracket
92+
// orgId - Literal "orgId"
93+
// \s+eq\s+ - "eq" operator surrounded by one or more spaces
94+
// (?: - Start of non-capturing group for quoted or unquoted value
95+
// "([^\"]+)" - Group 1: quoted orgId (excluding quotes)
96+
// | - OR
97+
// ([^\s\]]+) - Group 2: unquoted orgId (up to space or closing bracket)
98+
// )
99+
// \] - Literal closing square bracket
100+
// (\.roles)? - Optional ".roles" segment; Group 3 captures ".roles" if present
101+
// $ - End of the string
100102
private static final Pattern FILTER_PATTERN =
101-
Pattern.compile("^organizations\\[orgId\\s+eq\\s+\"([^\"]+)\"\\](\\.roles)?$");
103+
Pattern.compile("^organizations\\[orgId\\s+eq\\s+(?:\"([^\"]+)\"|([^\\s\\]]+))\\](\\.roles)?$");
102104

103105
/**
104106
* Parses the given SCIM-like filter string to extract the organization ID and

0 commit comments

Comments
 (0)