Skip to content

Commit

Permalink
Improve role permission extraction when roles are shared and not shared
Browse files Browse the repository at this point in the history
  • Loading branch information
ShanChathusanda93 committed Nov 19, 2024
1 parent cf8fad3 commit 18c4acd
Showing 1 changed file with 9 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -182,9 +182,7 @@
import static org.wso2.carbon.identity.role.v2.mgt.core.dao.SQLQueries.GET_ROLE_SCOPE_SQL;
import static org.wso2.carbon.identity.role.v2.mgt.core.dao.SQLQueries.GET_ROLE_TENANT_DOMAIN_BY_ID;
import static org.wso2.carbon.identity.role.v2.mgt.core.dao.SQLQueries.GET_ROLE_UM_ID_BY_UUID;
import static org.wso2.carbon.identity.role.v2.mgt.core.dao.SQLQueries.GET_SCOPE_BY_ROLES_SQL;
import static org.wso2.carbon.identity.role.v2.mgt.core.dao.SQLQueries.GET_SHARED_HYBRID_ROLE_WITH_MAIN_ROLE_SQL;
import static org.wso2.carbon.identity.role.v2.mgt.core.dao.SQLQueries.GET_SHARED_ROLES_MAIN_ROLE_IDS_SQL;
import static org.wso2.carbon.identity.role.v2.mgt.core.dao.SQLQueries.GET_SHARED_ROLES_SQL;
import static org.wso2.carbon.identity.role.v2.mgt.core.dao.SQLQueries.GET_SHARED_ROLE_MAIN_ROLE_ID_SQL;
import static org.wso2.carbon.identity.role.v2.mgt.core.dao.SQLQueries.INSERT_MAIN_TO_SHARED_ROLE_RELATIONSHIP;
Expand Down Expand Up @@ -531,35 +529,17 @@ public List<Permission> getPermissionListOfRole(String roleId, String tenantDoma
public List<String> getPermissionListOfRoles(List<String> roleIds, String tenantDomain)
throws IdentityRoleManagementException {

if (isOrganization(tenantDomain)) {
return getPermissionsOfSharedRoles(roleIds, tenantDomain);
} else {
return getPermissionListOfRolesByIds(roleIds, tenantDomain);
}
}

private List<String> getPermissionListOfRolesByIds(List<String> roleIds, String tenantDomain)
throws IdentityRoleManagementException {

List<String> permissions = new ArrayList<>();
String query = GET_SCOPE_BY_ROLES_SQL + String.join(", ",
Collections.nCopies(roleIds.size(), "?")) + ")";
try (Connection connection = IdentityDatabaseUtil.getDBConnection(false);
NamedPreparedStatement statement = new NamedPreparedStatement(connection, query)) {

for (int i = 0; i < roleIds.size(); i++) {
statement.setString(i + 1, roleIds.get(i));
}
try (ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
permissions.add(resultSet.getString(1));
}
List<Permission> permissionList = new ArrayList<>();
for (String roleId : roleIds) {
if (isOrganization(tenantDomain) && isSharedRole(roleId, tenantDomain)) {
permissionList.addAll(getPermissionsOfSharedRole(roleId, tenantDomain));
} else {
permissionList.addAll(getPermissions(roleId, tenantDomain));
}
} catch (SQLException e) {
String errorMessage =
"Error while retrieving permissions for role ids: " + StringUtils.join(roleIds, ", ")
+ " and tenantDomain : " + tenantDomain;
throw new IdentityRoleManagementServerException(UNEXPECTED_SERVER_ERROR.getCode(), errorMessage, e);
}
for (Permission permission : permissionList) {
permissions.add(permission.getName());
}
return permissions;
}
Expand Down Expand Up @@ -1655,50 +1635,6 @@ private boolean isValidSubOrgPermission(String permission) {
(!permission.startsWith(INTERNAL_SCOPE_PREFIX) && !permission.startsWith(CONSOLE_SCOPE_PREFIX));
}

/**
* Get permission of shared roles.
*
* @param roleIds Role IDs.
* @param tenantDomain Tenant domain.
* @throws IdentityRoleManagementException IdentityRoleManagementException.
*/
private List<String> getPermissionsOfSharedRoles(List<String> roleIds, String tenantDomain)
throws IdentityRoleManagementException {

int tenantId = IdentityTenantUtil.getTenantId(tenantDomain);
List<String> mainRoleIds = new ArrayList<>();
int mainTenantId = -1;
String query = GET_SHARED_ROLES_MAIN_ROLE_IDS_SQL + String.join(", ",
Collections.nCopies(roleIds.size(), "?")) + ")";
try (Connection connection = IdentityDatabaseUtil.getUserDBConnection(false);
NamedPreparedStatement statement = new NamedPreparedStatement(connection, query)) {

statement.setInt(RoleConstants.RoleTableColumns.UM_TENANT_ID, tenantId);
for (int i = 0; i < roleIds.size(); i++) {
statement.setString(i + 2, roleIds.get(i));
}
try (ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
mainRoleIds.add(resultSet.getString(RoleConstants.RoleTableColumns.UM_UUID));
if (mainTenantId == -1) {
mainTenantId = resultSet.getInt(RoleConstants.RoleTableColumns.UM_TENANT_ID);
}
}
}
if (!mainRoleIds.isEmpty() && mainTenantId != -1) {
String mainTenantDomain = IdentityTenantUtil.getTenantDomain(mainTenantId);
if (StringUtils.isNotEmpty(mainTenantDomain)) {
return getPermissionListOfRolesByIds(mainRoleIds, mainTenantDomain);
}
}
} catch (SQLException | IdentityRoleManagementException e) {
String errorMessage = "Error while retrieving permissions for role ids : "
+ StringUtils.join(roleIds, ",") + "in the tenantDomain: " + tenantDomain;
throw new IdentityRoleManagementServerException(errorMessage, e);
}
return null;
}

/**
* Delete application role association.
*
Expand Down

0 comments on commit 18c4acd

Please sign in to comment.