use of com.evolveum.midpoint.audit.api.AuditEventRecord in project midpoint by Evolveum.
the class TestMiscellaneous method test100RequesterComment.
@Test
public void test100RequesterComment() throws Exception {
login(userAdministrator);
Task task = getTestTask();
OperationResult result = getTestOperationResult();
given();
dummyAuditService.clear();
OperationBusinessContextType businessContext = new OperationBusinessContextType();
final String REQUESTER_COMMENT = "req.comment";
businessContext.setComment(REQUESTER_COMMENT);
ObjectDelta<UserType> userDelta = createAssignmentUserDelta(userJackOid, ROLE_SAILOR.oid, RoleType.COMPLEX_TYPE, null, null, null, true);
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta);
modelService.executeChanges(deltas, executeOptions().requestBusinessContext(businessContext), task, result);
assertNotAssignedRole(userJackOid, ROLE_SAILOR.oid, result);
CaseWorkItemType workItem = getWorkItem(task, result);
display("Work item", workItem);
when();
caseManager.completeWorkItem(WorkItemId.of(workItem), ApprovalUtils.createApproveOutput(prismContext).comment("OK"), null, task, result);
then();
CaseType aCase = getCase(CaseWorkItemUtil.getCaseRequired(workItem).getOid());
display("workflow context", aCase.getApprovalContext());
List<? extends CaseEventType> events = aCase.getEvent();
assertEquals("Wrong # of events", 2, events.size());
CaseCreationEventType event1 = (CaseCreationEventType) events.get(0);
display("Event 1", event1);
assertEquals("Wrong requester comment", REQUESTER_COMMENT, ApprovalContextUtil.getBusinessContext(aCase).getComment());
WorkItemEventType event2 = (WorkItemEventType) events.get(1);
display("Event 2", event2);
assertNotNull("Original assignee is null", event2.getOriginalAssigneeRef());
assertEquals("Wrong original assignee OID", USER_SCOTT.oid, event2.getOriginalAssigneeRef().getOid());
displayDumpable("audit", dummyAuditService);
List<AuditEventRecord> records = dummyAuditService.getRecordsOfType(AuditEventType.WORKFLOW_PROCESS_INSTANCE);
assertEquals("Wrong # of process instance audit records", 2, records.size());
for (int i = 0; i < records.size(); i++) {
AuditEventRecord record = records.get(i);
assertEquals("Wrong requester comment in audit record #" + i, Collections.singleton(REQUESTER_COMMENT), record.getPropertyValues(AuditingConstants.AUDIT_REQUESTER_COMMENT));
}
CaseType parentCase = getCase(aCase.getParentRef().getOid());
waitForCaseClose(parentCase);
AssignmentType assignment = assertAssignedRole(userJackOid, ROLE_SAILOR.oid, result);
display("assignment after creation", assignment);
MetadataType metadata = assignment.getMetadata();
assertNotNull("Null request timestamp in metadata", metadata.getRequestTimestamp());
assertRefEquals("Wrong requestorRef in metadata", ObjectTypeUtil.createObjectRef(userAdministrator, prismContext), metadata.getRequestorRef());
assertEquals("Wrong requestorComment in metadata", REQUESTER_COMMENT, metadata.getRequestorComment());
}
use of com.evolveum.midpoint.audit.api.AuditEventRecord in project midpoint by Evolveum.
the class PendingAuditRecords method addWorkItemClosure.
public void addWorkItemClosure(@NotNull CaseWorkItemType workItem, @Nullable WorkItemEventCauseInformationType cause, @NotNull OperationResult result) {
// workItem contains taskRef, assignee, candidates resolved (if possible)
// We don't pass userRef (initiator) to the audit method. It does need the whole object (not only the reference),
// so it fetches it directly from the security enforcer (logged-in user). This could change in the future.
CaseType aCase = operation.getCurrentCase();
AuditEventRecord record = prepareWorkItemAuditRecordCommon(workItem, AuditEventStage.EXECUTION, result);
setInitiatorAndAttorneyFromPrincipal(record);
if (cause != null) {
if (cause.getType() != null) {
record.addPropertyValue(AuditingConstants.AUDIT_CAUSE_TYPE, cause.getType().value());
}
if (cause.getName() != null) {
record.addPropertyValue(AuditingConstants.AUDIT_CAUSE_NAME, cause.getName());
}
if (cause.getDisplayName() != null) {
record.addPropertyValue(AuditingConstants.AUDIT_CAUSE_DISPLAY_NAME, cause.getDisplayName());
}
}
// message + result
StringBuilder message = new StringBuilder();
String stageInfo = operation.doesUseStages() ? ApprovalContextUtil.getCompleteStageInfo(aCase) : null;
if (stageInfo != null) {
message.append(stageInfo).append(" : ");
}
AbstractWorkItemOutputType output = workItem.getOutput();
if (output != null) {
// FIXME
String answer = ApprovalUtils.makeNiceFromUri(aCase, output);
record.setResult(answer);
message.append(answer);
if (output.getComment() != null) {
message.append(" : ").append(output.getComment());
record.addPropertyValue(AuditingConstants.AUDIT_COMMENT, output.getComment());
}
} else {
// TODO
message.append("(no decision)");
}
record.setMessage(message.toString());
extension.enrichWorkItemDeletedAuditRecord(record, workItem, operation, result);
records.add(record);
}
use of com.evolveum.midpoint.audit.api.AuditEventRecord in project midpoint by Evolveum.
the class TestScriptingBasicNew method test910DeleteShadowsMultinode.
/**
* Deletes shadows while searching for them using noFetch option. (Tests for correct options application by tasks: MID-6717).
*
* Also check correct task OID in audit messages: MID-6713.
*/
@Test
public void test910DeleteShadowsMultinode() throws Exception {
given();
Task task = getTestTask();
OperationResult result = task.getResult();
UserType user = new UserType(prismContext).name("test910").beginAssignment().beginConstruction().resourceRef(RESOURCE_DUMMY_OID, ResourceType.COMPLEX_TYPE).<AssignmentType>end().end();
addObject(user.asPrismObject(), task, result);
String shadowOid = assertUser(user.getOid(), "after creation").display().links().singleLive().getOid();
int before = countDummyAccountShadows(result);
displayValue("account shadows before", before);
assertThat(before).isGreaterThan(0);
dummyAuditService.clear();
when();
addObject(TASK_DELETE_SHADOWS_MULTINODE, task, result);
runTaskTreeAndWaitForFinish(TASK_DELETE_SHADOWS_MULTINODE.oid, 15000);
then();
dumpTaskTree(TASK_DELETE_SHADOWS_MULTINODE.oid, result);
int after = countDummyAccountShadows(result);
displayValue("account shadows after", after);
assertThat(after).isEqualTo(0);
displayDumpable("Audit", dummyAuditService);
List<AuditEventRecord> records = dummyAuditService.getRecords().stream().filter(record -> record.getEventStage() == AuditEventStage.EXECUTION).filter(record -> record.getTargetRef() != null && shadowOid.equals(record.getTargetRef().getOid())).collect(Collectors.toList());
assertThat(records).as("Shadow " + shadowOid + " deletion records").hasSize(1);
AuditEventRecord record = records.get(0);
assertThat(record.getTaskOid()).as("task OID in audit record").isEqualTo(TASK_DELETE_SHADOWS_MULTINODE.oid);
}
use of com.evolveum.midpoint.audit.api.AuditEventRecord in project midpoint by Evolveum.
the class AuditSearchTest method initSystem.
@Override
public void initSystem() throws Exception {
OperationResult result = createOperationResult();
PrismObject<UserType> initiator = createUser("initiator");
initiatorOid = initiator.getOid();
PrismObject<UserType> attorney = createUser("attorney");
attorneyOid = attorney.getOid();
PrismObject<UserType> target = createUser("target");
targetOid = target.getOid();
PrismObject<? extends FocusType> targetOwner = createUser("targetOwner");
targetOwnerOid = targetOwner.getOid();
AuditEventRecord record1 = new AuditEventRecord();
// all tested records have parameter, it is used for assertions where practical
record1.setParameter("1");
record1.addPropertyValue("prop1", "val1");
record1.setTimestamp(TIMESTAMP_1);
record1.setEventType(AuditEventType.ADD_OBJECT);
record1.setMessage("record1");
record1.setOutcome(OperationResultStatus.SUCCESS);
record1.setResult("result1");
record1.setHostIdentifier("localhost");
record1.setNodeIdentifier("node1");
record1.setRemoteHostAddress("192.168.10.1");
record1.setSessionIdentifier("session-1");
record1.setTarget(target);
record1.setTargetOwner(targetOwner);
// values are not even necessary
record1.addDelta(createDelta(UserType.F_FULL_NAME));
record1.addDelta(createDelta(UserType.F_FAMILY_NAME, PolyString.fromOrig("familyNameVal")));
record1.addDelta(createDelta(ItemPath.create(ObjectType.F_METADATA, MetadataType.F_REQUEST_TIMESTAMP), MiscUtil.asXMLGregorianCalendar(System.currentTimeMillis())));
// just want to see two values, that's all
record1.addReferenceValue("ref1", ObjectTypeUtil.createObjectRef(targetOid, ObjectTypes.USER).asReferenceValue());
record1.addReferenceValue("ref2", ObjectTypeUtil.createObjectRef(targetOid, ObjectTypes.USER).asReferenceValue());
record1.addResourceOid("res-oid-1");
record1.addResourceOid("res-oid-2");
record1.addResourceOid("res-oid-3");
record1.getCustomColumnProperty().put("foo", "foo-val");
auditService.audit(record1, NullTaskImpl.INSTANCE, result);
record1EventIdentifier = record1.getEventIdentifier();
AuditEventRecord record2 = new AuditEventRecord();
record2.setParameter("2");
record2.addPropertyValue("prop1", "val2");
record2.setTimestamp(TIMESTAMP_2);
record2.setEventType(AuditEventType.MODIFY_OBJECT);
record2.setEventStage(AuditEventStage.EXECUTION);
record2.setMessage("record2");
record2.setOutcome(OperationResultStatus.UNKNOWN);
record2.setInitiator(initiator);
record2.setHostIdentifier("127.0.0.1");
record2.setRemoteHostAddress("192.168.10.2");
// session-1 on purpose
record2.setSessionIdentifier("session-1");
record2.setAttorney(attorney);
record2.setRequestIdentifier("req-id");
record2.addDelta(createDelta(UserType.F_FULL_NAME, PolyString.fromOrig("somePolyString")));
record2.addDelta(createDelta(UserType.F_ADDITIONAL_NAME));
// these two deltas should collapse into single no-op delta + no changed items for them
record2.addDelta(createDeltaWithIgnoredPath(UserType.F_GIVEN_NAME));
record2.addDelta(createDeltaWithIgnoredPath(UserType.F_FAMILY_NAME));
record2.getCustomColumnProperty().put("foo", "foo-value-2");
record2.getCustomColumnProperty().put("bar", "bar-val");
record2.setTaskOid("task_oid2");
auditService.audit(record2, NullTaskImpl.INSTANCE, result);
AuditEventRecord record3 = new AuditEventRecord();
record3.setParameter("3");
record3.addPropertyValue("prop1", "val3-1");
record3.addPropertyValue("prop1", "val3-2");
record3.addPropertyValue("prop1", "val3-3");
record3.addPropertyValue("prop2", null);
record3.setTimestamp(TIMESTAMP_3);
record3.setEventType(AuditEventType.MODIFY_OBJECT);
record3.setEventStage(AuditEventStage.EXECUTION);
record3.setMessage("RECORD THREE");
// null outcome is kinda like "unknown", but not quite, filter/GUI must handle it
record3.setChannel(CHANNEL_REST_URI);
record3.setTaskIdentifier("task-identifier");
record3.setTaskOid("task-oid");
auditService.audit(record3, NullTaskImpl.INSTANCE, result);
}
use of com.evolveum.midpoint.audit.api.AuditEventRecord in project midpoint by Evolveum.
the class CleanupTest method prepareAuditEventRecords.
private void prepareAuditEventRecords() throws Exception {
Calendar calendar = create_2013_07_12_12_00_Calendar();
for (int i = 0; i < 3; i++) {
long timestamp = calendar.getTimeInMillis();
AuditEventRecord record = new AuditEventRecord();
record.addDelta(createObjectDeltaOperation(i));
record.setTimestamp(timestamp);
record.addPropertyValue("prop1", "val1");
record.addReferenceValue("ref1", ObjectTypeUtil.createObjectRef("oid1", ObjectTypes.USER).asReferenceValue());
logger.info("Adding audit record with timestamp {}", new Date(timestamp));
auditService.audit(record, new NullTaskImpl(), createOperationResult());
calendar.add(Calendar.HOUR_OF_DAY, 1);
}
assertAndReturnAuditEventRecord(3);
}
Aggregations