Skip to content

Commit f3445a8

Browse files
author
Arjen Poutsma
committed
Added additional Nonce tests for XWSS
Addes addirtional Nonce + Created tests for XWSS. Issue: SWS-841
1 parent e2f10c3 commit f3445a8

File tree

7 files changed

+152
-3
lines changed

7 files changed

+152
-3
lines changed

security/src/main/java/org/springframework/ws/soap/security/xwss/XwsSecurityInterceptor.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.io.IOException;
2020
import java.io.InputStream;
21+
import java.util.Arrays;
22+
import java.util.Hashtable;
2123
import javax.security.auth.callback.Callback;
2224
import javax.security.auth.callback.CallbackHandler;
2325
import javax.security.auth.callback.UnsupportedCallbackException;
@@ -170,7 +172,25 @@ protected void validateMessage(SoapMessage soapMessage, MessageContext messageCo
170172
}
171173
}
172174

173-
@Override
175+
private SOAPMessage verifyInboundMessage(ProcessingContext context)
176+
throws XWSSecurityException {
177+
try {
178+
return processor.verifyInboundMessage(context);
179+
}
180+
catch (XWSSecurityException ex) {
181+
Throwable cause = ex.getCause();
182+
if (cause instanceof NullPointerException) {
183+
StackTraceElement[] stackTrace = cause.getStackTrace();
184+
if (stackTrace.length >= 1 &&
185+
Hashtable.class.getName().equals(stackTrace[0].getClassName())) {
186+
return verifyInboundMessage(context);
187+
}
188+
}
189+
throw ex;
190+
}
191+
}
192+
193+
@Override
174194
protected void cleanUp() {
175195
if (callbackHandler != null) {
176196
try {

security/src/test/java/org/springframework/ws/soap/security/xwss/AbstractXwssMessageInterceptorTestCase.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public final void setUp() throws Exception {
5353
namespaces = new HashMap<String, String>(4);
5454
namespaces.put("SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/");
5555
namespaces.put("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
56+
namespaces.put("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
5657
namespaces.put("ds", "http://www.w3.org/2000/09/xmldsig#");
5758
namespaces.put("xenc", "http://www.w3.org/2001/04/xmlenc#");
5859
onSetup();

security/src/test/java/org/springframework/ws/soap/security/xwss/XwssMessageInterceptorUsernameTokenTest.java

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,16 @@ else if (callback instanceof PasswordCallback) {
6161
SOAPMessage result = message.getSaajMessage();
6262
assertNotNull("No result returned", result);
6363
assertXpathEvaluatesTo("Invalid Username", "Bert",
64-
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Username/text()", result);
64+
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Username/text()",
65+
result);
6566
assertXpathExists("Password does not exist",
66-
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Password[@Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest']",
67+
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Password[@Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest']",
68+
result);
69+
assertXpathExists("Nonce does not exist",
70+
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Nonce",
71+
result);
72+
assertXpathExists("Created does not exist",
73+
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsu:Created",
6774
result);
6875
}
6976

@@ -100,6 +107,47 @@ else if (callback instanceof PasswordCallback) {
100107
}
101108

102109
@Test
110+
public void testAddUsernameTokenPlainTextNonce() throws Exception {
111+
interceptor.setPolicyConfiguration(
112+
new ClassPathResource("usernameToken-plainText-nonce-config.xml",
113+
getClass()));
114+
CallbackHandler handler = new AbstractCallbackHandler() {
115+
116+
@Override
117+
protected void handleInternal(Callback callback) {
118+
if (callback instanceof UsernameCallback) {
119+
((UsernameCallback) callback).setUsername("Bert");
120+
}
121+
else if (callback instanceof PasswordCallback) {
122+
PasswordCallback passwordCallback = (PasswordCallback) callback;
123+
passwordCallback.setPassword("Ernie");
124+
}
125+
else {
126+
fail("Unexpected callback");
127+
}
128+
}
129+
};
130+
interceptor.setCallbackHandler(handler);
131+
interceptor.afterPropertiesSet();
132+
SaajSoapMessage message = loadSaajMessage("empty-soap.xml");
133+
interceptor.secureMessage(message, null);
134+
SOAPMessage result = message.getSaajMessage();
135+
assertNotNull("No result returned", result);
136+
assertXpathEvaluatesTo("Invalid Username", "Bert",
137+
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Username/text()",
138+
result);
139+
assertXpathEvaluatesTo("Invalid Password", "Ernie",
140+
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Password[@Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText']/text()",
141+
result);
142+
assertXpathExists("Nonce does not exist",
143+
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Nonce",
144+
result);
145+
assertXpathExists("Created does not exist",
146+
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsu:Created",
147+
result);
148+
}
149+
150+
@Test
103151
public void testValidateUsernameTokenPlainText() throws Exception {
104152
interceptor
105153
.setPolicyConfiguration(new ClassPathResource("requireUsernameToken-plainText-config.xml", getClass()));
@@ -139,6 +187,53 @@ public boolean validate(PasswordValidationCallback.Request request) {
139187
assertXpathNotExists("Security Header not removed", "/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security", result);
140188
}
141189

190+
@Test
191+
public void testValidateUsernameTokenPlainTextNonce() throws Exception {
192+
interceptor
193+
.setPolicyConfiguration(new ClassPathResource("requireUsernameToken-plainText-nonce-config.xml", getClass()));
194+
CallbackHandler handler = new AbstractCallbackHandler() {
195+
196+
@Override
197+
protected void handleInternal(Callback callback) {
198+
if (callback instanceof PasswordValidationCallback) {
199+
PasswordValidationCallback validationCallback = (PasswordValidationCallback) callback;
200+
validationCallback.setValidator(new PasswordValidationCallback.PasswordValidator() {
201+
public boolean validate(PasswordValidationCallback.Request request) {
202+
if (request instanceof PasswordValidationCallback.PlainTextPasswordRequest) {
203+
PasswordValidationCallback.PlainTextPasswordRequest passwordRequest =
204+
(PasswordValidationCallback.PlainTextPasswordRequest) request;
205+
assertEquals("Invalid username", "Bert", passwordRequest.getUsername());
206+
assertEquals("Invalid password", "Ernie", passwordRequest.getPassword());
207+
return true;
208+
}
209+
else {
210+
fail("Unexpected request");
211+
return false;
212+
}
213+
}
214+
});
215+
}
216+
else if (callback instanceof TimestampValidationCallback) {
217+
TimestampValidationCallback validationCallback = (TimestampValidationCallback) callback;
218+
validationCallback.setValidator(new TimestampValidationCallback.TimestampValidator() {
219+
public void validate(TimestampValidationCallback.Request request) {
220+
}
221+
});
222+
}
223+
else {
224+
fail("Unexpected callback");
225+
}
226+
}
227+
};
228+
interceptor.setCallbackHandler(handler);
229+
interceptor.afterPropertiesSet();
230+
SaajSoapMessage message = loadSaajMessage("usernameTokenPlainText-nonce-soap.xml");
231+
interceptor.validateMessage(message, null);
232+
SOAPMessage result = message.getSaajMessage();
233+
assertNotNull("No result returned", result);
234+
assertXpathNotExists("Security Header not removed", "/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security", result);
235+
}
236+
142237
@Test
143238
public void testValidateUsernameTokenDigest() throws Exception {
144239
interceptor.setPolicyConfiguration(new ClassPathResource("requireUsernameToken-digest-config.xml", getClass()));
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<xwss:SecurityConfiguration dumpMessages="false" xmlns:xwss="http://java.sun.com/xml/ns/xwss/config">
2+
<xwss:RequireUsernameToken passwordDigestRequired="false" nonceRequired="true"/>
3+
</xwss:SecurityConfiguration>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
2+
<SOAP-ENV:Header>
3+
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1"><wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="XWSSGID-13769977765581298196166"><wsse:Username>Bert</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Ernie</wsse:Password><wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">rPCuuraVbaTLFVS73/xkKNB2</wsse:Nonce><wsu:Created>2013-08-20T11:22:56Z</wsu:Created></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body>
4+
<tru:StockSymbol xmlns:tru="http://fabrikam123.com/payloads">QQQ</tru:StockSymbol>
5+
</SOAP-ENV:Body>
6+
</SOAP-ENV:Envelope>2013-08-20 13:22:56,589 INFO [org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor] - <Loading policy configuration from from 'class path resource [org/springframework/ws/soap/security/xwss/requireUsernameToken-plainText-config.xml]'>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<xwss:SecurityConfiguration dumpMessages="false" xmlns:xwss="http://java.sun.com/xml/ns/xwss/config">
2+
<xwss:UsernameToken digestPassword="false" useNonce="true"/>
3+
</xwss:SecurityConfiguration>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
2+
<SOAP-ENV:Header>
3+
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
4+
SOAP-ENV:mustUnderstand="1">
5+
<wsse:UsernameToken
6+
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
7+
wsu:Id="XWSSGID-1149200055993710197275"
8+
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
9+
<wsse:Username>Bert</wsse:Username>
10+
<wsse:Password
11+
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"
12+
>Ernie</wsse:Password>
13+
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">rPCuuraVbaTLFVS73/xkKNB2</wsse:Nonce>
14+
<wsu:Created>2013-08-20T11:22:56Z</wsu:Created>
15+
</wsse:UsernameToken>
16+
</wsse:Security>
17+
</SOAP-ENV:Header>
18+
<SOAP-ENV:Body>
19+
<tru:StockSymbol xmlns:tru="http://fabrikam123.com/payloads">QQQ</tru:StockSymbol>
20+
</SOAP-ENV:Body>
21+
</SOAP-ENV:Envelope>

0 commit comments

Comments
 (0)