11package com .onelogin .saml2 .authn ;
22
3- import java .io .IOException ;
43import java .security .PrivateKey ;
54import java .security .cert .X509Certificate ;
65import java .util .ArrayList ;
98import java .util .Map ;
109
1110import javax .servlet .http .HttpServletRequest ;
12- import javax .xml .parsers .ParserConfigurationException ;
13- import javax .xml .xpath .XPath ;
14- import javax .xml .xpath .XPathConstants ;
1511import javax .xml .xpath .XPathExpressionException ;
16- import javax .xml .xpath .XPathFactory ;
1712
18- import org .apache .commons .lang3 .StringUtils ;
1913import org .joda .time .DateTime ;
2014import org .slf4j .Logger ;
2115import org .slf4j .LoggerFactory ;
2418import org .w3c .dom .NamedNodeMap ;
2519import org .w3c .dom .Node ;
2620import org .w3c .dom .NodeList ;
27- import org .xml .sax .SAXException ;
2821
2922import com .onelogin .saml2 .settings .Saml2Settings ;
3023import com .onelogin .saml2 .model .SamlResponseStatus ;
@@ -289,7 +282,7 @@ public boolean isValid(String requestId) {
289282
290283 // Check SubjectConfirmation, at least one SubjectConfirmation must be valid
291284 private void validateSubjectConfirmation (String responseInResponseTo ) throws Exception {
292- final List <String > subjectConfirmationDataIssues = new ArrayList <>();
285+ final List <SubjectConfirmationIssue > validationIssues = new ArrayList <>();
293286 boolean validSubjectConfirmation = false ;
294287 NodeList subjectConfirmationNodes = this .queryAssertion ("/saml:Subject/saml:SubjectConfirmation" );
295288 for (int i = 0 ; i < subjectConfirmationNodes .getLength (); i ++) {
@@ -306,50 +299,49 @@ private void validateSubjectConfirmation(String responseInResponseTo) throws Exc
306299
307300 Node recipient = subjectConfirmationDataNodes .item (c ).getAttributes ().getNamedItem ("Recipient" );
308301 if (recipient == null ) {
309- subjectConfirmationDataIssues .add ("SubjectConfirmationData doesn't contain a Recipient" );
302+ validationIssues .add (new SubjectConfirmationIssue ( i , "SubjectConfirmationData doesn't contain a Recipient" ) );
310303 continue ;
311304 }
312305
313306 if (!recipient .getNodeValue ().equals (currentUrl )) {
314- subjectConfirmationDataIssues .add ("SubjectConfirmationData doesn't match a valid Recipient" );
307+ validationIssues .add (new SubjectConfirmationIssue ( i , "SubjectConfirmationData doesn't match a valid Recipient" ) );
315308 continue ;
316309 }
317310
318311 Node inResponseTo = subjectConfirmationDataNodes .item (c ).getAttributes ().getNamedItem ("InResponseTo" );
319312 if (inResponseTo != null && !inResponseTo .getNodeValue ().equals (responseInResponseTo )) {
320- subjectConfirmationDataIssues .add ("SubjectConfirmationData has an invalid InResponseTo value" );
313+ validationIssues .add (new SubjectConfirmationIssue ( i , "SubjectConfirmationData has an invalid InResponseTo value" ) );
321314 continue ;
322315 }
323316
324317
325318 Node notOnOrAfter = subjectConfirmationDataNodes .item (c ).getAttributes ().getNamedItem ("NotOnOrAfter" );
326319 if (notOnOrAfter == null ) {
327- subjectConfirmationDataIssues .add ("SubjectConfirmationData doesn't contain a NotOnOrAfter attribute" );
320+ validationIssues .add (new SubjectConfirmationIssue ( i , "SubjectConfirmationData doesn't contain a NotOnOrAfter attribute" ) );
328321 continue ;
329322 }
330323
331324 DateTime noa = Util .parseDateTime (notOnOrAfter .getNodeValue ());
332325 if (noa .isEqualNow () || noa .isBeforeNow ()) {
333- subjectConfirmationDataIssues .add ("SubjectConfirmationData is no longer valid" );
326+ validationIssues .add (new SubjectConfirmationIssue ( i , "SubjectConfirmationData is no longer valid" ) );
334327 continue ;
335328 }
336329
337330 Node notBefore = subjectConfirmationDataNodes .item (c ).getAttributes ().getNamedItem ("NotBefore" );
338331 if (notBefore != null ) {
339332 DateTime nb = Util .parseDateTime (notBefore .getNodeValue ());
340333 if (nb .isAfterNow ()) {
341- subjectConfirmationDataIssues .add ("SubjectConfirmationData is not yet valid" );
334+ validationIssues .add (new SubjectConfirmationIssue ( i , "SubjectConfirmationData is not yet valid" ) );
342335 continue ;
343336 }
344337 }
345338 validSubjectConfirmation = true ;
346339 }
347340 }
348341 }
342+
349343 if (!validSubjectConfirmation ) {
350- String subjectConfirmationDataIssuesMsg = subjectConfirmationDataIssues .isEmpty () ? "" :
351- " - " + StringUtils .join (subjectConfirmationDataIssues , ", " );
352- throw new Exception ("A valid SubjectConfirmation was not found on this Response" + subjectConfirmationDataIssuesMsg );
344+ throw new Exception (SubjectConfirmationIssue .prettyPrint (validationIssues ));
353345 }
354346 }
355347
0 commit comments