Skip to content
Snippets Groups Projects
Commit f026e4ee authored by OZGCloud's avatar OZGCloud
Browse files

OZG-4383 Tests verbessert

parent 5dddd729
No related branches found
No related tags found
No related merge requests found
Showing
with 140 additions and 55 deletions
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import de.ozgcloud.nachrichten.postfach.PersistPostfachNachrichtService; import de.ozgcloud.nachrichten.postfach.PersistPostfachNachrichtService;
import de.ozgcloud.nachrichten.postfach.antragraum.*; import de.ozgcloud.nachrichten.postfach.antragraum.*;
......
...@@ -18,14 +18,12 @@ ...@@ -18,14 +18,12 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
import net.shibboleth.utilities.java.support.resolver.CriteriaSet; import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
import net.shibboleth.utilities.java.support.xml.BasicParserPool;
import net.shibboleth.utilities.java.support.xml.ParserPool;
import net.shibboleth.utilities.java.support.xml.XMLParserException; import net.shibboleth.utilities.java.support.xml.XMLParserException;
import org.opensaml.core.config.ConfigurationService; import org.opensaml.core.config.ConfigurationService;
import org.opensaml.core.config.InitializationService; import org.opensaml.core.config.InitializationService;
...@@ -71,6 +69,8 @@ import java.security.cert.X509Certificate; ...@@ -71,6 +69,8 @@ import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPrivateKey;
import java.util.*; import java.util.*;
import static de.ozgcloud.nachrichten.antragraum.Saml2Parser.*;
@Configuration @Configuration
@Log4j2 @Log4j2
public class BayernIdSamlConfiguration { public class BayernIdSamlConfiguration {
...@@ -104,42 +104,7 @@ public class BayernIdSamlConfiguration { ...@@ -104,42 +104,7 @@ public class BayernIdSamlConfiguration {
@Bean @Bean
Saml2Parser parser() { Saml2Parser parser() {
try { return new Saml2Parser();
return new Saml2Parser(getParserPool());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
static ParserPool getParserPool() throws ComponentInitializationException {
BasicParserPool parserPool = new BasicParserPool();
parserPool.setMaxPoolSize(100);
parserPool.setCoalescing(true);
parserPool.setIgnoreComments(true);
parserPool.setIgnoreElementContentWhitespace(true);
parserPool.setNamespaceAware(true);
parserPool.setExpandEntityReferences(false);
parserPool.setXincludeAware(false);
final Map<String, Boolean> features = createFeatureMap();
parserPool.setBuilderFeatures(features);
parserPool.setBuilderAttributes(new HashMap<>());
parserPool.initialize();
return parserPool;
}
private static Map<String, Boolean> createFeatureMap() {
final Map<String, Boolean> features = new HashMap<>();
features.put("http://xml.org/sax/features/external-general-entities", Boolean.FALSE);
features.put("http://xml.org/sax/features/external-parameter-entities", Boolean.FALSE);
features.put("http://apache.org/xml/features/disallow-doctype-decl", Boolean.TRUE);
features.put("http://apache.org/xml/features/validation/schema/normalized-value", Boolean.FALSE);
features.put("http://javax.xml.XMLConstants/feature/secure-processing", Boolean.TRUE);
return features;
} }
@Bean @Bean
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import de.ozgcloud.nachrichten.postfach.PostfachNachricht; import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
import de.ozgcloud.nachrichten.postfach.antragraum.GrpcRueckfrage; import de.ozgcloud.nachrichten.postfach.antragraum.GrpcRueckfrage;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import org.opensaml.core.xml.XMLObject; import org.opensaml.core.xml.XMLObject;
import org.opensaml.core.xml.schema.XSString; import org.opensaml.core.xml.schema.XSString;
...@@ -45,6 +45,7 @@ import java.util.Collection; ...@@ -45,6 +45,7 @@ import java.util.Collection;
import java.util.List; import java.util.List;
class Saml2Decrypter { class Saml2Decrypter {
public static final String LEGACY_POSTKORB_HANDLE_KEY = "legacyPostkorbHandle";
private final Decrypter decrypter; private final Decrypter decrypter;
private static final EncryptedKeyResolver encryptedKeyResolver = new ChainingEncryptedKeyResolver( private static final EncryptedKeyResolver encryptedKeyResolver = new ChainingEncryptedKeyResolver(
Arrays.asList(new InlineEncryptedKeyResolver(), new EncryptedElementTypeEncryptedKeyResolver(), Arrays.asList(new InlineEncryptedKeyResolver(), new EncryptedElementTypeEncryptedKeyResolver(),
...@@ -80,7 +81,7 @@ class Saml2Decrypter { ...@@ -80,7 +81,7 @@ class Saml2Decrypter {
var samlAssertion = response.getAssertions().get(0); var samlAssertion = response.getAssertions().get(0);
var statements = (AttributeStatement) samlAssertion.getStatements().get(1); var statements = (AttributeStatement) samlAssertion.getStatements().get(1);
var attributes = statements.getAttributes(); var attributes = statements.getAttributes();
var postfachIdOptional = attributes.stream().filter(attribute -> "legacyPostkorbHandle".equals(attribute.getFriendlyName())).findFirst(); var postfachIdOptional = attributes.stream().filter(attribute -> LEGACY_POSTKORB_HANDLE_KEY.equals(attribute.getFriendlyName())).findFirst();
return postfachIdOptional.map(postfachIdAttribute -> { return postfachIdOptional.map(postfachIdAttribute -> {
List<XMLObject> values = postfachIdAttribute.getAttributeValues(); List<XMLObject> values = postfachIdAttribute.getAttributeValues();
......
...@@ -18,10 +18,15 @@ ...@@ -18,10 +18,15 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
import net.shibboleth.utilities.java.support.xml.BasicParserPool;
import net.shibboleth.utilities.java.support.xml.ParserPool; import net.shibboleth.utilities.java.support.xml.ParserPool;
import net.shibboleth.utilities.java.support.xml.XMLParserException;
import org.opensaml.core.xml.XMLObject;
import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
import org.opensaml.core.xml.io.UnmarshallingException;
import org.opensaml.saml.saml2.core.Response; import org.opensaml.saml.saml2.core.Response;
import org.opensaml.saml.saml2.core.impl.ResponseUnmarshaller; import org.opensaml.saml.saml2.core.impl.ResponseUnmarshaller;
import org.springframework.security.saml2.Saml2Exception; import org.springframework.security.saml2.Saml2Exception;
...@@ -29,31 +34,69 @@ import org.w3c.dom.Document; ...@@ -29,31 +34,69 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
class Saml2Parser { class Saml2Parser {
private final ParserPool parserPool; private ParserPool parserPool;
private ResponseUnmarshaller unmarshaller; private ResponseUnmarshaller unmarshaller;
Saml2Parser(ParserPool parserPool) { Saml2Parser() {
this.parserPool = parserPool;
init(); init();
} }
void init() { void init() {
try { try {
this.parserPool = getParserPool();
unmarshaller = (ResponseUnmarshaller) XMLObjectProviderRegistrySupport.getUnmarshallerFactory().getUnmarshaller(Response.DEFAULT_ELEMENT_NAME); unmarshaller = (ResponseUnmarshaller) XMLObjectProviderRegistrySupport.getUnmarshallerFactory().getUnmarshaller(Response.DEFAULT_ELEMENT_NAME);
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
Response parse(String request) throws Saml2Exception { static ParserPool getParserPool() throws ComponentInitializationException {
BasicParserPool parserPool = new BasicParserPool();
parserPool.setMaxPoolSize(100);
parserPool.setCoalescing(true);
parserPool.setIgnoreComments(true);
parserPool.setIgnoreElementContentWhitespace(true);
parserPool.setNamespaceAware(true);
parserPool.setExpandEntityReferences(false);
parserPool.setXincludeAware(false);
final Map<String, Boolean> features = createFeatureMap();
parserPool.setBuilderFeatures(features);
parserPool.setBuilderAttributes(new HashMap<>());
parserPool.initialize();
return parserPool;
}
private static Map<String, Boolean> createFeatureMap() {
final Map<String, Boolean> features = new HashMap<>();
features.put("http://xml.org/sax/features/external-general-entities", Boolean.FALSE);
features.put("http://xml.org/sax/features/external-parameter-entities", Boolean.FALSE);
features.put("http://apache.org/xml/features/disallow-doctype-decl", Boolean.TRUE);
features.put("http://apache.org/xml/features/validation/schema/normalized-value", Boolean.FALSE);
features.put("http://javax.xml.XMLConstants/feature/secure-processing", Boolean.TRUE);
return features;
}
Response parse(String request) {
return (Response) xmlObject(new ByteArrayInputStream(request.getBytes(StandardCharsets.UTF_8)));
}
XMLObject xmlObject(InputStream inputStream) throws Saml2Exception {
try { try {
Document document = parserPool.parse(new ByteArrayInputStream(request.getBytes(StandardCharsets.UTF_8))); Document document = parserPool.parse(inputStream);
Element element = document.getDocumentElement(); Element element = document.getDocumentElement();
return (Response) unmarshaller.unmarshall(element); return unmarshaller.unmarshall(element);
} catch (Exception e) { } catch (XMLParserException | UnmarshallingException e) {
throw new Saml2Exception("Failed to deserialize LogoutRequest", e); throw new Saml2Exception("Failed to deserialize LogoutRequest", e);
} }
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
...@@ -42,7 +42,6 @@ class Saml2Verifier { ...@@ -42,7 +42,6 @@ class Saml2Verifier {
private final SignatureTrustEngine trustEngine; private final SignatureTrustEngine trustEngine;
private final CriteriaSet verificationCriteria; private final CriteriaSet verificationCriteria;
List<Saml2Error> verify(String samlToken) { List<Saml2Error> verify(String samlToken) {
var response = parser.parse(samlToken); var response = parser.parse(samlToken);
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import de.ozgcloud.nachrichten.postfach.PersistPostfachNachrichtService; import de.ozgcloud.nachrichten.postfach.PersistPostfachNachrichtService;
import de.ozgcloud.nachrichten.postfach.PostfachNachricht; import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import de.ozgcloud.common.test.ITCase; import de.ozgcloud.common.test.ITCase;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.common.test.TestUtils;
import de.ozgcloud.nachrichten.postfach.antragraum.GrpcFindRueckfragenRequest; import de.ozgcloud.nachrichten.postfach.antragraum.GrpcFindRueckfragenRequest;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory; import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
import de.ozgcloud.nachrichten.postfach.antragraum.GrpcRueckfrage; import de.ozgcloud.nachrichten.postfach.antragraum.GrpcRueckfrage;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import de.ozgcloud.common.test.ITCase; import de.ozgcloud.common.test.ITCase;
import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.common.test.TestUtils;
......
...@@ -18,18 +18,26 @@ ...@@ -18,18 +18,26 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.common.test.TestUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.opensaml.saml.saml2.core.Response; import org.opensaml.saml.saml2.core.Response;
import java.io.InputStream;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
class Saml2ParserTest { class Saml2ParserTest {
@BeforeEach
void setup() {
new BayernIdSamlConfiguration().initOpenSAML();
}
@Test @Test
void shouldInit() throws Exception { void shouldInit() {
Saml2Parser parser = new Saml2Parser(BayernIdSamlConfiguration.getParserPool()); Saml2Parser parser = new Saml2Parser();
assertThat(parser).isNotNull(); assertThat(parser).isNotNull();
} }
...@@ -57,9 +65,18 @@ class Saml2ParserTest { ...@@ -57,9 +65,18 @@ class Saml2ParserTest {
assertThat(response.getIssuer().getValue()).isEqualTo("https://infra-pre-id.bayernportal.de/idp"); assertThat(response.getIssuer().getValue()).isEqualTo("https://infra-pre-id.bayernportal.de/idp");
} }
@Test
void shouldGetXMLObject() throws Exception {
Saml2Parser parser = new Saml2Parser();
try (InputStream tokenStream = TestUtils.loadFile("SamlResponse.xml")) {
assertThat(parser.xmlObject(tokenStream)).isNotNull();
}
}
private static Response getResponse() throws Exception { private static Response getResponse() throws Exception {
var token = TestUtils.loadTextFile("SamlResponse.xml"); var token = TestUtils.loadTextFile("SamlResponse.xml");
Saml2Parser parser = new Saml2Parser(BayernIdSamlConfiguration.getParserPool()); Saml2Parser parser = new Saml2Parser(); //BayernIdSamlConfiguration.getParserPool()
return parser.parse(token); return parser.parse(token);
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.antragsraum; package de.ozgcloud.nachrichten.antragraum;
import de.ozgcloud.common.test.ITCase; import de.ozgcloud.common.test.ITCase;
import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.common.test.TestUtils;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment