aboutsummaryrefslogtreecommitdiff
path: root/ms_specific_connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'ms_specific_connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java')
-rw-r--r--ms_specific_connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java336
1 files changed, 336 insertions, 0 deletions
diff --git a/ms_specific_connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java b/ms_specific_connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java
new file mode 100644
index 00000000..ea163e61
--- /dev/null
+++ b/ms_specific_connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java
@@ -0,0 +1,336 @@
+package at.asitplus.eidas.specific.connector.test.utils;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opensaml.core.config.InitializationException;
+import org.opensaml.core.xml.io.Unmarshaller;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.saml.saml2.core.AuthnRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
+import at.asitplus.eidas.specific.core.config.ServiceProviderConfiguration;
+import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants;
+import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP;
+import at.gv.egiz.eaaf.core.exceptions.AuthnRequestValidatorException;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.impl.idp.controller.protocols.RequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.utils.DomUtils;
+import at.gv.egiz.eaaf.modules.pvp2.api.validation.IAuthnRequestPostProcessor;
+import at.gv.egiz.eaaf.modules.pvp2.idp.impl.PvpSProfilePendingRequest;
+import at.gv.egiz.eaaf.modules.pvp2.impl.opensaml.initialize.EaafOpenSaml3xInitializer;
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration({
+ "/applicationContext.xml",
+ "/spring/SpringTest_connector.beans.xml",
+ "/eaaf_core.beans.xml",
+ "/eaaf_pvp.beans.xml",
+ "/eaaf_pvp_idp.beans.xml",
+ "/spring/SpringTest-context_simple_storage.xml"})
+@ActiveProfiles(profiles = {"deprecatedConfig"})
+@WebAppConfiguration
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
+public class AuthnRequestValidatorTest {
+
+ @Autowired private IConfigurationWithSP basicConfig;
+ @Autowired protected IAuthnRequestPostProcessor authRequestValidator;
+
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+ private PvpSProfilePendingRequest pendingReq;
+
+ /**
+ * jUnit class initializer.
+ * @throws ComponentInitializationException In case of an error
+ * @throws InitializationException In case of an error
+ *
+ */
+ @BeforeClass
+ public static void classInitializer() throws InitializationException, ComponentInitializationException {
+ final String current = new java.io.File(".").toURI().toString();
+ System.setProperty("eidas.ms.configuration", current + "src/test/resources/config/junit_config_1.properties");
+
+ EaafOpenSaml3xInitializer.eaafInitialize();
+ }
+
+ /**
+ * jUnit test set-up.
+ * @throws EaafException
+ *
+ */
+ @Before
+ public void initialize() throws EaafException {
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
+ httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ Map<String, String> spConfig = new HashMap<>();
+ spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, RandomStringUtils.randomAlphabetic(10));
+
+ pendingReq = new PvpSProfilePendingRequest();
+ pendingReq.initialize(httpReq, basicConfig);
+ pendingReq.setPendingRequestId(RandomStringUtils.randomAlphanumeric(10));
+ pendingReq.setOnlineApplicationConfiguration(new ServiceProviderConfiguration(spConfig, basicConfig));
+ ((RequestImpl)pendingReq).setUniqueTransactionIdentifier(null);
+
+ }
+
+ @Test
+ public void loaLowRequested() throws AuthnRequestValidatorException, ParserConfigurationException,
+ SAXException, IOException, UnmarshallingException {
+ AuthnRequest authReq = getAuthRequest("/data/pvp2_authn_1.xml");
+
+ //test
+ authRequestValidator.process(httpReq, pendingReq, authReq, null);
+
+ //validate
+ Assert.assertNotNull("spEntityId is null", pendingReq.getRawData(MsEidasNodeConstants.DATA_REQUESTERID));
+ Assert.assertEquals("SP EntityId not match",
+ "https://demo.egiz.gv.at/demoportal-openID_demo",
+ pendingReq.getRawData(MsEidasNodeConstants.DATA_REQUESTERID));
+
+ Assert.assertNotNull("SP ProviderName is null", pendingReq.getRawData(MsEidasNodeConstants.DATA_PROVIDERNAME));
+ Assert.assertEquals("SP ProviderName not match",
+ "OpenID Connect Demo",
+ pendingReq.getRawData(MsEidasNodeConstants.DATA_PROVIDERNAME));
+
+ Assert.assertNotNull("Requested SP LoA is null",
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA());
+ Assert.assertFalse("Requested SP LoA is null",
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA().isEmpty());
+ Assert.assertEquals("SP LoA count not match", 1,
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA().size());
+ Assert.assertEquals("SP LoA not match",
+ "http://eidas.europa.eu/LoA/substantial",
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA().get(0));
+
+ Assert.assertNotNull("bPK Target is null",
+ pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier());
+ Assert.assertEquals("bPK target not match", "urn:publicid:gv.at:cdid+BF",
+ pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier());
+
+ Assert.assertNull("wrong transactionId", pendingReq.getUniqueTransactionIdentifier());
+
+ }
+
+ @Test
+ public void loaSubstentialRequested() throws AuthnRequestValidatorException, ParserConfigurationException,
+ SAXException, IOException, UnmarshallingException {
+ AuthnRequest authReq = getAuthRequest("/data/pvp2_authn_2.xml");
+
+ //test
+ authRequestValidator.process(httpReq, pendingReq, authReq, null);
+
+ //validate
+ Assert.assertNotNull("spEntityId is null", pendingReq.getRawData(MsEidasNodeConstants.DATA_REQUESTERID));
+ Assert.assertEquals("SP EntityId not match",
+ "https://demo.egiz.gv.at/demoportal-openID_demo",
+ pendingReq.getRawData(MsEidasNodeConstants.DATA_REQUESTERID));
+
+ Assert.assertNotNull("SP ProviderName is null", pendingReq.getRawData(MsEidasNodeConstants.DATA_PROVIDERNAME));
+ Assert.assertEquals("SP ProviderName not match",
+ "OpenID Connect Demo",
+ pendingReq.getRawData(MsEidasNodeConstants.DATA_PROVIDERNAME));
+
+ Assert.assertNotNull("Requested SP LoA is null",
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA());
+ Assert.assertFalse("Requested SP LoA is null",
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA().isEmpty());
+ Assert.assertEquals("SP LoA count not match", 1,
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA().size());
+ Assert.assertEquals("SP LoA not match",
+ "http://eidas.europa.eu/LoA/substantial",
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA().get(0));
+
+ Assert.assertNotNull("bPK Target is null",
+ pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier());
+ Assert.assertEquals("bPK target not match", "urn:publicid:gv.at:cdid+BF",
+ pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier());
+
+ Assert.assertNull("wrong transactionId", pendingReq.getUniqueTransactionIdentifier());
+
+ }
+
+ @Test
+ public void loaHighRequested() throws AuthnRequestValidatorException, ParserConfigurationException,
+ SAXException, IOException, UnmarshallingException {
+ AuthnRequest authReq = getAuthRequest("/data/pvp2_authn_3.xml");
+
+ //test
+ authRequestValidator.process(httpReq, pendingReq, authReq, null);
+
+ //validate
+ Assert.assertNotNull("spEntityId is null", pendingReq.getRawData(MsEidasNodeConstants.DATA_REQUESTERID));
+ Assert.assertEquals("SP EntityId not match",
+ "https://demo.egiz.gv.at/demoportal-openID_demo",
+ pendingReq.getRawData(MsEidasNodeConstants.DATA_REQUESTERID));
+
+ Assert.assertNotNull("SP ProviderName is null", pendingReq.getRawData(MsEidasNodeConstants.DATA_PROVIDERNAME));
+ Assert.assertEquals("SP ProviderName not match",
+ "OpenID Connect Demo",
+ pendingReq.getRawData(MsEidasNodeConstants.DATA_PROVIDERNAME));
+
+ Assert.assertNotNull("Requested SP LoA is null",
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA());
+ Assert.assertFalse("Requested SP LoA is null",
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA().isEmpty());
+ Assert.assertEquals("SP LoA count not match", 1,
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA().size());
+ Assert.assertEquals("SP LoA not match",
+ "http://eidas.europa.eu/LoA/high",
+ pendingReq.getServiceProviderConfiguration().getRequiredLoA().get(0));
+
+ Assert.assertNotNull("bPK Target is null",
+ pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier());
+ Assert.assertEquals("bPK target not match", "urn:publicid:gv.at:cdid+XX",
+ pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier());
+
+ Assert.assertEquals("wrong transactionId", "transId_11223344556677aabbcc",
+ pendingReq.getUniqueTransactionIdentifier());
+
+ Assert.assertEquals("wrong binding pubkey", "binding_pubKey_1144225247125dsfasfasdf",
+ pendingReq.getRawData(MsEidasNodeConstants.EID_BINDING_PUBLIC_KEY_NAME, String.class));
+
+
+
+ }
+
+ @Test
+ public void transactionIdWrongPendingReqType() throws AuthnRequestValidatorException, ParserConfigurationException,
+ SAXException, IOException, UnmarshallingException {
+
+ Map<String, String> spConfig = new HashMap<>();
+ spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, RandomStringUtils.randomAlphabetic(10));
+
+ TestRequestImpl pendingReqLocal = new TestRequestImpl();
+ pendingReqLocal.setPendingReqId(RandomStringUtils.randomAlphanumeric(10));
+ pendingReqLocal.setSpConfig(new ServiceProviderConfiguration(spConfig, basicConfig));
+
+ AuthnRequest authReq = getAuthRequest("/data/pvp2_authn_3.xml");
+
+ //test
+ authRequestValidator.process(httpReq, pendingReqLocal, authReq, null);
+
+ //validate
+ Assert.assertNull("wrong transactionId", pendingReqLocal.getUniqueTransactionIdentifier());
+
+ }
+
+ @Test
+ public void invalidBpkTarget_1() throws ParserConfigurationException,
+ SAXException, IOException, UnmarshallingException {
+ AuthnRequest authReq = getAuthRequest("/data/pvp2_authn_4.xml");
+
+ //test
+ try {
+ authRequestValidator.process(httpReq, pendingReq, authReq, null);
+ Assert.fail("Invalid or missing bPK target not detected");
+
+ } catch (AuthnRequestValidatorException e) {
+ Assert.assertEquals("Wrong errorCode", "pvp2.22", e.getErrorId());
+
+ }
+ }
+
+ @Test
+ public void invalidBpkTarget_2() throws ParserConfigurationException,
+ SAXException, IOException, UnmarshallingException {
+ AuthnRequest authReq = getAuthRequest("/data/pvp2_authn_5.xml");
+
+ //test
+ try {
+ authRequestValidator.process(httpReq, pendingReq, authReq, null);
+ Assert.fail("Invalid or missing bPK target not detected");
+
+ } catch (AuthnRequestValidatorException e) {
+ Assert.assertEquals("Wrong errorCode", "pvp2.22", e.getErrorId());
+
+ }
+ }
+
+ @Test
+ public void invalidBpkTarget_3() throws ParserConfigurationException,
+ SAXException, IOException, UnmarshallingException {
+ AuthnRequest authReq = getAuthRequest("/data/pvp2_authn_6.xml");
+
+ //test
+ try {
+ authRequestValidator.process(httpReq, pendingReq, authReq, null);
+ Assert.fail("Invalid or missing bPK target not detected");
+
+ } catch (AuthnRequestValidatorException e) {
+ Assert.assertEquals("Wrong errorCode", "pvp2.22", e.getErrorId());
+
+ }
+ }
+
+ @Test
+ public void invalidBpkTarget_4() throws ParserConfigurationException,
+ SAXException, IOException, UnmarshallingException {
+ AuthnRequest authReq = getAuthRequest("/data/pvp2_authn_7.xml");
+
+ //test
+ try {
+ authRequestValidator.process(httpReq, pendingReq, authReq, null);
+ Assert.fail("Invalid or missing bPK target not detected");
+
+ } catch (AuthnRequestValidatorException e) {
+ Assert.assertEquals("Wrong errorCode", "pvp2.22", e.getErrorId());
+
+ }
+ }
+
+ @Test
+ public void invalidBpkTarget_5() throws ParserConfigurationException,
+ SAXException, IOException, UnmarshallingException {
+ AuthnRequest authReq = getAuthRequest("/data/pvp2_authn_8.xml");
+
+ //test
+ try {
+ authRequestValidator.process(httpReq, pendingReq, authReq, null);
+ Assert.fail("Invalid or missing bPK target not detected");
+
+ } catch (AuthnRequestValidatorException e) {
+ Assert.assertEquals("Wrong errorCode", "pvp2.22", e.getErrorId());
+
+ }
+ }
+
+
+ private AuthnRequest getAuthRequest(String resource) throws
+ ParserConfigurationException, SAXException, IOException, UnmarshallingException {
+ final Element authBlockDom =
+ DomUtils.parseXmlValidating(AuthnRequestValidatorTest.class.getResourceAsStream(resource));
+
+ final Unmarshaller unmarshaller = XMLObjectSupport.getUnmarshaller(authBlockDom);
+ return (AuthnRequest) unmarshaller.unmarshall(authBlockDom);
+
+ }
+}