Skip to content

Commit

Permalink
Merge branch 'master' into feature/SHIBUI-1364-QA
Browse files Browse the repository at this point in the history
  • Loading branch information
Bill Smith committed Oct 3, 2019
2 parents 3157b01 + 8f1e2e5 commit 21fb880
Show file tree
Hide file tree
Showing 38 changed files with 613 additions and 339 deletions.
Original file line number Diff line number Diff line change
@@ -1,23 +1,41 @@
package edu.internet2.tier.shibboleth.admin.ui.controller

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import edu.internet2.tier.shibboleth.admin.ui.configuration.CustomPropertiesConfiguration
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityRoleWhiteListFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.NameIdFormatFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.NameIdFormatFilterTarget
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.SignatureValidationFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataQueryProtocolScheme
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.RegexScheme
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.TemplateScheme
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository

import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverVersionService
import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator
import edu.internet2.tier.shibboleth.admin.util.AttributeUtility

import org.apache.commons.lang3.RandomStringUtils

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.web.client.TestRestTemplate
import org.springframework.test.context.ActiveProfiles
import org.springframework.transaction.PlatformTransactionManager
import spock.lang.Specification
import spock.lang.Unroll

import static edu.internet2.tier.shibboleth.admin.ui.domain.filters.NameIdFormatFilterTarget.NameIdFormatFilterTargetType.ENTITY
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic

