Skip to content

Commit

Permalink
- Mandatory UserID and Network Access Point info is missing in Destin…
Browse files Browse the repository at this point in the history
…ation Active Participant for Scheduler Triggered XDS Export Audit Message #1633

- Refactor #566
  • Loading branch information
vrindanayak committed Oct 23, 2018
1 parent 0fb3bc1 commit 25343b9
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 170 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1836,13 +1836,12 @@ private ActiveParticipantBuilder[] buildProcedureRecordActiveParticipants(AuditL
}

void spoolProvideAndRegister(ExportContext ctx) {
try {
ProvideAndRegisterAuditInfoBuilder provideAndRegisterInfo = new ProvideAndRegisterAuditInfoBuilder(ctx, getArchiveDevice());
AuditInfoBuilder auditInfoBuilder = provideAndRegisterInfo.getAuditInfoBuilder();
if (auditInfoBuilder == null)
return;
if (ctx.getXDSiManifest() == null)
return;

writeSpoolFile(AuditServiceUtils.EventType.PROV_REGIS, auditInfoBuilder);
try {
writeSpoolFile(AuditServiceUtils.EventType.PROV_REGIS,
ProvideAndRegisterAuditService.provideRegisterAuditInfo(ctx, getArchiveDevice()));
} catch (Exception e) {
LOG.warn("Failed to spool Provide and Register : " + e);
}
Expand All @@ -1851,47 +1850,9 @@ void spoolProvideAndRegister(ExportContext ctx) {
private void auditProvideAndRegister(AuditLogger auditLogger, Path path, AuditServiceUtils.EventType et) {
SpoolFileReader reader = new SpoolFileReader(path);
AuditInfo auditInfo = new AuditInfo(reader.getMainInfo());
EventIdentificationBuilder ei = toBuildEventIdentification(et, auditInfo.getField(AuditInfo.OUTCOME), getEventTime(path, auditLogger));

ActiveParticipantBuilder[] activeParticipantBuilder = buildProvideRegisterActiveParticipants(auditLogger, et, auditInfo);

emitAuditMessage(auditLogger, ei, activeParticipantBuilder, patientPOI(auditInfo), submissionSetPOI(auditInfo));
}

private ActiveParticipantBuilder[] buildProvideRegisterActiveParticipants(
AuditLogger auditLogger, AuditServiceUtils.EventType et, AuditInfo ai) {
ActiveParticipantBuilder[] activeParticipantBuilder = new ActiveParticipantBuilder[3];
activeParticipantBuilder[0] = new ActiveParticipantBuilder.Builder(
ai.getField(AuditInfo.DEST_USER_ID),
ai.getField(AuditInfo.DEST_NAP_ID))
.userIDTypeCode(AuditMessages.UserIDTypeCode.URI)
.roleIDCode(et.destination)
.build();
if (isServiceUserTriggered(ai.getField(AuditInfo.CALLING_USERID))) {
activeParticipantBuilder[1] = new ActiveParticipantBuilder.Builder(
ai.getField(AuditInfo.CALLED_USERID),
getLocalHostName(auditLogger))
.userIDTypeCode(AuditMessages.UserIDTypeCode.URI)
.altUserID(AuditLogger.processID())
.roleIDCode(et.source)
.build();
String callingUserID = ai.getField(AuditInfo.CALLING_USERID);
activeParticipantBuilder[2] = new ActiveParticipantBuilder.Builder(
callingUserID,
ai.getField(AuditInfo.CALLING_HOST))
.userIDTypeCode(AuditMessages.userIDTypeCode(callingUserID))
.isRequester()
.build();
} else
activeParticipantBuilder[1] = new ActiveParticipantBuilder.Builder(
device.getDeviceName(),
getLocalHostName(auditLogger))
.altUserID(AuditLogger.processID())
.userIDTypeCode(AuditMessages.UserIDTypeCode.DeviceName)
.isRequester()
.roleIDCode(et.source)
.build();
return activeParticipantBuilder;
emitAuditMessage(
ProvideAndRegisterAuditService.provideRegisterAuditMsg(auditInfo, auditLogger, et, getEventTime(path, auditLogger)),
auditLogger);
}

private boolean isServiceUserTriggered(Object val) {
Expand Down Expand Up @@ -2274,15 +2235,6 @@ private ParticipantObjectIdentificationBuilder patientPOI(AuditInfo auditInfo) {
.build();
}

private ParticipantObjectIdentificationBuilder submissionSetPOI(AuditInfo auditInfo) {
return new ParticipantObjectIdentificationBuilder.Builder(
auditInfo.getField(AuditInfo.SUBMISSION_SET_UID),
AuditMessages.ParticipantObjectIDTypeCode.IHE_XDS_METADATA,
AuditMessages.ParticipantObjectTypeCode.SystemObject,
AuditMessages.ParticipantObjectTypeCodeRole.Job)
.build();
}

private AuditMessages.UserIDTypeCode archiveUserIDTypeCode(String userID) {
return userID.indexOf('/') != -1
? AuditMessages.UserIDTypeCode.URI
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package org.dcm4chee.arc.audit;

import org.dcm4che3.audit.*;
import org.dcm4che3.net.audit.AuditLogger;
import org.dcm4chee.arc.conf.ArchiveDeviceExtension;
import org.dcm4chee.arc.exporter.ExportContext;
import org.dcm4chee.arc.qmgt.HttpServletRequestInfo;

import java.net.URI;
import java.util.Calendar;

/**
* @author Vrinda Nayak <vrinda.nayak@j4care.com>
* @since Oct 2018
*/
class ProvideAndRegisterAuditService {

static AuditInfoBuilder provideRegisterAuditInfo(ExportContext ctx, ArchiveDeviceExtension arcDev) {
return ctx.getHttpServletRequestInfo() != null
? restfulTriggeredProvideRegisterAuditInfo(ctx, arcDev)
: schedulerTriggeredProvideRegisterAuditInfo(ctx, arcDev);
}

private static AuditInfoBuilder restfulTriggeredProvideRegisterAuditInfo(
ExportContext ctx, ArchiveDeviceExtension arcDev) {
HttpServletRequestInfo httpServletRequestInfo = ctx.getHttpServletRequestInfo();
URI destination = ctx.getExporter().getExporterDescriptor().getExportURI();
return new AuditInfoBuilder.Builder()
.callingUserID(httpServletRequestInfo.requesterUserID)
.callingHost(httpServletRequestInfo.requesterHost)
.calledUserID(httpServletRequestInfo.requestURI)
.destUserID(destination.toString())
.destNapID(destinationHost(destination))
.outcome(outcome(ctx))
.pIDAndName(ctx.getXDSiManifest(), arcDev)
.submissionSetUID(ctx.getSubmissionSetUID()).build();
}

private static AuditInfoBuilder schedulerTriggeredProvideRegisterAuditInfo(
ExportContext ctx, ArchiveDeviceExtension arcDev) {
URI destination = ctx.getExporter().getExporterDescriptor().getExportURI();
return new AuditInfoBuilder.Builder()
.callingUserID(arcDev.getDevice().getDeviceName())
.destUserID(destination.toString())
.destNapID(destinationHost(destination))
.outcome(outcome(ctx))
.pIDAndName(ctx.getXDSiManifest(), arcDev)
.submissionSetUID(ctx.getSubmissionSetUID()).build();
}

private static String destinationHost(URI destination) {
String schemeSpecificPart = destination.getSchemeSpecificPart();
return schemeSpecificPart.substring(schemeSpecificPart.indexOf("://") + 3, schemeSpecificPart.lastIndexOf(":"));
}

private static String outcome(ExportContext ctx) {
return ctx.getException() != null ? ctx.getException().getMessage() : null;
}

static AuditMessage provideRegisterAuditMsg(
AuditInfo auditInfo, AuditLogger auditLogger, AuditServiceUtils.EventType eventType, Calendar eventTime) {
String outcome = auditInfo.getField(AuditInfo.OUTCOME);
EventIdentificationBuilder eventIdentificationBuilder
= new EventIdentificationBuilder.Builder(
eventType.eventID,
eventType.eventActionCode,
eventTime,
outcome != null ? AuditMessages.EventOutcomeIndicator.MinorFailure : AuditMessages.EventOutcomeIndicator.Success)
.outcomeDesc(outcome)
.eventTypeCode(eventType.eventTypeCode).build();

ParticipantObjectIdentificationBuilder patientPOI = new ParticipantObjectIdentificationBuilder.Builder(
auditInfo.getField(AuditInfo.P_ID),
AuditMessages.ParticipantObjectIDTypeCode.PatientNumber,
AuditMessages.ParticipantObjectTypeCode.Person,
AuditMessages.ParticipantObjectTypeCodeRole.Patient)
.name(auditInfo.getField(AuditInfo.P_NAME))
.build();

ParticipantObjectIdentificationBuilder submissionSetPOI = new ParticipantObjectIdentificationBuilder.Builder(
auditInfo.getField(AuditInfo.SUBMISSION_SET_UID),
AuditMessages.ParticipantObjectIDTypeCode.IHE_XDS_METADATA,
AuditMessages.ParticipantObjectTypeCode.SystemObject,
AuditMessages.ParticipantObjectTypeCodeRole.Job)
.build();

return AuditMessages.createMessage(
eventIdentificationBuilder,
activeParticipantBuilders(auditLogger, eventType, auditInfo),
patientPOI,
submissionSetPOI);
}

private static ActiveParticipantBuilder[] activeParticipantBuilders(
AuditLogger auditLogger, AuditServiceUtils.EventType eventType, AuditInfo auditInfo) {
ActiveParticipantBuilder[] activeParticipantBuilder = new ActiveParticipantBuilder[3];
activeParticipantBuilder[0] = new ActiveParticipantBuilder.Builder(
auditInfo.getField(AuditInfo.DEST_USER_ID),
auditInfo.getField(AuditInfo.DEST_NAP_ID))
.userIDTypeCode(AuditMessages.UserIDTypeCode.URI)
.roleIDCode(eventType.destination)
.build();
String callingUserID = auditInfo.getField(AuditInfo.CALLING_USERID);
if (auditInfo.getField(AuditInfo.CALLING_HOST) != null) {
activeParticipantBuilder[1] = new ActiveParticipantBuilder.Builder(
auditInfo.getField(AuditInfo.CALLED_USERID),
getLocalHostName(auditLogger))
.userIDTypeCode(AuditMessages.UserIDTypeCode.URI)
.altUserID(AuditLogger.processID())
.roleIDCode(eventType.source)
.build();
activeParticipantBuilder[2] = new ActiveParticipantBuilder.Builder(
callingUserID,
auditInfo.getField(AuditInfo.CALLING_HOST))
.userIDTypeCode(AuditMessages.userIDTypeCode(callingUserID))
.isRequester()
.build();
} else
activeParticipantBuilder[1] = new ActiveParticipantBuilder.Builder(
callingUserID,
getLocalHostName(auditLogger))
.altUserID(AuditLogger.processID())
.userIDTypeCode(AuditMessages.UserIDTypeCode.DeviceName)
.isRequester()
.roleIDCode(eventType.source)
.build();
return activeParticipantBuilder;
}

private static String getLocalHostName(AuditLogger auditLogger) {
return auditLogger.getConnections().get(0).getHostname();
}
}

0 comments on commit 25343b9

Please sign in to comment.