1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.commons.ihe.ws.cxf.audit;
17
18 import org.apache.cxf.binding.soap.SoapMessage;
19 import org.apache.cxf.headers.Header;
20 import org.apache.cxf.message.Message;
21 import org.apache.cxf.phase.Phase;
22 import org.apache.cxf.ws.addressing.AddressingProperties;
23 import org.apache.cxf.ws.addressing.JAXWSAConstants;
24 import org.apache.cxf.ws.addressing.Names;
25 import org.openehealth.ipf.commons.audit.AuditContext;
26 import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategy;
27 import org.openehealth.ipf.commons.ihe.ws.WsTransactionConfiguration;
28 import org.openehealth.ipf.commons.ihe.ws.correlation.AsynchronyCorrelator;
29 import org.openehealth.ipf.commons.ihe.ws.cxf.payload.OutPayloadExtractorInterceptor;
30 import org.openehealth.ipf.commons.ihe.ws.cxf.payload.StringPayloadHolder;
31
32
33
34
35
36
37
38
39 public class AuditOutRequestInterceptor<T extends WsAuditDataset> extends AbstractAuditInterceptor<T> {
40 private final AsynchronyCorrelator<T> correlator;
41 private final WsTransactionConfiguration<T> wsTransactionConfiguration;
42
43
44
45
46 public AuditOutRequestInterceptor(
47 AuditStrategy<T> auditStrategy,
48 AuditContext auditContext,
49 AsynchronyCorrelator<T> correlator,
50 WsTransactionConfiguration<T> wsTransactionConfiguration)
51 {
52 super(Phase.PRE_PROTOCOL_ENDING, auditStrategy, auditContext);
53 addAfter(OutPayloadExtractorInterceptor.class.getName());
54 this.correlator = correlator;
55 this.wsTransactionConfiguration = wsTransactionConfiguration;
56 }
57
58
59 @Override
60 protected void process(SoapMessage message) {
61 if (isGET(message)) {
62 return;
63 }
64
65 T auditDataset = getAuditDataset(message);
66 auditDataset.setRemoteAddress((String) message.get(Message.ENDPOINT_ADDRESS));
67 auditDataset.setDestinationUserId((String) message.get(Message.ENDPOINT_ADDRESS));
68 extractXuaUserNameFromSaml2Assertion(message, Header.Direction.DIRECTION_OUT, auditDataset);
69
70 Object request = extractPojo(message);
71
72
73
74
75 if (wsTransactionConfiguration.isAuditRequestPayload()) {
76 if (request instanceof String) {
77 auditDataset.setRequestPayload((String) request);
78 } else {
79 auditDataset.setRequestPayload(message.getContent(StringPayloadHolder.class));
80 }
81 }
82
83 getAuditStrategy().enrichAuditDatasetFromRequest(auditDataset, request, message);
84
85
86 AddressingProperties props = (AddressingProperties) message.get(JAXWSAConstants.ADDRESSING_PROPERTIES_OUTBOUND);
87 if (props != null && (Boolean.TRUE.equals(message.getContextualProperty(AsynchronyCorrelator.FORCE_CORRELATION)) ||
88 ! Names.WSA_ANONYMOUS_ADDRESS.equals(props.getReplyTo().getAddress().getValue())))
89 {
90 correlator.storeAuditDataset(props.getMessageID().getValue(), auditDataset);
91 }
92 }
93
94 }