1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package dk.sosi.seal.modelbuilders;
30
31 import dk.sosi.seal.SOSIFactory;
32 import dk.sosi.seal.model.SecurityTokenResponse;
33 import dk.sosi.seal.model.SignatureUtil;
34 import dk.sosi.seal.model.constants.DGWSConstants;
35 import dk.sosi.seal.model.constants.DSTags;
36 import dk.sosi.seal.model.constants.NameSpaces;
37 import dk.sosi.seal.model.constants.SOAPTags;
38 import dk.sosi.seal.xml.XmlUtil;
39 import org.w3c.dom.Document;
40 import org.w3c.dom.Element;
41
42 import java.text.ParseException;
43 import java.util.Date;
44
45
46
47
48
49
50
51
52 public class SecurityTokenResponseModelBuilder extends MessageModelBuilder {
53
54 public SecurityTokenResponseModelBuilder(SOSIFactory fac) {
55
56 super(fac);
57 }
58
59
60
61
62
63
64
65 public SecurityTokenResponse buildModel(Document doc) throws ModelBuildException {
66
67 ModelPrefixResolver modelPrefixResolver = new ModelPrefixResolver();
68
69
70
71 Element elmSoapHeader = XmlUtil.selectSingleElement(doc, "//" + NameSpaces.NS_SOAP + ":Envelope/" + NameSpaces.NS_SOAP + ":Header", modelPrefixResolver);
72
73
74 Element elmCreated = XmlUtil.selectSingleElement(elmSoapHeader, "wsse:Security/wsu:Timestamp/wsu:Created", modelPrefixResolver);
75
76 String xmlTimestamp = XmlUtil.getTextNodeValue(elmCreated);
77 Date created;
78 try {
79 created = XmlUtil.fromXMLTimeStamp(xmlTimestamp);
80 } catch (ParseException e) {
81 throw new ModelBuildException("Unable to parse timestamp from <wsu:Created>", e);
82 }
83
84 String dgwsVersion = XmlUtil.isZuluTimeFormat(xmlTimestamp) ? DGWSConstants.VERSION_1_0_1 : DGWSConstants.VERSION_1_0;
85
86 String inResponseToMessageID = ((Element) doc.getElementsByTagNameNS(NameSpaces.WSSE_SCHEMA, "Security").item(0)).getAttribute("id");
87
88 Element elmFaultCode, elmFaultString, elmFaultActor;
89 SecurityTokenResponse securityTokenResponse;
90
91
92 Element fault = XmlUtil.selectSingleElement(doc, "//" + SOAPTags.BODY_PREFIXED + '/' + SOAPTags.FAULT_PREFIXED, modelPrefixResolver);
93 if (fault != null) {
94
95 elmFaultCode = XmlUtil.selectSingleElement(fault, SOAPTags.FAULTCODE, modelPrefixResolver);
96 elmFaultString = XmlUtil.selectSingleElement(fault, SOAPTags.FAULTSTRING, modelPrefixResolver);
97 elmFaultActor = XmlUtil.selectSingleElement(fault, SOAPTags.FAULTACTOR, modelPrefixResolver);
98
99 if (elmFaultCode == null)
100 throw new ModelBuildException("No " + SOAPTags.FAULTCODE + " in " + SOAPTags.FAULT_PREFIXED);
101
102 if (elmFaultString == null)
103 throw new ModelBuildException("No " + SOAPTags.FAULTSTRING + " in " + SOAPTags.FAULT_PREFIXED);
104
105 if (elmFaultActor == null)
106 throw new ModelBuildException("No " + SOAPTags.FAULTACTOR + " in " + SOAPTags.FAULT_PREFIXED);
107
108 securityTokenResponse = factory.createNewSecurityTokenErrorResponse(dgwsVersion, inResponseToMessageID, XmlUtil.getTextNodeValue(elmFaultCode),
109 XmlUtil.getTextNodeValue(elmFaultString), XmlUtil.getTextNodeValue(elmFaultActor));
110 } else {
111 securityTokenResponse = factory.createNewSecurityTokenResponse(dgwsVersion, inResponseToMessageID);
112 }
113
114 securityTokenResponse.setCreationDate(created);
115
116
117 super.buildModel(securityTokenResponse, doc);
118
119
120 SignatureUtil.validateAllSignatures(securityTokenResponse, doc.getElementsByTagNameNS(NameSpaces.DSIG_SCHEMA, DSTags.SIGNATURE), factory
121 .getFederation(), factory.getCredentialVault(), true);
122
123 return securityTokenResponse;
124 }
125 }