Skip to content

Commit

Permalink
Merge branch 'feature/SHIBUI-1281-QA' into feature/SHIBUI-1311-QA
Browse files Browse the repository at this point in the history
  • Loading branch information
Bill Smith committed Jul 17, 2019
2 parents 3cdddf4 + 1582593 commit 84a2c7a
Show file tree
Hide file tree
Showing 41 changed files with 734 additions and 209 deletions.
6 changes: 6 additions & 0 deletions backend/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,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')
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,20 @@ 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


@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 EnversEntityDescriptorVersionServiceTests extends Specification {

@Autowired
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -18,19 +17,20 @@ 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


@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 EnversMetadataResolverVersionServiceTests extends Specification {

@Autowired
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
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.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
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()
}

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()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class EntitiesVersioningConfiguration {

@Bean
public EntityDescriptorVersionService entityDescriptorVersionService(EntityDescriptorService entityDescriptorService) {
return new EnversEntityDescriptorVersionService(entityManager, entityDescriptorService);
return new EnversEntityDescriptorVersionService(enversVersionServiceSupport(), entityDescriptorService);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,22 @@
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"})
@Audited
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
Expand All @@ -26,4 +30,17 @@ public abstract class AbstractAttributeExtensibleXMLObject extends AbstractXMLOb
public AttributeMap getUnknownAttributes() {
return this.unknownAttributes;
}
}

@ElementCollection
private Map<QName,String> storageAttributeMap = new HashMap<>();

@PrePersist
void prePersist() {
this.storageAttributeMap = this.unknownAttributes;
}

@PostLoad
void postLoad() {
this.unknownAttributes.putAll(this.storageAttributeMap);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -16,13 +18,19 @@
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;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;


@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@EqualsAndHashCode
@EqualsAndHashCode(exclude = {"current"})
@Audited
public abstract class AbstractAuditable implements Auditable {

Expand All @@ -48,6 +56,9 @@ public abstract class AbstractAuditable implements Auditable {
@LastModifiedBy
private String modifiedBy;

@Transient
@JsonProperty
private boolean current;

@Override
public Long getAudId() {
Expand Down Expand Up @@ -94,4 +105,28 @@ 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);
}

public boolean isCurrent() {
return this.current;
}

public void markAsCurrent() {
this.current = true;
}

private static ZonedDateTime toZonedDateTime(LocalDateTime localDateTime) {
return localDateTime
.atZone(ZoneId.systemDefault())
.toInstant()
.atOffset(ZoneOffset.UTC)
.toZonedDateTime();
}
}
Original file line number Diff line number Diff line change
@@ -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) {

}
}
Loading

0 comments on commit 84a2c7a

Please sign in to comment.