/**
* @author Dmitriy Kopylenko
Expand All @@ -32,12 +50,34 @@ class MetadataResolverControllerVersionEndpointsIntegrationTests extends Specifi
@Autowired
MetadataResolverRepository repository

@Autowired
AttributeUtility attributeUtility

@Autowired
CustomPropertiesConfiguration customPropertiesConfiguration

ObjectMapper mapper
TestObjectGenerator generator

@Autowired
PlatformTransactionManager txMgr

@Autowired
MetadataResolverVersionService metadataResolverVersionService

static BASE_URI = '/api/MetadataResolvers'

static ALL_VERSIONS_URI = "$BASE_URI/%s/Versions"

static SPECIFIC_VERSION_URI = "$BASE_URI/%s/Versions/%s"

def setup() {
generator = new TestObjectGenerator(attributeUtility, customPropertiesConfiguration)
mapper = new ObjectMapper()
mapper.enable(SerializationFeature.INDENT_OUTPUT)
mapper.registerModule(new JavaTimeModule())
}

def "GET /api/MetadataResolvers/{resourceId}/Versions with non-existent resolver"() {
when:
def result = getAllMetadataResolverVersions('non-existent-resolver-id', String)
Expand Down Expand Up @@ -111,6 +151,7 @@ class MetadataResolverControllerVersionEndpointsIntegrationTests extends Specifi
}

def "SHIBUI-1386"() {
given:
MetadataResolver mr = new FileBackedHttpMetadataResolver(name: 'testme')
mr = repository.save(mr)

Expand Down Expand Up @@ -142,6 +183,7 @@ class MetadataResolverControllerVersionEndpointsIntegrationTests extends Specifi
}

def "SHIBUI-1500"() {
given:
MetadataResolver mr = new FileBackedHttpMetadataResolver(name: 'shibui-1500')
mr = repository.save(mr)

Expand All @@ -159,6 +201,7 @@ class MetadataResolverControllerVersionEndpointsIntegrationTests extends Specifi
}

def "SHIBUI-1499"() {
given:
MetadataResolver mr = new FileBackedHttpMetadataResolver(name: 'shibui-1499')
mr = repository.save(mr)

Expand All @@ -182,6 +225,48 @@ class MetadataResolverControllerVersionEndpointsIntegrationTests extends Specifi
noExceptionThrown()
}

def "SHIBUI-1501"() {
given:
def mr = new FileBackedHttpMetadataResolver(name: 'shibui-1501')
mr = repository.save(mr)

when: 'add a filter'
EntityAttributesFilter filter = this.generator.entityAttributesFilter()
mr.addFilter(filter)
def resolver = (repository.save(mr) as MetadataResolver).withTraits AttributeReleaseAndOverrides
resolver.entityAttributesFilterIntoTransientRepresentation()

def allVersions = getAllMetadataResolverVersions(mr.resourceId, List)
def mrv2 = getMetadataResolverForVersion(mr.resourceId, allVersions.body[1].id, MetadataResolver)
.body.withTraits AttributeReleaseAndOverrides

then:
mrv2.metadataFilters.size() == 1
mrv2.attributesRelease(0).size() == resolver.attributesRelease(0).size()
mrv2.overrides(0).size() == resolver.overrides(0).size()
mrv2.attributesRelease(0) == resolver.attributesRelease(0)
mrv2.overrides(0) == resolver.overrides(0)
}

@Unroll
def "SHIBUI-1509 with #urlConstructionScheme"() {
MetadataResolver mr = new DynamicHttpMetadataResolver(name: randomAlphabetic(8)).with {
it.metadataRequestURLConstructionScheme = urlConstructionScheme
it
}
mr = repository.save(mr)

when:
def allVersions = getAllMetadataResolverVersions(mr.resourceId, List)
def mrv1 = getMetadataResolverForVersion(mr.resourceId, allVersions.body[0].id, MetadataResolver)

then:
noExceptionThrown()

where:
urlConstructionScheme << [new RegexScheme(match: ".*"), new MetadataQueryProtocolScheme(), new TemplateScheme()]
}

private getAllMetadataResolverVersions(String resourceId, responseType) {
this.restTemplate.getForEntity(resourceUriFor(ALL_VERSIONS_URI, resourceId), responseType)
}
Expand All @@ -198,3 +283,13 @@ class MetadataResolverControllerVersionEndpointsIntegrationTests extends Specifi
String.format(uriTemplate, resourceId)
}
}

trait AttributeReleaseAndOverrides {
List<String> attributesRelease(int filterIndex) {
(this.metadataFilters[filterIndex] as EntityAttributesFilter).attributeRelease
}

Map<String, Object> overrides(int filterIndex) {
(this.metadataFilters[filterIndex] as EntityAttributesFilter).relyingPartyOverrides
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package edu.internet2.tier.shibboleth.admin.ui.repository.envers

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration
import edu.internet2.tier.shibboleth.admin.ui.configuration.CustomPropertiesConfiguration
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
Expand All @@ -19,6 +23,8 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMet
import edu.internet2.tier.shibboleth.admin.ui.repository.FilterRepository
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository
import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverVersionService
import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator
import edu.internet2.tier.shibboleth.admin.util.AttributeUtility
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.domain.EntityScan
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
Expand Down Expand Up @@ -49,6 +55,22 @@ class MetadataFilterEnversVersioningTests extends Specification {
@Autowired
PlatformTransactionManager txMgr

@Autowired
AttributeUtility attributeUtility

@Autowired
CustomPropertiesConfiguration customPropertiesConfiguration

ObjectMapper mapper
TestObjectGenerator generator

def setup() {
generator = new TestObjectGenerator(attributeUtility, customPropertiesConfiguration)
mapper = new ObjectMapper()
mapper.enable(SerializationFeature.INDENT_OUTPUT)
mapper.registerModule(new JavaTimeModule())
}


def "test versioning of MetadataResolver with EntityRoleWhiteListFilter"() {
when: 'Add initial filter'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ public ResponseEntity<?> getAllVersions(@PathVariable String resourceId) {
}

@GetMapping("/MetadataResolvers/{resourceId}/Versions/{versionId}")
@Transactional(readOnly = true)
public ResponseEntity<?> getSpecificVersion(@PathVariable String resourceId, @PathVariable String versionId) {
MetadataResolver resolver = versionService.findSpecificVersionOfMetadataResolver(resourceId, versionId);
if (resolver == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import static edu.internet2.tier.shibboleth.admin.util.ModelRepresentationConversions.getAttributeListFromAttributeReleaseList;
import static edu.internet2.tier.shibboleth.admin.util.ModelRepresentationConversions.getAttributeListFromRelyingPartyOverridesRepresentation;
Expand Down Expand Up @@ -69,6 +70,8 @@ private void rebuildAttributes() {

@PostLoad
public void intoTransientRepresentation() {
//For some update operations, list of attributes could contain null values. Filter them out
this.attributes.removeIf(Objects::isNull);
this.attributeRelease = getAttributeReleaseListFromAttributeList(this.attributes);
this.relyingPartyOverrides = getRelyingPartyOverridesRepresentationFromAttributeList(this.attributes);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
Expand Down Expand Up @@ -28,6 +29,7 @@
@JsonSubTypes.Type(value=RegexScheme.class, name="Regex")})
@Audited
@AuditOverride(forClass = AbstractAuditable.class)
@JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})
public abstract class MetadataRequestURLConstructionScheme extends AbstractAuditable {
public enum SchemeType {
METADATA_QUERY_PROTOCOL("MetadataQueryProtocol"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import edu.internet2.tier.shibboleth.admin.ui.domain.AbstractAuditable;
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter;
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter;
import lombok.EqualsAndHashCode;
import lombok.Getter;
Expand Down Expand Up @@ -100,4 +101,14 @@ public void addFilter(MetadataFilter metadataFilter) {
public void markAsModified() {
this.versionModifiedTimestamp = System.currentTimeMillis();
}

public void entityAttributesFilterIntoTransientRepresentation() {
//expose explicit API to call to convert into transient representation
//used in unit/integration tests where JPA's @PostLoad callback execution engine is not available
this.metadataFilters
.stream()
.filter(EntityAttributesFilter.class::isInstance)
.map(EntityAttributesFilter.class::cast)
.forEach(EntityAttributesFilter::intoTransientRepresentation);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package edu.internet2.tier.shibboleth.admin.ui.service;

import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter;
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver;
import edu.internet2.tier.shibboleth.admin.ui.domain.versioning.Version;
import edu.internet2.tier.shibboleth.admin.ui.envers.EnversVersionServiceSupport;
Expand Down Expand Up @@ -27,6 +28,16 @@ public List<Version> findVersionsForMetadataResolver(String resourceId) {
@Override
public MetadataResolver findSpecificVersionOfMetadataResolver(String resourceId, String versionId) {
Object mrObject = enversVersionServiceSupport.findSpecificVersionOfPersistentEntity(resourceId, versionId, MetadataResolver.class);
return mrObject == null ? null : (MetadataResolver) mrObject;
if(mrObject == null) {
return null;
}
MetadataResolver resolver = (MetadataResolver) mrObject;

//The @PostLoad is not honored by Envers. So need to do this manually for EntityAttributesFilters
//So the correct representation is built and returned to upstream clients expecting JSON
resolver.entityAttributesFilterIntoTransientRepresentation();

return resolver;

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
</div>
<metadata-configuration
[numbered]="false"
[editable]="false"
[configuration]="configuration"
[entity]="filter"
[definition]="definition"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<ng-container *ngIf="filters && filters.dates.length > 0">
<div class="d-flex border-bottom border-light border-2 py-2">
<span [ngStyle]="{'width.%': width}" *ngIf="!comparing">Order</span>
<span [ngStyle]="{'width.%': width}" *ngIf="comparing">Option</span>
<strong [ngStyle]="{'width.%': width}" *ngIf="!comparing">Order</strong>
<strong [ngStyle]="{'width.%': width}" *ngIf="comparing">Option</strong>
<strong *ngFor="let date of filters.dates" [ngStyle]="{'width.%': width}">
{{ date | date:DATE_FORMAT }}
</strong>
Expand Down Expand Up @@ -39,13 +39,13 @@
</div>
</ng-container>
</div>
<div class="d-flex justify-content-end my-2">
<div class="alert alert-info m-4" *ngIf="filters ? filters.filters.length < 1 : false">
<h3 translate="message.no-filters">No Filters</h3>
<p translate="message.no-filters-added">No filters have been added to this Metadata Provider</p>
</div>
<div class="d-flex justify-content-end my-2" *ngIf="filters && filters.filters.length > 0">
<button class="btn btn-primary" [disabled]="!selected" (click)="compareSelected()">
<translate-i18n key="label.compare-selected">Compare Selected</translate-i18n>
</button>
</div>
</ng-container>
<div class="alert alert-info m-4" *ngIf="filters && filters.dates.length < 1">
<h3 translate="message.no-filters">No Filters</h3>
<p translate="message.no-filters-added">No filters have been added to this Metadata Provider</p>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ <h2 class="title h4 m-0 flex-grow-1">
</span>
<span class="text ml-2">{{ section.label | translate }}</span>
</h2>
<div class="actions px-2"
*ngIf="editable && configuration.dates.length === 1">
<div class="actions px-2" *ngIf="editable">
<button class="btn btn-link edit-link change-view" (click)="edit(section.id)">
<i class="fa fa-edit"></i>&nbsp;
<span translate="action.edit">Edit</span>
Expand All @@ -38,9 +37,4 @@ <h2 class="title h4 m-0 flex-grow-1">
</div>
</section>
</ng-container>
<ng-container *ngIf="zero">
<div class="alert alert-info" role="alert">
No changes
</div>
</ng-container>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,10 @@ describe('Metadata Configuration Component', () => {
}));

describe('edit method', () => {
it('should call router.navigate', () => {
spyOn(router, 'navigate');
it('should call onEdit.emit', () => {
spyOn(app.onEdit, 'emit');
app.edit('foo');
expect(router.navigate).toHaveBeenCalled();
expect(app.onEdit.emit).toHaveBeenCalled();
});
});

Expand Down
Loading

0 comments on commit 21fb880

Please sign in to comment.