From e9278dec9a1b19c08fbf19d98057acff6a363ad1 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 1 Jul 2019 16:07:57 -0400 Subject: [PATCH 01/13] SHIBUI-1337 --- ...EntityDescriptorVersionServiceTests.groovy | 3 +- ...MetadataResolverVersionServiceTests.groovy | 4 +- .../EnversVersioningMetadataTests.groovy | 84 +++++++++++++++++++ .../EntitiesVersioningConfiguration.java | 2 +- .../admin/ui/domain/AbstractAuditable.java | 21 +++++ .../envers/EnversVersionServiceSupport.java | 12 ++- .../envers/PrincipalAwareRevisionEntity.java | 1 - .../ui/security/DefaultAuditorAware.java | 7 +- .../EnversEntityDescriptorVersionService.java | 61 ++------------ .../ui/configuration/TestConfiguration.groovy | 7 ++ .../envers/EnversTestsSupport.groovy | 4 + .../shibui/pac4j/Pac4jAuditorAware.java | 5 +- 12 files changed, 142 insertions(+), 69 deletions(-) create mode 100644 backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversEntityDescriptorVersionServiceTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversEntityDescriptorVersionServiceTests.groovy index ac5a4d129..0289be502 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversEntityDescriptorVersionServiceTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversEntityDescriptorVersionServiceTests.groovy @@ -13,12 +13,12 @@ import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorVersionSer import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.domain.EntityScan import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest +import org.springframework.data.jpa.repository.config.EnableJpaAuditing import org.springframework.data.jpa.repository.config.EnableJpaRepositories import org.springframework.test.context.ContextConfiguration import org.springframework.transaction.PlatformTransactionManager import spock.lang.Specification -import java.time.LocalDateTime import java.time.ZonedDateTime @@ -26,6 +26,7 @@ import java.time.ZonedDateTime @ContextConfiguration(classes = [CoreShibUiConfiguration, InternationalizationConfiguration, TestConfiguration, SearchConfiguration, EntitiesVersioningConfiguration]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") +@EnableJpaAuditing class EnversEntityDescriptorVersionServiceTests extends Specification { @Autowired diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversMetadataResolverVersionServiceTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversMetadataResolverVersionServiceTests.groovy index 8f68922ed..97b37f10e 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversMetadataResolverVersionServiceTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversMetadataResolverVersionServiceTests.groovy @@ -6,7 +6,6 @@ import edu.internet2.tier.shibboleth.admin.ui.configuration.EntitiesVersioningCo import edu.internet2.tier.shibboleth.admin.ui.configuration.InternationalizationConfiguration import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration -import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver @@ -18,12 +17,12 @@ import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverVersionSer import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.domain.EntityScan import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest +import org.springframework.data.jpa.repository.config.EnableJpaAuditing import org.springframework.data.jpa.repository.config.EnableJpaRepositories import org.springframework.test.context.ContextConfiguration import org.springframework.transaction.PlatformTransactionManager import spock.lang.Specification -import java.time.LocalDateTime import java.time.ZonedDateTime @@ -31,6 +30,7 @@ import java.time.ZonedDateTime @ContextConfiguration(classes = [CoreShibUiConfiguration, InternationalizationConfiguration, TestConfiguration, SearchConfiguration, EntitiesVersioningConfiguration]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") +@EnableJpaAuditing class EnversMetadataResolverVersionServiceTests extends Specification { @Autowired diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy new file mode 100644 index 000000000..c4e677c57 --- /dev/null +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy @@ -0,0 +1,84 @@ +package edu.internet2.tier.shibboleth.admin.ui.service.envers + +import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration +import edu.internet2.tier.shibboleth.admin.ui.configuration.EntitiesVersioningConfiguration +import edu.internet2.tier.shibboleth.admin.ui.configuration.InternationalizationConfiguration +import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration +import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration +import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository +import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository +import edu.internet2.tier.shibboleth.admin.ui.repository.envers.EnversTestsSupport +import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorVersionService +import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverVersionService +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.autoconfigure.domain.EntityScan +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest +import org.springframework.data.jpa.repository.config.EnableJpaAuditing +import org.springframework.data.jpa.repository.config.EnableJpaRepositories +import org.springframework.test.context.ContextConfiguration +import org.springframework.transaction.PlatformTransactionManager +import spock.lang.Specification + +@DataJpaTest +@ContextConfiguration(classes = [CoreShibUiConfiguration, InternationalizationConfiguration, TestConfiguration, SearchConfiguration, EntitiesVersioningConfiguration]) +@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) +@EntityScan("edu.internet2.tier.shibboleth.admin.ui") +@EnableJpaAuditing +class EnversVersioningMetadataTests extends Specification { + + @Autowired + MetadataResolverVersionService metadataResolverVersionService + + @Autowired + MetadataResolverRepository metadataResolverRepository + + @Autowired + EntityDescriptorVersionService entityDescriptorVersionService + + @Autowired + EntityDescriptorRepository entityDescriptorRepository + + @Autowired + PlatformTransactionManager txMgr + + def "versioning service uses versioning metadata from target entities enhanced by boot auditing facility"() { + when: 'Initial versions' + MetadataResolver mr = new LocalDynamicMetadataResolver(name: 'resolver') + EntityDescriptor ed = new EntityDescriptor(serviceProviderName: 'descriptor') + mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { + metadataResolverRepository.save(mr) + } + ed = EnversTestsSupport.doInExplicitTransaction(txMgr) { + entityDescriptorRepository.save(ed) + } + def mrVersions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) + def edVersions = entityDescriptorVersionService.findVersionsForEntityDescriptor(ed.resourceId) + + then: + mrVersions[0].creator == mr.createdBy + mrVersions[0].date == mr.createdDateAsZonedDateTime() + edVersions[0].creator == ed.createdBy + edVersions[0].date == ed.createdDateAsZonedDateTime() + + when: 'new version due to update' + mr.name = 'UPDATED' + ed.serviceProviderName = 'UPDATED' + mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { + metadataResolverRepository.save(mr) + } + ed = EnversTestsSupport.doInExplicitTransaction(txMgr) { + entityDescriptorRepository.save(ed) + } + mrVersions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) + edVersions = entityDescriptorVersionService.findVersionsForEntityDescriptor(ed.resourceId) + + then: + mrVersions[1].creator == mr.modifiedBy + mrVersions[1].date == mr.modifiedDateAsZonedDateTime() + edVersions[1].creator == ed.modifiedBy + edVersions[1].date == ed.modifiedDateAsZonedDateTime() + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java index ec21d42c4..9341a45c2 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java @@ -20,7 +20,7 @@ public class EntitiesVersioningConfiguration { @Bean public EntityDescriptorVersionService entityDescriptorVersionService(EntityDescriptorService entityDescriptorService) { - return new EnversEntityDescriptorVersionService(entityManager, entityDescriptorService); + return new EnversEntityDescriptorVersionService(enversVersionServiceSupport(), entityDescriptorService); } @Bean diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java index 567a6637e..24731b6f3 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java @@ -17,7 +17,12 @@ import javax.persistence.Id; import javax.persistence.MappedSuperclass; import javax.validation.constraints.NotNull; +import java.time.Instant; import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; @MappedSuperclass @@ -94,4 +99,20 @@ public String getModifiedBy() { public void setModifiedBy(String modifiedBy) { this.modifiedBy = modifiedBy; } + + public ZonedDateTime createdDateAsZonedDateTime() { + return toZonedDateTime(this.createdDate); + } + + public ZonedDateTime modifiedDateAsZonedDateTime() { + return toZonedDateTime(this.modifiedDate); + } + + private static ZonedDateTime toZonedDateTime(LocalDateTime localDateTime) { + return localDateTime + .atZone(ZoneId.systemDefault()) + .toInstant() + .atOffset(ZoneOffset.UTC) + .toZonedDateTime(); + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java index 964ede86a..b12d943fc 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java @@ -1,5 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.envers; +import edu.internet2.tier.shibboleth.admin.ui.domain.AbstractAuditable; import edu.internet2.tier.shibboleth.admin.ui.domain.versioning.Version; import org.hibernate.envers.AuditReaderFactory; import org.hibernate.envers.query.AuditEntity; @@ -31,14 +32,11 @@ public List findVersionsForPersistentEntity(String resourceId, Class .getResultList(); Object listOfVersions = revs.stream() - .map(it -> ((Object[]) it)[1]) + //.map(it -> ((Object[]) it)) .map(it -> { - return new Version(((PrincipalAwareRevisionEntity) it).idAsString(), - ((PrincipalAwareRevisionEntity) it).getPrincipalUserName(), - ((PrincipalAwareRevisionEntity) it).getRevisionDate() - .toInstant() - .atOffset(ZoneOffset.UTC) - .toZonedDateTime()); + return new Version(((PrincipalAwareRevisionEntity) ((Object[]) it)[1]).idAsString(), + ((AbstractAuditable) ((Object[]) it)[0]).getModifiedBy(), + ((AbstractAuditable) ((Object[]) it)[0]).modifiedDateAsZonedDateTime()); }) .sorted(comparing(Version::getDate)) .collect(toList()); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/PrincipalAwareRevisionEntity.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/PrincipalAwareRevisionEntity.java index 6a2847b38..e0aef8807 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/PrincipalAwareRevisionEntity.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/PrincipalAwareRevisionEntity.java @@ -2,7 +2,6 @@ import lombok.Getter; import lombok.Setter; -import org.hibernate.envers.DefaultRevisionEntity; import org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity; import org.hibernate.envers.RevisionEntity; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/DefaultAuditorAware.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/DefaultAuditorAware.java index 080b4312d..9ec1a7eb7 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/DefaultAuditorAware.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/DefaultAuditorAware.java @@ -3,7 +3,6 @@ import org.springframework.data.domain.AuditorAware; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.User; import java.util.Optional; @@ -16,12 +15,14 @@ */ public class DefaultAuditorAware implements AuditorAware { + private static final String ANONYMOUS = "anonymousUser"; + @Override public Optional getCurrentAuditor() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || !authentication.isAuthenticated()) { - return Optional.empty(); + return Optional.of(ANONYMOUS); } - return Optional.of(User.class.cast(authentication.getPrincipal()).getUsername()); + return Optional.of(authentication.getName()); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java index f21d9d227..2bfced24d 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java @@ -3,77 +3,32 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor; import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityDescriptorRepresentation; import edu.internet2.tier.shibboleth.admin.ui.domain.versioning.Version; -import edu.internet2.tier.shibboleth.admin.ui.envers.PrincipalAwareRevisionEntity; -import org.hibernate.envers.AuditReader; -import org.hibernate.envers.AuditReaderFactory; -import org.hibernate.envers.RevisionEntity; -import org.hibernate.envers.query.AuditEntity; -import org.springframework.data.jpa.repository.JpaContext; +import edu.internet2.tier.shibboleth.admin.ui.envers.EnversVersionServiceSupport; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.util.Arrays; -import java.util.Comparator; import java.util.List; -import java.util.stream.Collectors; - -import static java.util.Comparator.comparing; -import static java.util.stream.Collectors.toList; /** - * Hibernate Envers based implementation of {@link EntityDescriptorVersionService}. - * TODO: refactor this implementation using EnversVersionServiceSupport class + * Hibernate Envers based implementation of {@link EntityDescriptorVersionService}.* */ public class EnversEntityDescriptorVersionService implements EntityDescriptorVersionService { - private EntityManager entityManager; + private EnversVersionServiceSupport enversVersionServiceSupport; private EntityDescriptorService entityDescriptorService; - public EnversEntityDescriptorVersionService(EntityManager entityManager, EntityDescriptorService entityDescriptorService) { - this.entityManager = entityManager; + public EnversEntityDescriptorVersionService(EnversVersionServiceSupport enversVersionServiceSupport, EntityDescriptorService entityDescriptorService) { + this.enversVersionServiceSupport = enversVersionServiceSupport; this.entityDescriptorService = entityDescriptorService; } @Override public List findVersionsForEntityDescriptor(String resourceId) { - List revs = AuditReaderFactory.get(entityManager).createQuery() - .forRevisionsOfEntity(EntityDescriptor.class, false, false) - .add(AuditEntity.property("resourceId").eq(resourceId)) - .getResultList(); - - Object listOfVersions = revs.stream() - .map(it -> ((Object[])it)[1]) - .map(it -> { - return new Version(((PrincipalAwareRevisionEntity) it).idAsString(), - ((PrincipalAwareRevisionEntity) it).getPrincipalUserName(), - ((PrincipalAwareRevisionEntity) it).getRevisionDate() - .toInstant() - .atOffset(ZoneOffset.UTC) - .toZonedDateTime()); - }) - .sorted(comparing(Version::getDate)) - .collect(toList()); - - return (List)listOfVersions; + return enversVersionServiceSupport.findVersionsForPersistentEntity(resourceId, EntityDescriptor.class); } @Override public EntityDescriptorRepresentation findSpecificVersionOfEntityDescriptor(String resourceId, String versionId) { - try { - Object revision = AuditReaderFactory.get(entityManager).createQuery() - .forEntitiesAtRevision(EntityDescriptor.class, Integer.valueOf(versionId)) - .add(AuditEntity.property("resourceId").eq(resourceId)) - .add(AuditEntity.revisionNumber().eq(Integer.valueOf(versionId))) - .getSingleResult(); - return entityDescriptorService.createRepresentationFromDescriptor((EntityDescriptor) revision); - } - catch (NoResultException e) { - return null; - } + Object edObject = enversVersionServiceSupport.findSpecificVersionOfPersistentEntity(resourceId, versionId, EntityDescriptor.class); + return edObject == null ? null : entityDescriptorService.createRepresentationFromDescriptor((EntityDescriptor) edObject); } } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy index a01645a09..676547ffd 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy @@ -3,6 +3,7 @@ package edu.internet2.tier.shibboleth.admin.ui.configuration import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlChainingMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository +import edu.internet2.tier.shibboleth.admin.ui.security.DefaultAuditorAware import edu.internet2.tier.shibboleth.admin.ui.service.IndexWriterService import net.shibboleth.ext.spring.resource.ResourceHelper import net.shibboleth.utilities.java.support.component.ComponentInitializationException @@ -20,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.core.io.ClassPathResource +import org.springframework.data.domain.AuditorAware import org.springframework.mail.javamail.JavaMailSender import org.springframework.mail.javamail.JavaMailSenderImpl @@ -87,4 +89,9 @@ class TestConfiguration { metadataResolver.initialize() return metadataResolver } + + @Bean + AuditorAware defaultAuditorAware() { + return new DefaultAuditorAware() + } } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EnversTestsSupport.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EnversTestsSupport.groovy index 2052cf9d1..cd1bb58b5 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EnversTestsSupport.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EnversTestsSupport.groovy @@ -13,6 +13,10 @@ import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.support.DefaultTransactionDefinition import javax.persistence.EntityManager +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.ZoneOffset +import java.time.ZonedDateTime import static org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRES_NEW 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 index 0fe287c7e..47332d43b 100644 --- a/pac4j-module/src/main/java/net/unicon/shibui/pac4j/Pac4jAuditorAware.java +++ b/pac4j-module/src/main/java/net/unicon/shibui/pac4j/Pac4jAuditorAware.java @@ -7,11 +7,14 @@ import java.util.Optional; public class Pac4jAuditorAware implements AuditorAware { + + private static final String ANONYMOUS = "anonymousUser"; + @Override public Optional getCurrentAuditor() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null) { - return Optional.empty(); + return Optional.of(ANONYMOUS); } return Optional.of(authentication.getName()); } From 1abd039def1ed01075504b5b9b76727e25708e7c Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 2 Jul 2019 14:12:33 -0400 Subject: [PATCH 02/13] SHIBUI-1337 --- ...lerVersionEndpointsIntegrationTests.groovy | 6 +-- .../EnversVersioningMetadataTests.groovy | 43 +++++++++++++++++++ .../admin/ui/domain/AbstractAuditable.java | 16 ++++++- .../EntityDescriptorRepresentation.java | 14 ++++++ .../envers/EnversVersionServiceSupport.java | 22 ++++++++-- .../JPAEntityDescriptorServiceImpl.java | 1 + .../VersionJsonSerializationBasicTests.groovy | 6 ++- 7 files changed, 99 insertions(+), 9 deletions(-) diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy index 705f50021..99b5810ce 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy @@ -36,7 +36,7 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi result.statusCodeValue == 404 } - def "GET /api/EntityDescriptor{resourceId}/Versions with 1 entity descriptor version"() { + def "GET /api/EntityDescriptor/{resourceId}/Versions with 1 entity descriptor version"() { given: EntityDescriptor ed = new EntityDescriptor(entityID: 'http://test/controller', createdBy: 'anonymousUser') entityDescriptorRepository.save(ed) @@ -50,7 +50,7 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi result.body[0].id && result.body[0].creator && result.body[0].date } - def "GET /api/EntityDescriptor{resourceId}/Versions with 2 entity descriptor versions"() { + def "GET /api/EntityDescriptor/{resourceId}/Versions with 2 entity descriptor versions"() { given: EntityDescriptor ed = new EntityDescriptor(entityID: 'http://test/controller', createdBy: 'anonymousUser') ed = entityDescriptorRepository.save(ed) @@ -68,7 +68,7 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi result.body[0].date < result.body[1].date } - def "GET /api/EntityDescriptor{resourceId}/Versions/{version} for non existent version"() { + def "GET /api/EntityDescriptor/{resourceId}/Versions/{version} for non existent version"() { given: EntityDescriptor ed = new EntityDescriptor(entityID: 'http://test/controller', createdBy: 'anonymousUser') ed = entityDescriptorRepository.save(ed) diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy index c4e677c57..9eed8e2bc 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversVersioningMetadataTests.groovy @@ -6,6 +6,7 @@ import edu.internet2.tier.shibboleth.admin.ui.configuration.Internationalization import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository @@ -81,4 +82,46 @@ class EnversVersioningMetadataTests extends Specification { edVersions[1].creator == ed.modifiedBy edVersions[1].date == ed.modifiedDateAsZonedDateTime() } + + def "test current version correct logic"() { + when: 'Initial versions' + MetadataResolver mr = new DynamicHttpMetadataResolver(name: 'resolver') + EntityDescriptor ed = new EntityDescriptor(serviceProviderName: 'descriptor') + mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { + metadataResolverRepository.save(mr) + } + ed = EnversTestsSupport.doInExplicitTransaction(txMgr) { + entityDescriptorRepository.save(ed) + } + def mrVersions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) + def edVersions = entityDescriptorVersionService.findVersionsForEntityDescriptor(ed.resourceId) + def mrV1 = metadataResolverVersionService.findSpecificVersionOfMetadataResolver(mr.resourceId, mrVersions[0].id) + def edV1 = entityDescriptorVersionService.findSpecificVersionOfEntityDescriptor(ed.resourceId, edVersions[0].id) + + then: + mrV1.isCurrent() + edV1.isCurrent() + + when: 'new version due to update' + mr.name = 'UPDATED' + ed.serviceProviderName = 'UPDATED' + mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { + metadataResolverRepository.save(mr) + } + ed = EnversTestsSupport.doInExplicitTransaction(txMgr) { + entityDescriptorRepository.save(ed) + } + mrVersions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) + edVersions = entityDescriptorVersionService.findVersionsForEntityDescriptor(ed.resourceId) + mrV1 = metadataResolverVersionService.findSpecificVersionOfMetadataResolver(mr.resourceId, mrVersions[0].id) + edV1 = entityDescriptorVersionService.findSpecificVersionOfEntityDescriptor(ed.resourceId, edVersions[0].id) + def mrV2 = metadataResolverVersionService.findSpecificVersionOfMetadataResolver(mr.resourceId, mrVersions[1].id) + def edV2 = entityDescriptorVersionService.findSpecificVersionOfEntityDescriptor(ed.resourceId, edVersions[1].id) + + then: + !mrV1.isCurrent() + !edV1.isCurrent() + mrV2.isCurrent() + edV2.isCurrent() + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java index 24731b6f3..3d2ed1391 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java @@ -1,5 +1,7 @@ package edu.internet2.tier.shibboleth.admin.ui.domain; +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.EqualsAndHashCode; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; @@ -16,6 +18,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; +import javax.persistence.Transient; import javax.validation.constraints.NotNull; import java.time.Instant; import java.time.LocalDateTime; @@ -27,7 +30,7 @@ @MappedSuperclass @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode +@EqualsAndHashCode(exclude = {"current"}) @Audited public abstract class AbstractAuditable implements Auditable { @@ -53,6 +56,9 @@ public abstract class AbstractAuditable implements Auditable { @LastModifiedBy private String modifiedBy; + @Transient + @JsonProperty + private boolean current; @Override public Long getAudId() { @@ -108,6 +114,14 @@ public ZonedDateTime modifiedDateAsZonedDateTime() { return toZonedDateTime(this.modifiedDate); } + public boolean isCurrent() { + return this.current; + } + + public void markAsCurrent() { + this.current = true; + } + private static ZonedDateTime toZonedDateTime(LocalDateTime localDateTime) { return localDateTime .atZone(ZoneId.systemDefault()) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/frontend/EntityDescriptorRepresentation.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/frontend/EntityDescriptorRepresentation.java index e378f5fbb..44f1463c5 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/frontend/EntityDescriptorRepresentation.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/frontend/EntityDescriptorRepresentation.java @@ -1,5 +1,7 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.frontend; +import com.fasterxml.jackson.annotation.JsonProperty; + import javax.validation.constraints.NotNull; import java.io.Serializable; import java.time.LocalDateTime; @@ -64,6 +66,9 @@ public EntityDescriptorRepresentation(String id, private String createdBy; + @JsonProperty + private boolean current; + public String getId() { return id; } @@ -112,6 +117,7 @@ public void setMdui(MduiRepresentation mdui) { this.mdui = mdui; } + public ServiceProviderSsoDescriptorRepresentation getServiceProviderSsoDescriptor() { return this.getServiceProviderSsoDescriptor(false); } @@ -213,4 +219,12 @@ public String getCreatedBy() { public void setCreatedBy(String createdBy) { this.createdBy = createdBy; } + + public boolean isCurrent() { + return current; + } + + public void setCurrent(boolean current) { + this.current = current; + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java index b12d943fc..b5e713143 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java @@ -46,14 +46,30 @@ public List findVersionsForPersistentEntity(String resourceId, Class public Object findSpecificVersionOfPersistentEntity(String resourceId, String versionId, Class entityClass) { try { - return AuditReaderFactory.get(entityManager).createQuery() + AbstractAuditable abstractAuditable = + (AbstractAuditable) AuditReaderFactory.get(entityManager).createQuery() .forEntitiesAtRevision(entityClass, Integer.valueOf(versionId)) .add(AuditEntity.property("resourceId").eq(resourceId)) .add(AuditEntity.revisionNumber().eq(Integer.valueOf(versionId))) .getSingleResult(); - } - catch (NoResultException e) { + if(isCurrentRevision(resourceId, versionId, entityClass)) { + abstractAuditable.markAsCurrent(); + } + return abstractAuditable; + } catch (NoResultException e) { return null; } } + + private boolean isCurrentRevision(String resourceId, String versionId, Class entityClass) { + Number revision = (Number) AuditReaderFactory + .get(entityManager) + .createQuery() + .forRevisionsOfEntity(entityClass, false, false) + .addProjection(AuditEntity.revisionNumber().max()) + .add(AuditEntity.property("resourceId").eq(resourceId)) + .getSingleResult(); + + return Integer.valueOf(versionId) == revision.intValue(); + } } 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 ca7a8659e..7be97f308 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 @@ -497,6 +497,7 @@ public EntityDescriptorRepresentation createRepresentationFromDescriptor(org.ope representation.setModifiedDate(ed.getModifiedDate()); representation.setVersion(ed.hashCode()); representation.setCreatedBy(ed.getCreatedBy()); + representation.setCurrent(ed.isCurrent()); if (ed.getSPSSODescriptor("") != null && ed.getSPSSODescriptor("").getSupportedProtocols().size() > 0) { ServiceProviderSsoDescriptorRepresentation serviceProviderSsoDescriptorRepresentation = representation.getServiceProviderSsoDescriptor(true); diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/versioning/VersionJsonSerializationBasicTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/versioning/VersionJsonSerializationBasicTests.groovy index 011fe7033..c05d9e52b 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/versioning/VersionJsonSerializationBasicTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/versioning/VersionJsonSerializationBasicTests.groovy @@ -22,12 +22,12 @@ class VersionJsonSerializationBasicTests extends Specification { def "Verify basic Version JSON serialization"() { given: def staticDate = ZonedDateTime.parse("2019-05-20T15:00:00.574Z") - def version = new Version('2', 'kramer', staticDate) + def version = new Version('2', 'kramer', staticDate, false) def expectedJson = """ { "id": "2", "creator": "kramer", - "date": "2019-05-20T15:00:00.574Z" + "date": "2019-05-20T15:00:00.574Z" } """ def expectedJsonMap = jsonSlurper.parseText(expectedJson) @@ -37,5 +37,7 @@ class VersionJsonSerializationBasicTests extends Specification { then: deSerializedJsonMap.date == expectedJsonMap.date + deSerializedJsonMap.id == expectedJsonMap.id + deSerializedJsonMap.creator == expectedJsonMap.creator } } From d3da0192f0b5095a9a970d23e845b2ca7f223cc3 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Wed, 3 Jul 2019 10:22:02 -0400 Subject: [PATCH 03/13] Fix tests --- .../EntityDescriptorControllerTests.groovy | 24 ++++++++++++------- .../VersionJsonSerializationBasicTests.groovy | 2 +- .../UsersControllerIntegrationTests.groovy | 18 +++++++------- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy index 89cb89d54..bf3778fbb 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy @@ -147,7 +147,8 @@ class EntityDescriptorControllerTests extends Specification { "relyingPartyOverrides": null, "attributeRelease": null, "version": $version, - "createdBy": null + "createdBy": null, + "current": false } ] """ @@ -202,7 +203,8 @@ class EntityDescriptorControllerTests extends Specification { "relyingPartyOverrides": null, "attributeRelease": null, "version": $versionOne, - "createdBy": null + "createdBy": null, + "current": false }, { "id": "uuid-2", @@ -221,7 +223,8 @@ class EntityDescriptorControllerTests extends Specification { "relyingPartyOverrides": null, "attributeRelease": null, "version": $versionTwo, - "createdBy": null + "createdBy": null, + "current": false } ] """ @@ -273,7 +276,8 @@ class EntityDescriptorControllerTests extends Specification { "relyingPartyOverrides": null, "attributeRelease": null, "version": $versionOne, - "createdBy": "someUser" + "createdBy": "someUser", + "current": false } ] """ @@ -325,7 +329,8 @@ class EntityDescriptorControllerTests extends Specification { "securityInfo": null, "assertionConsumerServices": null, "relyingPartyOverrides": null, - "attributeRelease": null + "attributeRelease": null, + "current": false } """ @@ -348,7 +353,8 @@ class EntityDescriptorControllerTests extends Specification { "relyingPartyOverrides": null, "attributeRelease": null, "version": $version, - "createdBy": null + "createdBy": null, + "current": false } """ @@ -504,7 +510,8 @@ class EntityDescriptorControllerTests extends Specification { "relyingPartyOverrides": null, "attributeRelease": null, "version": $version, - "createdBy": null + "createdBy": null, + "current": false } """ @@ -556,7 +563,8 @@ class EntityDescriptorControllerTests extends Specification { "relyingPartyOverrides": null, "attributeRelease": null, "version": $version, - "createdBy": "someUser" + "createdBy": "someUser", + "current": false } """ diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/versioning/VersionJsonSerializationBasicTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/versioning/VersionJsonSerializationBasicTests.groovy index c05d9e52b..b7fecdf4d 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/versioning/VersionJsonSerializationBasicTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/versioning/VersionJsonSerializationBasicTests.groovy @@ -22,7 +22,7 @@ class VersionJsonSerializationBasicTests extends Specification { def "Verify basic Version JSON serialization"() { given: def staticDate = ZonedDateTime.parse("2019-05-20T15:00:00.574Z") - def version = new Version('2', 'kramer', staticDate, false) + def version = new Version('2', 'kramer', staticDate) def expectedJson = """ { "id": "2", diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy index 0e96fc1b7..ab60461a0 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy @@ -39,30 +39,30 @@ class UsersControllerIntegrationTests extends Specification { def expectedJson = """ [ { - "modifiedBy" : null, + "modifiedBy" : anonymousUser, "firstName" : "Joe", "emailAddress" : "joe@institution.edu", "role" : "ROLE_ADMIN", "username" : "admin", - "createdBy" : null, + "createdBy" : anonymousUser, "lastName" : "Doe" }, { - "modifiedBy" : null, + "modifiedBy" : anonymousUser, "firstName" : "Peter", "emailAddress" : "peter@institution.edu", "role" : "ROLE_USER", "username" : "nonadmin", - "createdBy" : null, + "createdBy" : anonymousUser, "lastName" : "Vandelay" }, { - "modifiedBy" : null, + "modifiedBy" : anonymousUser, "firstName" : "Anon", "emailAddress" : "anon@institution.edu", "role" : "ROLE_ADMIN", "username" : "anonymousUser", - "createdBy" : null, + "createdBy" : anonymousUser, "lastName" : "Ymous" } ]""" @@ -83,12 +83,12 @@ class UsersControllerIntegrationTests extends Specification { given: def expectedJson = """ { - "modifiedBy" : null, + "modifiedBy" : anonymousUser, "firstName" : "Joe", "emailAddress" : "joe@institution.edu", "role" : "ROLE_ADMIN", "username" : "admin", - "createdBy" : null, + "createdBy" : anonymousUser, "lastName" : "Doe" }""" when: 'GET request is made for one existing user' @@ -229,4 +229,4 @@ class UsersControllerIntegrationTests extends Specification { then: result.andExpect(status().isNotFound()) } -} \ No newline at end of file +} From a477eb7d006a55e3dad3e365c045bbe6bd8b181e Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Wed, 3 Jul 2019 15:20:59 -0400 Subject: [PATCH 04/13] Kick off build --- .../admin/ui/repository/envers/EnversTestsSupport.groovy | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EnversTestsSupport.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EnversTestsSupport.groovy index cd1bb58b5..2052cf9d1 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EnversTestsSupport.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/EnversTestsSupport.groovy @@ -13,10 +13,6 @@ import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.support.DefaultTransactionDefinition import javax.persistence.EntityManager -import java.time.LocalDateTime -import java.time.ZoneId -import java.time.ZoneOffset -import java.time.ZonedDateTime import static org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRES_NEW From 7c74fe803b584921af4050c0b1150d26b7916fb5 Mon Sep 17 00:00:00 2001 From: Jj! Date: Fri, 5 Jul 2019 13:53:32 -0500 Subject: [PATCH 05/13] [SHIBUI-1263] remove Filter versioning since it is rolling up into the resolver --- backend/build.gradle | 6 + .../AbstractAttributeExtensibleXMLObject.java | 25 +++- .../admin/ui/domain/DigestMethod.java | 29 ++++ .../admin/ui/domain/RequestInitiator.java | 26 ++++ .../admin/ui/domain/SigningMethod.java | 55 +++++++ .../JPAXMLObjectProviderInitializer.java | 2 +- .../jpa-saml2-metadata-algorithm-config.xml | 34 +++++ .../templates/AlgorithmBuilderTemplate.java | 22 +++ .../EntityDescriptorRepositoryTest.groovy | 43 +++++- .../test/resources/metadata/SHIBUI-950.xml | 141 ++++++++++++++++++ 10 files changed, 372 insertions(+), 11 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/DigestMethod.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SigningMethod.java create mode 100644 backend/src/main/resources/jpa-saml2-metadata-algorithm-config.xml create mode 100644 backend/src/main/templates/AlgorithmBuilderTemplate.java create mode 100644 backend/src/test/resources/metadata/SHIBUI-950.xml diff --git a/backend/build.gradle b/backend/build.gradle index 4e5822e2e..970b23f4c 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -266,6 +266,12 @@ task generateSources { xmlSecBuilders.ObjectProviders.ObjectProvider.BuilderClass.each { processLine(it['@className'].toString(), 'src/main/templates/XMLSecBuilderTemplate.java') } + + new XmlSlurper().parse(file('src/main/resources/jpa-saml2-metadata-algorithm-config.xml')).with { builders -> + builders.ObjectProviders.ObjectProvider.BuilderClass.each { + processLine(it['@className'].toString(), 'src/main/templates/AlgorithmBuilderTemplate.java') + } + } } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAttributeExtensibleXMLObject.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAttributeExtensibleXMLObject.java index 075280330..3e029e17e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAttributeExtensibleXMLObject.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAttributeExtensibleXMLObject.java @@ -5,17 +5,21 @@ import org.opensaml.core.xml.util.AttributeMap; import javax.annotation.Nonnull; +import javax.persistence.ElementCollection; import javax.persistence.MappedSuperclass; +import javax.persistence.PostLoad; +import javax.persistence.PrePersist; import javax.persistence.Transient; +import javax.xml.namespace.QName; +import java.util.HashMap; +import java.util.Map; @MappedSuperclass -@EqualsAndHashCode(callSuper = true, exclude={"unknownAttributes"}) +@EqualsAndHashCode(callSuper = true, exclude={"storageAttributeMap"}) public abstract class AbstractAttributeExtensibleXMLObject extends AbstractXMLObject implements AttributeExtensibleXMLObject { - - private transient final AttributeMap unknownAttributes; + private transient final AttributeMap unknownAttributes = new AttributeMap(this); AbstractAttributeExtensibleXMLObject() { - unknownAttributes = new AttributeMap(this); } @Nonnull @@ -24,4 +28,17 @@ public abstract class AbstractAttributeExtensibleXMLObject extends AbstractXMLOb public AttributeMap getUnknownAttributes() { return this.unknownAttributes; } + + @ElementCollection + private Map storageAttributeMap = new HashMap<>(); + + @PrePersist + void prePersist() { + this.storageAttributeMap = this.unknownAttributes; + } + + @PostLoad + void postLoad() { + this.unknownAttributes.putAll(this.storageAttributeMap); + } } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/DigestMethod.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/DigestMethod.java new file mode 100644 index 000000000..bb0fe5359 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/DigestMethod.java @@ -0,0 +1,29 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain; + +import lombok.EqualsAndHashCode; + +import javax.annotation.Nullable; +import javax.persistence.Entity; + +@Entity +@EqualsAndHashCode(callSuper = true) +public class DigestMethod extends AbstractElementExtensibleXMLObject implements org.opensaml.saml.ext.saml2alg.DigestMethod { + private String algorithm; + + public DigestMethod() {} + + public DigestMethod(String algorithm) { + this.algorithm = algorithm; + } + + @Nullable + @Override + public String getAlgorithm() { + return null; + } + + @Override + public void setAlgorithm(@Nullable String value) { + + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RequestInitiator.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RequestInitiator.java index 78fd0028e..dbd667ff9 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RequestInitiator.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RequestInitiator.java @@ -1,9 +1,20 @@ package edu.internet2.tier.shibboleth.admin.ui.domain; +import lombok.EqualsAndHashCode; import org.opensaml.core.xml.util.AttributeMap; import javax.annotation.Nonnull; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.PostLoad; +import javax.persistence.PrePersist; +import javax.persistence.Transient; +import javax.xml.namespace.QName; +import java.util.HashMap; +import java.util.Map; +@Entity +@EqualsAndHashCode(callSuper = true, exclude = {"storageAttributeMap"}) public class RequestInitiator extends AbstractElementExtensibleXMLObject implements org.opensaml.saml.ext.saml2mdreqinit.RequestInitiator { private String binding; @Override @@ -40,10 +51,25 @@ public void setResponseLocation(String location) { this.responseLocation = location; } + @ElementCollection + private Map storageAttributeMap = new HashMap<>(); + + @Transient private AttributeMap attributeMap = new AttributeMap(this); + @PrePersist + void prePersist() { + this.storageAttributeMap = this.attributeMap; + } + + @PostLoad + void postLoad() { + this.attributeMap.putAll(this.storageAttributeMap); + } + @Nonnull @Override + @Transient public AttributeMap getUnknownAttributes() { return this.attributeMap; } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SigningMethod.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SigningMethod.java new file mode 100644 index 000000000..c66996c9b --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SigningMethod.java @@ -0,0 +1,55 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain; + +import lombok.EqualsAndHashCode; + +import javax.annotation.Nullable; +import javax.persistence.Entity; + +@Entity +@EqualsAndHashCode(callSuper = true) +public class SigningMethod extends AbstractElementExtensibleXMLObject implements org.opensaml.saml.ext.saml2alg.SigningMethod { + private String algorithm; + private Integer minKeySize; + private Integer maxKeySize; + + public SigningMethod() {} + + public SigningMethod(String algorithm, Integer minKeySize, Integer maxKeySize) { + this.algorithm = algorithm; + this.minKeySize = minKeySize; + this.maxKeySize = maxKeySize; + } + + @Nullable + @Override + public String getAlgorithm() { + return this.algorithm; + } + + @Override + public void setAlgorithm(@Nullable String value) { + this.algorithm = value; + } + + @Nullable + @Override + public Integer getMinKeySize() { + return this.minKeySize; + } + + @Override + public void setMinKeySize(@Nullable Integer value) { + this.minKeySize = value; + } + + @Nullable + @Override + public Integer getMaxKeySize() { + return this.maxKeySize; + } + + @Override + public void setMaxKeySize(@Nullable Integer value) { + this.maxKeySize = value; + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/opensaml/config/JPAXMLObjectProviderInitializer.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/opensaml/config/JPAXMLObjectProviderInitializer.java index 2b6718dd1..25000ae67 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/opensaml/config/JPAXMLObjectProviderInitializer.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/opensaml/config/JPAXMLObjectProviderInitializer.java @@ -14,8 +14,8 @@ protected String[] getConfigResources() { "/jpa-schema-config.xml", "/jpa-saml2-metadata-ui-config.xml", "/jpa-signature-config.xml", + "/jpa-saml2-metadata-algorithm-config.xml", "/encryption-config.xml", - "/saml2-metadata-algorithm-config.xml", "/jpa-saml2-metadata-reqinit-config.xml", "/saml2-protocol-config.xml", "/modified-saml2-assertion-config.xml" diff --git a/backend/src/main/resources/jpa-saml2-metadata-algorithm-config.xml b/backend/src/main/resources/jpa-saml2-metadata-algorithm-config.xml new file mode 100644 index 000000000..f6432a71a --- /dev/null +++ b/backend/src/main/resources/jpa-saml2-metadata-algorithm-config.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/src/main/templates/AlgorithmBuilderTemplate.java b/backend/src/main/templates/AlgorithmBuilderTemplate.java new file mode 100644 index 000000000..26d1e3077 --- /dev/null +++ b/backend/src/main/templates/AlgorithmBuilderTemplate.java @@ -0,0 +1,22 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain; + +import edu.internet2.tier.shibboleth.admin.ui.opensaml.xml.AbstractSAMLObjectBuilder; +import org.opensaml.saml.common.xml.SAMLConstants; + +public class {{TOKEN}}Builder extends AbstractSAMLObjectBuilder<{{TOKEN}}> { + public {{TOKEN}}Builder() { + } + + public {{TOKEN}} buildObject() { + return buildObject(SAMLConstants.SAML20ALG_NS, {{TOKEN}}.DEFAULT_ELEMENT_LOCAL_NAME, + SAMLConstants.SAML20ALG_PREFIX); + } + + public {{TOKEN}} buildObject(final String namespaceURI, final String localName, final String namespacePrefix) { + {{TOKEN}} o = new {{TOKEN}}(); + o.setNamespaceURI(namespaceURI); + o.setElementLocalName(localName); + o.setNamespacePrefix(namespacePrefix); + return o; + } +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepositoryTest.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepositoryTest.groovy index 4ecb6e758..741df5ac5 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepositoryTest.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepositoryTest.groovy @@ -1,21 +1,25 @@ package edu.internet2.tier.shibboleth.admin.ui.repository -import edu.internet2.tier.shibboleth.admin.ui.configuration.InternationalizationConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration +import edu.internet2.tier.shibboleth.admin.ui.configuration.InternationalizationConfiguration import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlChainingMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects import edu.internet2.tier.shibboleth.admin.ui.security.repository.RoleRepository import edu.internet2.tier.shibboleth.admin.ui.security.repository.UserRepository import edu.internet2.tier.shibboleth.admin.ui.security.service.UserService import edu.internet2.tier.shibboleth.admin.ui.service.JPAEntityDescriptorServiceImpl import edu.internet2.tier.shibboleth.admin.ui.service.JPAEntityServiceImpl +import org.apache.lucene.analysis.Analyzer +import org.apache.lucene.analysis.en.EnglishAnalyzer +import org.opensaml.saml.metadata.resolver.MetadataResolver import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.domain.EntityScan import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest +import org.springframework.boot.test.context.TestConfiguration +import org.springframework.context.annotation.Bean import org.springframework.data.jpa.repository.config.EnableJpaRepositories - +import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification @@ -25,9 +29,10 @@ import javax.persistence.EntityManager * A highly unnecessary test so that I can check to make sure that persistence is correct for the model */ @DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration, TestConfiguration, InternationalizationConfiguration]) +@ContextConfiguration(classes=[CoreShibUiConfiguration, InternationalizationConfiguration]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") +@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD) class EntityDescriptorRepositoryTest extends Specification { @Autowired EntityDescriptorRepository entityDescriptorRepository @@ -42,7 +47,7 @@ class EntityDescriptorRepositoryTest extends Specification { UserRepository userRepository OpenSamlObjects openSamlObjects = new OpenSamlObjects().with { - init() + it.init() it } @@ -61,4 +66,30 @@ class EntityDescriptorRepositoryTest extends Specification { then: item1.hashCode() == item2.hashCode() } + + def "SHIBUI-950"() { + when: + def input = openSamlObjects.unmarshalFromXml(this.class.getResource('/metadata/SHIBUI-950.xml').bytes) as EntityDescriptor + entityDescriptorRepository.save(input) + + then: + noExceptionThrown() + } + + @TestConfiguration + static class Config { + @Bean + MetadataResolver metadataResolver() { + new OpenSamlChainingMetadataResolver().with { + it.id = 'tester' + it.initialize() + return it + } + } + + @Bean + Analyzer analyzer() { + return new EnglishAnalyzer() + } + } } diff --git a/backend/src/test/resources/metadata/SHIBUI-950.xml b/backend/src/test/resources/metadata/SHIBUI-950.xml new file mode 100644 index 000000000..1d534cf44 --- /dev/null +++ b/backend/src/test/resources/metadata/SHIBUI-950.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + +0uoDhgpIppfgBW09Xl/CzKh+FtwMpQnyrKUFp4Z4xzM= + + +mR7mTtB6hQYGchYSvOp9xt5emHVT3/vq7ikVkARf3OF3mLkILMX60m5h73T3ZrBK +siVglL2USnsaecbqxZ/zn0Kd+PHcrUyMBBUnZdsmX+C8DfSKvV6fdDRWjcsjG4pt +DvnX+6UwqESev7wIm0rBfYJMMMEimxsWssQQg7v/yAuoeMCoz8sUPIpMm6sB6qXl +6ldXLt2dmDSXtrtd2Er+e8lp4QvpohI9DyzDqtHKAKD0y3TMqniZ8LA59cnjTcQg +MCD9DszcBuexniOMTqrgDG4VFAexSn6k2le/eXJIOsRouVizHOZSei1VxZoFl3IR +PPs+eFOTsligBCEVBPWEUg== +MIIDQjCCAiqgAwIBAgIJAMI1r/DZzTEJMA0GCSqGSIb3DQEBBQUAME8xEzARBgoJ +kiaJk/IsZAEZFgNuZXQxGjAYBgoJkiaJk/IsZAEZFgpzaGliYm9sZXRoMRwwGgYD +VQQDExN3aWtpLnNoaWJib2xldGgubmV0MB4XDTEzMTEyNTE0NTcyOFoXDTM3MDMw +NDE0NTcyOFowTzETMBEGCgmSJomT8ixkARkWA25ldDEaMBgGCgmSJomT8ixkARkW +CnNoaWJib2xldGgxHDAaBgNVBAMTE3dpa2kuc2hpYmJvbGV0aC5uZXQwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1viMiWhYa8cmxJ6rQ8yORYMD6Gx5n +r/r9wQko+Tbjl/qGS0LaTfPQCokvwrD06506MPHainaMqbjlO4gDjq2LpU9/iy0s +iLuY7UHgDqNNZOELBTQOMwLAFcuEA10FCWjJRglT+6w3xEFeU+dZkBXV1VvKBvsZ +SiuQw437CcV3ueEF4+ZB0l9uyq8o3wzKRZ9DnpyFL7SUJiHJPuqqXZuyQnjLrbVZ +KjjumGnY3LJTUo1xoUEuhqj5RMfspn2oc5YnIYka5YrCBmYKJV3QtCFbLA/cz8nF +m+lOvYGz8nl3wHNkZIVRoetVw/Mhf7lzex0rh3XBdS6vVcT75uH0X1OPAgMBAAGj +ITAfMB0GA1UdDgQWBBQe1XwZavrgAhRXrfhv1gGUwSkc7DANBgkqhkiG9w0BAQUF +AAOCAQEADCGhWJ+oZ8ltcjJ7D66rMg1HOZT6GFCVeZ7MfhY/KFrvsnITNbTA+SgZ +tCJt/BLlZXxpzmix19bD9bNwqEMo7WSqBy77X7SS97ZXti6y6vwAz8h78vzQopOd +rnn8XXyWxtrtRRCK4RMpZGrVm3sfBPW68j9hiPHZqewE4nLavjCki/I9rCMe5dJE +3+ZRf4Ip/9hYqM+a5Chcvbo2zJEOtw+EUQqNTZ51j33H/2qF9UoSpt74UFh+Jd5y +L2GoFSt/gCld78j/7cU3ObGQEme+hVVZ8/uGa/cCYvFt75vNBdnlj4icZ6fgFe9R +9h5hlBTGD3PULSFmCdkgxtwIyd855Q== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MIIDQjCCAiqgAwIBAgIJAMI1r/DZzTEJMA0GCSqGSIb3DQEBBQUAME8xEzARBgoJ +kiaJk/IsZAEZFgNuZXQxGjAYBgoJkiaJk/IsZAEZFgpzaGliYm9sZXRoMRwwGgYD +VQQDExN3aWtpLnNoaWJib2xldGgubmV0MB4XDTEzMTEyNTE0NTcyOFoXDTM3MDMw +NDE0NTcyOFowTzETMBEGCgmSJomT8ixkARkWA25ldDEaMBgGCgmSJomT8ixkARkW +CnNoaWJib2xldGgxHDAaBgNVBAMTE3dpa2kuc2hpYmJvbGV0aC5uZXQwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1viMiWhYa8cmxJ6rQ8yORYMD6Gx5n +r/r9wQko+Tbjl/qGS0LaTfPQCokvwrD06506MPHainaMqbjlO4gDjq2LpU9/iy0s +iLuY7UHgDqNNZOELBTQOMwLAFcuEA10FCWjJRglT+6w3xEFeU+dZkBXV1VvKBvsZ +SiuQw437CcV3ueEF4+ZB0l9uyq8o3wzKRZ9DnpyFL7SUJiHJPuqqXZuyQnjLrbVZ +KjjumGnY3LJTUo1xoUEuhqj5RMfspn2oc5YnIYka5YrCBmYKJV3QtCFbLA/cz8nF +m+lOvYGz8nl3wHNkZIVRoetVw/Mhf7lzex0rh3XBdS6vVcT75uH0X1OPAgMBAAGj +ITAfMB0GA1UdDgQWBBQe1XwZavrgAhRXrfhv1gGUwSkc7DANBgkqhkiG9w0BAQUF +AAOCAQEADCGhWJ+oZ8ltcjJ7D66rMg1HOZT6GFCVeZ7MfhY/KFrvsnITNbTA+SgZ +tCJt/BLlZXxpzmix19bD9bNwqEMo7WSqBy77X7SS97ZXti6y6vwAz8h78vzQopOd +rnn8XXyWxtrtRRCK4RMpZGrVm3sfBPW68j9hiPHZqewE4nLavjCki/I9rCMe5dJE +3+ZRf4Ip/9hYqM+a5Chcvbo2zJEOtw+EUQqNTZ51j33H/2qF9UoSpt74UFh+Jd5y +L2GoFSt/gCld78j/7cU3ObGQEme+hVVZ8/uGa/cCYvFt75vNBdnlj4icZ6fgFe9R +9h5hlBTGD3PULSFmCdkgxtwIyd855Q== + + + + + + + + + + + + + + + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + + + + + + Shibboleth Federated Wiki + + A shared Wiki service with automatic registration for users who can supply a supported + identifier, such as eduPersonPrincipalName or eduPersonTargetedID. + + + + + + + + + + + + + Shibboleth Consortium + Shibboleth Consortium + http://www.shibboleth.net/ + + + Shibboleth.Net Technical Support + contact@shibboleth.net + \ No newline at end of file From 751a0de8ec5f8940d3c41962d7fb5ea1579159ab Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 11 Jul 2019 07:34:56 -0700 Subject: [PATCH 06/13] NOJIRA: fixed issue with date --- .../manager/container/dashboard-providers-list.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html index 07d0bf58d..25860cf59 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html @@ -50,7 +50,7 @@ {{ provider['@type'] }} {{ provider.createdBy }} - {{ provider.createdDate | customDate : '—' }} + {{ provider.createdDate | customDate }} Date: Thu, 11 Jul 2019 07:57:08 -0700 Subject: [PATCH 07/13] SHIBUI fixed route for provider edit --- .../dashboard-providers-list.component.html | 22 ++----------------- .../dashboard-providers-list.component.ts | 3 ++- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html index 25860cf59..bceba636f 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html @@ -46,7 +46,8 @@ - {{ provider.name }} + + {{ provider.name }} {{ provider['@type'] }} {{ provider.createdBy }} @@ -63,25 +64,6 @@ - diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts index 6d09cf0fa..6a206d9a1 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts @@ -81,7 +81,8 @@ export class DashboardProvidersListComponent implements OnInit { this.router.navigate(['metadata', 'provider', id, page]); } - edit(provider: MetadataProvider): void { + edit(provider: MetadataProvider, event: Event): void { + event.preventDefault(); this.view(provider.resourceId, 'edit'); } From 762d61c389bfa10941c213b9e5be84d8daa16619 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 11 Jul 2019 08:27:02 -0700 Subject: [PATCH 08/13] Fixed header component --- .../component/metadata-header.component.html | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ui/src/app/metadata/configuration/component/metadata-header.component.html b/ui/src/app/metadata/configuration/component/metadata-header.component.html index 4da057c91..64a1a2a2c 100644 --- a/ui/src/app/metadata/configuration/component/metadata-header.component.html +++ b/ui/src/app/metadata/configuration/component/metadata-header.component.html @@ -1,11 +1,12 @@
-

- Saved  - {{ version.date | date }}, - by  +

+ Saved:  + {{ version.date | date:'medium' }} +
+ By{{ version.creator }} -
+

Enabled Disabled From 61ea9229638ca0dcaabb59011dc4a619e23ff6cb Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 11 Jul 2019 08:27:56 -0700 Subject: [PATCH 09/13] Fixed header text --- backend/src/main/resources/i18n/messages.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/src/main/resources/i18n/messages.properties b/backend/src/main/resources/i18n/messages.properties index e04fe3b90..f3054d636 100644 --- a/backend/src/main/resources/i18n/messages.properties +++ b/backend/src/main/resources/i18n/messages.properties @@ -84,7 +84,6 @@ value.dynamic-http-metadata-provider=DynamicHttpMetadataProvider value.entity-attributes-filter=EntityAttributes Filter value.spdescriptor=SPSSODescriptor value.attr-auth-descriptor=AttributeAuthorityDescriptor -value.dynamic-http-metadata-provider=DynamicHttpMetadataProvider value.local-dynamic-metadata-provider=LocalDynamicMetadataProvider value.md-query-protocol=MetadataQueryProtocol @@ -409,7 +408,7 @@ label.restore=Restore label.compare-selected=Compare Selected label.saved=Saved -label.by=by +label.by=By message.delete-user-title=Delete User? message.delete-user-body=You are requesting to delete a user. If you complete this process the user will be removed. This cannot be undone. Do you wish to continue? From 5dcf0eaf789d0a241040c89d2d64575a6d094001 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 11 Jul 2019 10:49:31 -0700 Subject: [PATCH 10/13] SHIBUI-1352 fixed provider selection issue --- ...dynamic-http-metadata-provider.schema.json | 30 ++++++++++++ .../file-system-metadata-provider.schema.json | 6 +-- ...ocal-dynamic-metadata-provider.schema.json | 8 +-- .../container/provider-select.component.ts | 8 +-- .../model/dynamic-http.provider.form.ts | 33 ++++++++++++- .../provider/reducer/collection.reducer.ts | 5 +- .../provider/filebacked-http.schema.json | 49 ++----------------- 7 files changed, 77 insertions(+), 62 deletions(-) diff --git a/backend/src/main/resources/dynamic-http-metadata-provider.schema.json b/backend/src/main/resources/dynamic-http-metadata-provider.schema.json index 68fdf6fd7..f7106c6e5 100644 --- a/backend/src/main/resources/dynamic-http-metadata-provider.schema.json +++ b/backend/src/main/resources/dynamic-http-metadata-provider.schema.json @@ -1,11 +1,41 @@ { "type": "object", "required": [ + "name", + "@type", "xmlId", "metadataURL", "metadataRequestURLConstructionScheme" ], "properties": { + "name": { + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", + "type": "string", + "widget": { + "id": "string", + "help": "message.must-be-unique" + } + }, + "@type": { + "title": "label.metadata-provider-type", + "description": "tooltip.metadata-provider-type", + "placeholder": "label.select-metadata-type", + "type": "string", + "readOnly": true, + "widget": { + "id": "select", + "disabled": true + }, + "oneOf": [ + { + "enum": [ + "DynamicHttpMetadataResolver" + ], + "description": "value.dynamic-http-metadata-provider" + } + ] + }, "enabled": { "title": "label.enable-provider-upon-saving", "description": "tooltip.enable-provider-upon-saving", diff --git a/backend/src/main/resources/file-system-metadata-provider.schema.json b/backend/src/main/resources/file-system-metadata-provider.schema.json index cbfec6b8c..af2f8af0a 100644 --- a/backend/src/main/resources/file-system-metadata-provider.schema.json +++ b/backend/src/main/resources/file-system-metadata-provider.schema.json @@ -8,8 +8,8 @@ ], "properties": { "name": { - "title": "label.service-provider-name-dashboard-display-only", - "description": "tooltip.metadata-provider-name", + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", "type": "string", "widget": { "id": "string", @@ -29,7 +29,7 @@ "oneOf": [ { "enum": [ - "FileSystemMetadataResolver" + "FilesystemMetadataResolver" ], "description": "value.file-system-metadata-provider" } diff --git a/backend/src/main/resources/local-dynamic-metadata-provider.schema.json b/backend/src/main/resources/local-dynamic-metadata-provider.schema.json index d683db316..f39904f36 100644 --- a/backend/src/main/resources/local-dynamic-metadata-provider.schema.json +++ b/backend/src/main/resources/local-dynamic-metadata-provider.schema.json @@ -8,8 +8,8 @@ ], "properties": { "name": { - "title": "label.metadata-provider-name-display-only", - "description": "tooltip.metadata-provider-name-display-only", + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", "type": "string", "widget": { "id": "string", @@ -29,9 +29,9 @@ "oneOf": [ { "enum": [ - "FileSystemMetadataResolver" + "LocalDynamicMetadataResolver" ], - "description": "value.file-system-metadata-provider" + "description": "value.local-dynamic-metadata-provider" } ] }, diff --git a/ui/src/app/metadata/provider/container/provider-select.component.ts b/ui/src/app/metadata/provider/container/provider-select.component.ts index b0c07f6fd..37519a259 100644 --- a/ui/src/app/metadata/provider/container/provider-select.component.ts +++ b/ui/src/app/metadata/provider/container/provider-select.component.ts @@ -20,6 +20,7 @@ import { ClearEditor } from '../action/editor.action'; export class ProviderSelectComponent implements OnDestroy { actionsSubscription: Subscription; + providerSubscription: Subscription; provider$: Observable; @@ -31,11 +32,9 @@ export class ProviderSelectComponent implements OnDestroy { map(params => new SelectProviderRequest(params.providerId)) ).subscribe(store); - this.provider$ = this.store.select(fromProviders.getSelectedProvider).pipe(filter(p => { - return p; - })); + this.provider$ = this.store.select(fromProviders.getSelectedProvider).pipe(filter(p => !!p)); - this.provider$.subscribe(provider => { + this.providerSubscription = this.provider$.subscribe(provider => { this.setDefinition(provider); }); } @@ -50,6 +49,7 @@ export class ProviderSelectComponent implements OnDestroy { ngOnDestroy() { this.actionsSubscription.unsubscribe(); + this.providerSubscription.unsubscribe(); this.store.dispatch(new ClearProvider()); this.store.dispatch(new ClearWizard()); this.store.dispatch(new ClearEditor()); diff --git a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts index a0ca22143..2583e3c69 100644 --- a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts +++ b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts @@ -6,7 +6,6 @@ export const DynamicHttpMetadataProviderWizard: Wizard { let base = BaseMetadataProviderEditor.formatter(changes); if (base.dynamicMetadataResolverAttributes) { @@ -136,13 +135,43 @@ export const DynamicHttpMetadataProviderEditor: Wizard Date: Thu, 11 Jul 2019 11:56:24 -0700 Subject: [PATCH 11/13] SHIBUI-1352 Fixed unit test --- .../container/dashboard-providers-list.component.spec.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts index 4b5d1c38a..b70132eba 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts @@ -93,8 +93,11 @@ describe('Dashboard Providers List Page', () => { describe('edit method', () => { it('should route to the edit page', () => { + const evt = new Event('a type'); spyOn(router, 'navigate'); - instance.edit(provider); + spyOn(evt, 'preventDefault'); + instance.edit(provider, evt); + expect(evt.preventDefault).toHaveBeenCalled(); expect(router.navigate).toHaveBeenCalledWith(['metadata', 'provider', provider.resourceId, 'edit']); }); }); From 33929b4b2158411e2abee495b7fc9b9184aa78d5 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Fri, 12 Jul 2019 08:42:02 -0400 Subject: [PATCH 12/13] Polishing --- .../shibboleth/admin/ui/envers/EnversVersionServiceSupport.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java index b5e713143..bbf399227 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java @@ -32,7 +32,6 @@ public List findVersionsForPersistentEntity(String resourceId, Class .getResultList(); Object listOfVersions = revs.stream() - //.map(it -> ((Object[]) it)) .map(it -> { return new Version(((PrincipalAwareRevisionEntity) ((Object[]) it)[1]).idAsString(), ((AbstractAuditable) ((Object[]) it)[0]).getModifiedBy(), From d3e14210c1b4904f593580ca5d8743560a470f47 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 15 Jul 2019 13:38:46 -0400 Subject: [PATCH 13/13] Fixing tests OOM --- build.gradle | 6 ++++++ gradle.properties | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ff3c80edc..5b78682dc 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,12 @@ plugins { id 'com.github.breadmoirai.github-release' version '2.2.9' } +subprojects { + tasks.withType(Test) { + maxHeapSize = "3g" + } +} + tasks.findByName('release').dependsOn project.getTasksByName('test', true) githubRelease { diff --git a/gradle.properties b/gradle.properties index 335e4cb7b..4fdf282d7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ hibernate.version=5.2.11.Final lucene.version=7.2.1 -org.gradle.jvmargs=-Xmx4g -XX:-UseGCOverheadLimit +org.gradle.jvmargs=-Xmx1g -XX:-UseGCOverheadLimit # set token in personal global i2.github.token=