1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.submit.filters;
14
15 import java.io.StringReader;
16 import java.io.StringWriter;
17
18 import javax.xml.parsers.DocumentBuilder;
19 import javax.xml.parsers.DocumentBuilderFactory;
20 import javax.xml.parsers.ParserConfigurationException;
21
22 import org.apache.ws.security.WSConstants;
23 import org.apache.ws.security.message.WSSecHeader;
24 import org.apache.ws.security.message.WSSecTimestamp;
25 import org.apache.ws.security.message.WSSecUsernameToken;
26 import org.w3c.dom.Document;
27 import org.xml.sax.InputSource;
28
29 import com.eviware.soapui.SoapUI;
30 import com.eviware.soapui.impl.wsdl.WsdlRequest;
31 import com.eviware.soapui.impl.wsdl.submit.RequestFilter;
32 import com.eviware.soapui.impl.wsdl.submit.transports.http.BaseHttpRequestTransport;
33 import com.eviware.soapui.model.iface.SubmitContext;
34 import com.eviware.soapui.support.xml.XmlUtils;
35
36 /***
37 * Modifies the request message to include WS-Securty Username and Timestamp tokens
38 *
39 * @author Ole.Matzura
40 */
41
42 public class WsSecurityAuthenticationRequestFilter implements RequestFilter
43 {
44 private static DocumentBuilderFactory dbf;
45 private static DocumentBuilder db;
46
47 static
48 {
49 dbf = DocumentBuilderFactory.newInstance();
50 dbf.setValidating(false);
51 dbf.setNamespaceAware(true);
52
53 try
54 {
55 db = dbf.newDocumentBuilder();
56 }
57 catch (ParserConfigurationException e)
58 {
59 SoapUI.logError( e );
60 }
61 }
62
63 public void filterRequest(SubmitContext context, WsdlRequest wsdlRequest)
64 {
65 String pwType = wsdlRequest.getWssPasswordType();
66 String wsTimestamp = wsdlRequest.getWssTimeToLive();
67
68 if ( (WsdlRequest.PW_TYPE_NONE.equals(pwType) || pwType == null || pwType.length() == 0) &&
69 (wsTimestamp == null || wsTimestamp.length() == 0 ))
70 return;
71
72 try
73 {
74 {
75 String request = (String) context.getProperty( BaseHttpRequestTransport.REQUEST_CONTENT );
76 Document doc = null;
77
78
79 synchronized( db )
80 {
81 doc = db.parse(new InputSource( new StringReader( request )));
82 }
83
84 if( pwType != null && pwType.length() > 0 && !pwType.equals( WsdlRequest.PW_TYPE_NONE ))
85 addWssUsernameToken( wsdlRequest, pwType, doc );
86
87 if( wsTimestamp != null && wsTimestamp.length() > 0 )
88 addWsTimestampToken( wsdlRequest, wsTimestamp, doc );
89
90 StringWriter writer = new StringWriter();
91 XmlUtils.serializePretty( doc, writer );
92 context.setProperty( BaseHttpRequestTransport.REQUEST_CONTENT, writer.toString() );
93 }
94 }
95 catch (Throwable e)
96 {
97 SoapUI.logError( e );
98 }
99 }
100
101 private void addWsTimestampToken( WsdlRequest wsdlRequest, String ttl, Document doc )
102 {
103 WSSecTimestamp addTimestamp = new WSSecTimestamp();
104 addTimestamp.setTimeToLive( Integer.parseInt( ttl ));
105 WSSecHeader secHeader = new WSSecHeader();
106 secHeader.insertSecurityHeader( doc );
107 addTimestamp.build( doc, secHeader );
108 }
109
110 private void addWssUsernameToken( WsdlRequest wsdlRequest, String pwType, Document doc )
111 {
112 WSSecUsernameToken wsa = new WSSecUsernameToken();
113 if (WsdlRequest.PW_TYPE_DIGEST.equals(pwType))
114 {
115 wsa.setPasswordType(WSConstants.PASSWORD_DIGEST);
116 }
117 else
118 {
119 wsa.setPasswordType(WSConstants.PASSWORD_TEXT);
120 }
121
122 wsa.setUserInfo(wsdlRequest.getUsername(), wsdlRequest.getPassword() );
123
124 WSSecHeader secHeader = new WSSecHeader();
125 secHeader.insertSecurityHeader( doc );
126 wsa.build(doc, secHeader );
127 }
128 }