|
@@ -1,5 +1,5 @@
|
|
/*
|
|
/*
|
|
- * Copyright 2002-2021 the original author or authors.
|
|
|
|
|
|
+ * Copyright 2002-2022 the original author or authors.
|
|
*
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* you may not use this file except in compliance with the License.
|
|
@@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream;
|
|
import java.io.File;
|
|
import java.io.File;
|
|
import java.io.InputStream;
|
|
import java.io.InputStream;
|
|
import java.io.InputStreamReader;
|
|
import java.io.InputStreamReader;
|
|
|
|
+import java.util.List;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import okhttp3.mockwebserver.MockResponse;
|
|
import okhttp3.mockwebserver.MockResponse;
|
|
@@ -41,12 +42,18 @@ public class RelyingPartyRegistrationsTests {
|
|
|
|
|
|
private String metadata;
|
|
private String metadata;
|
|
|
|
|
|
|
|
+ private String entitiesDescriptor;
|
|
|
|
+
|
|
@BeforeEach
|
|
@BeforeEach
|
|
public void setup() throws Exception {
|
|
public void setup() throws Exception {
|
|
ClassPathResource resource = new ClassPathResource("test-metadata.xml");
|
|
ClassPathResource resource = new ClassPathResource("test-metadata.xml");
|
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()))) {
|
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()))) {
|
|
this.metadata = reader.lines().collect(Collectors.joining());
|
|
this.metadata = reader.lines().collect(Collectors.joining());
|
|
}
|
|
}
|
|
|
|
+ resource = new ClassPathResource("test-entitiesdescriptor.xml");
|
|
|
|
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()))) {
|
|
|
|
+ this.entitiesDescriptor = reader.lines().collect(Collectors.joining());
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -129,4 +136,111 @@ public class RelyingPartyRegistrationsTests {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Test
|
|
|
|
+ public void collectionFromMetadataLocationWhenResolvableThenPopulatesBuilder() throws Exception {
|
|
|
|
+ try (MockWebServer server = new MockWebServer()) {
|
|
|
|
+ server.enqueue(new MockResponse().setBody(this.entitiesDescriptor).setResponseCode(200));
|
|
|
|
+ List<RelyingPartyRegistration> registrations = RelyingPartyRegistrations
|
|
|
|
+ .collectionFromMetadataLocation(server.url("/").toString()).stream()
|
|
|
|
+ .map((r) -> r.entityId("rp").build()).collect(Collectors.toList());
|
|
|
|
+ assertThat(registrations).hasSize(2);
|
|
|
|
+ RelyingPartyRegistration first = registrations.get(0);
|
|
|
|
+ RelyingPartyRegistration.AssertingPartyDetails details = first.getAssertingPartyDetails();
|
|
|
|
+ assertThat(details.getEntityId()).isEqualTo("https://idp.example.com/idp/shibboleth");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceLocation())
|
|
|
|
+ .isEqualTo("https://idp.example.com/idp/profile/SAML2/POST/SSO");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceBinding()).isEqualTo(Saml2MessageBinding.POST);
|
|
|
|
+ assertThat(details.getVerificationX509Credentials()).hasSize(1);
|
|
|
|
+ assertThat(details.getEncryptionX509Credentials()).hasSize(1);
|
|
|
|
+ RelyingPartyRegistration second = registrations.get(1);
|
|
|
|
+ details = second.getAssertingPartyDetails();
|
|
|
|
+ assertThat(details.getEntityId()).isEqualTo("https://ap.example.org/idp/shibboleth");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceLocation())
|
|
|
|
+ .isEqualTo("https://ap.example.org/idp/profile/SAML2/POST/SSO");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceBinding()).isEqualTo(Saml2MessageBinding.POST);
|
|
|
|
+ assertThat(details.getVerificationX509Credentials()).hasSize(1);
|
|
|
|
+ assertThat(details.getEncryptionX509Credentials()).hasSize(1);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void collectionFromMetadataLocationWhenUnresolvableThenSaml2Exception() throws Exception {
|
|
|
|
+ try (MockWebServer server = new MockWebServer()) {
|
|
|
|
+ server.enqueue(new MockResponse().setBody(this.metadata).setResponseCode(200));
|
|
|
|
+ String url = server.url("/").toString();
|
|
|
|
+ server.shutdown();
|
|
|
|
+ assertThatExceptionOfType(Saml2Exception.class)
|
|
|
|
+ .isThrownBy(() -> RelyingPartyRegistrations.collectionFromMetadataLocation(url));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void collectionFromMetadataLocationWhenMalformedResponseThenSaml2Exception() throws Exception {
|
|
|
|
+ try (MockWebServer server = new MockWebServer()) {
|
|
|
|
+ server.enqueue(new MockResponse().setBody("malformed").setResponseCode(200));
|
|
|
|
+ String url = server.url("/").toString();
|
|
|
|
+ assertThatExceptionOfType(Saml2Exception.class)
|
|
|
|
+ .isThrownBy(() -> RelyingPartyRegistrations.collectionFromMetadataLocation(url));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void collectionFromMetadataFileWhenResolvableThenPopulatesBuilder() {
|
|
|
|
+ File file = new File("src/test/resources/test-entitiesdescriptor.xml");
|
|
|
|
+ RelyingPartyRegistration registration = RelyingPartyRegistrations
|
|
|
|
+ .collectionFromMetadataLocation("file:" + file.getAbsolutePath()).stream()
|
|
|
|
+ .map((r) -> r.entityId("rp").build()).findFirst().get();
|
|
|
|
+ RelyingPartyRegistration.AssertingPartyDetails details = registration.getAssertingPartyDetails();
|
|
|
|
+ assertThat(details.getEntityId()).isEqualTo("https://idp.example.com/idp/shibboleth");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceLocation())
|
|
|
|
+ .isEqualTo("https://idp.example.com/idp/profile/SAML2/POST/SSO");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceBinding()).isEqualTo(Saml2MessageBinding.POST);
|
|
|
|
+ assertThat(details.getVerificationX509Credentials()).hasSize(1);
|
|
|
|
+ assertThat(details.getEncryptionX509Credentials()).hasSize(1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void collectionFromMetadataFileWhenContainsOnlyEntityDescriptorThenPopulatesBuilder() {
|
|
|
|
+ File file = new File("src/test/resources/test-metadata.xml");
|
|
|
|
+ RelyingPartyRegistration registration = RelyingPartyRegistrations
|
|
|
|
+ .collectionFromMetadataLocation("file:" + file.getAbsolutePath()).stream()
|
|
|
|
+ .map((r) -> r.entityId("rp").build()).findFirst().get();
|
|
|
|
+ RelyingPartyRegistration.AssertingPartyDetails details = registration.getAssertingPartyDetails();
|
|
|
|
+ assertThat(details.getEntityId()).isEqualTo("https://idp.example.com/idp/shibboleth");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceLocation())
|
|
|
|
+ .isEqualTo("https://idp.example.com/idp/profile/SAML2/POST/SSO");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceBinding()).isEqualTo(Saml2MessageBinding.POST);
|
|
|
|
+ assertThat(details.getVerificationX509Credentials()).hasSize(1);
|
|
|
|
+ assertThat(details.getEncryptionX509Credentials()).hasSize(1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void collectionFromMetadataFileWhenNotFoundThenSaml2Exception() {
|
|
|
|
+ assertThatExceptionOfType(Saml2Exception.class)
|
|
|
|
+ .isThrownBy(() -> RelyingPartyRegistrations.collectionFromMetadataLocation("filePath"));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void collectionFromMetadataInputStreamWhenResolvableThenPopulatesBuilder() throws Exception {
|
|
|
|
+ try (InputStream source = new ByteArrayInputStream(this.entitiesDescriptor.getBytes())) {
|
|
|
|
+ RelyingPartyRegistration registration = RelyingPartyRegistrations.collectionFromMetadata(source).stream()
|
|
|
|
+ .map((r) -> r.entityId("rp").build()).findFirst().get();
|
|
|
|
+ RelyingPartyRegistration.AssertingPartyDetails details = registration.getAssertingPartyDetails();
|
|
|
|
+ assertThat(details.getEntityId()).isEqualTo("https://idp.example.com/idp/shibboleth");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceLocation())
|
|
|
|
+ .isEqualTo("https://idp.example.com/idp/profile/SAML2/POST/SSO");
|
|
|
|
+ assertThat(details.getSingleSignOnServiceBinding()).isEqualTo(Saml2MessageBinding.POST);
|
|
|
|
+ assertThat(details.getVerificationX509Credentials()).hasSize(1);
|
|
|
|
+ assertThat(details.getEncryptionX509Credentials()).hasSize(1);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void collectionFromMetadataInputStreamWhenEmptyThenSaml2Exception() throws Exception {
|
|
|
|
+ try (InputStream source = new ByteArrayInputStream("".getBytes())) {
|
|
|
|
+ assertThatExceptionOfType(Saml2Exception.class)
|
|
|
|
+ .isThrownBy(() -> RelyingPartyRegistrations.collectionFromMetadata(source));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|