diff --git a/token-checker-server/src/main/java/de/ozgcloud/token/saml/SamlConfiguration.java b/token-checker-server/src/main/java/de/ozgcloud/token/saml/SamlConfiguration.java index 50354cd7132d242953d9b1d308a1fdb19fc84452..0cad2348097b0ab6ddd787b9f232bd7a18d44db6 100644 --- a/token-checker-server/src/main/java/de/ozgcloud/token/saml/SamlConfiguration.java +++ b/token-checker-server/src/main/java/de/ozgcloud/token/saml/SamlConfiguration.java @@ -16,6 +16,7 @@ import org.opensaml.security.credential.criteria.impl.EvaluableUsageCredentialCr import org.opensaml.security.criteria.UsageCriterion; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; import de.ozgcloud.token.TokenValidationProperties; import de.ozgcloud.token.TokenValidationProperties.TokenValidationProperty; @@ -35,6 +36,7 @@ public class SamlConfiguration { } @Bean + @DependsOn("xmlObjectProviderRegistry") SamlServiceRegistry samServiceRegistry(TokenValidationProperties tokenValidationProperties) { var registryBuilder = SamlServiceRegistry.builder(); for (var tokenEntity : tokenValidationProperties.getEntities()) { diff --git a/token-checker-server/src/main/resources/application-local.yml b/token-checker-server/src/main/resources/application-local.yml index 0f9eaeba57f44763a40dbc070c3b3cc7e77fdc51..d601973b2998caf553a9041db64203c0ce880256 100644 --- a/token-checker-server/src/main/resources/application-local.yml +++ b/token-checker-server/src/main/resources/application-local.yml @@ -1,8 +1,10 @@ logging: level: - "net.devh.boot.grpc": INFO + ROOT: ERROR, + "org.springframework": ERROR "org.opensaml.xmlsec.encryption.support": DEBUG - config: "token-checker-server/src/main/resources/log4j2-local.xml" + "de.ozgcloud": INFO + config: classpath:log4j2-local.xml ozgcloud: token: check: diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/TokenCheckGrpcServiceITCase.java b/token-checker-server/src/test/java/de/ozgcloud/token/TokenCheckGrpcServiceITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..c2c24b47fa6061b16a8157cc03190303dc1a0d3b --- /dev/null +++ b/token-checker-server/src/test/java/de/ozgcloud/token/TokenCheckGrpcServiceITCase.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.token; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Map; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; + +import de.ozgcloud.common.test.ITCase; +import de.ozgcloud.common.test.TestUtils; +import de.ozgcloud.token.saml.SamlTrustEngineFactoryTestConfiguration; +import net.devh.boot.grpc.client.inject.GrpcClient; + +@ITCase +@SpringBootTest(properties = { + "grpc.server.inProcessName=test", + "grpc.client.token-checker.address=in-process:test", +}) +@Import(SamlTrustEngineFactoryTestConfiguration.class) +public class TokenCheckGrpcServiceITCase { + + @GrpcClient("token-checker") + private TokenCheckServiceGrpc.TokenCheckServiceBlockingStub tokenCheckerStub; + + @Nested + class TestCheckToken { + + private static final String POSTFACH_ID = "28721c6f-b78f-4d5c-a048-19fd2fc429d2"; + private static final String TRUST_LEVEL = "STORK-QAA-Level-1"; + + @Test + void shouldAcceptToken() { + var token = TestUtils.loadTextFile("SamlResponseBayernId.xml"); + + var result = tokenCheckerStub.checkToken(buildCheckTokenRequest(token)); + + assertThat(result.getTokenValid()).isTrue(); + } + + @Test + void shouldSetClientAttribute() { + var token = TestUtils.loadTextFile("SamlResponseBayernId.xml"); + + var result = tokenCheckerStub.checkToken(buildCheckTokenRequest(token)); + + assertThat(result.getTokenAttributes().getPostfachId()).isEqualTo(POSTFACH_ID); + assertThat(result.getTokenAttributes().getTrustLevel()).isEqualTo(TRUST_LEVEL); + assertThat(getOtherFields(result)).isNotEmpty().doesNotContainKeys(TokenAttribute.POSTFACH_ID_KEY, TokenAttribute.TRUST_LEVEL_KEY); + } + + private GrpcCheckTokenRequest buildCheckTokenRequest(String token) { + return GrpcCheckTokenRequest.newBuilder().setToken(token).build(); + } + + private Map<String, String> getOtherFields(GrpcCheckTokenResponse result) { + return result.getTokenAttributes().getOtherFieldsList().stream() + .collect(Collectors.toMap(GrpcOtherField::getName, GrpcOtherField::getValue)); + } + } +} diff --git a/token-checker-server/src/test/java/de/ozgcloud/token/saml/SamlTrustEngineFactoryTestConfiguration.java b/token-checker-server/src/test/java/de/ozgcloud/token/saml/SamlTrustEngineFactoryTestConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..c018ca4195a0a113afd6e5cfee43c2f02e07a94d --- /dev/null +++ b/token-checker-server/src/test/java/de/ozgcloud/token/saml/SamlTrustEngineFactoryTestConfiguration.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.token.saml; + +import static org.mockito.Mockito.*; + +import org.opensaml.xmlsec.signature.support.SignatureTrustEngine; +import org.springframework.context.annotation.Bean; + +import lombok.SneakyThrows; + +public class SamlTrustEngineFactoryTestConfiguration { + + @SneakyThrows + @Bean + SamlTrustEngineFactory samlTrustEngineFactory() { + SignatureTrustEngine signatureTrustEngine = mock(SignatureTrustEngine.class); + when(signatureTrustEngine.validate(any(), any())).thenReturn(true); + return when(mock(SamlTrustEngineFactory.class).buildSamlTrustEngine(any())).thenReturn(signatureTrustEngine).getMock(); + } + +} diff --git a/token-checker-server/src/test/resources/application-itcase.yml b/token-checker-server/src/test/resources/application-itcase.yml new file mode 100644 index 0000000000000000000000000000000000000000..1c0f3971dfa214cd541b3bf13c9d2ba5f5b2cc17 --- /dev/null +++ b/token-checker-server/src/test/resources/application-itcase.yml @@ -0,0 +1,20 @@ +logging: + level: + ROOT: ERROR, + "org.springframework": ERROR + "org.opensaml.xmlsec.encryption.support": DEBUG + "de.ozgcloud": INFO + config: classpath:log4j2-local.xml +ozgcloud: + token: + check: + entities: + - idpEntityId: "https://infra-pre-id.bayernportal.de/idp" + key: "classpath:test1-enc.key" + certificate: "classpath:test1-enc.crt" + metadata: "classpath:metadata/bayernid-idp-infra.xml" + mappings: + postfachId: "urn:oid:2.5.4.18" + trustLevel: "urn:oid:1.2.40.0.10.2.1.1.261.94" +server: + port: -1 \ No newline at end of file