Skip to content

Commit

Permalink
SHIBUI-1798
Browse files Browse the repository at this point in the history
Ensures that deleting a definition will also delete the filter
references
  • Loading branch information
chasegawa committed May 28, 2021
1 parent 0cfbe25 commit 837ce16
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package edu.internet2.tier.shibboleth.admin.ui.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import edu.internet2.tier.shibboleth.admin.ui.domain.CustomEntityAttributeDefinition;
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.CustomEntityAttributeFilterValue;
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter;

// Not entirely sure this is needed for the core, but it did make validation/unit testing a whole lot easier
public interface CustomEntityAttributeFilterValueRepository extends JpaRepository<CustomEntityAttributeFilterValue, Long> {
// Not entirely sure this is needed for the core, but it did make validation/unit testing a whole lot easier
CustomEntityAttributeFilterValue findByEntityAttributesFilterAndCustomEntityAttributeDefinition(EntityAttributesFilter eaf , CustomEntityAttributeDefinition cead);

List<CustomEntityAttributeFilterValue> findAllByCustomEntityAttributeDefinition(CustomEntityAttributeDefinition definition);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,26 @@

import java.util.List;

import javax.persistence.EntityManager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import edu.internet2.tier.shibboleth.admin.ui.domain.CustomEntityAttributeDefinition;
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.CustomEntityAttributeFilterValue;
import edu.internet2.tier.shibboleth.admin.ui.repository.CustomEntityAttributeDefinitionRepository;
import edu.internet2.tier.shibboleth.admin.ui.repository.CustomEntityAttributeFilterValueRepository;

@Service
public class CustomEntityAttributesDefinitionServiceImpl implements CustomEntityAttributesDefinitionService {
@Autowired
private CustomEntityAttributeDefinitionRepository repository;

@Autowired
CustomEntityAttributeFilterValueRepository customEntityAttributeFilterValueRepository;

@Autowired
EntityManager entityManager;

@Override
public CustomEntityAttributeDefinition createOrUpdateDefinition(CustomEntityAttributeDefinition definition) {
Expand All @@ -20,7 +30,15 @@ public CustomEntityAttributeDefinition createOrUpdateDefinition(CustomEntityAttr

@Override
public void deleteDefinition(CustomEntityAttributeDefinition definition) {
repository.delete(definition);
// must remove any CustomEntityAttributeFilterValues first to avoid integrity constraint issues
List<CustomEntityAttributeFilterValue> customEntityValues = customEntityAttributeFilterValueRepository.findAllByCustomEntityAttributeDefinition(definition);
customEntityValues.forEach(value -> {
value.getEntityAttributesFilter().getCustomEntityAttributes().remove(value);
entityManager.remove(value);
customEntityAttributeFilterValueRepository.delete(value);
});
CustomEntityAttributeDefinition entityToRemove = repository.findByName(definition.getName());
repository.delete(entityToRemove);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@ import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
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

@Configuration
@ComponentScan("edu.internet2.tier.shibboleth.admin.ui.service")
class TestConfiguration {
@Autowired
IndexWriterService indexWriterService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration
import edu.internet2.tier.shibboleth.admin.ui.domain.CustomEntityAttributeDefinition
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.CustomEntityAttributeFilterValue
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter
import edu.internet2.tier.shibboleth.admin.ui.service.CustomEntityAttributesDefinitionService
import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.domain.EntityScan
Expand All @@ -28,9 +29,9 @@ class FilterRepositoryTests extends Specification {

@Autowired
FilterRepository repositoryUnderTest

@Autowired
CustomEntityAttributeDefinitionRepository ceadRepo
CustomEntityAttributesDefinitionService ceadService

@Autowired
CustomEntityAttributeFilterValueRepository ceafvRepo
Expand Down Expand Up @@ -102,7 +103,7 @@ class FilterRepositoryTests extends Specification {
it.defaultValue = "foo"
it
}
ceadRepo.save(ca)
ceadService.createOrUpdateDefinition(ca)
entityManager.flush()
entityManager.clear()

Expand Down Expand Up @@ -139,7 +140,7 @@ class FilterRepositoryTests extends Specification {
entityManager.flush()

def savedFilter = repositoryUnderTest.findByResourceId(persistedFilter.resourceId)
def saveEAD = ceadRepo.findByName("ca-name");
def saveEAD = ceadService.find("ca-name")

def ceafv = new CustomEntityAttributeFilterValue().with {
it.entityAttributesFilter = savedFilter
Expand Down Expand Up @@ -176,5 +177,89 @@ class FilterRepositoryTests extends Specification {
entityManager.flush()

ceafvRepo.findAll().size() == 0
}
}

def "Delete custom entity attributes definition removes entries from filter correctly"(){
given:
def ca = new CustomEntityAttributeDefinition().with {
it.name = "ca-name"
it.attributeType = "STRING"
it.defaultValue = "foo"
it
}
ceadService.createOrUpdateDefinition(ca)
entityManager.flush()
entityManager.clear()

def entityAttributesFilterJson = '''{
"name": "EntityAttributes",
"resourceId": "29a5d409-562a-41cd-acee-e9b3d7098d05",
"filterEnabled": false,
"entityAttributesFilterTarget": {
"entityAttributesFilterTargetType": "CONDITION_SCRIPT",
"value": [
"TwUuSOz5O6"
]
},
"attributeRelease": [
"WbkhLQNI3m"
],
"relyingPartyOverrides": {
"signAssertion": true,
"dontSignResponse": true,
"turnOffEncryption": true,
"useSha": true,
"ignoreAuthenticationMethod": false,
"omitNotBefore": true,
"responderId": null,
"nameIdFormats": [
"xLenUFmCLn"
],
"authenticationMethods": []
},
"@type": "EntityAttributes"
}'''
def filter = new ObjectMapper().readValue(entityAttributesFilterJson.bytes, EntityAttributesFilter.class)
def persistedFilter = repositoryUnderTest.save(filter)
entityManager.flush()

def savedFilter = repositoryUnderTest.findByResourceId(persistedFilter.resourceId)
def saveEAD = ceadService.find("ca-name");

def ceafv = new CustomEntityAttributeFilterValue().with {
it.entityAttributesFilter = savedFilter
it.customEntityAttributeDefinition = saveEAD
it.value = "bar"
it
}

def customEntityAttributes = new HashSet()

when:
customEntityAttributes.add(ceafv) // nothing to do yet, just here to let us verify nothing in the CEAFV table in 'then' block

then:
((Set)ceafvRepo.findAll()).size() == 0 //nothing yet
((EntityAttributesFilter)savedFilter).setCustomEntityAttributes(customEntityAttributes)
repositoryUnderTest.save(savedFilter)
entityManager.flush()

then:
def listOfceafv = ceafvRepo.findAll()
listOfceafv.size() == 1

def ceafvFromDb = listOfceafv.get(0).asType(CustomEntityAttributeFilterValue)
ceafvFromDb.getEntityAttributesFilter().getResourceId().equals("29a5d409-562a-41cd-acee-e9b3d7098d05")

def filterFromDb = (EntityAttributesFilter) repositoryUnderTest.findByResourceId("29a5d409-562a-41cd-acee-e9b3d7098d05")
filterFromDb.getCustomEntityAttributes().size() == 1

// now remove the definition
ceadService.deleteDefinition(saveEAD)
entityManager.flush()
entityManager.clear()

def filterFromDb2 = (EntityAttributesFilter)repositoryUnderTest.findByResourceId("29a5d409-562a-41cd-acee-e9b3d7098d05")
filterFromDb2.getCustomEntityAttributes().size() == 0
}
}

0 comments on commit 837ce16

Please sign in to comment.