Skip to content

Commit

Permalink
Improve generating RBAC testing data using ninja
Browse files Browse the repository at this point in the history
1. Part of RBAC Testing Data, which provides testing data
 for role mining and other RBAC-related processes
  • Loading branch information
tchrapovic committed Mar 12, 2024
1 parent f94504f commit 4821e7d
Showing 1 changed file with 57 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import java.io.IOException;
import java.util.*;

import com.evolveum.midpoint.schema.ResultHandler;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand All @@ -25,7 +27,6 @@
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SearchResultList;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException;
Expand Down Expand Up @@ -68,7 +69,7 @@ public void executeImport() {

if (generatorOptions.isTransform()) {
log.info("Make sure that RoleType objects is recomputed");
remakeBusinessRoles(context, result, null, null);
remakeUsersBusinessRoles(context, result, null, null);
}
}

Expand Down Expand Up @@ -545,77 +546,89 @@ private void resolveContractors(int contractorsCount, RepositoryService reposito
* @param options The options for retrieving users.
* @throws RuntimeException If an error occurs during the process.
*/
public static void remakeBusinessRoles(@NotNull NinjaContext context,
public static void remakeUsersBusinessRoles(@NotNull NinjaContext context,
@NotNull OperationResult result,
@Nullable ObjectQuery query,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options) {

RepositoryService repository = context.getRepository();
Log log = context.getLog();
log.info("Replace business role for their inducements on users");
log.info("Replace business role for their inducements on users started");

ResultHandler<UserType> handler = (object, parentResult) -> {
executeChangesOnUser(result, object, repository, log);
return true;
};

SearchResultList<PrismObject<UserType>> users;
try {
users = repository.searchObjects(UserType.class, query, options, result);
repository.searchObjectsIterative(UserType.class, query, handler, options, false, result);
} catch (SchemaException e) {
throw new RuntimeException(e);
}

log.info("Replace business role for their inducements on users 0/{}", users.size() - 1);
for (int i = 0; i < users.size(); i++) {
log.info("Progress: {}/{}", i, users.size() - 1);
PrismObject<UserType> user = users.get(i);

String userOid = user.getOid();
PolyString name = user.getName();
if (name == null) {
continue;
}
log.info("Replace business role for their inducements on users finished");
}

String stringName = name.toString();
/**
* Executes changes on a user object.
* <p>
* This method replaces business roles with their inducements on a user object.
*
* @param result The operation result used for tracking the operation.
* @param object The user object to execute changes on.
* @param repository The repository service used for executing changes.
* @param log The log used for logging the operation.
* @throws RuntimeException If an error occurs during the process.
*/
private static void executeChangesOnUser(@NotNull OperationResult result, @NotNull PrismObject<UserType> object, RepositoryService repository, Log log) {
String userOid = object.getOid();
PolyString name = object.getName();
if (name == null) {
return;
}

if (stringName.equals("administrator")) {
continue;
}
String stringName = name.toString();

UserType userObject = user.asObjectable();
if (stringName.equals("administrator")) {
return;
}

List<PrismObject<RoleType>> rolesOidAssignment;
try {
rolesOidAssignment = getBusinessRolesOidAssignment(userObject, repository, result);
} catch (SchemaException | ObjectNotFoundException e) {
log.error("Error while getting roles oid assignment for user: {}", userOid, e);
throw new RuntimeException(e);
}
UserType userObject = object.asObjectable();

for (PrismObject<RoleType> roleTypePrismObject : rolesOidAssignment) {
RoleType role = roleTypePrismObject.asObjectable();
List<AssignmentType> inducement = role.getInducement();
List<PrismObject<RoleType>> rolesOidAssignment;
try {
rolesOidAssignment = getBusinessRolesOidAssignment(userObject, repository, result);
} catch (SchemaException | ObjectNotFoundException e) {
log.error("Error while getting roles oid assignment for user: {}", userOid, e);
throw new RuntimeException(e);
}

List<ItemDelta<?, ?>> modifications = new ArrayList<>();
try {
for (PrismObject<RoleType> roleTypePrismObject : rolesOidAssignment) {
RoleType role = roleTypePrismObject.asObjectable();
List<AssignmentType> inducement = role.getInducement();

for (AssignmentType assignmentType : inducement) {
modifications.add(PrismContext.get().deltaFor(UserType.class)
.item(UserType.F_ASSIGNMENT).add(createRoleAssignment(assignmentType.getTargetRef().getOid()))
.asItemDelta());
}
List<ItemDelta<?, ?>> modifications = new ArrayList<>();
try {

for (AssignmentType assignmentType : inducement) {
modifications.add(PrismContext.get().deltaFor(UserType.class)
.item(UserType.F_ASSIGNMENT).delete(createRoleAssignment(role.getOid()))
.item(UserType.F_ASSIGNMENT).add(createRoleAssignment(assignmentType.getTargetRef().getOid()))
.asItemDelta());
}

repository.modifyObject(UserType.class, userOid, modifications, result);
modifications.add(PrismContext.get().deltaFor(UserType.class)
.item(UserType.F_ASSIGNMENT).delete(createRoleAssignment(role.getOid()))
.asItemDelta());

} catch (SchemaException | ObjectNotFoundException | ObjectAlreadyExistsException e) {
throw new RuntimeException(e);
}
repository.modifyObject(UserType.class, userOid, modifications, result);

} catch (SchemaException | ObjectNotFoundException | ObjectAlreadyExistsException e) {
throw new RuntimeException(e);
}

}

log.info("Replace business role for their inducements on users finished");
log.info("User {} prepared", name);
}

/**
Expand Down

0 comments on commit 4821e7d

Please sign in to comment.