From 880100b9d6424d0ddec056c1c5f02d1c986120ec Mon Sep 17 00:00:00 2001 From: Jj! Date: Wed, 13 Feb 2019 13:02:21 -0600 Subject: [PATCH 01/13] [SHIBUI-1226] initial auditor aware for pac4j extra configuration for debugging in database rename field for mariadb compatibility --- .../admin/ui/domain/resolvers/RegexScheme.java | 2 ++ .../JPAEntityDescriptorServiceImpl.java | 2 ++ .../unicon/shibui/pac4j/Pac4jAuditorAware.java | 18 ++++++++++++++++++ .../net/unicon/shibui/pac4j/WebSecurity.java | 6 ++++++ .../src/test/docker/conf/application.yml | 10 ++++++++++ .../src/test/docker/docker-compose.yml | 15 ++++++++++++++- 6 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 pac4j-module/src/main/java/net/unicon/shibui/pac4j/Pac4jAuditorAware.java diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/RegexScheme.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/RegexScheme.java index bb175432c..a8d4fffaa 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/RegexScheme.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/RegexScheme.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.Setter; +import javax.persistence.Column; import javax.persistence.Entity; import javax.validation.constraints.NotNull; @@ -21,5 +22,6 @@ public RegexScheme() { } @NotNull + @Column(name = "match_regex") private String match; } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index 6bf5ac294..214f4a083 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -94,12 +94,14 @@ public JPAEntityDescriptorServiceImpl(OpenSamlObjects openSamlObjects, EntitySer public EntityDescriptor createDescriptorFromRepresentation(final EntityDescriptorRepresentation representation) { EntityDescriptor ed = openSamlObjects.buildDefaultInstanceOfType(EntityDescriptor.class); ed.setEntityID(representation.getEntityId()); + /* User user = userService.getCurrentUser(); if (user != null) { ed.setCreatedBy(user.getUsername()); } else { LOGGER.warn("Current user was null! Who is logged in?"); } + */ // setup SPSSODescriptor if (representation.getServiceProviderSsoDescriptor() != null) { diff --git a/pac4j-module/src/main/java/net/unicon/shibui/pac4j/Pac4jAuditorAware.java b/pac4j-module/src/main/java/net/unicon/shibui/pac4j/Pac4jAuditorAware.java new file mode 100644 index 000000000..0fe287c7e --- /dev/null +++ b/pac4j-module/src/main/java/net/unicon/shibui/pac4j/Pac4jAuditorAware.java @@ -0,0 +1,18 @@ +package net.unicon.shibui.pac4j; + +import org.springframework.data.domain.AuditorAware; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +import java.util.Optional; + +public class Pac4jAuditorAware implements AuditorAware { + @Override + public Optional getCurrentAuditor() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + return Optional.empty(); + } + return Optional.of(authentication.getName()); + } +} diff --git a/pac4j-module/src/main/java/net/unicon/shibui/pac4j/WebSecurity.java b/pac4j-module/src/main/java/net/unicon/shibui/pac4j/WebSecurity.java index 120a45f36..6e08444a9 100644 --- a/pac4j-module/src/main/java/net/unicon/shibui/pac4j/WebSecurity.java +++ b/pac4j-module/src/main/java/net/unicon/shibui/pac4j/WebSecurity.java @@ -10,6 +10,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; +import org.springframework.data.domain.AuditorAware; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; @@ -93,4 +94,9 @@ public void configure(org.springframework.security.config.annotation.web.builder web.httpFirewall(firewall); } } + + @Bean + public AuditorAware defaultAuditorAware() { + return new Pac4jAuditorAware(); + } } diff --git a/pac4j-module/src/test/docker/conf/application.yml b/pac4j-module/src/test/docker/conf/application.yml index e5986c1c1..90ddce36a 100644 --- a/pac4j-module/src/test/docker/conf/application.yml +++ b/pac4j-module/src/test/docker/conf/application.yml @@ -1,6 +1,16 @@ spring: profiles: include: + datasource: + platform: mariadb + driver-class-name: org.mariadb.jdbc.Driver + url: jdbc:mariadb://db:3306/shibui + username: shibui + password: shibui + jpa: + properties: + hibernate: + dialect: org.hibernate.dialect.MariaDBDialect server: port: 8443 ssl: diff --git a/pac4j-module/src/test/docker/docker-compose.yml b/pac4j-module/src/test/docker/docker-compose.yml index ac3a781c2..f76e1b375 100644 --- a/pac4j-module/src/test/docker/docker-compose.yml +++ b/pac4j-module/src/test/docker/docker-compose.yml @@ -1,6 +1,18 @@ version: "3.7" services: + db: + image: mariadb + container_name: db + environment: + MYSQL_USER: shibui + MYSQL_PASSWORD: shibui + MYSQL_DATABASE: shibui + MYSQL_RANDOM_ROOT_PASSWORD: "yes" + networks: + - front + ports: + - 3306:3306 shibui: image: unicon/shibui-pac4j entrypoint: ["/usr/bin/java", "-Dspring.profiles.active=dev", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005", "-jar", "app.jar"] @@ -13,7 +25,8 @@ services: - ./conf/application.yml:/application.yml networks: - front - + depends_on: + - db mailhog: image: mailhog/mailhog:latest ports: From 2396bd7fd658bec294a46f10155715a3cd44b3d6 Mon Sep 17 00:00:00 2001 From: Jj! Date: Wed, 13 Feb 2019 15:54:47 -0600 Subject: [PATCH 02/13] [SHIBUI-1226] update backing service update controller to use newly implemented service method ignore update test for now --- .../EntityDescriptorController.java | 12 +-- .../JPAEntityDescriptorServiceImpl.java | 96 +++++++++++++++---- ...JPAEntityDescriptorServiceImplTests.groovy | 2 + 3 files changed, 83 insertions(+), 27 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java index adcabd2f0..ba3188daa 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java @@ -132,16 +132,10 @@ public ResponseEntity update(@RequestBody EntityDescriptorRepresentation edRe return new ResponseEntity(HttpStatus.CONFLICT); } - EntityDescriptor updatedEd = - EntityDescriptor.class.cast(entityDescriptorService.createDescriptorFromRepresentation(edRepresentation)); + entityDescriptorService.updateDescriptorFromRepresentation(existingEd, edRepresentation); + existingEd = entityDescriptorRepository.save(existingEd); - updatedEd.setAudId(existingEd.getAudId()); - updatedEd.setResourceId(existingEd.getResourceId()); - updatedEd.setCreatedDate(existingEd.getCreatedDate()); - - updatedEd = entityDescriptorRepository.save(updatedEd); - - return ResponseEntity.ok().body(entityDescriptorService.createRepresentationFromDescriptor(updatedEd)); + return ResponseEntity.ok().body(entityDescriptorService.createRepresentationFromDescriptor(existingEd)); } else { return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new ErrorResponse(HttpStatus.FORBIDDEN, "You are not authorized to perform the requested operation.")); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index 214f4a083..ee249e1f1 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -90,19 +90,23 @@ public JPAEntityDescriptorServiceImpl(OpenSamlObjects openSamlObjects, EntitySer this.userService = userService; } + @Override + public void updateDescriptorFromRepresentation(org.opensaml.saml.saml2.metadata.EntityDescriptor entityDescriptor, EntityDescriptorRepresentation representation) { + if (!(entityDescriptor instanceof EntityDescriptor)) { + throw new UnsupportedOperationException("not yet implemented"); + } + buildDescriptorFromRepresentation((EntityDescriptor) entityDescriptor, representation); + } + @Override public EntityDescriptor createDescriptorFromRepresentation(final EntityDescriptorRepresentation representation) { EntityDescriptor ed = openSamlObjects.buildDefaultInstanceOfType(EntityDescriptor.class); ed.setEntityID(representation.getEntityId()); - /* - User user = userService.getCurrentUser(); - if (user != null) { - ed.setCreatedBy(user.getUsername()); - } else { - LOGGER.warn("Current user was null! Who is logged in?"); - } - */ + return buildDescriptorFromRepresentation(ed, representation); + } + + private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescriptor ed, final EntityDescriptorRepresentation representation) { // setup SPSSODescriptor if (representation.getServiceProviderSsoDescriptor() != null) { SPSSODescriptor spssoDescriptor = getSPSSODescriptorFromEntityDescriptor(ed); @@ -123,6 +127,8 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto spssoDescriptor.getNameIDFormats().add(nameIDFormat); } } + } else { + ed.setRoleDescriptors(null); } ed.setServiceProviderName(representation.getServiceProviderName()); @@ -149,6 +155,8 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto organization.getURLs().add(organizationURL); ed.setOrganization(organization); + } else { + ed.setOrganization(null); } // set up contacts @@ -168,6 +176,8 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto ed.addContactPerson(contactPerson); } + } else { + ed.getContactPersons().clear(); } // set up mdui @@ -179,6 +189,10 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto getUIInfo(ed).addDisplayName(displayName); displayName.setValue(mduiRepresentation.getDisplayName()); displayName.setXMLLang("en"); + } else { + if (getUIInfo(ed).getXMLObjects(DisplayName.DEFAULT_ELEMENT_NAME).size() > 0) { + getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(DisplayName.DEFAULT_ELEMENT_NAME).get(0)); + } } if (!Strings.isNullOrEmpty(mduiRepresentation.getInformationUrl())) { @@ -186,6 +200,10 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto getUIInfo(ed).addInformationURL(informationURL); informationURL.setValue(mduiRepresentation.getInformationUrl()); informationURL.setXMLLang("en"); + } else { + if (getUIInfo(ed).getXMLObjects(InformationURL.DEFAULT_ELEMENT_NAME).size() > 0) { + getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(InformationURL.DEFAULT_ELEMENT_NAME).get(0)); + } } if (!Strings.isNullOrEmpty(mduiRepresentation.getPrivacyStatementUrl())) { @@ -193,6 +211,10 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto getUIInfo(ed).addPrivacyStatementURL(privacyStatementURL); privacyStatementURL.setValue(mduiRepresentation.getPrivacyStatementUrl()); privacyStatementURL.setXMLLang("en"); + } else { + if (getUIInfo(ed).getXMLObjects(PrivacyStatementURL.DEFAULT_ELEMENT_NAME).size() > 0) { + getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(PrivacyStatementURL.DEFAULT_ELEMENT_NAME).get(0)); + } } if (!Strings.isNullOrEmpty(mduiRepresentation.getDescription())) { @@ -200,6 +222,10 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto getUIInfo(ed).addDescription(description); description.setValue(mduiRepresentation.getDescription()); description.setXMLLang("en"); + } else { + if (getUIInfo(ed).getXMLObjects(Description.DEFAULT_ELEMENT_NAME).size() > 0) { + getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(Description.DEFAULT_ELEMENT_NAME).get(0)); + } } if (!Strings.isNullOrEmpty(mduiRepresentation.getLogoUrl())) { @@ -209,7 +235,13 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto logo.setHeight(mduiRepresentation.getLogoHeight()); logo.setWidth(mduiRepresentation.getLogoWidth()); logo.setXMLLang("en"); + } else { + if (getUIInfo(ed).getXMLObjects(Description.DEFAULT_ELEMENT_NAME).size() > 0) { + getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(Description.DEFAULT_ELEMENT_NAME).get(0)); + } } + } else { + removeUIInfo(ed); } // setup security @@ -227,6 +259,8 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto getSPSSODescriptorFromEntityDescriptor(ed).addKeyDescriptor(keyDescriptor); } } + } else { + // TODO: implement } // setup ACSs @@ -240,6 +274,8 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto assertionConsumerService.setBinding(acsRepresentation.getBinding()); assertionConsumerService.setLocation(acsRepresentation.getLocationUrl()); } + } else { + // TODO: implement } // setup logout @@ -251,16 +287,28 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto getSPSSODescriptorFromEntityDescriptor(ed).getSingleLogoutServices().add(singleLogoutService); } + } else { + // TODO: implement } if (representation.getRelyingPartyOverrides() != null || (representation.getAttributeRelease() != null && representation.getAttributeRelease().size() > 0)) { + // TODO: fix implementation getEntityAttributes(ed).getAttributes().addAll(entityService.getAttributeListFromEntityRepresentation(representation)); + } else { + EntityAttributes entityAttributes = getEntityAttributes(ed, false); + if (entityAttributes != null) { + entityAttributes.getAttributes().clear(); + } } return ed; } - private SPSSODescriptor getSPSSODescriptorFromEntityDescriptor(EntityDescriptor entityDescriptor) { - if (entityDescriptor.getSPSSODescriptor("") == null) { + private SPSSODescriptor getSPSSODescriptorFromEntityDescriptor(EntityDescriptor entityDescriptor) { + return getSPSSODescriptorFromEntityDescriptor(entityDescriptor, true); + } + + private SPSSODescriptor getSPSSODescriptorFromEntityDescriptor(EntityDescriptor entityDescriptor, boolean create) { + if (entityDescriptor.getSPSSODescriptor("") == null && create) { SPSSODescriptor spssoDescriptor = openSamlObjects.buildDefaultInstanceOfType(SPSSODescriptor.class); entityDescriptor.getRoleDescriptors().add(spssoDescriptor); } @@ -324,7 +372,14 @@ private KeyDescriptor createKeyDescriptor(String name, String type, String value } private EntityAttributes getEntityAttributes(EntityDescriptor ed) { + return getEntityAttributes(ed, true); + } + + private EntityAttributes getEntityAttributes(EntityDescriptor ed, boolean create) { Extensions extensions = ed.getExtensions(); + if (extensions == null && !create) { + return null; + } if (extensions == null) { extensions = openSamlObjects.buildDefaultInstanceOfType(Extensions.class); ed.setExtensions(extensions); @@ -357,6 +412,19 @@ private UIInfo getUIInfo(EntityDescriptor ed) { return uiInfo; } + private void removeUIInfo(EntityDescriptor ed) { + SPSSODescriptor spssoDescriptor = getSPSSODescriptorFromEntityDescriptor(ed, false); + if (spssoDescriptor != null) { + Extensions extensions = spssoDescriptor.getExtensions(); + if (extensions == null) { + return; + } + if (extensions.getUnknownXMLObjects(UIInfo.DEFAULT_ELEMENT_NAME).size() > 0) { + extensions.getUnknownXMLObjects().remove(extensions.getUnknownXMLObjects(UIInfo.DEFAULT_ELEMENT_NAME).get(0)); + } + } + } + //TODO: implement @Override public EntityDescriptorRepresentation createRepresentationFromDescriptor(org.opensaml.saml.saml2.metadata.EntityDescriptor entityDescriptor) { @@ -584,12 +652,4 @@ public List getAttributeReleaseListFromAttributeList(List att public Map getRelyingPartyOverridesRepresentationFromAttributeList(List attributeList) { return ModelRepresentationConversions.getRelyingPartyOverridesRepresentationFromAttributeList(attributeList); } - - - - @Override - public void updateDescriptorFromRepresentation(org.opensaml.saml.saml2.metadata.EntityDescriptor entityDescriptor, EntityDescriptorRepresentation representation) { - // TODO: implement - throw new UnsupportedOperationException("not yet implemented"); - } } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy index 0c4057678..67dec2c22 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy @@ -34,6 +34,7 @@ import org.xmlunit.builder.DiffBuilder import org.xmlunit.builder.Input import org.xmlunit.diff.DefaultNodeMatcher import org.xmlunit.diff.ElementSelectors +import spock.lang.Ignore import spock.lang.Specification @ContextConfiguration(classes=[CoreShibUiConfiguration, CustomPropertiesConfiguration]) @@ -764,6 +765,7 @@ class JPAEntityDescriptorServiceImplTests extends Specification { testRunIndex << (1..5) } + @Ignore def "updateDescriptorFromRepresentation throws expected exception"() { given: def randomEntityDescriptor = generateRandomEntityDescriptor() From d4e2a946f2925bf0adee6054254988b1724e5553 Mon Sep 17 00:00:00 2001 From: Jj! Date: Wed, 13 Feb 2019 15:56:09 -0600 Subject: [PATCH 03/13] [SHIBUI-1226] add broken test --- .../admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy index 67dec2c22..220e3f944 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy @@ -765,7 +765,6 @@ class JPAEntityDescriptorServiceImplTests extends Specification { testRunIndex << (1..5) } - @Ignore def "updateDescriptorFromRepresentation throws expected exception"() { given: def randomEntityDescriptor = generateRandomEntityDescriptor() From a475f357c9d94201646ee01038511addc8736d36 Mon Sep 17 00:00:00 2001 From: Jj! Date: Wed, 13 Feb 2019 16:12:11 -0600 Subject: [PATCH 04/13] [SHIBUI-1226] implement TODO for security configuration update --- .../ui/service/JPAEntityDescriptorServiceImpl.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index ee249e1f1..7652541c8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -260,7 +260,11 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto } } } else { - // TODO: implement + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent( spssoDescriptor -> { + spssoDescriptor.setAuthnRequestsSigned((Boolean) null); + spssoDescriptor.setWantAssertionsSigned((Boolean) null); + spssoDescriptor.getKeyDescriptors().clear(); + }); } // setup ACSs @@ -303,6 +307,10 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto return ed; } + private Optional getOptionalSPSSODescriptorFromEntityDescriptor(EntityDescriptor entityDescriptor) { + return Optional.ofNullable(getSPSSODescriptorFromEntityDescriptor(entityDescriptor, false)); + } + private SPSSODescriptor getSPSSODescriptorFromEntityDescriptor(EntityDescriptor entityDescriptor) { return getSPSSODescriptorFromEntityDescriptor(entityDescriptor, true); } From 0d115f98c785b800787246ba7a8bd7916d455651 Mon Sep 17 00:00:00 2001 From: Jj! Date: Wed, 13 Feb 2019 16:26:01 -0600 Subject: [PATCH 05/13] [SHIBUI-1226] implemented update for ACSs --- .../admin/ui/service/JPAEntityDescriptorServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index 7652541c8..c3d434927 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -269,6 +269,8 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto // setup ACSs if (representation.getAssertionConsumerServices() != null && representation.getAssertionConsumerServices().size() > 0) { + // TODO: review if we need more than a naive implementation + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); for (AssertionConsumerServiceRepresentation acsRepresentation : representation.getAssertionConsumerServices()) { AssertionConsumerService assertionConsumerService = openSamlObjects.buildDefaultInstanceOfType(AssertionConsumerService.class); getSPSSODescriptorFromEntityDescriptor(ed).getAssertionConsumerServices().add(assertionConsumerService); @@ -279,7 +281,7 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto assertionConsumerService.setLocation(acsRepresentation.getLocationUrl()); } } else { - // TODO: implement + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); } // setup logout From 370c88b4a6b5410a03b2428e3f0e1a1ec5870b92 Mon Sep 17 00:00:00 2001 From: Jj! Date: Wed, 13 Feb 2019 16:35:17 -0600 Subject: [PATCH 06/13] [SHIBUI-1226] implement updates for logout endpoints --- .../admin/ui/service/JPAEntityDescriptorServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index c3d434927..6004c6a93 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -286,6 +286,8 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto // setup logout if (representation.getLogoutEndpoints() != null && !representation.getLogoutEndpoints().isEmpty()) { + // TODO: review if we need more than a naive implementation + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); for (LogoutEndpointRepresentation logoutEndpointRepresentation : representation.getLogoutEndpoints()) { SingleLogoutService singleLogoutService = openSamlObjects.buildDefaultInstanceOfType(SingleLogoutService.class); singleLogoutService.setBinding(logoutEndpointRepresentation.getBindingType()); @@ -294,7 +296,7 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto getSPSSODescriptorFromEntityDescriptor(ed).getSingleLogoutServices().add(singleLogoutService); } } else { - // TODO: implement + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); } if (representation.getRelyingPartyOverrides() != null || (representation.getAttributeRelease() != null && representation.getAttributeRelease().size() > 0)) { From 29b5a04a8837fa59b7123367320764e561e9ce10 Mon Sep 17 00:00:00 2001 From: Jj! Date: Wed, 13 Feb 2019 16:51:13 -0600 Subject: [PATCH 07/13] [SHIBUI-1226] add implementation for updating relying party overrides --- .../JPAEntityDescriptorServiceImpl.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index 6004c6a93..a2fb2391e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -300,13 +300,11 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto } if (representation.getRelyingPartyOverrides() != null || (representation.getAttributeRelease() != null && representation.getAttributeRelease().size() > 0)) { - // TODO: fix implementation + // TODO: review if we need more than a naive implementation + getOptionalEntityAttributes(ed).ifPresent(entityAttributes -> entityAttributes.getAttributes().clear()); getEntityAttributes(ed).getAttributes().addAll(entityService.getAttributeListFromEntityRepresentation(representation)); } else { - EntityAttributes entityAttributes = getEntityAttributes(ed, false); - if (entityAttributes != null) { - entityAttributes.getAttributes().clear(); - } + getOptionalEntityAttributes(ed).ifPresent(entityAttributes -> entityAttributes.getAttributes().clear()); } return ed; } @@ -387,6 +385,10 @@ private EntityAttributes getEntityAttributes(EntityDescriptor ed) { return getEntityAttributes(ed, true); } + private Optional getOptionalEntityAttributes(EntityDescriptor ed) { + return Optional.ofNullable(getEntityAttributes(ed, false)); + } + private EntityAttributes getEntityAttributes(EntityDescriptor ed, boolean create) { Extensions extensions = ed.getExtensions(); if (extensions == null && !create) { @@ -397,12 +399,14 @@ private EntityAttributes getEntityAttributes(EntityDescriptor ed, boolean create ed.setExtensions(extensions); } - EntityAttributes entityAttributes; + EntityAttributes entityAttributes = null; if (extensions.getUnknownXMLObjects(EntityAttributes.DEFAULT_ELEMENT_NAME).size() > 0) { entityAttributes = (EntityAttributes) extensions.getUnknownXMLObjects(EntityAttributes.DEFAULT_ELEMENT_NAME).get(0); } else { - entityAttributes = ((EntityAttributesBuilder) openSamlObjects.getBuilderFactory().getBuilder(EntityAttributes.DEFAULT_ELEMENT_NAME)).buildObject(); - extensions.getUnknownXMLObjects().add(entityAttributes); + if (create) { + entityAttributes = ((EntityAttributesBuilder) openSamlObjects.getBuilderFactory().getBuilder(EntityAttributes.DEFAULT_ELEMENT_NAME)).buildObject(); + extensions.getUnknownXMLObjects().add(entityAttributes); + } } return entityAttributes; } From 9125590b3452cf6e76327f67bf37f4930bd357b2 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Wed, 13 Feb 2019 17:41:21 -0700 Subject: [PATCH 08/13] [SHIBUI-1058] WIP Added JsonAssert. Updated test to use it. --- backend/build.gradle | 2 ++ ...JPAEntityDescriptorServiceImplTests.groovy | 22 ++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/backend/build.gradle b/backend/build.gradle index 914ccc374..156829bf4 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -170,6 +170,8 @@ dependencies { // CSV file support compile 'com.opencsv:opencsv:4.4' + + testCompile 'org.skyscreamer:jsonassert:1.5.0' } def generatedSrcDir = new File(buildDir, 'generated/src/main/java') diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy index 220e3f944..54f2b3d1f 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy @@ -25,6 +25,8 @@ import edu.internet2.tier.shibboleth.admin.ui.security.service.UserService import edu.internet2.tier.shibboleth.admin.ui.util.RandomGenerator import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator import edu.internet2.tier.shibboleth.admin.util.AttributeUtility +import groovy.json.JsonOutput +import org.skyscreamer.jsonassert.JSONAssert import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.json.JacksonTester @@ -56,6 +58,8 @@ class JPAEntityDescriptorServiceImplTests extends Specification { JacksonTester jacksonTester + ObjectMapper mapper + RandomGenerator generator @Autowired @@ -67,7 +71,8 @@ class JPAEntityDescriptorServiceImplTests extends Specification { def setup() { service = new JPAEntityDescriptorServiceImpl(openSamlObjects, new JPAEntityServiceImpl(openSamlObjects, new AttributeUtility(openSamlObjects), customPropertiesConfiguration), new UserService(roleRepository, userRepository)) - JacksonTester.initFields(this, new ObjectMapper()) + mapper = new ObjectMapper() + JacksonTester.initFields(this, mapper) generator = new RandomGenerator() testObjectGenerator = new TestObjectGenerator() } @@ -765,16 +770,20 @@ class JPAEntityDescriptorServiceImplTests extends Specification { testRunIndex << (1..5) } - def "updateDescriptorFromRepresentation throws expected exception"() { + def "updateDescriptorFromRepresentation updates descriptor properly"() { given: def randomEntityDescriptor = generateRandomEntityDescriptor() - def entityDescriptorRepresentation = service.createRepresentationFromDescriptor(randomEntityDescriptor) + def updatedEntityDescriptor = generateRandomEntityDescriptor() + //TODO: copy values we don't care about asserting (id, entity id, ...) + def updatedEntityDescriptorRepresentation = service.createRepresentationFromDescriptor(updatedEntityDescriptor) when: - service.updateDescriptorFromRepresentation(randomEntityDescriptor, entityDescriptorRepresentation) + service.updateDescriptorFromRepresentation(randomEntityDescriptor, updatedEntityDescriptorRepresentation) then: - thrown UnsupportedOperationException + def expectedJson = mapper.writeValueAsString(updatedEntityDescriptorRepresentation) + def actualJson = mapper.writeValueAsString(service.createRepresentationFromDescriptor(randomEntityDescriptor)) + JSONAssert.assertEquals(expectedJson, actualJson, false) } def "createRepresentationFromDescriptor creates a representation containing a version that is a hash of the original object"() { @@ -850,6 +859,9 @@ class JPAEntityDescriptorServiceImplTests extends Specification { ed.setServiceProviderName(generator.randomString(10)) ed.setServiceEnabled(generator.randomBoolean()) ed.setResourceId(generator.randomId()) + ed.setElementLocalName(generator.randomString(10)) + + //TODO: Finish fleshing out this thing return ed } From 7ef641eb6f56f4008d5d68084169e94ce243b986 Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 14 Feb 2019 08:46:30 -0600 Subject: [PATCH 09/13] [SHIBUI-1226] copy fields for test --- .../ui/service/JPAEntityDescriptorServiceImplTests.groovy | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy index 54f2b3d1f..9ce206755 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy @@ -774,7 +774,12 @@ class JPAEntityDescriptorServiceImplTests extends Specification { given: def randomEntityDescriptor = generateRandomEntityDescriptor() def updatedEntityDescriptor = generateRandomEntityDescriptor() - //TODO: copy values we don't care about asserting (id, entity id, ...) + + //copy values we don't care about asserting (id, entity id, ...) + updatedEntityDescriptor.entityID = randomEntityDescriptor.entityID + updatedEntityDescriptor.resourceId = randomEntityDescriptor.resourceId + updatedEntityDescriptor.elementLocalName = randomEntityDescriptor.elementLocalName + def updatedEntityDescriptorRepresentation = service.createRepresentationFromDescriptor(updatedEntityDescriptor) when: From b407f16b2a6c6fe24950f8b89f25679885d07165 Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 14 Feb 2019 11:21:38 -0600 Subject: [PATCH 10/13] [SHIBUI-1226] refactor fix MDUI updates --- .../admin/ui/domain/Extensions.java | 12 +++++++ .../admin/ui/domain/SPSSODescriptor.java | 6 ++++ .../shibboleth/admin/ui/domain/UIInfo.java | 1 + .../JPAEntityDescriptorServiceImpl.java | 35 +++++++++++-------- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Extensions.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Extensions.java index dd8521f70..c1538f463 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Extensions.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Extensions.java @@ -5,8 +5,10 @@ import javax.annotation.Nullable; import javax.persistence.Entity; +import javax.persistence.Transient; import java.util.Collections; import java.util.List; +import java.util.Optional; @Entity @@ -17,4 +19,14 @@ public class Extensions extends AbstractElementExtensibleXMLObject implements or public List getOrderedChildren() { return Collections.unmodifiableList(this.getUnknownXMLObjects()); } + + @Transient + public Optional getOptionalUIInfo() { + List uiinfos = this.getUnknownXMLObjects(UIInfo.DEFAULT_ELEMENT_NAME); + if (uiinfos.size() == 0) { + return Optional.empty(); + } else { + return Optional.of((UIInfo) uiinfos.get(0)); + } + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java index cda00fe4f..379c2c928 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Optional; @Entity @EqualsAndHashCode(callSuper = true) @@ -116,4 +117,9 @@ public List getOrderedChildren() { return Collections.unmodifiableList(children); } + + @Transient + public Optional getOptionalExtensions() { + return Optional.ofNullable(this.getExtensions()); + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java index 77b0dbd79..43d74e6eb 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java @@ -15,6 +15,7 @@ import javax.persistence.Entity; import javax.persistence.OneToMany; import javax.persistence.OrderColumn; +import javax.persistence.Transient; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.List; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index a2fb2391e..ea9c4240b 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -190,9 +190,10 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto displayName.setValue(mduiRepresentation.getDisplayName()); displayName.setXMLLang("en"); } else { - if (getUIInfo(ed).getXMLObjects(DisplayName.DEFAULT_ELEMENT_NAME).size() > 0) { - getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(DisplayName.DEFAULT_ELEMENT_NAME).get(0)); - } + getOptionalSPSSODescriptorFromEntityDescriptor(ed) + .flatMap(SPSSODescriptor::getOptionalExtensions) + .flatMap(Extensions::getOptionalUIInfo) + .ifPresent(u -> u.getXMLObjects().removeAll(u.getDisplayNames())); } if (!Strings.isNullOrEmpty(mduiRepresentation.getInformationUrl())) { @@ -201,9 +202,10 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto informationURL.setValue(mduiRepresentation.getInformationUrl()); informationURL.setXMLLang("en"); } else { - if (getUIInfo(ed).getXMLObjects(InformationURL.DEFAULT_ELEMENT_NAME).size() > 0) { - getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(InformationURL.DEFAULT_ELEMENT_NAME).get(0)); - } + getOptionalSPSSODescriptorFromEntityDescriptor(ed) + .flatMap(SPSSODescriptor::getOptionalExtensions) + .flatMap(Extensions::getOptionalUIInfo) + .ifPresent(u -> u.getXMLObjects().removeAll(u.getInformationURLs())); } if (!Strings.isNullOrEmpty(mduiRepresentation.getPrivacyStatementUrl())) { @@ -212,9 +214,10 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto privacyStatementURL.setValue(mduiRepresentation.getPrivacyStatementUrl()); privacyStatementURL.setXMLLang("en"); } else { - if (getUIInfo(ed).getXMLObjects(PrivacyStatementURL.DEFAULT_ELEMENT_NAME).size() > 0) { - getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(PrivacyStatementURL.DEFAULT_ELEMENT_NAME).get(0)); - } + getOptionalSPSSODescriptorFromEntityDescriptor(ed) + .flatMap(SPSSODescriptor::getOptionalExtensions) + .flatMap(Extensions::getOptionalUIInfo) + .ifPresent(u -> u.getXMLObjects().removeAll(u.getPrivacyStatementURLs())); } if (!Strings.isNullOrEmpty(mduiRepresentation.getDescription())) { @@ -223,9 +226,10 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto description.setValue(mduiRepresentation.getDescription()); description.setXMLLang("en"); } else { - if (getUIInfo(ed).getXMLObjects(Description.DEFAULT_ELEMENT_NAME).size() > 0) { - getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(Description.DEFAULT_ELEMENT_NAME).get(0)); - } + getOptionalSPSSODescriptorFromEntityDescriptor(ed) + .flatMap(SPSSODescriptor::getOptionalExtensions) + .flatMap(Extensions::getOptionalUIInfo) + .ifPresent(u -> u.getXMLObjects().removeAll(u.getDescriptions())); } if (!Strings.isNullOrEmpty(mduiRepresentation.getLogoUrl())) { @@ -236,9 +240,10 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto logo.setWidth(mduiRepresentation.getLogoWidth()); logo.setXMLLang("en"); } else { - if (getUIInfo(ed).getXMLObjects(Description.DEFAULT_ELEMENT_NAME).size() > 0) { - getUIInfo(ed).getXMLObjects().remove(getUIInfo(ed).getXMLObjects(Description.DEFAULT_ELEMENT_NAME).get(0)); - } + getOptionalSPSSODescriptorFromEntityDescriptor(ed) + .flatMap(SPSSODescriptor::getOptionalExtensions) + .flatMap(Extensions::getOptionalUIInfo) + .ifPresent(u -> u.getXMLObjects().removeAll(u.getLogos())); } } else { removeUIInfo(ed); From c8bd24e787ca285762aafae41525a81387513d54 Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 14 Feb 2019 11:44:05 -0600 Subject: [PATCH 11/13] [SHIBUI-1226] refactor to extract methods --- .../JPAEntityDescriptorServiceImpl.java | 256 ++++++++++-------- 1 file changed, 142 insertions(+), 114 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index ea9c4240b..8bd4c678a 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -107,79 +107,92 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto } private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescriptor ed, final EntityDescriptorRepresentation representation) { - // setup SPSSODescriptor - if (representation.getServiceProviderSsoDescriptor() != null) { - SPSSODescriptor spssoDescriptor = getSPSSODescriptorFromEntityDescriptor(ed); - - if (!Strings.isNullOrEmpty(representation.getServiceProviderSsoDescriptor().getProtocolSupportEnum())) { - spssoDescriptor.setSupportedProtocols( - Arrays.stream(representation.getServiceProviderSsoDescriptor().getProtocolSupportEnum().split(",")).map(p -> MDDCConstants.PROTOCOL_BINDINGS.get(p.trim())).collect(Collectors.toList()) - ); - } + setupSPSSODescriptor(ed, representation); + ed.setServiceProviderName(representation.getServiceProviderName()); + ed.setServiceEnabled(representation.isServiceEnabled()); + setupOrganization(ed, representation); + setupContacts(ed, representation); + setupUIInfo(ed, representation); + setupSecurity(ed, representation); + setupACSs(ed, representation); + setupLogout(ed, representation); + setupRelyingPartyOverrides(ed, representation); + return ed; + } - if (representation.getServiceProviderSsoDescriptor() != null && representation.getServiceProviderSsoDescriptor().getNameIdFormats() != null && representation.getServiceProviderSsoDescriptor().getNameIdFormats().size() > 0) { - for (String nameidFormat : representation.getServiceProviderSsoDescriptor().getNameIdFormats()) { - NameIDFormat nameIDFormat = openSamlObjects.buildDefaultInstanceOfType(NameIDFormat.class); + void setupRelyingPartyOverrides(EntityDescriptor ed, EntityDescriptorRepresentation representation) { + if (representation.getRelyingPartyOverrides() != null || (representation.getAttributeRelease() != null && representation.getAttributeRelease().size() > 0)) { + // TODO: review if we need more than a naive implementation + getOptionalEntityAttributes(ed).ifPresent(entityAttributes -> entityAttributes.getAttributes().clear()); + getEntityAttributes(ed).getAttributes().addAll(entityService.getAttributeListFromEntityRepresentation(representation)); + } else { + getOptionalEntityAttributes(ed).ifPresent(entityAttributes -> entityAttributes.getAttributes().clear()); + } + } - nameIDFormat.setFormat(nameidFormat); + void setupLogout(EntityDescriptor ed, EntityDescriptorRepresentation representation) { + // setup logout + if (representation.getLogoutEndpoints() != null && !representation.getLogoutEndpoints().isEmpty()) { + // TODO: review if we need more than a naive implementation + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); + for (LogoutEndpointRepresentation logoutEndpointRepresentation : representation.getLogoutEndpoints()) { + SingleLogoutService singleLogoutService = openSamlObjects.buildDefaultInstanceOfType(SingleLogoutService.class); + singleLogoutService.setBinding(logoutEndpointRepresentation.getBindingType()); + singleLogoutService.setLocation(logoutEndpointRepresentation.getUrl()); - spssoDescriptor.getNameIDFormats().add(nameIDFormat); - } + getSPSSODescriptorFromEntityDescriptor(ed).getSingleLogoutServices().add(singleLogoutService); } } else { - ed.setRoleDescriptors(null); + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); } + } - ed.setServiceProviderName(representation.getServiceProviderName()); - ed.setServiceEnabled(representation.isServiceEnabled()); - - // set up organization - if (representation.getOrganization() != null && representation.getOrganization().getName() != null && representation.getOrganization().getDisplayName() != null && representation.getOrganization().getUrl() != null) { - OrganizationRepresentation organizationRepresentation = representation.getOrganization(); - Organization organization = openSamlObjects.buildDefaultInstanceOfType(Organization.class); - - OrganizationName organizationName = openSamlObjects.buildDefaultInstanceOfType(OrganizationName.class); - organizationName.setXMLLang("en"); - organizationName.setValue(organizationRepresentation.getName()); - organization.getOrganizationNames().add(organizationName); - - OrganizationDisplayName organizationDisplayName = openSamlObjects.buildDefaultInstanceOfType(OrganizationDisplayName.class); - organizationDisplayName.setXMLLang("en"); - organizationDisplayName.setValue(organizationRepresentation.getDisplayName()); - organization.getDisplayNames().add(organizationDisplayName); - - OrganizationURL organizationURL = openSamlObjects.buildDefaultInstanceOfType(OrganizationURL.class); - organizationURL.setXMLLang("en"); - organizationURL.setValue(organizationRepresentation.getUrl()); - organization.getURLs().add(organizationURL); - - ed.setOrganization(organization); + void setupACSs(EntityDescriptor ed, EntityDescriptorRepresentation representation) { + // setup ACSs + if (representation.getAssertionConsumerServices() != null && representation.getAssertionConsumerServices().size() > 0) { + // TODO: review if we need more than a naive implementation + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); + for (AssertionConsumerServiceRepresentation acsRepresentation : representation.getAssertionConsumerServices()) { + AssertionConsumerService assertionConsumerService = openSamlObjects.buildDefaultInstanceOfType(AssertionConsumerService.class); + getSPSSODescriptorFromEntityDescriptor(ed).getAssertionConsumerServices().add(assertionConsumerService); + if (acsRepresentation.isMakeDefault()) { + assertionConsumerService.setIsDefault(true); + } + assertionConsumerService.setBinding(acsRepresentation.getBinding()); + assertionConsumerService.setLocation(acsRepresentation.getLocationUrl()); + } } else { - ed.setOrganization(null); + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); } + } - // set up contacts - if (representation.getContacts() != null && representation.getContacts().size() > 0) { - for (ContactRepresentation contactRepresentation : representation.getContacts()) { - ContactPerson contactPerson = ((ContactPersonBuilder) openSamlObjects.getBuilderFactory().getBuilder(ContactPerson.DEFAULT_ELEMENT_NAME)).buildObject(); - - contactPerson.setType(contactRepresentation.getType()); - - GivenName givenName = openSamlObjects.buildDefaultInstanceOfType(GivenName.class); - givenName.setName(contactRepresentation.getName()); - contactPerson.setGivenName(givenName); - - EmailAddress emailAddress = openSamlObjects.buildDefaultInstanceOfType(EmailAddress.class); - emailAddress.setAddress(contactRepresentation.getEmailAddress()); - contactPerson.addEmailAddress(emailAddress); - - ed.addContactPerson(contactPerson); + void setupSecurity(EntityDescriptor ed, EntityDescriptorRepresentation representation) { + // setup security + if (representation.getSecurityInfo() != null) { + SecurityInfoRepresentation securityInfoRepresentation = representation.getSecurityInfo(); + if (securityInfoRepresentation.isAuthenticationRequestsSigned()) { + getSPSSODescriptorFromEntityDescriptor(ed).setAuthnRequestsSigned(true); + } + if (securityInfoRepresentation.isWantAssertionsSigned()) { + getSPSSODescriptorFromEntityDescriptor(ed).setWantAssertionsSigned(true); + } + if (securityInfoRepresentation.isX509CertificateAvailable()) { + for (SecurityInfoRepresentation.X509CertificateRepresentation x509CertificateRepresentation : securityInfoRepresentation.getX509Certificates()) { + KeyDescriptor keyDescriptor = createKeyDescriptor(x509CertificateRepresentation.getName(), x509CertificateRepresentation.getType(), x509CertificateRepresentation.getValue()); + getSPSSODescriptorFromEntityDescriptor(ed).addKeyDescriptor(keyDescriptor); + } } } else { - ed.getContactPersons().clear(); + getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent( spssoDescriptor -> { + spssoDescriptor.setAuthnRequestsSigned((Boolean) null); + spssoDescriptor.setWantAssertionsSigned((Boolean) null); + spssoDescriptor.getKeyDescriptors().clear(); + }); } + } + void setupUIInfo(EntityDescriptor ed, EntityDescriptorRepresentation representation) { // set up mdui if (representation.getMdui() != null) { MduiRepresentation mduiRepresentation = representation.getMdui(); @@ -248,70 +261,82 @@ private EntityDescriptor buildDescriptorFromRepresentation(final EntityDescripto } else { removeUIInfo(ed); } + } - // setup security - if (representation.getSecurityInfo() != null) { - SecurityInfoRepresentation securityInfoRepresentation = representation.getSecurityInfo(); - if (securityInfoRepresentation.isAuthenticationRequestsSigned()) { - getSPSSODescriptorFromEntityDescriptor(ed).setAuthnRequestsSigned(true); - } - if (securityInfoRepresentation.isWantAssertionsSigned()) { - getSPSSODescriptorFromEntityDescriptor(ed).setWantAssertionsSigned(true); - } - if (securityInfoRepresentation.isX509CertificateAvailable()) { - for (SecurityInfoRepresentation.X509CertificateRepresentation x509CertificateRepresentation : securityInfoRepresentation.getX509Certificates()) { - KeyDescriptor keyDescriptor = createKeyDescriptor(x509CertificateRepresentation.getName(), x509CertificateRepresentation.getType(), x509CertificateRepresentation.getValue()); - getSPSSODescriptorFromEntityDescriptor(ed).addKeyDescriptor(keyDescriptor); - } + void setupContacts(EntityDescriptor ed, EntityDescriptorRepresentation representation) { + // set up contacts + if (representation.getContacts() != null && representation.getContacts().size() > 0) { + for (ContactRepresentation contactRepresentation : representation.getContacts()) { + ContactPerson contactPerson = ((ContactPersonBuilder) openSamlObjects.getBuilderFactory().getBuilder(ContactPerson.DEFAULT_ELEMENT_NAME)).buildObject(); + + contactPerson.setType(contactRepresentation.getType()); + + GivenName givenName = openSamlObjects.buildDefaultInstanceOfType(GivenName.class); + givenName.setName(contactRepresentation.getName()); + contactPerson.setGivenName(givenName); + + EmailAddress emailAddress = openSamlObjects.buildDefaultInstanceOfType(EmailAddress.class); + emailAddress.setAddress(contactRepresentation.getEmailAddress()); + contactPerson.addEmailAddress(emailAddress); + + ed.addContactPerson(contactPerson); } } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent( spssoDescriptor -> { - spssoDescriptor.setAuthnRequestsSigned((Boolean) null); - spssoDescriptor.setWantAssertionsSigned((Boolean) null); - spssoDescriptor.getKeyDescriptors().clear(); - }); + ed.getContactPersons().clear(); } + } - // setup ACSs - if (representation.getAssertionConsumerServices() != null && representation.getAssertionConsumerServices().size() > 0) { - // TODO: review if we need more than a naive implementation - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); - for (AssertionConsumerServiceRepresentation acsRepresentation : representation.getAssertionConsumerServices()) { - AssertionConsumerService assertionConsumerService = openSamlObjects.buildDefaultInstanceOfType(AssertionConsumerService.class); - getSPSSODescriptorFromEntityDescriptor(ed).getAssertionConsumerServices().add(assertionConsumerService); - if (acsRepresentation.isMakeDefault()) { - assertionConsumerService.setIsDefault(true); - } - assertionConsumerService.setBinding(acsRepresentation.getBinding()); - assertionConsumerService.setLocation(acsRepresentation.getLocationUrl()); - } + void setupOrganization(EntityDescriptor ed, EntityDescriptorRepresentation representation) { + // set up organization + if (representation.getOrganization() != null && representation.getOrganization().getName() != null && representation.getOrganization().getDisplayName() != null && representation.getOrganization().getUrl() != null) { + OrganizationRepresentation organizationRepresentation = representation.getOrganization(); + Organization organization = openSamlObjects.buildDefaultInstanceOfType(Organization.class); + + OrganizationName organizationName = openSamlObjects.buildDefaultInstanceOfType(OrganizationName.class); + organizationName.setXMLLang("en"); + organizationName.setValue(organizationRepresentation.getName()); + organization.getOrganizationNames().add(organizationName); + + OrganizationDisplayName organizationDisplayName = openSamlObjects.buildDefaultInstanceOfType(OrganizationDisplayName.class); + organizationDisplayName.setXMLLang("en"); + organizationDisplayName.setValue(organizationRepresentation.getDisplayName()); + organization.getDisplayNames().add(organizationDisplayName); + + OrganizationURL organizationURL = openSamlObjects.buildDefaultInstanceOfType(OrganizationURL.class); + organizationURL.setXMLLang("en"); + organizationURL.setValue(organizationRepresentation.getUrl()); + organization.getURLs().add(organizationURL); + + ed.setOrganization(organization); } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); + ed.setOrganization(null); } + } - // setup logout - if (representation.getLogoutEndpoints() != null && !representation.getLogoutEndpoints().isEmpty()) { - // TODO: review if we need more than a naive implementation - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); - for (LogoutEndpointRepresentation logoutEndpointRepresentation : representation.getLogoutEndpoints()) { - SingleLogoutService singleLogoutService = openSamlObjects.buildDefaultInstanceOfType(SingleLogoutService.class); - singleLogoutService.setBinding(logoutEndpointRepresentation.getBindingType()); - singleLogoutService.setLocation(logoutEndpointRepresentation.getUrl()); + void setupSPSSODescriptor(EntityDescriptor ed, EntityDescriptorRepresentation representation) { + // setup SPSSODescriptor + if (representation.getServiceProviderSsoDescriptor() != null) { + SPSSODescriptor spssoDescriptor = getSPSSODescriptorFromEntityDescriptor(ed); - getSPSSODescriptorFromEntityDescriptor(ed).getSingleLogoutServices().add(singleLogoutService); + if (!Strings.isNullOrEmpty(representation.getServiceProviderSsoDescriptor().getProtocolSupportEnum())) { + spssoDescriptor.setSupportedProtocols( + Arrays.stream(representation.getServiceProviderSsoDescriptor().getProtocolSupportEnum().split(",")).map(p -> MDDCConstants.PROTOCOL_BINDINGS.get(p.trim())).collect(Collectors.toList()) + ); } - } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); - } - if (representation.getRelyingPartyOverrides() != null || (representation.getAttributeRelease() != null && representation.getAttributeRelease().size() > 0)) { - // TODO: review if we need more than a naive implementation - getOptionalEntityAttributes(ed).ifPresent(entityAttributes -> entityAttributes.getAttributes().clear()); - getEntityAttributes(ed).getAttributes().addAll(entityService.getAttributeListFromEntityRepresentation(representation)); + + if (representation.getServiceProviderSsoDescriptor() != null && representation.getServiceProviderSsoDescriptor().getNameIdFormats() != null && representation.getServiceProviderSsoDescriptor().getNameIdFormats().size() > 0) { + for (String nameidFormat : representation.getServiceProviderSsoDescriptor().getNameIdFormats()) { + NameIDFormat nameIDFormat = openSamlObjects.buildDefaultInstanceOfType(NameIDFormat.class); + + nameIDFormat.setFormat(nameidFormat); + + spssoDescriptor.getNameIDFormats().add(nameIDFormat); + } + } } else { - getOptionalEntityAttributes(ed).ifPresent(entityAttributes -> entityAttributes.getAttributes().clear()); + ed.setRoleDescriptors(null); } - return ed; } private Optional getOptionalSPSSODescriptorFromEntityDescriptor(EntityDescriptor entityDescriptor) { @@ -330,12 +355,18 @@ private SPSSODescriptor getSPSSODescriptorFromEntityDescriptor(EntityDescriptor return entityDescriptor.getSPSSODescriptor(""); } - private Attribute createAttributeWithBooleanValue(String name, String friendlyName, Boolean value) { + private Attribute createBaseAttribute(String name, String friendlyName) { Attribute attribute = ((AttributeBuilder) openSamlObjects.getBuilderFactory().getBuilder(Attribute.DEFAULT_ELEMENT_NAME)).buildObject(); attribute.setName(name); attribute.setFriendlyName(friendlyName); attribute.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri"); + return attribute; + } + + private Attribute createAttributeWithBooleanValue(String name, String friendlyName, Boolean value) { + Attribute attribute = createBaseAttribute(name, friendlyName); + XSBoolean xsBoolean = (XSBoolean) openSamlObjects.getBuilderFactory().getBuilder(XSBoolean.TYPE_NAME).buildObject(AttributeValue.DEFAULT_ELEMENT_NAME, XSBoolean.TYPE_NAME); xsBoolean.setValue(XSBooleanValue.valueOf(value.toString())); @@ -344,10 +375,7 @@ private Attribute createAttributeWithBooleanValue(String name, String friendlyNa } private Attribute createAttributeWithArbitraryValues(String name, String friendlyName, String... values) { - Attribute attribute = ((AttributeBuilder) openSamlObjects.getBuilderFactory().getBuilder(Attribute.DEFAULT_ELEMENT_NAME)).buildObject(); - attribute.setName(name); - attribute.setFriendlyName(friendlyName); - attribute.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:uri"); + Attribute attribute = createBaseAttribute(name, friendlyName); for (String value : values) { XSAny xsAny = (XSAny) openSamlObjects.getBuilderFactory().getBuilder(XSAny.TYPE_NAME).buildObject(AttributeValue.DEFAULT_ELEMENT_NAME); From 20a159860cf500691e705f1ddb613b820237654f Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 14 Feb 2019 12:46:04 -0600 Subject: [PATCH 12/13] [SHIBUI-1226] refactor --- .../admin/ui/domain/EntityDescriptor.java | 11 +++++++++ .../JPAEntityDescriptorServiceImpl.java | 24 ++++++++----------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityDescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityDescriptor.java index 498e46f32..2f53e5cc8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityDescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityDescriptor.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; @@ -171,6 +172,16 @@ public SPSSODescriptor getSPSSODescriptor(String s) { .orElse(null); } + @Transient + public Optional getOptionalSPSSODescriptor(String s) { + return Optional.ofNullable(this.getSPSSODescriptor(s)); + } + + @Transient + public Optional getOptionalSPSSODescriptor() { + return this.getOptionalSPSSODescriptor(""); + } + @Override public AuthnAuthorityDescriptor getAuthnAuthorityDescriptor(String s) { return authnAuthorityDescriptor; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index 8bd4c678a..ba3680ee7 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -135,7 +135,7 @@ void setupLogout(EntityDescriptor ed, EntityDescriptorRepresentation representat // setup logout if (representation.getLogoutEndpoints() != null && !representation.getLogoutEndpoints().isEmpty()) { // TODO: review if we need more than a naive implementation - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); + ed.getOptionalSPSSODescriptor().ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); for (LogoutEndpointRepresentation logoutEndpointRepresentation : representation.getLogoutEndpoints()) { SingleLogoutService singleLogoutService = openSamlObjects.buildDefaultInstanceOfType(SingleLogoutService.class); singleLogoutService.setBinding(logoutEndpointRepresentation.getBindingType()); @@ -144,7 +144,7 @@ void setupLogout(EntityDescriptor ed, EntityDescriptorRepresentation representat getSPSSODescriptorFromEntityDescriptor(ed).getSingleLogoutServices().add(singleLogoutService); } } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); + ed.getOptionalSPSSODescriptor().ifPresent(spssoDescriptor -> spssoDescriptor.getSingleLogoutServices().clear()); } } @@ -152,7 +152,7 @@ void setupACSs(EntityDescriptor ed, EntityDescriptorRepresentation representatio // setup ACSs if (representation.getAssertionConsumerServices() != null && representation.getAssertionConsumerServices().size() > 0) { // TODO: review if we need more than a naive implementation - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); + ed.getOptionalSPSSODescriptor().ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); for (AssertionConsumerServiceRepresentation acsRepresentation : representation.getAssertionConsumerServices()) { AssertionConsumerService assertionConsumerService = openSamlObjects.buildDefaultInstanceOfType(AssertionConsumerService.class); getSPSSODescriptorFromEntityDescriptor(ed).getAssertionConsumerServices().add(assertionConsumerService); @@ -163,7 +163,7 @@ void setupACSs(EntityDescriptor ed, EntityDescriptorRepresentation representatio assertionConsumerService.setLocation(acsRepresentation.getLocationUrl()); } } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); + ed.getOptionalSPSSODescriptor().ifPresent(spssoDescriptor -> spssoDescriptor.getAssertionConsumerServices().clear()); } } @@ -184,7 +184,7 @@ void setupSecurity(EntityDescriptor ed, EntityDescriptorRepresentation represent } } } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed).ifPresent( spssoDescriptor -> { + ed.getOptionalSPSSODescriptor().ifPresent( spssoDescriptor -> { spssoDescriptor.setAuthnRequestsSigned((Boolean) null); spssoDescriptor.setWantAssertionsSigned((Boolean) null); spssoDescriptor.getKeyDescriptors().clear(); @@ -203,7 +203,7 @@ void setupUIInfo(EntityDescriptor ed, EntityDescriptorRepresentation representat displayName.setValue(mduiRepresentation.getDisplayName()); displayName.setXMLLang("en"); } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed) + ed.getOptionalSPSSODescriptor() .flatMap(SPSSODescriptor::getOptionalExtensions) .flatMap(Extensions::getOptionalUIInfo) .ifPresent(u -> u.getXMLObjects().removeAll(u.getDisplayNames())); @@ -215,7 +215,7 @@ void setupUIInfo(EntityDescriptor ed, EntityDescriptorRepresentation representat informationURL.setValue(mduiRepresentation.getInformationUrl()); informationURL.setXMLLang("en"); } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed) + ed.getOptionalSPSSODescriptor() .flatMap(SPSSODescriptor::getOptionalExtensions) .flatMap(Extensions::getOptionalUIInfo) .ifPresent(u -> u.getXMLObjects().removeAll(u.getInformationURLs())); @@ -227,7 +227,7 @@ void setupUIInfo(EntityDescriptor ed, EntityDescriptorRepresentation representat privacyStatementURL.setValue(mduiRepresentation.getPrivacyStatementUrl()); privacyStatementURL.setXMLLang("en"); } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed) + ed.getOptionalSPSSODescriptor() .flatMap(SPSSODescriptor::getOptionalExtensions) .flatMap(Extensions::getOptionalUIInfo) .ifPresent(u -> u.getXMLObjects().removeAll(u.getPrivacyStatementURLs())); @@ -239,7 +239,7 @@ void setupUIInfo(EntityDescriptor ed, EntityDescriptorRepresentation representat description.setValue(mduiRepresentation.getDescription()); description.setXMLLang("en"); } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed) + ed.getOptionalSPSSODescriptor() .flatMap(SPSSODescriptor::getOptionalExtensions) .flatMap(Extensions::getOptionalUIInfo) .ifPresent(u -> u.getXMLObjects().removeAll(u.getDescriptions())); @@ -253,7 +253,7 @@ void setupUIInfo(EntityDescriptor ed, EntityDescriptorRepresentation representat logo.setWidth(mduiRepresentation.getLogoWidth()); logo.setXMLLang("en"); } else { - getOptionalSPSSODescriptorFromEntityDescriptor(ed) + ed.getOptionalSPSSODescriptor() .flatMap(SPSSODescriptor::getOptionalExtensions) .flatMap(Extensions::getOptionalUIInfo) .ifPresent(u -> u.getXMLObjects().removeAll(u.getLogos())); @@ -339,10 +339,6 @@ void setupSPSSODescriptor(EntityDescriptor ed, EntityDescriptorRepresentation re } } - private Optional getOptionalSPSSODescriptorFromEntityDescriptor(EntityDescriptor entityDescriptor) { - return Optional.ofNullable(getSPSSODescriptorFromEntityDescriptor(entityDescriptor, false)); - } - private SPSSODescriptor getSPSSODescriptorFromEntityDescriptor(EntityDescriptor entityDescriptor) { return getSPSSODescriptorFromEntityDescriptor(entityDescriptor, true); } From 22d3f57c6fb070169829f3f6b464c6521349acea Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 14 Feb 2019 12:53:07 -0600 Subject: [PATCH 13/13] [SHIBUI-1226] remove unused import --- .../edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java index 43d74e6eb..77b0dbd79 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java @@ -15,7 +15,6 @@ import javax.persistence.Entity; import javax.persistence.OneToMany; import javax.persistence.OrderColumn; -import javax.persistence.Transient; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.List;