Skip to content

Commit

Permalink
Test Refactor (SamlAuthenticationMockMvcTests)
Browse files Browse the repository at this point in the history
- Clarify test class fields (type and name) in preparation for using IdentityZoneSeeder

[#163812001] https://www.pivotaltracker.com/story/show/163812001
  • Loading branch information
joshuatcasey committed Feb 8, 2019
1 parent d64dedd commit b29b152
Showing 1 changed file with 46 additions and 43 deletions.
Expand Up @@ -18,7 +18,6 @@
import org.cloudfoundry.identity.uaa.DefaultTestContext;
import org.cloudfoundry.identity.uaa.constants.OriginKeys;
import org.cloudfoundry.identity.uaa.mock.util.MockMvcUtils;
import org.cloudfoundry.identity.uaa.mock.util.MockMvcUtils.IdentityZoneCreationResult;
import org.cloudfoundry.identity.uaa.provider.IdentityProvider;
import org.cloudfoundry.identity.uaa.provider.IdentityProviderProvisioning;
import org.cloudfoundry.identity.uaa.provider.JdbcIdentityProviderProvisioning;
Expand All @@ -29,8 +28,11 @@
import org.cloudfoundry.identity.uaa.provider.saml.idp.SamlServiceProviderProvisioning;
import org.cloudfoundry.identity.uaa.scim.ScimUser;
import org.cloudfoundry.identity.uaa.scim.jdbc.JdbcScimUserProvisioning;
import org.cloudfoundry.identity.uaa.test.ZoneSeederExtension;
import org.cloudfoundry.identity.uaa.zone.IdentityZone;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
Expand Down Expand Up @@ -64,16 +66,16 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@DefaultTestContext
@ExtendWith(ZoneSeederExtension.class)
class SamlAuthenticationMockMvcTests {

private RandomValueStringGenerator generator;

private IdentityZoneCreationResult spZone;
private IdentityZoneCreationResult idpZone;
private String entityId;
private IdentityZone spZone;
private IdentityZone idpZone;
private String spZoneEntityId;
private IdentityProvider<SamlIdentityProviderDefinition> idp;
private SamlServiceProvider sp;
private SamlServiceProviderProvisioning spProvisioning;
private SamlServiceProvider samlServiceProvider;

@Autowired
private MockMvc mockMvc;
Expand All @@ -92,23 +94,22 @@ void createSamlRelationship(
BaseClientDetails adminClient = new BaseClientDetails("admin", "", "", "client_credentials", "uaa.admin");
adminClient.setClientSecret("adminsecret");
spZone = createZone(adminClient);
spZoneEntityId = spZone.getSubdomain() + ".cloudfoundry-saml-login";
idpZone = createZone(adminClient);
spProvisioning = jdbcSamlServiceProviderProvisioning;
createIdp(jdbcIdentityProviderProvisioning);
createSp(spProvisioning);
createSp(jdbcSamlServiceProviderProvisioning);
createUser(jdbcScimUserProvisioning, idpZone);
}

@Test
void sendAuthnRequestToIdp() throws Exception {
String spEntityId = spZone.getIdentityZone().getSubdomain() + ".cloudfoundry-saml-login";
String idpEntityId = idpZone.getIdentityZone().getSubdomain() + ".cloudfoundry-saml-login";
String idpEntityId = idpZone.getSubdomain() + ".cloudfoundry-saml-login";
MvcResult mvcResult = mockMvc.perform(
get("/uaa/saml/discovery")
.contextPath("/uaa")
.header(HttpHeaders.HOST, spZone.getIdentityZone().getSubdomain() + ".localhost:8080")
.header(HttpHeaders.HOST, spZone.getSubdomain() + ".localhost:8080")
.param("returnIDParam", "idp")
.param("entityID", spEntityId)
.param("entityID", spZoneEntityId)
.param("idp", idp.getOriginKey())
.param("isPassive", "true")
)
Expand All @@ -118,7 +119,7 @@ void sendAuthnRequestToIdp() throws Exception {
mvcResult = mockMvc.perform(
get(mvcResult.getResponse().getRedirectedUrl())
.contextPath("/uaa")
.header(HttpHeaders.HOST, spZone.getIdentityZone().getSubdomain() + ".localhost:8080")
.header(HttpHeaders.HOST, spZone.getSubdomain() + ".localhost:8080")
.session((MockHttpSession) mvcResult.getRequest().getSession())

)
Expand All @@ -132,19 +133,21 @@ void sendAuthnRequestToIdp() throws Exception {
mockMvc.perform(
post("/uaa/saml/idp/SSO/alias/" + idpEntityId)
.contextPath("/uaa")
.header(HttpHeaders.HOST, idpZone.getIdentityZone().getSubdomain() + ".localhost:8080")
.header(HttpHeaders.HOST, idpZone.getSubdomain() + ".localhost:8080")
.param("RelayState", relayState)
.param("SAMLRequest", samlRequest)
)
.andExpect(status().isFound())
.andExpect(redirectedUrl("http://" + idpZone.getIdentityZone().getSubdomain() + ".localhost:8080/uaa/login"));
.andExpect(redirectedUrl("http://" + idpZone.getSubdomain() + ".localhost:8080/uaa/login"));
}

@Test
void validateStaticAttributes() throws Exception {
sp.getConfig().getStaticCustomAttributes().put("portal_id", "portal");
sp.getConfig().getStaticCustomAttributes().put("portal_emails", Arrays.asList("portal1@portal.test", "portal2@portal.test"));
spProvisioning.update(sp, idpZone.getIdentityZone().getId());
void validateStaticAttributes(
@Autowired JdbcSamlServiceProviderProvisioning jdbcSamlServiceProviderProvisioning
) throws Exception {
samlServiceProvider.getConfig().getStaticCustomAttributes().put("portal_id", "portal");
samlServiceProvider.getConfig().getStaticCustomAttributes().put("portal_emails", Arrays.asList("portal1@portal.test", "portal2@portal.test"));
jdbcSamlServiceProviderProvisioning.update(samlServiceProvider, idpZone.getId());

String samlResponse = performIdpAuthentication();
String xml = extractAssertion(samlResponse, true);
Expand All @@ -155,9 +158,11 @@ void validateStaticAttributes() throws Exception {
}

@Test
void validateCustomEmailAttribute() throws Exception {
sp.getConfig().getAttributeMappings().put("email", "primary-email");
spProvisioning.update(sp, idpZone.getIdentityZone().getId());
void validateCustomEmailAttribute(
@Autowired JdbcSamlServiceProviderProvisioning jdbcSamlServiceProviderProvisioning
) throws Exception {
samlServiceProvider.getConfig().getAttributeMappings().put("email", "primary-email");
jdbcSamlServiceProviderProvisioning.update(samlServiceProvider, idpZone.getId());

String samlResponse = performIdpAuthentication();
String xml = extractAssertion(samlResponse, true);
Expand All @@ -170,10 +175,9 @@ void validateCustomEmailAttribute() throws Exception {
void spIsAuthenticated() throws Exception {
String samlResponse = performIdpAuthentication();
String xml = extractAssertion(samlResponse, false);
String subdomain = spZone.getIdentityZone().getSubdomain();
String spEntityId = subdomain + ".cloudfoundry-saml-login";
String subdomain = spZone.getSubdomain();
mockMvc.perform(
post("/uaa/saml/SSO/alias/" + spEntityId)
post("/uaa/saml/SSO/alias/" + spZoneEntityId)
.contextPath("/uaa")
.header(HttpHeaders.HOST, subdomain + ".localhost:8080")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
Expand All @@ -183,11 +187,11 @@ void spIsAuthenticated() throws Exception {
}

private String performIdpAuthentication() throws Exception {
RequestPostProcessor marissa = securityContext(getUaaSecurityContext("marissa", webApplicationContext, idpZone.getIdentityZone()));
RequestPostProcessor marissa = securityContext(getUaaSecurityContext("marissa", webApplicationContext, idpZone));
return mockMvc.perform(
get("/saml/idp/initiate")
.header("Host", idpZone.getIdentityZone().getSubdomain() + ".localhost")
.param("sp", entityId)
.header("Host", idpZone.getSubdomain() + ".localhost")
.param("sp", spZoneEntityId)
.with(marissa)
)
.andDo(print())
Expand All @@ -204,53 +208,52 @@ private String getSamlMetadata(String subdomain, String url) throws Exception {

private static void createUser(
JdbcScimUserProvisioning jdbcScimUserProvisioning,
IdentityZoneCreationResult idpZone
IdentityZone identityZone
) {
ScimUser user = new ScimUser(null, "marissa", "first", "last");
user.setPrimaryEmail("test@test.org");
jdbcScimUserProvisioning.createUser(user, "secret", idpZone.getIdentityZone().getId());
jdbcScimUserProvisioning.createUser(user, "secret", identityZone.getId());
}

private void createSp(SamlServiceProviderProvisioning spProvisioning) throws Exception {
SamlServiceProviderDefinition spDefinition = new SamlServiceProviderDefinition();
spDefinition.setEnableIdpInitiatedSso(true);
spDefinition.setMetaDataLocation(getSamlMetadata(spZone.getIdentityZone().getSubdomain(), "/saml/metadata"));
spDefinition.setMetaDataLocation(getSamlMetadata(spZone.getSubdomain(), "/saml/metadata"));
Map<String, Object> staticAttributes = new HashMap<>();
spDefinition.setStaticCustomAttributes(staticAttributes);
entityId = spZone.getIdentityZone().getSubdomain() + ".cloudfoundry-saml-login";
sp = new SamlServiceProvider()
.setIdentityZoneId(idpZone.getIdentityZone().getId())
.setEntityId(entityId)
samlServiceProvider = new SamlServiceProvider()
.setIdentityZoneId(idpZone.getId())
.setEntityId(spZoneEntityId)
.setConfig(spDefinition)
.setActive(true)
.setName("SAML SP for Mock Tests");
sp = spProvisioning.create(sp, idpZone.getIdentityZone().getId());
samlServiceProvider = spProvisioning.create(samlServiceProvider, idpZone.getId());
}

private void createIdp(IdentityProviderProvisioning idpProvisioning) throws Exception {
idp = new IdentityProvider<>()
.setType(OriginKeys.SAML)
.setOriginKey(idpZone.getIdentityZone().getSubdomain())
.setOriginKey(idpZone.getSubdomain())
.setActive(true)
.setName("SAML IDP for Mock Tests")
.setIdentityZoneId(spZone.getIdentityZone().getId());
.setIdentityZoneId(spZone.getId());
SamlIdentityProviderDefinition idpDefinition = new SamlIdentityProviderDefinition()
.setMetaDataLocation(getSamlMetadata(idpZone.getIdentityZone().getSubdomain(), "/saml/idp/metadata"))
.setMetaDataLocation(getSamlMetadata(idpZone.getSubdomain(), "/saml/idp/metadata"))
.setIdpEntityAlias(idp.getOriginKey())
.setLinkText(idp.getName())
.setZoneId(spZone.getIdentityZone().getId());
.setZoneId(spZone.getId());

idp.setConfig(idpDefinition);
idp = idpProvisioning.create(idp, spZone.getIdentityZone().getId());
idp = idpProvisioning.create(idp, spZone.getId());
}

private IdentityZoneCreationResult createZone(BaseClientDetails adminClient) throws Exception {
private IdentityZone createZone(BaseClientDetails adminClient) throws Exception {
return MockMvcUtils.createOtherIdentityZoneAndReturnResult(
generator.generate(),
mockMvc,
webApplicationContext,
adminClient
);
).getIdentityZone();
}

private static String extractAssertion(String response, boolean decode) {
Expand Down

0 comments on commit b29b152

Please sign in to comment.