diff --git a/.gitignore b/.gitignore index 934a0cec0..050e01025 100644 --- a/.gitignore +++ b/.gitignore @@ -390,4 +390,8 @@ pac4j-module/out/ r #Local integration test run shell script wrapper -rinteg \ No newline at end of file +rinteg + +#Local run with durable H2 shell script wrapper +**/application-h2durable.properties +rdurable \ No newline at end of file diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/MetadataResolverEnversVersioningTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/MetadataResolverEnversVersioningTests.groovy index 2ba81bcdf..b468a2ffa 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/MetadataResolverEnversVersioningTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/envers/MetadataResolverEnversVersioningTests.groovy @@ -54,7 +54,7 @@ class MetadataResolverEnversVersioningTests extends Specification { when: LocalDynamicMetadataResolver resolver = new LocalDynamicMetadataResolver(name: 'ldmr').with { - it.dynamicMetadataResolverAttributes = new DynamicMetadataResolverAttributes() + it.dynamicMetadataResolverAttributes = new DynamicMetadataResolverAttributes(refreshDelayFactor: 0.75) it } def resolverHistory = updateAndGetRevisionHistoryOfMetadataResolver(resolver, diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/ShibbolethUiApplication.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/ShibbolethUiApplication.java index 42e7901e7..b2470b8c5 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/ShibbolethUiApplication.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/ShibbolethUiApplication.java @@ -21,6 +21,8 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import javax.script.ScriptException; + @SpringBootApplication @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "edu.internet2.tier.shibboleth.admin.ui.configuration.auto.*")) @EntityScan(basePackages = {"edu.internet2.tier.shibboleth.admin.ui.domain", "edu.internet2.tier.shibboleth.admin.ui.envers", "edu.internet2.tier.shibboleth.admin.ui.security.model"}) @@ -69,7 +71,16 @@ public void initializeResolvers(ApplicationStartedEvent e) { metadataResolverRepository.findAll() .forEach(it -> { logger.info(String.format("Reloading filters for resolver [%s: %s]", it.getName(), it.getResourceId())); - metadataResolverService.reloadFilters(it.getResourceId()); + try { + metadataResolverService.reloadFilters(it.getResourceId()); + } + catch (Throwable ex) { + if(ex instanceof ScriptException) { + logger.warn("Caught invalid script parsing error. Please fix the script data.", ex); + return; + } + throw ex; + } }); } } 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 b640f6362..87c7a8bd3 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 @@ -15,6 +15,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; @@ -27,6 +28,7 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; +import javax.script.ScriptException; import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -57,7 +59,7 @@ public class MetadataFiltersController { @ExceptionHandler public ResponseEntity notFoundHandler(HttpClientErrorException ex) { - if(ex.getStatusCode() == NOT_FOUND) { + if (ex.getStatusCode() == NOT_FOUND) { return ResponseEntity.notFound().build(); } throw ex; @@ -78,13 +80,14 @@ public ResponseEntity getOne(@PathVariable String metadataResolverId, @PathVa } @PostMapping("/Filters") + @Transactional public ResponseEntity create(@PathVariable String metadataResolverId, @RequestBody MetadataFilter createdFilter) { MetadataResolver metadataResolver = findResolverOrThrowHttp404(metadataResolverId); metadataResolver.addFilter(createdFilter); MetadataResolver persistedMr = repository.save(metadataResolver); // we reload the filters here after save - metadataResolverService.reloadFilters(persistedMr.getResourceId()); + reloadFiltersAndHandleScriptException(persistedMr.getResourceId()); MetadataFilter persistedFilter = newlyPersistedFilter(persistedMr.getMetadataFilters().stream(), createdFilter.getResourceId()); @@ -94,6 +97,7 @@ public ResponseEntity create(@PathVariable String metadataResolverId, @Reques } @PutMapping("/Filters/{resourceId}") + @Transactional public ResponseEntity update(@PathVariable String metadataResolverId, @PathVariable String resourceId, @RequestBody MetadataFilter updatedFilter) { @@ -106,7 +110,7 @@ public ResponseEntity update(@PathVariable String metadataResolverId, .stream() .filter(it -> it.getResourceId().equals(resourceId)) .findFirst(); - if(!filterTobeUpdatedOptional.isPresent()) { + if (!filterTobeUpdatedOptional.isPresent()) { return ResponseEntity.notFound().build(); } MetadataFilter filterTobeUpdated = filterTobeUpdatedOptional.get(); @@ -129,8 +133,8 @@ public ResponseEntity update(@PathVariable String metadataResolverId, metadataResolver.markAsModified(); repository.save(metadataResolver); - // TODO: this is wrong - metadataResolverService.reloadFilters(metadataResolver.getResourceId()); + // TODO: do we need to reload filters here? + reloadFiltersAndHandleScriptException(metadataResolver.getResourceId()); return ResponseEntity.ok().body(persistedFilter); } @@ -149,7 +153,7 @@ public ResponseEntity delete(@PathVariable String metadataResolverId, //change that we need to make in the entire code base List updatedFilters = new ArrayList<>(resolver.getMetadataFilters()); boolean removed = updatedFilters.removeIf(f -> f.getResourceId().equals(resourceId)); - if(!removed) { + if (!removed) { throw HTTP_404_CLIENT_ERROR_EXCEPTION.get(); } resolver.setMetadataFilters(updatedFilters); @@ -164,9 +168,23 @@ public ResponseEntity delete(@PathVariable String metadataResolverId, return ResponseEntity.noContent().build(); } + private void reloadFiltersAndHandleScriptException(String resolverResourceId) { + try { + metadataResolverService.reloadFilters(resolverResourceId); + } catch (Throwable ex) { + //explicitly mark transaction for rollback when we get ScriptException as we call reloadFilters + //after persistence call. Then re-throw the exception + //to let RestControllerSupport advice return proper 400 error message + if (ex instanceof ScriptException) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw ex; + } + } + } + private MetadataResolver findResolverOrThrowHttp404(String resolverResourceId) { MetadataResolver resolver = repository.findByResourceId(resolverResourceId); - if(resolver == null) { + if (resolver == null) { throw HTTP_404_CLIENT_ERROR_EXCEPTION.get(); } return resolver; @@ -174,7 +192,7 @@ private MetadataResolver findResolverOrThrowHttp404(String resolverResourceId) { private MetadataFilter findFilterOrThrowHttp404(String filterResourceId) { MetadataFilter filter = filterRepository.findByResourceId(filterResourceId); - if(filter == null) { + if (filter == null) { throw HTTP_404_CLIENT_ERROR_EXCEPTION.get(); } return filter; @@ -189,28 +207,25 @@ private MetadataFilter newlyPersistedFilter(Stream filters, fina } /** - * * Add else if instanceof block here for each concrete filter types we add in the future */ private void updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated, MetadataFilter filterWithUpdatedData) { //TODO: Could we maybe use Dozer here before things get out of control? https://dozermapper.github.io // Mapper mapper = new net.sf.dozer.Mapper(); // or autowire one // mapper.map(fromFilter, toFilter); - if(filterWithUpdatedData instanceof EntityAttributesFilter) { + if (filterWithUpdatedData instanceof EntityAttributesFilter) { EntityAttributesFilter toFilter = EntityAttributesFilter.class.cast(filterToBeUpdated); EntityAttributesFilter fromFilter = EntityAttributesFilter.class.cast(filterWithUpdatedData); toFilter.setEntityAttributesFilterTarget(fromFilter.getEntityAttributesFilterTarget()); toFilter.setRelyingPartyOverrides(fromFilter.getRelyingPartyOverrides()); toFilter.setAttributeRelease(fromFilter.getAttributeRelease()); - } - else if(filterWithUpdatedData instanceof EntityRoleWhiteListFilter) { + } else if (filterWithUpdatedData instanceof EntityRoleWhiteListFilter) { EntityRoleWhiteListFilter toFilter = EntityRoleWhiteListFilter.class.cast(filterToBeUpdated); EntityRoleWhiteListFilter fromFilter = EntityRoleWhiteListFilter.class.cast(filterWithUpdatedData); toFilter.setRemoveEmptyEntitiesDescriptors(fromFilter.getRemoveEmptyEntitiesDescriptors()); toFilter.setRemoveRolelessEntityDescriptors(fromFilter.getRemoveRolelessEntityDescriptors()); toFilter.setRetainedRoles(fromFilter.getRetainedRoles()); - } - else if (filterWithUpdatedData instanceof SignatureValidationFilter) { + } else if (filterWithUpdatedData instanceof SignatureValidationFilter) { SignatureValidationFilter toFilter = SignatureValidationFilter.class.cast(filterToBeUpdated); SignatureValidationFilter fromFilter = SignatureValidationFilter.class.cast(filterWithUpdatedData); toFilter.setRequireSignedRoot(fromFilter.getRequireSignedRoot()); @@ -220,13 +235,11 @@ else if (filterWithUpdatedData instanceof SignatureValidationFilter) { toFilter.setDynamicTrustedNamesStrategyRef(fromFilter.getDynamicTrustedNamesStrategyRef()); toFilter.setTrustEngineRef(fromFilter.getTrustEngineRef()); toFilter.setPublicKey(fromFilter.getPublicKey()); - } - else if(filterWithUpdatedData instanceof RequiredValidUntilFilter) { + } else if (filterWithUpdatedData instanceof RequiredValidUntilFilter) { RequiredValidUntilFilter toFilter = RequiredValidUntilFilter.class.cast(filterToBeUpdated); RequiredValidUntilFilter fromFilter = RequiredValidUntilFilter.class.cast(filterWithUpdatedData); toFilter.setMaxValidityInterval(fromFilter.getMaxValidityInterval()); - } - else if (filterWithUpdatedData instanceof NameIdFormatFilter) { + } else if (filterWithUpdatedData instanceof NameIdFormatFilter) { NameIdFormatFilter toFilter = NameIdFormatFilter.class.cast(filterToBeUpdated); NameIdFormatFilter fromFilter = NameIdFormatFilter.class.cast(filterWithUpdatedData); toFilter.setRemoveExistingFormats(fromFilter.getRemoveExistingFormats()); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilterTarget.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilterTarget.java index ffff2ca30..8a9c2a7fb 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilterTarget.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilterTarget.java @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; @@ -31,6 +32,7 @@ public enum EntityAttributesFilterTargetType { @ElementCollection @OrderColumn + @Column(length = 4000) private List value; public EntityAttributesFilterTargetType getEntityAttributesFilterTargetType() { diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicMetadataResolverAttributes.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicMetadataResolverAttributes.java index d817284ba..9a87d1ffa 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicMetadataResolverAttributes.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicMetadataResolverAttributes.java @@ -20,17 +20,17 @@ public class DynamicMetadataResolverAttributes { private String taskTimerRef; - private Float refreshDelayFactor = 0.75F; + private Float refreshDelayFactor; - private String minCacheDuration = "PT10M"; + private String minCacheDuration; - private String maxCacheDuration = "PT8H"; + private String maxCacheDuration; - private String maxIdleEntityData = "PT8H"; + private String maxIdleEntityData; private Boolean removeIdleEntityData; - private String cleanupTaskInterval = "PT30M"; + private String cleanupTaskInterval; private String persistentCacheManagerRef; @@ -40,7 +40,7 @@ public class DynamicMetadataResolverAttributes { private Boolean initializeFromPersistentCacheInBackground = true; - private String backgroundInitializationFromCacheDelay = "PT2S"; + private String backgroundInitializationFromCacheDelay; private String initializationFromCachePredicateRef; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java index d7d124a0a..9660950d7 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import static edu.internet2.tier.shibboleth.admin.util.DurationUtility.toMillis; @@ -83,6 +84,15 @@ protected void initMetadataResolver() throws ComponentInitializationException { indexWriter); } + @Nonnull + @Override + protected BatchEntityBackingStore getBackingStore() { + if (super.getBackingStore() == null) { + super.setBackingStore(super.createNewBackingStore()); + } + return super.getBackingStore(); + } + /** * {@inheritDoc} */ diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java index 8da204c3e..cfd3bdf2c 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java @@ -11,6 +11,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.File; @@ -51,15 +52,31 @@ public DateTime getLastRefresh() { @Override protected void initMetadataResolver() throws ComponentInitializationException { + //Necessary to make sure backing store is initialized by the super class to avoid NPE during re-filtering + try { + setBackingStore(createNewBackingStore()); + } + catch(Throwable e) { + logger.warn("Error caught and ignored during initialization necessary to init backingStore", e); + } + if (this.sourceResolver.getDoInitialization()) { super.initMetadataResolver(); - delegate.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), this.sourceResolver.getResourceId(), indexWriter); } } + @Nonnull + @Override + protected BatchEntityBackingStore getBackingStore() { + if (super.getBackingStore() == null) { + super.setBackingStore(super.createNewBackingStore()); + } + return super.getBackingStore(); + } + /** * {@inheritDoc} */ diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlResourceBackedMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlResourceBackedMetadataResolver.java index 0a4b2a7f2..62bdb37d8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlResourceBackedMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlResourceBackedMetadataResolver.java @@ -11,6 +11,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; @@ -59,6 +60,15 @@ protected void initMetadataResolver() throws ComponentInitializationException { indexWriter); } + @Nonnull + @Override + protected BatchEntityBackingStore getBackingStore() { + if (super.getBackingStore() == null) { + super.setBackingStore(super.createNewBackingStore()); + } + return super.getBackingStore(); + } + /** * {@inheritDoc} */ diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterServiceImpl.java index 8088793a9..ee5f8cec3 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterServiceImpl.java @@ -13,6 +13,7 @@ import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects; import net.shibboleth.ext.spring.resource.ResourceHelper; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.logic.ConstraintViolationException; import net.shibboleth.utilities.java.support.resolver.ResolverException; import net.shibboleth.utilities.java.support.resource.Resource; import org.apache.lucene.index.IndexWriter; @@ -21,13 +22,10 @@ import org.opensaml.saml.metadata.resolver.MetadataResolver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; -import org.springframework.stereotype.Service; -import javax.validation.ConstraintViolationException; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; -import java.net.URL; import static edu.internet2.tier.shibboleth.admin.util.TokenPlaceholderResolvers.placeholderResolverService; @@ -46,8 +44,8 @@ private OpenSamlFunctionDrivenDynamicHTTPMetadataResolver convertToOpenSamlRepre IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); OpenSamlFunctionDrivenDynamicHTTPMetadataResolver openSamlResolver = new OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(openSamlObjects.getParserPool(), - indexWriter, - resolver); + indexWriter, + resolver); openSamlResolver.initialize(); return openSamlResolver; } @@ -68,31 +66,25 @@ private OpenSamlFilesystemMetadataResolver convertToOpenSamlRepresentation(Files } OpenSamlFilesystemMetadataResolver openSamlResolver = new OpenSamlFilesystemMetadataResolver(openSamlObjects.getParserPool(), - indexWriter, - resolver, - metadataFile); + indexWriter, + resolver, + metadataFile); openSamlResolver.initialize(); return openSamlResolver; } private OpenSamlLocalDynamicMetadataResolver convertToOpenSamlRepresentation(LocalDynamicMetadataResolver resolver) throws IOException, ComponentInitializationException { - IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); - - XMLObjectLoadSaveManager manager = null; - if (resolver.getDoInitialization()) { - try { - manager = new FilesystemLoadSaveManager(placeholderResolverService() - .resolveValueFromPossibleTokenPlaceholder(resolver.getSourceDirectory())); - } catch (ConstraintViolationException e) { - // the base directory string instance was null or empty - //TODO: What should we do here? Currently, this causes a test to fail. - throw new RuntimeException("An exception occurred while attempting to instantiate a FilesystemLoadSaveManger for the path: " + resolver.getSourceDirectory(), e); - } + try { + IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); + XMLObjectLoadSaveManager manager = new FilesystemLoadSaveManager(new AlwaysExistingVirtualMetadataDirectory(placeholderResolverService() + .resolveValueFromPossibleTokenPlaceholder(resolver.getSourceDirectory()))); + OpenSamlLocalDynamicMetadataResolver openSamlResolver = new OpenSamlLocalDynamicMetadataResolver(openSamlObjects.getParserPool(), indexWriter, resolver, manager); + openSamlResolver.initialize(); + return openSamlResolver; + } catch (ConstraintViolationException e) { + // the base directory string instance was null or empty + throw new RuntimeException("An exception occurred while attempting to instantiate a FilesystemLoadSaveManger for the path: " + resolver.getSourceDirectory(), e); } - - OpenSamlLocalDynamicMetadataResolver openSamlResolver = new OpenSamlLocalDynamicMetadataResolver(openSamlObjects.getParserPool(), indexWriter, resolver, manager); - openSamlResolver.initialize(); - return openSamlResolver; } private OpenSamlResourceBackedMetadataResolver convertToOpenSamlRepresentation(ResourceBackedMetadataResolver resolver) throws IOException, ComponentInitializationException { @@ -112,9 +104,9 @@ private OpenSamlResourceBackedMetadataResolver convertToOpenSamlRepresentation(R } OpenSamlResourceBackedMetadataResolver openSamlResolver = new OpenSamlResourceBackedMetadataResolver(openSamlObjects.getParserPool(), - indexWriter, - resolver, - resource); + indexWriter, + resolver, + resource); openSamlResolver.initialize(); return openSamlResolver; } @@ -136,4 +128,27 @@ public MetadataResolver convertToOpenSamlRepresentation(edu.internet2.tier.shibb throw new RuntimeException("Unsupported metadata resolver type!"); } } + + /** + * Use this class when creating FilesystemLoadSaveManager for OpenSamlLocalDynamicMetadataResolver + * as we guard the system from any file-related exceptions during init of open saml object representation. + * File with the same name might exist and we don't force the + * system to create a directory in this case. Shibboleth Idp would take care of these directory-creating aspects + * instead. + */ + private static class AlwaysExistingVirtualMetadataDirectory extends File { + public AlwaysExistingVirtualMetadataDirectory(String pathname) { + super(pathname); + } + + @Override + public boolean exists() { + return true; + } + + @Override + public boolean isDirectory() { + return true; + } + } } diff --git a/backend/src/main/resources/i18n/messages.properties b/backend/src/main/resources/i18n/messages.properties index 1e3c0370d..6fd9ac34e 100644 --- a/backend/src/main/resources/i18n/messages.properties +++ b/backend/src/main/resources/i18n/messages.properties @@ -58,6 +58,7 @@ action.back-to-top=Back to Top action.restore=Restore action.view-only-changes=View Only Changes action.user-role=User Role +action.toggle-view=Toggle view value.enabled=Enabled value.disabled=Disabled @@ -207,8 +208,8 @@ label.service-provider-status=Metadata Source Status: label.current-metadata-sources=Current Metadata Sources label.current-metadata-providers=Current Metadata Providers label.add-a-new-metadata-provider=Add a new metadata provider -label.service-resolver-name-dashboard-display-only=Service Resolver Name (Dashboard Display Only) -label.service-resolver-entity-id=Service Resolver Entity ID +label.service-resolver-name-dashboard-display-only=Service Provider Name (Dashboard Display Only) +label.service-resolver-entity-id=Service Provider Entity ID label.add-a-new-metadata-source=Add a new metadata source - Finish Summary label.name-and-entityid=Name and Entity ID. label.finish-summary-validation=Finished! @@ -221,8 +222,8 @@ label.how-are-you-adding-the-metadata-information=How are you adding the metadat label.upload-url=Upload/URL label.or=or label.name-and-upload-url=Name and Upload Url -label.service-resolver-file=Select Resolver Metadata File -label.service-resolver-metadata-url=Service Resolver Metadata URL +label.service-resolver-file=Select Provider Metadata File +label.service-resolver-metadata-url=Service Provider Metadata URL label.search-criteria-by=Search Criteria by { displayType } label.entity-ids-added=Entity Ids Added label.ui-mdui-info=User Interface / MDUI Information @@ -444,6 +445,8 @@ message.type-required=Missing required property: Type message.match-required=Missing required property: Match message.value-required=Missing required property: Value +message.protocol-support-required=Protocol Support Enumeration is required if any NameID formats are defined. + message.conflict=Conflict message.data-version-contention=Data Version Contention message.contention-new-version=A newer version of this metadata source has been saved. Below are a list of changes. You can use your changes or their changes. @@ -462,7 +465,7 @@ message.unsaved-editor=You have not saved your changes. If you exit this screen, message.editor-invalid=All forms must be valid before changes can be saved! message.unsaved-source-1=You have not completed the wizard! Do you wish to save this information? You can finish the wizard later by clicking the \u0027Edit\u0027 message.unsaved-source-2=icon on the dashboard. -message.service-resolver-name-required=Service Resolver Name is required +message.service-resolver-name-required=Service Provider Name is required message.entity-id-required=Entity ID is required message.entity-id-must-be-unique=Entity ID must be unique message.file-upload-alert=Note: You can only import a file with a single entityID (EntityDescriptor element) in it. Anything more in that file will result in an error. @@ -482,7 +485,7 @@ message.restoring-this-version-will-copy=Restoring this version will copy the Ve message.invalid-regex-pattern=Invalid Regular Expression -message.invalid-signing=Warning! If neither the Assertions or the Response are signed the service will not be able to verify a SAML response from the Identity Provider. +message.invalid-signing=Unless the response or the assertions are signed, SAML security is compromised and the service should reject the SAML response. (If it doesn\u0027t, investigate, as that is serious unless the HTTP-Artifact binding is in use.) tooltip.entity-id=Entity ID tooltip.service-provider-name=Service Provider Name (Dashboard Display Only) @@ -501,6 +504,7 @@ tooltip.mark-as-default=Mark as Default tooltip.protocol-support-enumeration=Protocol Support Enumeration tooltip.nameid-format=Content is name identifier format which is added to all the applicable roles of the entities which match any of the following or {{}}elements. tooltip.enable-this-service-upon-saving=If checkbox is clicked, the metadata provider is enabled for integration with the IdP +tooltip.is-there-a-x509-certificate=Is there a X509 Certificate? tooltip.authentication-requests-signed=Authentication Requests Signed tooltip.want-assertions-signed=Want Assertions Signed tooltip.certificate-name=Certificate Name @@ -559,7 +563,7 @@ tooltip.enable-provider-upon-saving=If checkbox is clicked, the metadata provide tooltip.max-validity-interval=Defines the window within which the metadata is valid. tooltip.require-signed-root=If true, this fails to load metadata with no signature on the root XML element. -tooltip.certificate-file=A path (on the local file system) to a certificate file whose key used to verify the signature. Conflicts with trustEngineRef and both of the child elements. +tooltip.certificate-file=A path (on the local file system) to a certificate file whose key is used to verify the signature. Conflicts with trustEngineRef and both of the child elements. tooltip.retained-roles=Note that property replacement cannot be used on this element. tooltip.remove-roleless-entity-descriptors=Controls whether to keep entity descriptors that contain no roles. Note: If this attribute is set to false, the resulting output may not be schema-valid since an element must include at least one role descriptor. tooltip.remove-empty-entities-descriptors=Controls whether to keep entities descriptors that contain no entity descriptors. Note: If this attribute is set to false, the resulting output may not be schema-valid since an element must include at least one child element, either an element or an element. diff --git a/backend/src/main/resources/i18n/messages_en.properties b/backend/src/main/resources/i18n/messages_en.properties index b2875bc84..3384f478a 100644 --- a/backend/src/main/resources/i18n/messages_en.properties +++ b/backend/src/main/resources/i18n/messages_en.properties @@ -196,13 +196,13 @@ label.service-provider-status=Metadata Source Status: label.current-metadata-sources=Current Metadata Sources label.current-metadata-providers=Current Metadata Providers label.add-a-new-metadata-provider=Add a new metadata provider -label.service-resolver-name-dashboard-display-only=Service Resolver Name (Dashboard Display Only) -label.service-resolver-entity-id=Service Resolver Entity ID +label.service-resolver-name-dashboard-display-only=Service Provider Name (Dashboard Display Only) +label.service-resolver-entity-id=Service Provider Entity ID label.add-a-new-metadata-source=Add a new metadata source - Finish Summary label.name-and-entityid=Name and Entity ID. label.finish-summary-validation=Finished! label.select-entity-id-to-copy=Select the Entity ID to copy -label.metadata-source-name-dashboard-display-only=Metadata Source Name (Dashboard Display Only) +label.metadata-source-name-dashboard-display-only=Service Provider Name (Dashboard Display Only) label.new-entity-id=New Entity ID label.sections-to-copy=Sections to Copy? label.add-a-new-metadata-resolver=Add a new metadata source @@ -210,8 +210,8 @@ label.how-are-you-adding-the-metadata-information=How are you adding the metadat label.upload-url=Upload/URL label.or=or label.name-and-upload-url=Name and Upload Url -label.service-resolver-file=Select Resolver Metadata File -label.service-resolver-metadata-url=Service Resolver Metadata URL +label.service-resolver-file=Select Provider Metadata File +label.service-resolver-metadata-url=Service Provider Metadata URL label.search-criteria-by=Search Criteria by { displayType } label.entity-ids-added=Entity Ids Added label.ui-mdui-info=User Interface / MDUI Information @@ -429,7 +429,7 @@ message.unsaved-editor=You have not saved your changes. If you exit this screen, message.editor-invalid=All forms must be valid before changes can be saved! message.unsaved-source-1=You have not completed the wizard! Do you wish to save this information? You can finish the wizard later by clicking the \u0027Edit\u0027 message.unsaved-source-2=icon on the dashboard. -message.service-resolver-name-required=Service Resolver Name is required +message.service-resolver-name-required=Service Provider Name is required message.entity-id-required=Entity ID is required message.entity-id-must-be-unique=Entity ID must be unique message.file-upload-alert=Note: You can only import a file with a single entityID (EntityDescriptor element) in it. Anything more in that file will result in an error. @@ -521,7 +521,7 @@ tooltip.enable-provider-upon-saving=If checkbox is clicked, the metadata provide tooltip.max-validity-interval=Defines the window within which the metadata is valid. tooltip.require-signed-root=If true, this fails to load metadata with no signature on the root XML element. -tooltip.certificate-file=A path (on the local file system) to a certificate file whose key used to verify the signature. Conflicts with trustEngineRef and both of the child elements. +tooltip.certificate-file=A path (on the local file system) to a certificate file whose key is used to verify the signature. Conflicts with trustEngineRef and both of the child elements. tooltip.retained-roles=Note that property replacement cannot be used on this element. tooltip.remove-roleless-entity-descriptors=Controls whether to keep entity descriptors that contain no roles. Note: If this attribute is set to false, the resulting output may not be schema-valid since an element must include at least one role descriptor. tooltip.remove-empty-entities-descriptors=Controls whether to keep entities descriptors that contain no entity descriptors. Note: If this attribute is set to false, the resulting output may not be schema-valid since an element must include at least one child element, either an element or an element. diff --git a/backend/src/main/resources/metadata-sources-ui-schema.json b/backend/src/main/resources/metadata-sources-ui-schema.json index da3cc5672..6d556d606 100644 --- a/backend/src/main/resources/metadata-sources-ui-schema.json +++ b/backend/src/main/resources/metadata-sources-ui-schema.json @@ -149,9 +149,6 @@ }, "serviceProviderSsoDescriptor": { "type": "object", - "widget": { - "id": "fieldset" - }, "fieldsets": [ { "type": "group", @@ -282,7 +279,6 @@ "type": "object", "title": "label.certificate", "required": [ - "name", "type", "value" ], @@ -291,7 +287,6 @@ "title": "label.certificate-name-display-only", "description": "tooltip.certificate-name", "type": "string", - "minLength": 1, "maxLength": 255 }, "type": { @@ -580,4 +575,4 @@ } } } -} \ No newline at end of file +} 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 098e7ac2b..a07353b9c 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 @@ -4,6 +4,8 @@ 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.resolvers.opensaml.OpenSamlChainingMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverConverterService @@ -23,6 +25,7 @@ import org.springframework.http.HttpHeaders import org.springframework.test.context.ActiveProfiles import spock.lang.Specification +import static edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget.EntityAttributesFilterTargetType.CONDITION_SCRIPT import static org.springframework.http.HttpMethod.PUT /** @@ -191,7 +194,7 @@ class MetadataFiltersControllerIntegrationTests extends Specification { 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 filter = generator.entityAttributesFilter() def resolverResourceId = resolver.resourceId metadataResolverRepository.save(resolver) MetadataResolver openSamlRepresentation = metadataResolverConverterService.convertToOpenSamlRepresentation(resolver) @@ -209,6 +212,38 @@ class MetadataFiltersControllerIntegrationTests extends Specification { originalModifiedDate < afterFilterAddedModifiedDate } + def "EntityAttributesFilter with invalid script does not result in persisting that filter"() { + def resolver = generator.buildRandomMetadataResolverOfType('FileBacked') + def resolverResourceId = resolver.resourceId + metadataResolverRepository.save(resolver) + MetadataResolver openSamlRepresentation = metadataResolverConverterService.convertToOpenSamlRepresentation(resolver) + OpenSamlChainingMetadataResolverUtil.updateChainingMetadataResolver((OpenSamlChainingMetadataResolver) chainingMetadataResolver, openSamlRepresentation) + def filter = new EntityAttributesFilter().with { + it.name = 'SHIBUI-1249' + it.resourceId = 'SHIBUI-1249' + it.entityAttributesFilterTarget = new EntityAttributesFilterTarget().with { + it.entityAttributesFilterTargetType = CONDITION_SCRIPT + it.singleValue = """ + echo('invalid; + """ + it + } + it + } + + when: + def result = restTemplate.postForEntity("$BASE_URI/$resolverResourceId/Filters", filter, String) + + then: + result.statusCodeValue == 400 + + when: + result = this.restTemplate.getForEntity("$BASE_URI/$resolverResourceId", Map) + + then: + result.body.metadataFilters.size == 0 + } + private HttpEntity createRequestHttpEntityFor(Closure jsonBodySupplier) { new HttpEntity(jsonBodySupplier(), ['Content-Type': 'application/json'] as HttpHeaders) } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/OpenSamlFileBackedHTTPMetadataResolverTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/OpenSamlFileBackedHTTPMetadataResolverTests.groovy new file mode 100644 index 000000000..2a7ef7f7b --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/OpenSamlFileBackedHTTPMetadataResolverTests.groovy @@ -0,0 +1,27 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers + +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlFileBackedHTTPMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects +import edu.internet2.tier.shibboleth.admin.ui.service.TokenPlaceholderValueResolvingService +import edu.internet2.tier.shibboleth.admin.util.TokenPlaceholderResolvers +import org.springframework.core.env.MutablePropertySources +import spock.lang.Specification + +class OpenSamlFileBackedHTTPMetadataResolverTests extends Specification { + def openSamlObjects = new OpenSamlObjects().with { + init() + it + } + + def "test refresh"() { + when: + new TokenPlaceholderResolvers(TokenPlaceholderValueResolvingService.shibbolethPlaceholderPrefixAware(new MutablePropertySources())) + def fbhmr = new FileBackedHttpMetadataResolver(name: 'test', xmlId: 'test', metadataURL: 'http://testme', backingFile: 'metadata/testme.xml') + + def x = new OpenSamlFileBackedHTTPMetadataResolver(openSamlObjects.parserPool, null, fbhmr) + x.refilter() + + then: + noExceptionThrown() + } +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/OpenSamlFilesystemMetadataResolverTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/OpenSamlFilesystemMetadataResolverTests.groovy new file mode 100644 index 000000000..f6669b32a --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/OpenSamlFilesystemMetadataResolverTests.groovy @@ -0,0 +1,22 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers + +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlFilesystemMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects +import spock.lang.Specification + +class OpenSamlFilesystemMetadataResolverTests extends Specification { + def openSamlObjects = new OpenSamlObjects().with { + init() + it + } + + def "test refresh"() { + when: + def fsmr = new FilesystemMetadataResolver(name: 'test', xmlId: 'test', metadataFile: 'metadata/metadata.xml') + def x = new OpenSamlFilesystemMetadataResolver(openSamlObjects.parserPool, null, fsmr, new File(fsmr.metadataFile)) + x.refilter() + + then: + noExceptionThrown() + } +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/OpenSamlResourceBackedMetadataResolverTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/OpenSamlResourceBackedMetadataResolverTests.groovy new file mode 100644 index 000000000..28223b2f8 --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/OpenSamlResourceBackedMetadataResolverTests.groovy @@ -0,0 +1,24 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers + +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlResourceBackedMetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects +import net.shibboleth.ext.spring.resource.ResourceHelper +import org.springframework.core.io.ClassPathResource +import spock.lang.Specification + +class OpenSamlResourceBackedMetadataResolverTests extends Specification { + def openSamlObjects = new OpenSamlObjects().with { + init() + it + } + + def 'test refresh'() { + when: + def rbmr = new ResourceBackedMetadataResolver(name: 'test', xmlId: 'test', classpathMetadataResource: new ClasspathMetadataResource('metadata/metadata.xml')) + def x = new OpenSamlResourceBackedMetadataResolver(openSamlObjects.parserPool, null, rbmr, ResourceHelper.of(new ClassPathResource(rbmr.classpathMetadataResource.file))) + x.refilter() + + then: + noExceptionThrown() + } +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTests.groovy index cec7fe8c5..b3f102167 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTests.groovy @@ -25,6 +25,8 @@ import spock.lang.Specification import javax.persistence.EntityManager +import static edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget.EntityAttributesFilterTargetType.CONDITION_SCRIPT + /** * Testing persistence of the MetadataResolver models */ @@ -198,7 +200,42 @@ class MetadataResolverRepositoryTests extends Specification { basicPersistenceOfResolverIsCorrectFor { it instanceof LocalDynamicMetadataResolver } } + def "persisting entity attributes filter target with script of more than 255 characters"() { + given: + def mdr = new MetadataResolver().with { + it.name = "SHIBUI-1588" + it + } + def filter = new EntityAttributesFilter().with { + it.name = 'SHIBUI-1588' + it.resourceId = 'SHIBUI-1588' + it.entityAttributesFilterTarget = new EntityAttributesFilterTarget().with { + it.entityAttributesFilterTargetType = CONDITION_SCRIPT + it.singleValue = """ + /* + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut + labore et dolore magna aliqua. Cras fermentum odio eu feugiat pretium nibh ipsum. Sed augue lacus viverra vitae. + Fermentum et sollicitudin ac orci. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + Rhoncus urna neque viverra justo nec ultrices dui sapien. Tortor id aliquet lectus proin nibh nisl condimentum id venenatis. + Massa id neque aliquam vestibulum morbi blandit cursus risus. Metus aliquam eleifend mi in nulla posuere sollicitudin. + Arcu ac tortor dignissim convallis aenean. Et tortor consequat id porta nibh venenatis cras. + Netus et malesuada fames ac turpis egestas. Bibendum arcu vitae elementum curabitur. + Volutpat consequat mauris nunc congue nisi vitae suscipit. + */ + """ + it + } + it + } + mdr.addFilter(filter) + when: + metadataResolverRepository.save(mdr) + entityManager.flush() + + then: + noExceptionThrown() + } private void basicPersistenceOfResolverIsCorrectFor(Closure resolverTypeCheck) { assert metadataResolverRepository.findAll().size() > 0 @@ -227,5 +264,4 @@ class MetadataResolverRepositoryTests extends Specification { } resolver } - } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy index dd55874a0..73ace1205 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy @@ -12,6 +12,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter import edu.internet2.tier.shibboleth.admin.ui.domain.filters.RequiredValidUntilFilter import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ClasspathMetadataResource 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 import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataQueryProtocolScheme import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.RegexScheme diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterServiceImplTests.groovy new file mode 100644 index 000000000..8a261565e --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterServiceImplTests.groovy @@ -0,0 +1,29 @@ +package edu.internet2.tier.shibboleth.admin.ui.service + +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicMetadataResolverAttributes +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import spock.lang.Specification + +@SpringBootTest +class MetadataResolverConverterServiceImplTests extends Specification { + + @Autowired + MetadataResolverConverterService mrConverterServiceUnderTest + + def "conversion to OpenSamlLocalDynamicMetadataResolver with source directory name matching existing file (non-directory) succeeds"() { + given: + LocalDynamicMetadataResolver mr = new LocalDynamicMetadataResolver().with { + it.name = 'SHIBUI-1639' + it.sourceDirectory = File.createTempFile('foo', null).absolutePath + it.dynamicMetadataResolverAttributes = new DynamicMetadataResolverAttributes() + it + } + when: + mrConverterServiceUnderTest.convertToOpenSamlRepresentation(mr) + + then: + noExceptionThrown() + } +} diff --git a/backend/src/test/resources/conf/278.2.xml b/backend/src/test/resources/conf/278.2.xml index 82a25f618..7f950d8ac 100644 --- a/backend/src/test/resources/conf/278.2.xml +++ b/backend/src/test/resources/conf/278.2.xml @@ -1,66 +1,21 @@ - - - - - content - - - - - there - + + + content + + + + there + + https://sp1.example.org - + md:SPSSODescriptor - - - + + + + - - - - - \ No newline at end of file + diff --git a/backend/src/test/resources/conf/278.xml b/backend/src/test/resources/conf/278.xml index 6db6e5cfa..1e4c34b31 100644 --- a/backend/src/test/resources/conf/278.xml +++ b/backend/src/test/resources/conf/278.xml @@ -1,58 +1,15 @@ - - - - - content - - - + + + content + + + md:SPSSODescriptor - + + + + - - - - - - \ No newline at end of file + diff --git a/backend/src/test/resources/conf/704.1.xml b/backend/src/test/resources/conf/704.1.xml index a7e5d63a0..20d53416f 100644 --- a/backend/src/test/resources/conf/704.1.xml +++ b/backend/src/test/resources/conf/704.1.xml @@ -1,5 +1,5 @@ - + some content - \ No newline at end of file + diff --git a/backend/src/test/resources/conf/704.2.xml b/backend/src/test/resources/conf/704.2.xml index 823b89de4..5178d0097 100644 --- a/backend/src/test/resources/conf/704.2.xml +++ b/backend/src/test/resources/conf/704.2.xml @@ -1,5 +1,5 @@ - + - \ No newline at end of file + diff --git a/backend/src/test/resources/conf/704.3.xml b/backend/src/test/resources/conf/704.3.xml index d7ce637d3..37ab29fee 100644 --- a/backend/src/test/resources/conf/704.3.xml +++ b/backend/src/test/resources/conf/704.3.xml @@ -1,5 +1,5 @@ - + some content - \ No newline at end of file + diff --git a/backend/src/test/resources/conf/984-2.xml b/backend/src/test/resources/conf/984-2.xml index 0c5749f10..639411c63 100644 --- a/backend/src/test/resources/conf/984-2.xml +++ b/backend/src/test/resources/conf/984-2.xml @@ -1,19 +1,11 @@ - - - + + http://mdq-beta.incommon.org/global - +