From 464844370fbc142bb94f2c9aa384519bf2921d4c Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Wed, 18 Sep 2019 17:22:45 -0400 Subject: [PATCH] SHIBUI-1500 --- ...lerVersionEndpointsIntegrationTests.groovy | 18 +++++++++++++++ .../controller/MetadataFiltersController.java | 4 +++- .../ui/domain/resolvers/MetadataResolver.java | 6 +++++ ...taFiltersControllerIntegrationTests.groovy | 23 ++++++++++++++++++- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolverControllerVersionEndpointsIntegrationTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolverControllerVersionEndpointsIntegrationTests.groovy index aaa0a1095..2c02ee4b4 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolverControllerVersionEndpointsIntegrationTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolverControllerVersionEndpointsIntegrationTests.groovy @@ -2,6 +2,7 @@ package edu.internet2.tier.shibboleth.admin.ui.controller 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.resolvers.DynamicHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver @@ -136,6 +137,23 @@ class MetadataResolverControllerVersionEndpointsIntegrationTests extends Specifi noExceptionThrown() } + def "SHIBUI-1500"() { + MetadataResolver mr = new FileBackedHttpMetadataResolver(name: 'shibui-1500') + mr = repository.save(mr) + + when: 'add a filter' + def filter = new EntityRoleWhiteListFilter(name: 'shibui-1500', retainedRoles: ['role1']) + mr.addFilter(filter) + mr = repository.save(mr) + + def allVersions = getAllMetadataResolverVersions(mr.resourceId, List) + def mrv1 = getMetadataResolverForVersion(mr.resourceId, allVersions.body[0].id, MetadataResolver) + def mrv2 = getMetadataResolverForVersion(mr.resourceId, allVersions.body[1].id, MetadataResolver) + + then: + (mrv1.getBody() as MetadataResolver).modifiedDate < (mrv2.getBody() as MetadataResolver).modifiedDate + } + private getAllMetadataResolverVersions(String resourceId, responseType) { this.restTemplate.getForEntity(resourceUriFor(ALL_VERSIONS_URI, resourceId), responseType) } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java index cbf5051ba..b640f6362 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java @@ -80,7 +80,7 @@ public ResponseEntity getOne(@PathVariable String metadataResolverId, @PathVa @PostMapping("/Filters") public ResponseEntity create(@PathVariable String metadataResolverId, @RequestBody MetadataFilter createdFilter) { MetadataResolver metadataResolver = findResolverOrThrowHttp404(metadataResolverId); - metadataResolver.getMetadataFilters().add(createdFilter); + metadataResolver.addFilter(createdFilter); MetadataResolver persistedMr = repository.save(metadataResolver); // we reload the filters here after save @@ -153,6 +153,8 @@ public ResponseEntity delete(@PathVariable String metadataResolverId, throw HTTP_404_CLIENT_ERROR_EXCEPTION.get(); } resolver.setMetadataFilters(updatedFilters); + //To support envers versioning from MetadataResolver side + resolver.markAsModified(); repository.save(resolver); filterRepository.delete(filterToDelete); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java index dc30d40d8..9e67a5549 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java @@ -91,6 +91,12 @@ public int getVersion() { return this.hashCode(); } + public void addFilter(MetadataFilter metadataFilter) { + //To make sure that Spring Data auditing infrastructure recognizes update and "touched" modifiedDate + markAsModified(); + this.metadataFilters.add(metadataFilter); + } + public void markAsModified() { this.versionModifiedTimestamp = System.currentTimeMillis(); } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy index 206421f49..098e7ac2b 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy @@ -188,6 +188,27 @@ class MetadataFiltersControllerIntegrationTests extends Specification { resolverResult_3.body.metadataFilters.size == 5 } + def "POST new Filter updates resolver's modifiedDate - SHIBUI-1500"() { + given: 'MetadataResolver with attached entity attributes is available in data store' + def resolver = generator.buildRandomMetadataResolverOfType('FileBacked') + def filter = generator.entityAttributesFilter() + def resolverResourceId = resolver.resourceId + metadataResolverRepository.save(resolver) + MetadataResolver openSamlRepresentation = metadataResolverConverterService.convertToOpenSamlRepresentation(resolver) + OpenSamlChainingMetadataResolverUtil.updateChainingMetadataResolver((OpenSamlChainingMetadataResolver) chainingMetadataResolver, openSamlRepresentation) + + when: 'Resolver without filter is fetched' + def result = this.restTemplate.getForEntity("$BASE_URI/$resolverResourceId", String) + def originalModifiedDate = jsonSlurper.parseText(result.body).modifiedDate + + and: 'POST call is made with new filter' + result = restTemplate.postForEntity("$BASE_URI/$resolverResourceId/Filters", filter, String) + def afterFilterAddedModifiedDate = jsonSlurper.parseText(result.body).modifiedDate + + then: + originalModifiedDate < afterFilterAddedModifiedDate + } + private HttpEntity createRequestHttpEntityFor(Closure jsonBodySupplier) { new HttpEntity(jsonBodySupplier(), ['Content-Type': 'application/json'] as HttpHeaders) } @@ -203,4 +224,4 @@ class MetadataFiltersControllerIntegrationTests extends Specification { } } } -} \ No newline at end of file +}