Skip to content

Commit 9e7a25c

Browse files
author
Luis Miranda
committed
SamlResponse no longer depends on javax.servlet
1 parent 747c6f9 commit 9e7a25c

3 files changed

Lines changed: 199 additions & 327 deletions

File tree

core/src/main/java/com/onelogin/saml2/Auth.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ public void processResponse(String requestId) throws Exception {
356356
String samlResponseParameter = request.getParameter("SAMLResponse");
357357

358358
if (samlResponseParameter != null) {
359-
SamlResponse samlResponse = new SamlResponse(settings, request);
359+
SamlResponse samlResponse = new SamlResponse(settings, request.getRequestURL().toString(), samlResponseParameter);
360360

361361
if (samlResponse.isValid(requestId)) {
362362
nameid = samlResponse.getNameId();

core/src/main/java/com/onelogin/saml2/authn/SamlResponse.java

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.util.List;
88
import java.util.Map;
99

10-
import javax.servlet.http.HttpServletRequest;
1110
import javax.xml.xpath.XPathExpressionException;
1211

1312
import com.onelogin.saml2.model.SubjectConfirmationIssue;
@@ -80,17 +79,19 @@ public class SamlResponse {
8079
*
8180
* @param settings
8281
* Saml2Settings object. Setting data
83-
* @param request
84-
* HttpServletRequest object to be processed (Contains GET and POST parameters, session, ...).
82+
* @param requestURL
83+
* the URL where the response was POST'ed (not including query parameters)
84+
* @param samlResponseParameter
85+
* the contents of the {@code SAMLResponse} query parameter
8586
*
8687
* @throws Exception
8788
*/
88-
public SamlResponse(Saml2Settings settings, HttpServletRequest request) throws Exception {
89+
public SamlResponse(Saml2Settings settings, String requestURL, String samlResponseParameter) throws Exception {
8990
this.settings = settings;
9091

91-
if (request != null) {
92-
currentUrl = request.getRequestURL().toString();
93-
loadXmlFromBase64(request.getParameter("SAMLResponse"));
92+
if (requestURL != null && samlResponseParameter != null) {
93+
currentUrl = requestURL;
94+
loadXmlFromBase64(samlResponseParameter);
9495
}
9596
}
9697

@@ -183,7 +184,7 @@ public boolean isValid(String requestId) {
183184
if (requestId != null && !ObjectUtils.equals(responseInResponseTo, requestId)) {
184185
throw new Exception("The InResponseTo of the Response: " + responseInResponseTo
185186
+ ", does not match the ID of the AuthNRequest sent by the SP: " + requestId);
186-
}
187+
}
187188

188189
if (!this.encrypted && settings.getWantAssertionsEncrypted()) {
189190
throw new Exception("The assertion of the Response is not encrypted and the SP requires it");
@@ -285,68 +286,68 @@ public boolean isValid(String requestId) {
285286
}
286287
}
287288

288-
// Check SubjectConfirmation, at least one SubjectConfirmation must be valid
289+
// Check SubjectConfirmation, at least one SubjectConfirmation must be valid
289290
private void validateSubjectConfirmation(String responseInResponseTo) throws Exception {
290291
final List<SubjectConfirmationIssue> validationIssues = new ArrayList<>();
291-
boolean validSubjectConfirmation = false;
292-
NodeList subjectConfirmationNodes = this.queryAssertion("/saml:Subject/saml:SubjectConfirmation");
293-
for (int i = 0; i < subjectConfirmationNodes.getLength(); i++) {
294-
Node scn = subjectConfirmationNodes.item(i);
295-
296-
Node method = scn.getAttributes().getNamedItem("Method");
297-
if (method != null && !method.getNodeValue().equals(Constants.CM_BEARER)) {
298-
continue;
299-
}
292+
boolean validSubjectConfirmation = false;
293+
NodeList subjectConfirmationNodes = this.queryAssertion("/saml:Subject/saml:SubjectConfirmation");
294+
for (int i = 0; i < subjectConfirmationNodes.getLength(); i++) {
295+
Node scn = subjectConfirmationNodes.item(i);
296+
297+
Node method = scn.getAttributes().getNamedItem("Method");
298+
if (method != null && !method.getNodeValue().equals(Constants.CM_BEARER)) {
299+
continue;
300+
}
300301

301-
NodeList subjectConfirmationDataNodes = scn.getChildNodes();
302-
for (int c = 0; c < subjectConfirmationDataNodes.getLength(); c++) {
303-
if (subjectConfirmationDataNodes.item(c).getLocalName() != null && subjectConfirmationDataNodes.item(c).getLocalName().equals("SubjectConfirmationData")) {
302+
NodeList subjectConfirmationDataNodes = scn.getChildNodes();
303+
for (int c = 0; c < subjectConfirmationDataNodes.getLength(); c++) {
304+
if (subjectConfirmationDataNodes.item(c).getLocalName() != null && subjectConfirmationDataNodes.item(c).getLocalName().equals("SubjectConfirmationData")) {
304305

305-
Node recipient = subjectConfirmationDataNodes.item(c).getAttributes().getNamedItem("Recipient");
306+
Node recipient = subjectConfirmationDataNodes.item(c).getAttributes().getNamedItem("Recipient");
306307
if (recipient == null) {
307308
validationIssues.add(new SubjectConfirmationIssue(i, "SubjectConfirmationData doesn't contain a Recipient"));
308309
continue;
309310
}
310311

311312
if (!recipient.getNodeValue().equals(currentUrl)) {
312313
validationIssues.add(new SubjectConfirmationIssue(i, "SubjectConfirmationData doesn't match a valid Recipient"));
313-
continue;
314-
}
314+
continue;
315+
}
315316

316-
Node inResponseTo = subjectConfirmationDataNodes.item(c).getAttributes().getNamedItem("InResponseTo");
317+
Node inResponseTo = subjectConfirmationDataNodes.item(c).getAttributes().getNamedItem("InResponseTo");
317318
if (inResponseTo == null && responseInResponseTo != null ||
318319
inResponseTo != null && !inResponseTo.getNodeValue().equals(responseInResponseTo)) {
319320
validationIssues.add(new SubjectConfirmationIssue(i, "SubjectConfirmationData has an invalid InResponseTo value"));;
320-
continue;
321-
}
321+
continue;
322+
}
322323

323-
324-
Node notOnOrAfter = subjectConfirmationDataNodes.item(c).getAttributes().getNamedItem("NotOnOrAfter");
324+
325+
Node notOnOrAfter = subjectConfirmationDataNodes.item(c).getAttributes().getNamedItem("NotOnOrAfter");
325326
if (notOnOrAfter == null) {
326327
validationIssues.add(new SubjectConfirmationIssue(i, "SubjectConfirmationData doesn't contain a NotOnOrAfter attribute"));
327328
continue;
328329
}
329330

330-
DateTime noa = Util.parseDateTime(notOnOrAfter.getNodeValue());
331-
if (noa.isEqualNow() || noa.isBeforeNow()) {
331+
DateTime noa = Util.parseDateTime(notOnOrAfter.getNodeValue());
332+
if (noa.isEqualNow() || noa.isBeforeNow()) {
332333
validationIssues.add(new SubjectConfirmationIssue(i, "SubjectConfirmationData is no longer valid"));
333-
continue;
334-
}
334+
continue;
335+
}
335336

336-
Node notBefore = subjectConfirmationDataNodes.item(c).getAttributes().getNamedItem("NotBefore");
337-
if (notBefore != null) {
338-
DateTime nb = Util.parseDateTime(notBefore.getNodeValue());
339-
if (nb.isAfterNow()) {
337+
Node notBefore = subjectConfirmationDataNodes.item(c).getAttributes().getNamedItem("NotBefore");
338+
if (notBefore != null) {
339+
DateTime nb = Util.parseDateTime(notBefore.getNodeValue());
340+
if (nb.isAfterNow()) {
340341
validationIssues.add(new SubjectConfirmationIssue(i, "SubjectConfirmationData is not yet valid"));
341-
continue;
342+
continue;
343+
}
344+
}
345+
validSubjectConfirmation = true;
342346
}
343347
}
344-
validSubjectConfirmation = true;
345348
}
346-
}
347-
}
348349

349-
if (!validSubjectConfirmation) {
350+
if (!validSubjectConfirmation) {
350351
throw new Exception(SubjectConfirmationIssue.prettyPrintIssues(validationIssues));
351352
}
352353
}

0 commit comments

Comments
 (0)