Skip to content

Commit

Permalink
first batch of changes from AuditService.listRecords->searchObjects
Browse files Browse the repository at this point in the history
Focused on AuditController and ModelAuditService.
There should be no more test usages now, few more production left.
  • Loading branch information
virgo47 committed Aug 24, 2021
1 parent e9a4124 commit 0018712
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 140 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,22 @@
*/
package com.evolveum.midpoint.model.api;

import java.util.List;
import java.util.Collection;
import java.util.Map;

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

import com.evolveum.midpoint.audit.api.AuditEventRecord;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectQuery;
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.task.api.Task;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

Expand All @@ -39,10 +47,14 @@ void cleanupAudit(CleanupPolicyType policy, Task task, OperationResult parentRes
/**
* @throws UnsupportedOperationException if object retrieval is not supported
*/
// TODO this should be migrated to Query API using AuditEventRecordType search
@Deprecated
List<AuditEventRecord> listRecords(String query, Map<String, Object> params, Task task, OperationResult parentResult)
throws SecurityViolationException, SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException;
@NotNull
SearchResultList<AuditEventRecordType> searchObjects(
@Nullable ObjectQuery query,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options,
@NotNull Task task,
@NotNull OperationResult parentResult)
throws SecurityViolationException, SchemaException, ObjectNotFoundException,
ExpressionEvaluationException, CommunicationException, ConfigurationException;

/**
* @throws UnsupportedOperationException if object retrieval is not supported
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
/*
* Copyright (c) 2016-2020 Evolveum and contributors
* Copyright (C) 2016-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.model.impl.controller;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import java.util.*;
import javax.xml.datatype.XMLGregorianCalendar;

import com.evolveum.midpoint.model.impl.util.AuditHelper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

Expand All @@ -24,31 +20,31 @@
import com.evolveum.midpoint.model.api.ModelAuditService;
import com.evolveum.midpoint.model.api.ModelAuthorizationAction;
import com.evolveum.midpoint.model.impl.ModelObjectResolver;
import com.evolveum.midpoint.model.impl.util.AuditHelper;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ObjectDeltaOperation;
import com.evolveum.midpoint.schema.SearchResultList;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.security.enforcer.api.AuthorizationParameters;
import com.evolveum.midpoint.security.enforcer.api.SecurityEnforcer;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.exception.CommunicationException;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.ExpressionEvaluationException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AuthorizationPhaseType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

/**
* @author semancik
*
*/
@Component
public class AuditController implements ModelAuditService {
Expand All @@ -66,12 +62,18 @@ public void audit(AuditEventRecord record, Task task, OperationResult result) th
auditHelper.audit(record, null, task, result);
}

@Override
public List<AuditEventRecord> listRecords(String query, Map<String, Object> params, Task task, OperationResult result) throws SecurityViolationException, SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException {
authorize(ModelAuthorizationAction.AUDIT_READ, task, result);
return auditService.listRecords(query, params, result);
public @NotNull SearchResultList<AuditEventRecordType> searchObjects(
@Nullable ObjectQuery query,
@Nullable Collection<SelectorOptions<GetOperationOptions>> options,
@NotNull Task task,
@NotNull OperationResult parentResult)
throws SecurityViolationException, SchemaException, ObjectNotFoundException,
ExpressionEvaluationException, CommunicationException, ConfigurationException {
authorize(ModelAuthorizationAction.AUDIT_READ, task, parentResult);
return auditService.searchObjects(query, options, parentResult);
}

// TODO rework to countObject(ObjectQuery,...)
@Override
public long countObjects(String query, Map<String, Object> params, Task task, OperationResult result) throws SecurityViolationException, SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException {
authorize(ModelAuthorizationAction.AUDIT_READ, task, result);
Expand Down Expand Up @@ -113,7 +115,7 @@ public <O extends ObjectType> PrismObject<O> reconstructObject(Class<O> type, St
private List<AuditEventRecord> getChangeTrail(String targetOid, String finalEventIdentifier, OperationResult result) throws ObjectNotFoundException {
AuditEventRecord finalEvent = findEvent(finalEventIdentifier, result);
if (finalEvent == null) {
throw new ObjectNotFoundException("Audit event ID "+finalEventIdentifier+" was not found");
throw new ObjectNotFoundException("Audit event ID " + finalEventIdentifier + " was not found");
}
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Final event:\n{}", finalEvent.debugDump(1));
Expand All @@ -137,7 +139,7 @@ private List<AuditEventRecord> getChangeTrail(String targetOid, String finalEven
}

private List<AuditEventRecord> getChangeTrail(String targetOid, XMLGregorianCalendar from, OperationResult result) {
Map<String,Object> params = new HashMap<>();
Map<String, Object> params = new HashMap<>();
params.put("from", from);
params.put("targetOid", targetOid);
params.put("stage", AuditEventStage.EXECUTION);
Expand All @@ -147,30 +149,29 @@ private List<AuditEventRecord> getChangeTrail(String targetOid, XMLGregorianCale
}

private AuditEventRecord findEvent(String eventIdentifier, OperationResult result) {
Map<String,Object> params = new HashMap<>();
Map<String, Object> params = new HashMap<>();
params.put("eventIdentifier", eventIdentifier);
List<AuditEventRecord> listRecords = auditService
.listRecords("select * from m_audit_event as aer where (aer.eventIdentifier = :eventIdentifier)", params, result);
if (listRecords == null || listRecords.isEmpty()) {
return null;
}
if (listRecords.size() > 1) {
LOGGER.error("Found "+listRecords.size()+" audit records for event ID "+eventIdentifier+" (expecting just one)");
LOGGER.error("Found " + listRecords.size() + " audit records for event ID " + eventIdentifier + " (expecting just one)");
}
return listRecords.get(0);
}


private <O extends ObjectType> PrismObject<O> getObjectFromLastEvent(PrismObject<O> object, List<AuditEventRecord> changeTrail, String eventIdentifier) {
if (changeTrail.isEmpty()) {
return object;
}
AuditEventRecord lastEvent = changeTrail.remove(changeTrail.size() - 1);
if (!eventIdentifier.equals(lastEvent.getEventIdentifier())) {
throw new IllegalStateException("Wrong last event identifier, expected " + eventIdentifier+" but was " + lastEvent.getEventIdentifier());
throw new IllegalStateException("Wrong last event identifier, expected " + eventIdentifier + " but was " + lastEvent.getEventIdentifier());
}
Collection<ObjectDeltaOperation<? extends ObjectType>> lastEventDeltasOperations = lastEvent.getDeltas();
for (ObjectDeltaOperation<? extends ObjectType> lastEventDeltasOperation: lastEventDeltasOperations) {
for (ObjectDeltaOperation<? extends ObjectType> lastEventDeltasOperation : lastEventDeltasOperations) {
ObjectDelta<O> objectDelta = (ObjectDelta<O>) lastEventDeltasOperation.getObjectDelta();
if (!isApplicable(lastEventDeltasOperation, object, lastEvent)) {
continue;
Expand All @@ -189,12 +190,12 @@ private <O extends ObjectType> PrismObject<O> getObjectFromLastEvent(PrismObject
}

private <O extends ObjectType> PrismObject<O> rollBackTime(PrismObject<O> object, List<AuditEventRecord> changeTrail) throws SchemaException {
for (AuditEventRecord event: changeTrail) {
for (AuditEventRecord event : changeTrail) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Applying event {} ({})", event.getEventIdentifier(), XmlTypeConverter.createXMLGregorianCalendar(event.getTimestamp()));
}
Collection<ObjectDeltaOperation<? extends ObjectType>> deltaOperations = event.getDeltas();
for (ObjectDeltaOperation<? extends ObjectType> deltaOperation: deltaOperations) {
for (ObjectDeltaOperation<? extends ObjectType> deltaOperation : deltaOperations) {
ObjectDelta<O> objectDelta = (ObjectDelta<O>) deltaOperation.getObjectDelta();
if (!isApplicable(deltaOperation, object, event)) {
continue;
Expand Down Expand Up @@ -231,7 +232,7 @@ private <O extends ObjectType> boolean isApplicable(ObjectDeltaOperation<? exten
if (!object.getOid().equals(objectDelta.getOid())) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Skipping delta {} in event {} because OID does not match ({} vs {})", objectDelta, lastEvent.getEventIdentifier(),
object.getOid(), objectDelta.getOid());
object.getOid(), objectDelta.getOid());
}
return false;
}
Expand Down

0 comments on commit 0018712

Please sign in to comment.