1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.wss4j.stax.impl.processor.output;
20
21 import java.time.Instant;
22 import java.time.ZoneOffset;
23 import java.time.format.DateTimeFormatter;
24
25 import javax.xml.namespace.QName;
26 import javax.xml.stream.XMLStreamException;
27
28 import org.apache.wss4j.common.util.DateUtil;
29 import org.apache.wss4j.stax.ext.WSSConstants;
30 import org.apache.wss4j.stax.ext.WSSSecurityProperties;
31 import org.apache.wss4j.stax.utils.WSSUtils;
32 import org.apache.xml.security.exceptions.XMLSecurityException;
33 import org.apache.xml.security.stax.ext.AbstractOutputProcessor;
34 import org.apache.xml.security.stax.ext.OutputProcessorChain;
35 import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
36
37 public class TimestampOutputProcessor extends AbstractOutputProcessor {
38
39 public TimestampOutputProcessor() throws XMLSecurityException {
40 super();
41 addBeforeProcessor(WSSSignatureOutputProcessor.class);
42 addBeforeProcessor(EncryptOutputProcessor.class);
43 }
44
45
46
47
48
49
50
51
52
53
54
55
56
57 @Override
58 public void processEvent(XMLSecEvent xmlSecEvent, OutputProcessorChain outputProcessorChain)
59 throws XMLStreamException, XMLSecurityException {
60
61 outputProcessorChain.processEvent(xmlSecEvent);
62
63 if (WSSUtils.isSecurityHeaderElement(xmlSecEvent, ((WSSSecurityProperties) getSecurityProperties()).getActor())) {
64
65 final QName headerElementName = WSSConstants.TAG_WSU_TIMESTAMP;
66 OutputProcessorUtils.updateSecurityHeaderOrder(outputProcessorChain, headerElementName, getAction(), false);
67
68 Instant created = Instant.now();
69
70 int ttl = ((WSSSecurityProperties) getSecurityProperties()).getTimestampTTL();
71 Instant expires = created.plusSeconds(ttl);
72
73 OutputProcessorChain subOutputProcessorChain = outputProcessorChain.createSubChain(this);
74
75 createStartElementAndOutputAsEvent(subOutputProcessorChain, headerElementName, true, null);
76 createStartElementAndOutputAsEvent(subOutputProcessorChain, WSSConstants.TAG_WSU_CREATED, false, null);
77 DateTimeFormatter formatter = DateUtil.getDateTimeFormatter(true);
78 createCharactersAndOutputAsEvent(subOutputProcessorChain, created.atZone(ZoneOffset.UTC).format(formatter));
79 createEndElementAndOutputAsEvent(subOutputProcessorChain, WSSConstants.TAG_WSU_CREATED);
80 createStartElementAndOutputAsEvent(subOutputProcessorChain, WSSConstants.TAG_WSU_EXPIRES, false, null);
81 createCharactersAndOutputAsEvent(subOutputProcessorChain, expires.atZone(ZoneOffset.UTC).format(formatter));
82 createEndElementAndOutputAsEvent(subOutputProcessorChain, WSSConstants.TAG_WSU_EXPIRES);
83 createEndElementAndOutputAsEvent(subOutputProcessorChain, headerElementName);
84
85 outputProcessorChain.removeProcessor(this);
86 }
87 }
88 }