From 77857043ea67bfe92897bfea39085e9234db0e96 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Tue, 7 Aug 2018 09:48:05 -0700 Subject: [PATCH 01/23] [SHIBUI-723] OpenSaml resolver creation WIP. --- .../LuceneMetadataResolverService.groovy | 39 ++++++++++++++ .../DynamicHttpMetadataResolver.java | 36 ++++++++++++- .../FileBackedHttpMetadataResolver.java | 47 +++++++++++++++++ .../resolvers/FilesystemMetadataResolver.java | 43 +++++++++++++++ .../LocalDynamicMetadataResolver.java | 36 +++++++++++++ .../ResourceBackedMetadataResolver.java | 52 +++++++++++++++++++ 6 files changed, 252 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/LuceneMetadataResolverService.groovy diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/LuceneMetadataResolverService.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/LuceneMetadataResolverService.groovy new file mode 100644 index 000000000..dd59b669c --- /dev/null +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/LuceneMetadataResolverService.groovy @@ -0,0 +1,39 @@ +package edu.internet2.tier.shibboleth.admin.ui.service + +import net.shibboleth.utilities.java.support.component.ComponentInitializationException +import org.apache.lucene.document.Document +import org.apache.lucene.document.Field +import org.apache.lucene.document.StringField +import org.apache.lucene.document.TextField +import org.apache.lucene.index.IndexWriter +import org.opensaml.saml.metadata.resolver.impl.AbstractMetadataResolver +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.stereotype.Service + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +@Service +class LuceneMetadataResolverService { + private static final Logger logger = LoggerFactory.getLogger(LuceneMetadataResolverService.class) + + void addIndexedDescriptorsFromBackingStore(AbstractMetadataResolver.EntityBackingStore backingStore, String resourceId, IndexWriter indexWriter) { + for (String entityId : backingStore.getIndexedDescriptors().keySet()) { + Document document = new Document() + document.add(new StringField("id", entityId, Field.Store.YES)) + document.add(new TextField( "content", entityId, Field.Store.YES)) // TODO: change entityId to be content of entity descriptor block + document.add(new StringField("tag", resourceId, Field.Store.YES)) + try { + indexWriter.addDocument(document) + } catch (IOException e) { + logger.error(e.getMessage(), e) + } + } + try { + indexWriter.commit() + } catch (IOException e) { + throw new ComponentInitializationException(e) + } + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicHttpMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicHttpMetadataResolver.java index e1c9ddc6b..2392c1ac3 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicHttpMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicHttpMetadataResolver.java @@ -1,14 +1,32 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import org.apache.http.HttpResponse; +import org.apache.http.impl.client.HttpClients; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.StringField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.IndexWriter; +import org.joda.time.DateTime; +import org.opensaml.saml.metadata.resolver.DynamicMetadataResolver; +import org.opensaml.saml.metadata.resolver.impl.FunctionDrivenDynamicHTTPMetadataResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import javax.annotation.Nullable; import javax.persistence.ElementCollection; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.OrderColumn; +import java.io.IOException; import java.util.List; /** @@ -20,8 +38,10 @@ @Setter @ToString public class DynamicHttpMetadataResolver extends MetadataResolver { + private static final Logger logger = LoggerFactory.getLogger(DynamicHttpMetadataResolver.class); - + @Autowired + LuceneMetadataResolverService luceneMetadataResolverService; public static final String DEFAULT_TIMEOUT = "PT5S"; @@ -47,4 +67,18 @@ public DynamicHttpMetadataResolver() { this.httpMetadataResolverAttributes.setSocketTimeout(DEFAULT_TIMEOUT); this.dynamicMetadataResolverAttributes = new DynamicMetadataResolverAttributes(); } + + public FunctionDrivenDynamicHTTPMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException { + final String resourceId = this.getResourceId(); + + FunctionDrivenDynamicHTTPMetadataResolver openSamlResolver = new FunctionDrivenDynamicHTTPMetadataResolver(HttpClients.createMinimal()) { + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); + } + }; + return openSamlResolver; + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FileBackedHttpMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FileBackedHttpMetadataResolver.java index f659a412b..d044800b0 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FileBackedHttpMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FileBackedHttpMetadataResolver.java @@ -1,13 +1,30 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import org.apache.http.HttpResponse; +import org.apache.http.impl.client.HttpClients; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.StringField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.IndexWriter; +import org.joda.time.DateTime; +import org.opensaml.saml.metadata.resolver.impl.FileBackedHTTPMetadataResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import javax.annotation.Nullable; import javax.persistence.Embedded; import javax.persistence.Entity; +import java.io.IOException; @Entity @EqualsAndHashCode(callSuper = true) @@ -15,6 +32,10 @@ @Setter @ToString public class FileBackedHttpMetadataResolver extends MetadataResolver { + private static final Logger logger = LoggerFactory.getLogger(FileBackedHttpMetadataResolver.class); + + @Autowired + LuceneMetadataResolverService luceneMetadataResolverService; public FileBackedHttpMetadataResolver() { type = "FileBackedHttpMetadataResolver"; @@ -35,4 +56,30 @@ public FileBackedHttpMetadataResolver() { @Embedded private HttpMetadataResolverAttributes httpMetadataResolverAttributes; + public FileBackedHTTPMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException { + final String resourceId = this.getResourceId(); + + FileBackedHTTPMetadataResolver openSamlResolver = new FileBackedHTTPMetadataResolver(HttpClients.createMinimal(), this.metadataURL, this.backingFile) { + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); + } + + // TODO: this is still probably not the best way to do this? + @Nullable + @Override + public DateTime getLastRefresh() { + return null; + } + + // TODO: this is still probably not the best way to do this? + @Override + protected void processConditionalRetrievalHeaders(HttpResponse response) { + // let's do nothing 'cause we want to allow a refresh + } + }; + return openSamlResolver; + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java index 0e16c8353..7a081eeae 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java @@ -1,12 +1,28 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import org.apache.http.HttpResponse; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.StringField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.IndexWriter; +import org.joda.time.DateTime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import javax.annotation.Nullable; import javax.persistence.Embedded; import javax.persistence.Entity; +import java.io.File; +import java.io.IOException; /** * @author Bill Smith (wsmith@unicon.net) @@ -17,6 +33,10 @@ @Setter @ToString public class FilesystemMetadataResolver extends MetadataResolver { + private static final Logger logger = LoggerFactory.getLogger(FilesystemMetadataResolver.class); + + @Autowired + LuceneMetadataResolverService luceneMetadataResolverService; public FilesystemMetadataResolver() { type = "FilesystemMetadataResolver"; @@ -26,4 +46,27 @@ public FilesystemMetadataResolver() { @Embedded private ReloadableMetadataResolverAttributes reloadableMetadataResolverAttributes; + + public org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException { + File metadataFile = new File(this.metadataFile); + + final String resourceId = this.getResourceId(); + + org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver openSamlResolver = new org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver(metadataFile) { + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); + } + + // TODO: this is still probably not the best way to do this? + @Nullable + @Override + public DateTime getLastRefresh() { + return null; + } + }; + return openSamlResolver; + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/LocalDynamicMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/LocalDynamicMetadataResolver.java index 2bdb67d1f..0db3dae39 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/LocalDynamicMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/LocalDynamicMetadataResolver.java @@ -1,12 +1,28 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.StringField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.IndexWriter; +import org.joda.time.DateTime; +import org.opensaml.core.xml.persist.FilesystemLoadSaveManager; +import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import javax.annotation.Nullable; import javax.persistence.Embedded; import javax.persistence.Entity; +import java.io.IOException; @Entity @EqualsAndHashCode(callSuper = true) @@ -14,6 +30,10 @@ @Setter @ToString public class LocalDynamicMetadataResolver extends MetadataResolver { + private static final Logger logger = LoggerFactory.getLogger(LocalDynamicMetadataResolver.class); + + @Autowired + LuceneMetadataResolverService luceneMetadataResolverService; public LocalDynamicMetadataResolver() { type = "LocalDynamicMetadataResolver"; @@ -28,4 +48,20 @@ public LocalDynamicMetadataResolver() { @Embedded private DynamicMetadataResolverAttributes dynamicMetadataResolverAttributes; + public org.opensaml.saml.metadata.resolver.impl.LocalDynamicMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException { + XMLObjectLoadSaveManager manager = null; + // manager = new .. what? + + final String resourceId = this.getResourceId(); + + org.opensaml.saml.metadata.resolver.impl.LocalDynamicMetadataResolver openSamlResolver = new org.opensaml.saml.metadata.resolver.impl.LocalDynamicMetadataResolver(manager) { + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); + } + }; + return openSamlResolver; + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java index 5737d0162..5c2d9f1ac 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java @@ -1,13 +1,30 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import net.shibboleth.utilities.java.support.resource.Resource; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.StringField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.IndexWriter; +import org.joda.time.DateTime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import javax.annotation.Nullable; import javax.persistence.Embedded; import javax.persistence.Entity; +import java.io.IOException; + import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.CLASSPATH; import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.SVN; @@ -17,11 +34,15 @@ @Setter @ToString public class ResourceBackedMetadataResolver extends MetadataResolver { + private static final Logger logger = LoggerFactory.getLogger(ResourceBackedMetadataResolver.class); public ResourceBackedMetadataResolver() { type = "ResourceBackedMetadataResolver"; } + @Autowired + private LuceneMetadataResolverService luceneMetadataResolverService; + @Embedded private ReloadableMetadataResolverAttributes reloadableMetadataResolverAttributes; @@ -51,4 +72,35 @@ public enum ResourceType { CLASSPATH, SVN } + + public org.opensaml.saml.metadata.resolver.impl.ResourceBackedMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException, IOException { + ResourceType resourceType = this.validateAndDetermineResourceType(); + Resource resource = null; + switch (resourceType) { + case SVN: + // resource = new ... what? + break; + case CLASSPATH: + resource = (Resource) new ClassPathResource(this.classpathMetadataResource.getFile()); + break; + } + final String resourceId = this.getResourceId(); + + org.opensaml.saml.metadata.resolver.impl.ResourceBackedMetadataResolver openSamlResolver = new org.opensaml.saml.metadata.resolver.impl.ResourceBackedMetadataResolver(resource) { + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); + } + + // TODO: this is still probably not the best way to do this? + @Nullable + @Override + public DateTime getLastRefresh() { + return null; + } + }; + return openSamlResolver; + } } From 01a5a727effdbc0544c45a642e6df8953965b048 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Wed, 8 Aug 2018 12:17:35 -0700 Subject: [PATCH 02/23] [SHIBUI-723] Added support for conversion of ShibUI resolvers to OpenSaml resolvers. Added resolver to chaining bean on post/put. Added resolvers to chaining bean on bean creation. Still need to handle creating OpenSaml resolvers properly (populating all the relevant fields). Also, address new TODOs. --- .../MetadataResolverConfiguration.java | 78 ++----------- .../MetadataResolversController.java | 29 ++++- .../DynamicHttpMetadataResolver.java | 37 ------ .../FileBackedHttpMetadataResolver.java | 50 --------- .../resolvers/FilesystemMetadataResolver.java | 44 -------- .../LocalDynamicMetadataResolver.java | 38 ------- .../ResourceBackedMetadataResolver.java | 53 --------- ...penSamlFileBackedHTTPMetadataResolver.java | 82 ++++++++++++++ .../OpenSamlFilesystemMetadataResolver.java | 71 ++++++++++++ ...tionDrivenDynamicHTTPMetadataResolver.java | 62 ++++++++++ .../OpenSamlLocalDynamicMetadataResolver.java | 71 ++++++++++++ ...penSamlResourceBackedMetadataResolver.java | 69 ++++++++++++ .../MetadataResolverConverterService.java | 13 +++ .../MetadataResolverConverterServiceImpl.java | 106 ++++++++++++++++++ 14 files changed, 512 insertions(+), 291 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlResourceBackedMetadataResolver.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterService.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterServiceImpl.java diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java index cdcd54f02..3b2eab911 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java @@ -3,27 +3,17 @@ import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects; import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; import edu.internet2.tier.shibboleth.admin.ui.service.IndexWriterService; +import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverConverterService; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.resolver.ResolverException; -import org.apache.http.HttpResponse; -import org.apache.http.impl.client.HttpClients; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.IndexWriter; -import org.joda.time.DateTime; import org.opensaml.saml.metadata.resolver.ChainingMetadataResolver; import org.opensaml.saml.metadata.resolver.MetadataResolver; -import org.opensaml.saml.metadata.resolver.filter.MetadataFilterChain; -import org.opensaml.saml.metadata.resolver.impl.FileBackedHTTPMetadataResolver; 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.Configuration; -import javax.annotation.Nullable; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -44,6 +34,9 @@ public class MetadataResolverConfiguration { @Autowired MetadataResolverRepository metadataResolverRepository; + @Autowired + MetadataResolverConverterService metadataResolverConverterService; + @Bean public MetadataResolver metadataResolver() throws ResolverException, ComponentInitializationException { ChainingMetadataResolver metadataResolver = new ChainingMetadataResolver(); @@ -51,63 +44,14 @@ public MetadataResolver metadataResolver() throws ResolverException, ComponentIn List resolvers = new ArrayList<>(); - String incommonMRId = "incommonmd"; - // TODO: remove this later when we allow for creation of arbitrary metadata resolvers - FileBackedHTTPMetadataResolver incommonMR = new FileBackedHTTPMetadataResolver(HttpClients.createMinimal(), "http://md.incommon.org/InCommon/InCommon-metadata.xml", "/tmp/incommonmd.xml"){ - @Override - protected void initMetadataResolver() throws ComponentInitializationException { - super.initMetadataResolver(); - - IndexWriter indexWriter; - try { - indexWriter = indexWriterService.getIndexWriter(incommonMRId); - } catch (IOException e) { - throw new ComponentInitializationException(e); - } - - for (String entityId: this.getBackingStore().getIndexedDescriptors().keySet()) { - - Document document = new Document(); - document.add(new StringField("id", entityId, Field.Store.YES)); - document.add(new TextField("content", entityId, Field.Store.YES)); // TODO: change entityId to be content of entity descriptor block - try { - indexWriter.addDocument(document); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - } - try { - indexWriter.commit(); - } catch (IOException e) { - throw new ComponentInitializationException(e); - } - } - - // TODO: this is probably not the best way to do this - @Nullable - @Override - public DateTime getLastRefresh() { - return null; - } - - // TODO: this is probably not the best way to do this - @Override - protected void processConditionalRetrievalHeaders(HttpResponse response) { - // let's do nothing 'cause we want to allow a refresh + Iterable persistedResolvers = metadataResolverRepository.findAll(); + for (edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver resolver : persistedResolvers) { + try { + MetadataResolver openSamlResolver = metadataResolverConverterService.convertToOpenSamlRepresentation(resolver); + resolvers.add(openSamlResolver); + } catch (IOException e) { + //TODO: do something interesting here? } - }; - incommonMR.setId(incommonMRId); - incommonMR.setParserPool(openSamlObjects.getParserPool()); - incommonMR.setMetadataFilter(new MetadataFilterChain()); - incommonMR.initialize(); - - - resolvers.add(incommonMR); - - if (!metadataResolverRepository.findAll().iterator().hasNext()) { - edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver mr = new edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver(); - mr.setName("incommonmd"); - metadataResolverRepository.save(mr); } metadataResolver.setResolvers(resolvers); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java index ac1339201..3c97b40f5 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java @@ -5,13 +5,16 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidationService; import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; import edu.internet2.tier.shibboleth.admin.ui.service.IndexWriterService; +import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverConverterService; import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService; import lombok.extern.slf4j.Slf4j; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.StringField; import org.apache.lucene.index.IndexWriter; +import org.opensaml.saml.metadata.resolver.ChainingMetadataResolver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -36,6 +39,7 @@ import java.io.IOException; import java.io.StringWriter; import java.net.URI; +import java.util.List; import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult; @@ -56,6 +60,12 @@ public class MetadataResolversController { @Autowired IndexWriterService indexWriterService; + @Autowired + org.opensaml.saml.metadata.resolver.MetadataResolver chainingMetadataResolver; + + @Autowired + MetadataResolverConverterService metadataResolverConverterService; + @ExceptionHandler({InvalidTypeIdException.class, IOException.class, HttpMessageNotReadableException.class}) public ResponseEntity unableToParseJson(Exception ex) { return ResponseEntity.badRequest().body(new ErrorResponse(HttpStatus.BAD_REQUEST.toString(), ex.getMessage())); @@ -96,7 +106,7 @@ public ResponseEntity getOne(@PathVariable String resourceId) { @PostMapping("/MetadataResolvers") @Transactional - public ResponseEntity create(@RequestBody MetadataResolver newResolver) { + public ResponseEntity create(@RequestBody MetadataResolver newResolver) throws IOException, ResolverException { if (resolverRepository.findByName(newResolver.getName()) != null) { return ResponseEntity.status(HttpStatus.CONFLICT).build(); } @@ -110,13 +120,26 @@ public ResponseEntity create(@RequestBody MetadataResolver newResolver) { MetadataResolver persistedResolver = resolverRepository.save(newResolver); persistedResolver.updateVersion(); + updateChainingMetadataResolver(persistedResolver); + persistedResolver.convertFiltersIntoTransientRepresentationIfNecessary(); return ResponseEntity.created(getResourceUriFor(persistedResolver)).body(persistedResolver); } + private void updateChainingMetadataResolver(MetadataResolver persistedResolver) throws IOException, ResolverException { + org.opensaml.saml.metadata.resolver.MetadataResolver openSamlResolver = metadataResolverConverterService.convertToOpenSamlRepresentation(persistedResolver); + List resolverList = ((ChainingMetadataResolver) chainingMetadataResolver).getResolvers(); + for (org.opensaml.saml.metadata.resolver.MetadataResolver resolver : resolverList) { + if (resolver.getId().equals(persistedResolver.getResourceId())) { + resolverList.remove(resolver); + } + } + resolverList.add(openSamlResolver); + } + @PutMapping("/MetadataResolvers/{resourceId}") @Transactional - public ResponseEntity update(@PathVariable String resourceId, @RequestBody MetadataResolver updatedResolver) { + public ResponseEntity update(@PathVariable String resourceId, @RequestBody MetadataResolver updatedResolver) throws IOException, ResolverException { MetadataResolver existingResolver = resolverRepository.findByResourceId(resourceId); if (existingResolver == null) { return ResponseEntity.notFound().build(); @@ -140,6 +163,8 @@ public ResponseEntity update(@PathVariable String resourceId, @RequestBody Me MetadataResolver persistedResolver = resolverRepository.save(updatedResolver); persistedResolver.updateVersion(); + updateChainingMetadataResolver(persistedResolver); + return ResponseEntity.ok(persistedResolver); } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicHttpMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicHttpMetadataResolver.java index 2392c1ac3..d1b3692d2 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicHttpMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/DynamicHttpMetadataResolver.java @@ -1,32 +1,14 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import net.shibboleth.utilities.java.support.component.ComponentInitializationException; -import net.shibboleth.utilities.java.support.resolver.ResolverException; -import org.apache.http.HttpResponse; -import org.apache.http.impl.client.HttpClients; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.IndexWriter; -import org.joda.time.DateTime; -import org.opensaml.saml.metadata.resolver.DynamicMetadataResolver; -import org.opensaml.saml.metadata.resolver.impl.FunctionDrivenDynamicHTTPMetadataResolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import javax.annotation.Nullable; import javax.persistence.ElementCollection; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.OrderColumn; -import java.io.IOException; import java.util.List; /** @@ -38,11 +20,6 @@ @Setter @ToString public class DynamicHttpMetadataResolver extends MetadataResolver { - private static final Logger logger = LoggerFactory.getLogger(DynamicHttpMetadataResolver.class); - - @Autowired - LuceneMetadataResolverService luceneMetadataResolverService; - public static final String DEFAULT_TIMEOUT = "PT5S"; @Embedded @@ -67,18 +44,4 @@ public DynamicHttpMetadataResolver() { this.httpMetadataResolverAttributes.setSocketTimeout(DEFAULT_TIMEOUT); this.dynamicMetadataResolverAttributes = new DynamicMetadataResolverAttributes(); } - - public FunctionDrivenDynamicHTTPMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException { - final String resourceId = this.getResourceId(); - - FunctionDrivenDynamicHTTPMetadataResolver openSamlResolver = new FunctionDrivenDynamicHTTPMetadataResolver(HttpClients.createMinimal()) { - @Override - protected void initMetadataResolver() throws ComponentInitializationException { - super.initMetadataResolver(); - - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); - } - }; - return openSamlResolver; - } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FileBackedHttpMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FileBackedHttpMetadataResolver.java index d044800b0..b6d303fb3 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FileBackedHttpMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FileBackedHttpMetadataResolver.java @@ -1,30 +1,12 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; -import net.shibboleth.utilities.java.support.component.ComponentInitializationException; -import net.shibboleth.utilities.java.support.resolver.ResolverException; -import org.apache.http.HttpResponse; -import org.apache.http.impl.client.HttpClients; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.IndexWriter; -import org.joda.time.DateTime; -import org.opensaml.saml.metadata.resolver.impl.FileBackedHTTPMetadataResolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import javax.annotation.Nullable; import javax.persistence.Embedded; import javax.persistence.Entity; -import java.io.IOException; @Entity @EqualsAndHashCode(callSuper = true) @@ -32,11 +14,6 @@ @Setter @ToString public class FileBackedHttpMetadataResolver extends MetadataResolver { - private static final Logger logger = LoggerFactory.getLogger(FileBackedHttpMetadataResolver.class); - - @Autowired - LuceneMetadataResolverService luceneMetadataResolverService; - public FileBackedHttpMetadataResolver() { type = "FileBackedHttpMetadataResolver"; } @@ -55,31 +32,4 @@ public FileBackedHttpMetadataResolver() { @Embedded private HttpMetadataResolverAttributes httpMetadataResolverAttributes; - - public FileBackedHTTPMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException { - final String resourceId = this.getResourceId(); - - FileBackedHTTPMetadataResolver openSamlResolver = new FileBackedHTTPMetadataResolver(HttpClients.createMinimal(), this.metadataURL, this.backingFile) { - @Override - protected void initMetadataResolver() throws ComponentInitializationException { - super.initMetadataResolver(); - - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); - } - - // TODO: this is still probably not the best way to do this? - @Nullable - @Override - public DateTime getLastRefresh() { - return null; - } - - // TODO: this is still probably not the best way to do this? - @Override - protected void processConditionalRetrievalHeaders(HttpResponse response) { - // let's do nothing 'cause we want to allow a refresh - } - }; - return openSamlResolver; - } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java index 7a081eeae..1370f0881 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/FilesystemMetadataResolver.java @@ -1,28 +1,12 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import net.shibboleth.utilities.java.support.component.ComponentInitializationException; -import net.shibboleth.utilities.java.support.resolver.ResolverException; -import org.apache.http.HttpResponse; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.IndexWriter; -import org.joda.time.DateTime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import javax.annotation.Nullable; import javax.persistence.Embedded; import javax.persistence.Entity; -import java.io.File; -import java.io.IOException; /** * @author Bill Smith (wsmith@unicon.net) @@ -33,11 +17,6 @@ @Setter @ToString public class FilesystemMetadataResolver extends MetadataResolver { - private static final Logger logger = LoggerFactory.getLogger(FilesystemMetadataResolver.class); - - @Autowired - LuceneMetadataResolverService luceneMetadataResolverService; - public FilesystemMetadataResolver() { type = "FilesystemMetadataResolver"; } @@ -46,27 +25,4 @@ public FilesystemMetadataResolver() { @Embedded private ReloadableMetadataResolverAttributes reloadableMetadataResolverAttributes; - - public org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException { - File metadataFile = new File(this.metadataFile); - - final String resourceId = this.getResourceId(); - - org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver openSamlResolver = new org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver(metadataFile) { - @Override - protected void initMetadataResolver() throws ComponentInitializationException { - super.initMetadataResolver(); - - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); - } - - // TODO: this is still probably not the best way to do this? - @Nullable - @Override - public DateTime getLastRefresh() { - return null; - } - }; - return openSamlResolver; - } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/LocalDynamicMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/LocalDynamicMetadataResolver.java index 0db3dae39..20ca36251 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/LocalDynamicMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/LocalDynamicMetadataResolver.java @@ -1,28 +1,12 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import net.shibboleth.utilities.java.support.component.ComponentInitializationException; -import net.shibboleth.utilities.java.support.resolver.ResolverException; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.IndexWriter; -import org.joda.time.DateTime; -import org.opensaml.core.xml.persist.FilesystemLoadSaveManager; -import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import javax.annotation.Nullable; import javax.persistence.Embedded; import javax.persistence.Entity; -import java.io.IOException; @Entity @EqualsAndHashCode(callSuper = true) @@ -30,11 +14,6 @@ @Setter @ToString public class LocalDynamicMetadataResolver extends MetadataResolver { - private static final Logger logger = LoggerFactory.getLogger(LocalDynamicMetadataResolver.class); - - @Autowired - LuceneMetadataResolverService luceneMetadataResolverService; - public LocalDynamicMetadataResolver() { type = "LocalDynamicMetadataResolver"; } @@ -47,21 +26,4 @@ public LocalDynamicMetadataResolver() { @Embedded private DynamicMetadataResolverAttributes dynamicMetadataResolverAttributes; - - public org.opensaml.saml.metadata.resolver.impl.LocalDynamicMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException { - XMLObjectLoadSaveManager manager = null; - // manager = new .. what? - - final String resourceId = this.getResourceId(); - - org.opensaml.saml.metadata.resolver.impl.LocalDynamicMetadataResolver openSamlResolver = new org.opensaml.saml.metadata.resolver.impl.LocalDynamicMetadataResolver(manager) { - @Override - protected void initMetadataResolver() throws ComponentInitializationException { - super.initMetadataResolver(); - - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); - } - }; - return openSamlResolver; - } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java index 5c2d9f1ac..55c833f2d 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/ResourceBackedMetadataResolver.java @@ -1,30 +1,13 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import net.shibboleth.utilities.java.support.component.ComponentInitializationException; -import net.shibboleth.utilities.java.support.resolver.ResolverException; -import net.shibboleth.utilities.java.support.resource.Resource; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.IndexWriter; -import org.joda.time.DateTime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; -import javax.annotation.Nullable; import javax.persistence.Embedded; import javax.persistence.Entity; -import java.io.IOException; - import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.CLASSPATH; import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.SVN; @@ -34,15 +17,10 @@ @Setter @ToString public class ResourceBackedMetadataResolver extends MetadataResolver { - private static final Logger logger = LoggerFactory.getLogger(ResourceBackedMetadataResolver.class); - public ResourceBackedMetadataResolver() { type = "ResourceBackedMetadataResolver"; } - @Autowired - private LuceneMetadataResolverService luceneMetadataResolverService; - @Embedded private ReloadableMetadataResolverAttributes reloadableMetadataResolverAttributes; @@ -72,35 +50,4 @@ public enum ResourceType { CLASSPATH, SVN } - - public org.opensaml.saml.metadata.resolver.impl.ResourceBackedMetadataResolver createOpenSamlResolver(IndexWriter indexWriter) throws ResolverException, IOException { - ResourceType resourceType = this.validateAndDetermineResourceType(); - Resource resource = null; - switch (resourceType) { - case SVN: - // resource = new ... what? - break; - case CLASSPATH: - resource = (Resource) new ClassPathResource(this.classpathMetadataResource.getFile()); - break; - } - final String resourceId = this.getResourceId(); - - org.opensaml.saml.metadata.resolver.impl.ResourceBackedMetadataResolver openSamlResolver = new org.opensaml.saml.metadata.resolver.impl.ResourceBackedMetadataResolver(resource) { - @Override - protected void initMetadataResolver() throws ComponentInitializationException { - super.initMetadataResolver(); - - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), resourceId, indexWriter); - } - - // TODO: this is still probably not the best way to do this? - @Nullable - @Override - public DateTime getLastRefresh() { - return null; - } - }; - return openSamlResolver; - } } 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 new file mode 100644 index 000000000..cefc6a88c --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java @@ -0,0 +1,82 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; + +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.lucene.index.IndexWriter; +import org.joda.time.DateTime; +import org.opensaml.saml.metadata.resolver.impl.FileBackedHTTPMetadataResolver; + +import javax.annotation.Nullable; +import java.util.Timer; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public class OpenSamlFileBackedHTTPMetadataResolver extends FileBackedHTTPMetadataResolver { + private IndexWriter indexWriter; + private LuceneMetadataResolverService luceneMetadataResolverService; + private FileBackedHttpMetadataResolver sourceResolver; + + public OpenSamlFileBackedHTTPMetadataResolver(IndexWriter indexWriter, + LuceneMetadataResolverService luceneMetadataResolverService, + FileBackedHttpMetadataResolver sourceResolver) throws ResolverException { + super(HttpClients.createMinimal(), sourceResolver.getMetadataURL(), sourceResolver.getBackingFile()); + this.indexWriter = indexWriter; + this.luceneMetadataResolverService = luceneMetadataResolverService; + this.sourceResolver = sourceResolver; + //TODO: set other things from the resolver here + } + + public OpenSamlFileBackedHTTPMetadataResolver(HttpClient client, + String metadataURL, + String backupFilePath) throws ResolverException { + super(client, metadataURL, backupFilePath); + } + + public OpenSamlFileBackedHTTPMetadataResolver(Timer backgroundTaskTimer, + HttpClient client, + String metadataURL, + String backupFilePath) throws ResolverException { + super(backgroundTaskTimer, client, metadataURL, backupFilePath); + } + + // TODO: this is still probably not the best way to do this? + @Nullable + @Override + public DateTime getLastRefresh() { + return null; + } + + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); + } + + // TODO: this is still probably not the best way to do this? + @Override + protected void processConditionalRetrievalHeaders(HttpResponse response) { + // let's do nothing 'cause we want to allow a refresh + } + + public void setIndexWriter(IndexWriter indexWriter) { + + this.indexWriter = indexWriter; + } + + public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { + this.luceneMetadataResolverService = luceneMetadataResolverService; + } + + public void setSourceResolver(FileBackedHttpMetadataResolver sourceResolver) { + this.sourceResolver = sourceResolver; + } +} 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 new file mode 100644 index 000000000..4f3f778ba --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java @@ -0,0 +1,71 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; + +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import org.apache.lucene.index.IndexWriter; +import org.joda.time.DateTime; +import org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.File; +import java.util.Timer; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public class OpenSamlFilesystemMetadataResolver extends FilesystemMetadataResolver { + private IndexWriter indexWriter; + private LuceneMetadataResolverService luceneMetadataResolverService; + private edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver sourceResolver; + + public OpenSamlFilesystemMetadataResolver(File metadataFile, + IndexWriter indexWriter, + LuceneMetadataResolverService luceneMetadataResolverService, + edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver sourceResolver) throws ResolverException { + super(metadataFile); + this.indexWriter = indexWriter; + this.luceneMetadataResolverService = luceneMetadataResolverService; + this.sourceResolver = sourceResolver; + //TODO: set other things from the resolver here + } + + public OpenSamlFilesystemMetadataResolver(@Nonnull File metadata) throws ResolverException { + super(metadata); + } + + public OpenSamlFilesystemMetadataResolver(@Nullable Timer backgroundTaskTimer, + @Nonnull File metadata) throws ResolverException { + super(backgroundTaskTimer, metadata); + } + + // TODO: this is still probably not the best way to do this? + @Nullable + @Override + public DateTime getLastRefresh() { + return null; + } + + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); + } + + public void setIndexWriter(IndexWriter indexWriter) { + + this.indexWriter = indexWriter; + } + + public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { + this.luceneMetadataResolverService = luceneMetadataResolverService; + } + + public void setSourceResolver(edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver sourceResolver) { + this.sourceResolver = sourceResolver; + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java new file mode 100644 index 000000000..8b4039680 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java @@ -0,0 +1,62 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; + +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.lucene.index.IndexWriter; +import org.opensaml.saml.metadata.resolver.impl.FunctionDrivenDynamicHTTPMetadataResolver; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Timer; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public class OpenSamlFunctionDrivenDynamicHTTPMetadataResolver extends FunctionDrivenDynamicHTTPMetadataResolver { + private IndexWriter indexWriter; + private LuceneMetadataResolverService luceneMetadataResolverService; + private DynamicHttpMetadataResolver sourceResolver; + + public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(IndexWriter indexWriter, + LuceneMetadataResolverService luceneMetadataResolverService, + DynamicHttpMetadataResolver sourceResolver) { + super(HttpClients.createMinimal()); + this.indexWriter = indexWriter; + this.luceneMetadataResolverService = luceneMetadataResolverService; + this.sourceResolver = sourceResolver; + //TODO: set other things from the resolver here + } + + public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(HttpClient client) { + super(client); + } + + public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(@Nullable Timer backgroundTaskTimer, + @Nonnull HttpClient client) { + super(backgroundTaskTimer, client); + } + + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); + } + + public void setIndexWriter(IndexWriter indexWriter) { + this.indexWriter = indexWriter; + } + + public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { + this.luceneMetadataResolverService = luceneMetadataResolverService; + } + + public void setSourceResolver(DynamicHttpMetadataResolver sourceResolver) { + this.sourceResolver = sourceResolver; + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java new file mode 100644 index 000000000..0d248323d --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java @@ -0,0 +1,71 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; + +import com.google.common.base.Function; +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.CriteriaSet; +import org.apache.lucene.index.IndexWriter; +import org.opensaml.core.xml.XMLObject; +import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager; +import org.opensaml.saml.metadata.resolver.impl.LocalDynamicMetadataResolver; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Timer; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public class OpenSamlLocalDynamicMetadataResolver extends LocalDynamicMetadataResolver { + private IndexWriter indexWriter; + private LuceneMetadataResolverService luceneMetadataResolverService; + private edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver sourceResolver; + + public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager manager, + IndexWriter indexWriter, + LuceneMetadataResolverService luceneMetadataResolverService, + edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver sourceResolver) { + super(manager); + this.indexWriter = indexWriter; + this.luceneMetadataResolverService = luceneMetadataResolverService; + this.sourceResolver = sourceResolver; + //TODO: set other things from the resolver here + } + + public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager manager) { + super(manager); + } + + public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager manager, + @Nullable Function keyGenerator) { + super(manager, keyGenerator); + } + + public OpenSamlLocalDynamicMetadataResolver(@Nullable Timer backgroundTaskTimer, + @Nonnull XMLObjectLoadSaveManager manager, + @Nullable Function keyGenerator) { + super(backgroundTaskTimer, manager, keyGenerator); + } + + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); + } + + public void setIndexWriter(IndexWriter indexWriter) { + + this.indexWriter = indexWriter; + } + + public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { + this.luceneMetadataResolverService = luceneMetadataResolverService; + } + + public void setSourceResolver(edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver sourceResolver) { + this.sourceResolver = sourceResolver; + } +} 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 new file mode 100644 index 000000000..94921105f --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlResourceBackedMetadataResolver.java @@ -0,0 +1,69 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; + +import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resource.Resource; +import org.apache.lucene.index.IndexWriter; +import org.joda.time.DateTime; +import org.opensaml.saml.metadata.resolver.impl.ResourceBackedMetadataResolver; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.Timer; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public class OpenSamlResourceBackedMetadataResolver extends ResourceBackedMetadataResolver { + private IndexWriter indexWriter; + private LuceneMetadataResolverService luceneMetadataResolverService; + private edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver sourceResolver; + + public OpenSamlResourceBackedMetadataResolver(Resource resource, + IndexWriter indexWriter, + LuceneMetadataResolverService luceneMetadataResolverService, + edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver sourceResolver) throws IOException { + super(resource); + this.indexWriter = indexWriter; + this.luceneMetadataResolverService = luceneMetadataResolverService; + this.sourceResolver = sourceResolver; + //TODO: set other things from the resolver here + } + + public OpenSamlResourceBackedMetadataResolver(Timer timer, Resource resource) throws IOException { + super(timer, resource); + } + + public OpenSamlResourceBackedMetadataResolver(Resource resource) throws IOException { + super(resource); + } + + // TODO: this is still probably not the best way to do this? + @Nullable + @Override + public DateTime getLastRefresh() { + return null; + } + + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); + + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); + } + + public void setIndexWriter(IndexWriter indexWriter) { + + this.indexWriter = indexWriter; + } + + public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { + this.luceneMetadataResolverService = luceneMetadataResolverService; + } + + public void setSourceResolver(edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver sourceResolver) { + this.sourceResolver = sourceResolver; + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterService.java new file mode 100644 index 000000000..8ac04c154 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterService.java @@ -0,0 +1,13 @@ +package edu.internet2.tier.shibboleth.admin.ui.service; + +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import org.opensaml.saml.metadata.resolver.MetadataResolver; + +import java.io.IOException; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public interface MetadataResolverConverterService { + MetadataResolver convertToOpenSamlRepresentation(edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver resolver) throws IOException, ResolverException; +} 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 new file mode 100644 index 000000000..ed8b40c8a --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverConverterServiceImpl.java @@ -0,0 +1,106 @@ +package edu.internet2.tier.shibboleth.admin.ui.service; + +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.ResourceBackedMetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlFileBackedHTTPMetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlFilesystemMetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlFunctionDrivenDynamicHTTPMetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlLocalDynamicMetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlResourceBackedMetadataResolver; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import net.shibboleth.utilities.java.support.resource.Resource; +import org.apache.lucene.index.IndexWriter; +import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager; +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 java.io.File; +import java.io.IOException; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +@Service +public class MetadataResolverConverterServiceImpl implements MetadataResolverConverterService { + + @Autowired + IndexWriterService indexWriterService; + + @Autowired + LuceneMetadataResolverService luceneMetadataResolverService; + + private OpenSamlFunctionDrivenDynamicHTTPMetadataResolver convertToOpenSamlRepresentation(DynamicHttpMetadataResolver resolver) throws IOException { + IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); + + return new OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(indexWriter, + luceneMetadataResolverService, + resolver); + } + + private OpenSamlFileBackedHTTPMetadataResolver convertToOpenSamlRepresentation(FileBackedHttpMetadataResolver resolver) throws IOException, ResolverException { + IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); + + return new OpenSamlFileBackedHTTPMetadataResolver(indexWriter, luceneMetadataResolverService, resolver); + } + + private OpenSamlFilesystemMetadataResolver convertToOpenSamlRepresentation(FilesystemMetadataResolver resolver) throws IOException, ResolverException { + IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); + File metadataFile = new File(resolver.getMetadataFile()); + + return new OpenSamlFilesystemMetadataResolver(metadataFile, + indexWriter, + luceneMetadataResolverService, + resolver); + } + + private OpenSamlLocalDynamicMetadataResolver convertToOpenSamlRepresentation(LocalDynamicMetadataResolver resolver) throws IOException { + IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); + XMLObjectLoadSaveManager manager = null; + //TODO: manager = new .. what? + + return new OpenSamlLocalDynamicMetadataResolver(manager, indexWriter, luceneMetadataResolverService, resolver); + } + + private OpenSamlResourceBackedMetadataResolver convertToOpenSamlRepresentation(ResourceBackedMetadataResolver resolver) throws IOException { + IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); + ResourceBackedMetadataResolver.ResourceType resourceType = resolver.validateAndDetermineResourceType(); + Resource resource = null; + switch (resourceType) { + case SVN: + //TODO: resource = new ... what? + break; + case CLASSPATH: + resource = (Resource) new ClassPathResource(resolver.getClasspathMetadataResource() + .getFile()); + break; + } + + return new OpenSamlResourceBackedMetadataResolver(resource, + indexWriter, + luceneMetadataResolverService, + resolver); + } + + @Override + public MetadataResolver convertToOpenSamlRepresentation(edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver resolver) throws IOException, ResolverException { + switch (resolver.getType()) { + case "LocalDynamicMetadataResolver": + return convertToOpenSamlRepresentation((LocalDynamicMetadataResolver) resolver); + case "FileBackedHttpMetadataResolver": + return convertToOpenSamlRepresentation((FileBackedHttpMetadataResolver) resolver); + case "DynamicHttpMetadataResolver": + return convertToOpenSamlRepresentation((DynamicHttpMetadataResolver) resolver); + case "FilesystemMetadataResolver": + return convertToOpenSamlRepresentation((FilesystemMetadataResolver) resolver); + case "ResourceBackedMetadataResolver": + return convertToOpenSamlRepresentation((ResourceBackedMetadataResolver) resolver); + default: + throw new RuntimeException("Unsupported metadata resolver type!"); + } + } +} From 36daa4416e7e390f74b0fc12ff2a00f8846cddfc Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Tue, 14 Aug 2018 14:23:33 -0700 Subject: [PATCH 03/23] [SHIBUI-723] Finished first pass at new OpenSaml resolver creation. Added a simple helper to clean up the code a bit. --- ...penSamlFileBackedHTTPMetadataResolver.java | 49 +++++-------- .../OpenSamlFilesystemMetadataResolver.java | 26 +------ ...tionDrivenDynamicHTTPMetadataResolver.java | 36 +++------- .../OpenSamlLocalDynamicMetadataResolver.java | 36 ++-------- ...SamlMetadataResolverConstructorHelper.java | 69 +++++++++++++++++++ ...penSamlResourceBackedMetadataResolver.java | 24 +------ .../MetadataResolverConverterServiceImpl.java | 13 ++-- 7 files changed, 113 insertions(+), 140 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlMetadataResolverConstructorHelper.java 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 cefc6a88c..d40d7730e 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 @@ -5,14 +5,12 @@ import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.resolver.ResolverException; import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.lucene.index.IndexWriter; import org.joda.time.DateTime; import org.opensaml.saml.metadata.resolver.impl.FileBackedHTTPMetadataResolver; import javax.annotation.Nullable; -import java.util.Timer; /** * @author Bill Smith (wsmith@unicon.net) @@ -29,20 +27,18 @@ public OpenSamlFileBackedHTTPMetadataResolver(IndexWriter indexWriter, this.indexWriter = indexWriter; this.luceneMetadataResolverService = luceneMetadataResolverService; this.sourceResolver = sourceResolver; - //TODO: set other things from the resolver here - } - public OpenSamlFileBackedHTTPMetadataResolver(HttpClient client, - String metadataURL, - String backupFilePath) throws ResolverException { - super(client, metadataURL, backupFilePath); - } + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromHttpMetadataResolverAttributes( + this, sourceResolver.getHttpMetadataResolverAttributes()); + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes( + this, sourceResolver.getReloadableMetadataResolverAttributes()); - public OpenSamlFileBackedHTTPMetadataResolver(Timer backgroundTaskTimer, - HttpClient client, - String metadataURL, - String backupFilePath) throws ResolverException { - super(backgroundTaskTimer, client, metadataURL, backupFilePath); + this.setBackupFile(sourceResolver.getBackingFile()); + this.setBackupFileInitNextRefreshDelay(Long.parseLong(sourceResolver.getBackupFileInitNextRefreshDelay())); + this.setInitializeFromBackupFile(sourceResolver.getInitializeFromBackupFile()); + + //TODO: Where does this get set in OpenSAML land? + // sourceResolver.getMetadataURL(); } // TODO: this is still probably not the best way to do this? @@ -52,31 +48,18 @@ public DateTime getLastRefresh() { return null; } - @Override - protected void initMetadataResolver() throws ComponentInitializationException { - super.initMetadataResolver(); - - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), - this.sourceResolver.getResourceId(), - indexWriter); - } - // TODO: this is still probably not the best way to do this? @Override protected void processConditionalRetrievalHeaders(HttpResponse response) { // let's do nothing 'cause we want to allow a refresh } - public void setIndexWriter(IndexWriter indexWriter) { - - this.indexWriter = indexWriter; - } - - public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { - this.luceneMetadataResolverService = luceneMetadataResolverService; - } + @Override + protected void initMetadataResolver() throws ComponentInitializationException { + super.initMetadataResolver(); - public void setSourceResolver(FileBackedHttpMetadataResolver sourceResolver) { - this.sourceResolver = sourceResolver; + luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); } } 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 4f3f778ba..e329e2b05 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 @@ -7,10 +7,8 @@ import org.joda.time.DateTime; import org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver; -import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.File; -import java.util.Timer; /** * @author Bill Smith (wsmith@unicon.net) @@ -28,16 +26,9 @@ public OpenSamlFilesystemMetadataResolver(File metadataFile, this.indexWriter = indexWriter; this.luceneMetadataResolverService = luceneMetadataResolverService; this.sourceResolver = sourceResolver; - //TODO: set other things from the resolver here - } - - public OpenSamlFilesystemMetadataResolver(@Nonnull File metadata) throws ResolverException { - super(metadata); - } - public OpenSamlFilesystemMetadataResolver(@Nullable Timer backgroundTaskTimer, - @Nonnull File metadata) throws ResolverException { - super(backgroundTaskTimer, metadata); + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes( + this, sourceResolver.getReloadableMetadataResolverAttributes()); } // TODO: this is still probably not the best way to do this? @@ -55,17 +46,4 @@ protected void initMetadataResolver() throws ComponentInitializationException { this.sourceResolver.getResourceId(), indexWriter); } - - public void setIndexWriter(IndexWriter indexWriter) { - - this.indexWriter = indexWriter; - } - - public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { - this.luceneMetadataResolverService = luceneMetadataResolverService; - } - - public void setSourceResolver(edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver sourceResolver) { - this.sourceResolver = sourceResolver; - } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java index 8b4039680..a0f324ae3 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java @@ -3,15 +3,10 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver; import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; -import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.lucene.index.IndexWriter; import org.opensaml.saml.metadata.resolver.impl.FunctionDrivenDynamicHTTPMetadataResolver; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Timer; - /** * @author Bill Smith (wsmith@unicon.net) */ @@ -27,16 +22,19 @@ public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(IndexWriter indexWriter this.indexWriter = indexWriter; this.luceneMetadataResolverService = luceneMetadataResolverService; this.sourceResolver = sourceResolver; - //TODO: set other things from the resolver here - } - public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(HttpClient client) { - super(client); - } + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromDynamicMetadataResolverAttributes( + this, sourceResolver.getDynamicMetadataResolverAttributes()); + + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromHttpMetadataResolverAttributes( + this, sourceResolver.getHttpMetadataResolverAttributes()); - public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(@Nullable Timer backgroundTaskTimer, - @Nonnull HttpClient client) { - super(backgroundTaskTimer, client); + this.setSupportedContentTypes(sourceResolver.getSupportedContentTypes()); + + //TODO: These don't seem to be used anywhere. + // In the parser, if not null, a warning is logged .. but nothing else happens with them. + // sourceResolver.getMaxConnectionsPerRoute(); + // sourceResolver.getMaxConnectionsTotal(); } @Override @@ -47,16 +45,4 @@ protected void initMetadataResolver() throws ComponentInitializationException { this.sourceResolver.getResourceId(), indexWriter); } - - public void setIndexWriter(IndexWriter indexWriter) { - this.indexWriter = indexWriter; - } - - public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { - this.luceneMetadataResolverService = luceneMetadataResolverService; - } - - public void setSourceResolver(DynamicHttpMetadataResolver sourceResolver) { - this.sourceResolver = sourceResolver; - } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java index 0d248323d..41589e6a2 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java @@ -1,17 +1,13 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; -import com.google.common.base.Function; import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; -import net.shibboleth.utilities.java.support.resolver.CriteriaSet; import org.apache.lucene.index.IndexWriter; import org.opensaml.core.xml.XMLObject; import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager; import org.opensaml.saml.metadata.resolver.impl.LocalDynamicMetadataResolver; import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Timer; /** * @author Bill Smith (wsmith@unicon.net) @@ -29,22 +25,13 @@ public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager manager) { - super(manager); - } - public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager manager, - @Nullable Function keyGenerator) { - super(manager, keyGenerator); - } + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromDynamicMetadataResolverAttributes( + this, sourceResolver.getDynamicMetadataResolverAttributes()); - public OpenSamlLocalDynamicMetadataResolver(@Nullable Timer backgroundTaskTimer, - @Nonnull XMLObjectLoadSaveManager manager, - @Nullable Function keyGenerator) { - super(backgroundTaskTimer, manager, keyGenerator); + //TODO: Where do these refs get used in OpenSAML land? + // sourceResolver.getSourceKeyGeneratorRef(); + // sourceResolver.getSourceManagerRef(); } @Override @@ -55,17 +42,4 @@ protected void initMetadataResolver() throws ComponentInitializationException { this.sourceResolver.getResourceId(), indexWriter); } - - public void setIndexWriter(IndexWriter indexWriter) { - - this.indexWriter = indexWriter; - } - - public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { - this.luceneMetadataResolverService = luceneMetadataResolverService; - } - - public void setSourceResolver(edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver sourceResolver) { - this.sourceResolver = sourceResolver; - } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlMetadataResolverConstructorHelper.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlMetadataResolverConstructorHelper.java new file mode 100644 index 000000000..141abae95 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlMetadataResolverConstructorHelper.java @@ -0,0 +1,69 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; + +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicMetadataResolverAttributes; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.HttpMetadataResolverAttributes; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ReloadableMetadataResolverAttributes; +import org.opensaml.saml.metadata.resolver.MetadataResolver; +import org.opensaml.saml.metadata.resolver.impl.AbstractDynamicMetadataResolver; +import org.opensaml.saml.metadata.resolver.impl.AbstractReloadingMetadataResolver; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public class OpenSamlMetadataResolverConstructorHelper { + + public static void updateOpenSamlMetadataResolverFromDynamicMetadataResolverAttributes(MetadataResolver metadataResolver, DynamicMetadataResolverAttributes attributes) { + + AbstractDynamicMetadataResolver dynamicMetadataResolver = (AbstractDynamicMetadataResolver) metadataResolver; + + // from DynamicMetadataResolverAttributes + dynamicMetadataResolver.setBackgroundInitializationFromCacheDelay(Long.valueOf(attributes.getBackgroundInitializationFromCacheDelay())); + dynamicMetadataResolver.setCleanupTaskInterval(Long.valueOf(attributes.getCleanupTaskInterval())); + dynamicMetadataResolver.setInitializeFromPersistentCacheInBackground(attributes.getInitializeFromPersistentCacheInBackground()); + dynamicMetadataResolver.setMaxCacheDuration(Long.valueOf(attributes.getMaxCacheDuration())); + dynamicMetadataResolver.setMaxIdleEntityData(Long.valueOf(attributes.getMaxIdleEntityData())); + dynamicMetadataResolver.setMinCacheDuration(Long.valueOf(attributes.getMinCacheDuration())); + dynamicMetadataResolver.setBackgroundInitializationFromCacheDelay(Long.valueOf(attributes.getBackgroundInitializationFromCacheDelay())); + dynamicMetadataResolver.setRefreshDelayFactor(attributes.getRefreshDelayFactor().floatValue()); + dynamicMetadataResolver.setRemoveIdleEntityData(attributes.getRemoveIdleEntityData()); + + //TODO: This takes a XMLObjectLoadSaveManager. Do we have what we need to create one? + // dynamicMetadataResolver.setPersistentCacheManager(); attributes.getPersistentCacheManagerDirectory(); + // attributes.getPersistentCacheManagerRef(); + + //TODO: This takes a Function. We've got a ref. How to convert? + // dynamicMetadataResolver.setPersistentCacheKeyGenerator(); attributes.getPersistentCacheKeyGeneratorRef(); + + //TODO: This takes a Predicate. We've got a predicate ref. How to convert? + // dynamicMetadataResolver.setInitializationFromCachePredicate(); attributes.getInitializationFromCachePredicateRef(); + + //TODO: This takes a ParserPool. We've got a ParserPoolRef. How to convert? + // dynamicMetadataResolver.setParserPool(); attributes.getParserPoolRef(); + + //TODO: Where does this get used in OpenSAML land? + // attributes.getTaskTimerRef(); + } + + public static void updateOpenSamlMetadataResolverFromHttpMetadataResolverAttributes(MetadataResolver metadataResolver, HttpMetadataResolverAttributes attributes) { + //TODO: Implement once we figure out what needs to happen here. + } + + public static void updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes(MetadataResolver metadataResolver, ReloadableMetadataResolverAttributes attributes) { + AbstractReloadingMetadataResolver reloadingMetadataResolver = (AbstractReloadingMetadataResolver) metadataResolver; + + reloadingMetadataResolver.setExpirationWarningThreshold(Long.parseLong(attributes.getExpirationWarningThreshold())); + reloadingMetadataResolver.setMaxRefreshDelay(Long.parseLong(attributes.getMaxRefreshDelay())); + reloadingMetadataResolver.setMinRefreshDelay(Long.parseLong(attributes.getMinRefreshDelay())); + reloadingMetadataResolver.setRefreshDelayFactor(attributes.getRefreshDelayFactor().floatValue()); + reloadingMetadataResolver.setResolveViaPredicatesOnly(attributes.getResolveViaPredicatesOnly()); + + //TODO: This takes a set of MetadataIndex's. We've got an IndexesRef. How to convert? + // reloadingMetadataResolver.setIndexes(); attributes.getIndexesRef(); + + //TODO: This takes a ParserPool. We've got a ParserPoolRef. How to convert? + // reloadingMetadataResolver.setParserPool(); attributes.getParserPoolRef(); + + //TODO: Where does this get used in OpenSAML land? + // attributes.getTaskTimerRef(); + } +} 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 94921105f..a8b139804 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 @@ -9,7 +9,6 @@ import javax.annotation.Nullable; import java.io.IOException; -import java.util.Timer; /** * @author Bill Smith (wsmith@unicon.net) @@ -27,15 +26,9 @@ public OpenSamlResourceBackedMetadataResolver(Resource resource, this.indexWriter = indexWriter; this.luceneMetadataResolverService = luceneMetadataResolverService; this.sourceResolver = sourceResolver; - //TODO: set other things from the resolver here - } - - public OpenSamlResourceBackedMetadataResolver(Timer timer, Resource resource) throws IOException { - super(timer, resource); - } - public OpenSamlResourceBackedMetadataResolver(Resource resource) throws IOException { - super(resource); + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes( + this, sourceResolver.getReloadableMetadataResolverAttributes()); } // TODO: this is still probably not the best way to do this? @@ -53,17 +46,4 @@ protected void initMetadataResolver() throws ComponentInitializationException { this.sourceResolver.getResourceId(), indexWriter); } - - public void setIndexWriter(IndexWriter indexWriter) { - - this.indexWriter = indexWriter; - } - - public void setLuceneMetadataResolverService(LuceneMetadataResolverService luceneMetadataResolverService) { - this.luceneMetadataResolverService = luceneMetadataResolverService; - } - - public void setSourceResolver(edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver sourceResolver) { - this.sourceResolver = sourceResolver; - } } 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 ed8b40c8a..edca9fb7d 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 net.shibboleth.utilities.java.support.resolver.ResolverException; import net.shibboleth.utilities.java.support.resource.Resource; import org.apache.lucene.index.IndexWriter; +import org.opensaml.core.xml.persist.FilesystemLoadSaveManager; import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager; import org.opensaml.saml.metadata.resolver.MetadataResolver; import org.springframework.beans.factory.annotation.Autowired; @@ -60,8 +61,9 @@ private OpenSamlFilesystemMetadataResolver convertToOpenSamlRepresentation(Files private OpenSamlLocalDynamicMetadataResolver convertToOpenSamlRepresentation(LocalDynamicMetadataResolver resolver) throws IOException { IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); - XMLObjectLoadSaveManager manager = null; - //TODO: manager = new .. what? + + //TODO: This is an educated guess. + XMLObjectLoadSaveManager manager = new FilesystemLoadSaveManager(resolver.getSourceDirectory()); return new OpenSamlLocalDynamicMetadataResolver(manager, indexWriter, luceneMetadataResolverService, resolver); } @@ -72,12 +74,13 @@ private OpenSamlResourceBackedMetadataResolver convertToOpenSamlRepresentation(R Resource resource = null; switch (resourceType) { case SVN: - //TODO: resource = new ... what? + //TODO: What sort of resource type should be created here? URL? break; case CLASSPATH: - resource = (Resource) new ClassPathResource(resolver.getClasspathMetadataResource() - .getFile()); + resource = (Resource) new ClassPathResource(resolver.getClasspathMetadataResource().getFile()); break; + default: + throw new RuntimeException("Unsupported resource type!"); } return new OpenSamlResourceBackedMetadataResolver(resource, From c969919173455e8e05e8d298429439f928c69b3b Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Wed, 15 Aug 2018 09:42:40 -0700 Subject: [PATCH 04/23] [SHIBUI-723] Replaced LuceneMetadataResolverService with an OpenSaml Metadata Resolver delegate. --- .../LuceneMetadataResolverService.groovy | 39 --------------- ...penSamlFileBackedHTTPMetadataResolver.java | 13 +++-- .../OpenSamlFilesystemMetadataResolver.java | 12 ++--- ...tionDrivenDynamicHTTPMetadataResolver.java | 12 ++--- .../OpenSamlLocalDynamicMetadataResolver.java | 12 ++--- .../OpenSamlMetadataResolverDelegate.java | 49 +++++++++++++++++++ ...penSamlResourceBackedMetadataResolver.java | 12 ++--- .../MetadataResolverConverterServiceImpl.java | 10 +--- 8 files changed, 77 insertions(+), 82 deletions(-) delete mode 100644 backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/LuceneMetadataResolverService.groovy create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlMetadataResolverDelegate.java diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/LuceneMetadataResolverService.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/LuceneMetadataResolverService.groovy deleted file mode 100644 index dd59b669c..000000000 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/LuceneMetadataResolverService.groovy +++ /dev/null @@ -1,39 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.service - -import net.shibboleth.utilities.java.support.component.ComponentInitializationException -import org.apache.lucene.document.Document -import org.apache.lucene.document.Field -import org.apache.lucene.document.StringField -import org.apache.lucene.document.TextField -import org.apache.lucene.index.IndexWriter -import org.opensaml.saml.metadata.resolver.impl.AbstractMetadataResolver -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.springframework.stereotype.Service - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@Service -class LuceneMetadataResolverService { - private static final Logger logger = LoggerFactory.getLogger(LuceneMetadataResolverService.class) - - void addIndexedDescriptorsFromBackingStore(AbstractMetadataResolver.EntityBackingStore backingStore, String resourceId, IndexWriter indexWriter) { - for (String entityId : backingStore.getIndexedDescriptors().keySet()) { - Document document = new Document() - document.add(new StringField("id", entityId, Field.Store.YES)) - document.add(new TextField( "content", entityId, Field.Store.YES)) // TODO: change entityId to be content of entity descriptor block - document.add(new StringField("tag", resourceId, Field.Store.YES)) - try { - indexWriter.addDocument(document) - } catch (IOException e) { - logger.error(e.getMessage(), e) - } - } - try { - indexWriter.commit() - } catch (IOException e) { - throw new ComponentInitializationException(e) - } - } -} 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 d40d7730e..58da65cb8 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 @@ -1,7 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.resolver.ResolverException; import org.apache.http.HttpResponse; @@ -17,16 +16,16 @@ */ public class OpenSamlFileBackedHTTPMetadataResolver extends FileBackedHTTPMetadataResolver { private IndexWriter indexWriter; - private LuceneMetadataResolverService luceneMetadataResolverService; private FileBackedHttpMetadataResolver sourceResolver; + private OpenSamlMetadataResolverDelegate delegate; + public OpenSamlFileBackedHTTPMetadataResolver(IndexWriter indexWriter, - LuceneMetadataResolverService luceneMetadataResolverService, FileBackedHttpMetadataResolver sourceResolver) throws ResolverException { super(HttpClients.createMinimal(), sourceResolver.getMetadataURL(), sourceResolver.getBackingFile()); this.indexWriter = indexWriter; - this.luceneMetadataResolverService = luceneMetadataResolverService; this.sourceResolver = sourceResolver; + this.delegate = new OpenSamlMetadataResolverDelegate(); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromHttpMetadataResolverAttributes( this, sourceResolver.getHttpMetadataResolverAttributes()); @@ -58,8 +57,8 @@ protected void processConditionalRetrievalHeaders(HttpResponse response) { protected void initMetadataResolver() throws ComponentInitializationException { super.initMetadataResolver(); - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), - this.sourceResolver.getResourceId(), - indexWriter); + delegate.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); } } 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 e329e2b05..39b5ecca9 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 @@ -1,6 +1,5 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.resolver.ResolverException; import org.apache.lucene.index.IndexWriter; @@ -15,17 +14,16 @@ */ public class OpenSamlFilesystemMetadataResolver extends FilesystemMetadataResolver { private IndexWriter indexWriter; - private LuceneMetadataResolverService luceneMetadataResolverService; private edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver sourceResolver; + private OpenSamlMetadataResolverDelegate delegate; public OpenSamlFilesystemMetadataResolver(File metadataFile, IndexWriter indexWriter, - LuceneMetadataResolverService luceneMetadataResolverService, edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver sourceResolver) throws ResolverException { super(metadataFile); this.indexWriter = indexWriter; - this.luceneMetadataResolverService = luceneMetadataResolverService; this.sourceResolver = sourceResolver; + this.delegate = new OpenSamlMetadataResolverDelegate(); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes( this, sourceResolver.getReloadableMetadataResolverAttributes()); @@ -42,8 +40,8 @@ public DateTime getLastRefresh() { protected void initMetadataResolver() throws ComponentInitializationException { super.initMetadataResolver(); - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), - this.sourceResolver.getResourceId(), - indexWriter); + delegate.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java index a0f324ae3..077bb1671 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java @@ -1,7 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import org.apache.http.impl.client.HttpClients; import org.apache.lucene.index.IndexWriter; @@ -12,16 +11,15 @@ */ public class OpenSamlFunctionDrivenDynamicHTTPMetadataResolver extends FunctionDrivenDynamicHTTPMetadataResolver { private IndexWriter indexWriter; - private LuceneMetadataResolverService luceneMetadataResolverService; private DynamicHttpMetadataResolver sourceResolver; + private OpenSamlMetadataResolverDelegate delegate; public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(IndexWriter indexWriter, - LuceneMetadataResolverService luceneMetadataResolverService, DynamicHttpMetadataResolver sourceResolver) { super(HttpClients.createMinimal()); this.indexWriter = indexWriter; - this.luceneMetadataResolverService = luceneMetadataResolverService; this.sourceResolver = sourceResolver; + this.delegate = new OpenSamlMetadataResolverDelegate(); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromDynamicMetadataResolverAttributes( this, sourceResolver.getDynamicMetadataResolverAttributes()); @@ -41,8 +39,8 @@ public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(IndexWriter indexWriter protected void initMetadataResolver() throws ComponentInitializationException { super.initMetadataResolver(); - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), - this.sourceResolver.getResourceId(), - indexWriter); + delegate.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java index 41589e6a2..b693fa315 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java @@ -1,6 +1,5 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import org.apache.lucene.index.IndexWriter; import org.opensaml.core.xml.XMLObject; @@ -14,17 +13,16 @@ */ public class OpenSamlLocalDynamicMetadataResolver extends LocalDynamicMetadataResolver { private IndexWriter indexWriter; - private LuceneMetadataResolverService luceneMetadataResolverService; private edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver sourceResolver; + private OpenSamlMetadataResolverDelegate delegate; public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager manager, IndexWriter indexWriter, - LuceneMetadataResolverService luceneMetadataResolverService, edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver sourceResolver) { super(manager); this.indexWriter = indexWriter; - this.luceneMetadataResolverService = luceneMetadataResolverService; this.sourceResolver = sourceResolver; + this.delegate = new OpenSamlMetadataResolverDelegate(); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromDynamicMetadataResolverAttributes( this, sourceResolver.getDynamicMetadataResolverAttributes()); @@ -38,8 +36,8 @@ public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager resolve(@Nullable CriteriaSet criteria) { + throw new UnsupportedOperationException("This method should not be called."); + } + + void addIndexedDescriptorsFromBackingStore(AbstractMetadataResolver.EntityBackingStore backingStore, String resourceId, IndexWriter indexWriter) throws ComponentInitializationException { + for (String entityId : backingStore.getIndexedDescriptors().keySet()) { + Document document = new Document(); + document.add(new StringField("id", entityId, Field.Store.YES)); + document.add(new TextField("content", entityId, Field.Store.YES)); // TODO: change entityId to be content of entity descriptor block + document.add(new StringField("tag", resourceId, Field.Store.YES)); + try { + indexWriter.addDocument(document); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + try { + indexWriter.commit(); + } catch (IOException e) { + throw new ComponentInitializationException(e); + } + } +} 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 a8b139804..d7b62236d 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 @@ -1,6 +1,5 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; -import edu.internet2.tier.shibboleth.admin.ui.service.LuceneMetadataResolverService; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.resource.Resource; import org.apache.lucene.index.IndexWriter; @@ -15,17 +14,16 @@ */ public class OpenSamlResourceBackedMetadataResolver extends ResourceBackedMetadataResolver { private IndexWriter indexWriter; - private LuceneMetadataResolverService luceneMetadataResolverService; private edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver sourceResolver; + private OpenSamlMetadataResolverDelegate delegate; public OpenSamlResourceBackedMetadataResolver(Resource resource, IndexWriter indexWriter, - LuceneMetadataResolverService luceneMetadataResolverService, edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver sourceResolver) throws IOException { super(resource); this.indexWriter = indexWriter; - this.luceneMetadataResolverService = luceneMetadataResolverService; this.sourceResolver = sourceResolver; + this.delegate = new OpenSamlMetadataResolverDelegate(); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes( this, sourceResolver.getReloadableMetadataResolverAttributes()); @@ -42,8 +40,8 @@ public DateTime getLastRefresh() { protected void initMetadataResolver() throws ComponentInitializationException { super.initMetadataResolver(); - luceneMetadataResolverService.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), - this.sourceResolver.getResourceId(), - indexWriter); + delegate.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); } } 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 edca9fb7d..5773036c2 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 @@ -32,21 +32,17 @@ public class MetadataResolverConverterServiceImpl implements MetadataResolverCon @Autowired IndexWriterService indexWriterService; - @Autowired - LuceneMetadataResolverService luceneMetadataResolverService; - private OpenSamlFunctionDrivenDynamicHTTPMetadataResolver convertToOpenSamlRepresentation(DynamicHttpMetadataResolver resolver) throws IOException { IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); return new OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(indexWriter, - luceneMetadataResolverService, resolver); } private OpenSamlFileBackedHTTPMetadataResolver convertToOpenSamlRepresentation(FileBackedHttpMetadataResolver resolver) throws IOException, ResolverException { IndexWriter indexWriter = indexWriterService.getIndexWriter(resolver.getResourceId()); - return new OpenSamlFileBackedHTTPMetadataResolver(indexWriter, luceneMetadataResolverService, resolver); + return new OpenSamlFileBackedHTTPMetadataResolver(indexWriter, resolver); } private OpenSamlFilesystemMetadataResolver convertToOpenSamlRepresentation(FilesystemMetadataResolver resolver) throws IOException, ResolverException { @@ -55,7 +51,6 @@ private OpenSamlFilesystemMetadataResolver convertToOpenSamlRepresentation(Files return new OpenSamlFilesystemMetadataResolver(metadataFile, indexWriter, - luceneMetadataResolverService, resolver); } @@ -65,7 +60,7 @@ private OpenSamlLocalDynamicMetadataResolver convertToOpenSamlRepresentation(Loc //TODO: This is an educated guess. XMLObjectLoadSaveManager manager = new FilesystemLoadSaveManager(resolver.getSourceDirectory()); - return new OpenSamlLocalDynamicMetadataResolver(manager, indexWriter, luceneMetadataResolverService, resolver); + return new OpenSamlLocalDynamicMetadataResolver(manager, indexWriter, resolver); } private OpenSamlResourceBackedMetadataResolver convertToOpenSamlRepresentation(ResourceBackedMetadataResolver resolver) throws IOException { @@ -85,7 +80,6 @@ private OpenSamlResourceBackedMetadataResolver convertToOpenSamlRepresentation(R return new OpenSamlResourceBackedMetadataResolver(resource, indexWriter, - luceneMetadataResolverService, resolver); } From 3d160aaa62877d089134a23fb896efb471f7d664 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Wed, 15 Aug 2018 17:44:44 -0700 Subject: [PATCH 05/23] [SHIBUI-723] Added DurationUtility. Updated all duration-related code. Updated tests to mostly not break. Still need to address TODOs. --- .../MetadataResolversController.java | 4 +- ...penSamlFileBackedHTTPMetadataResolver.java | 6 ++- .../OpenSamlFilesystemMetadataResolver.java | 2 + ...tionDrivenDynamicHTTPMetadataResolver.java | 2 + .../OpenSamlLocalDynamicMetadataResolver.java | 2 + ...SamlMetadataResolverConstructorHelper.java | 30 +++++++------- ...penSamlResourceBackedMetadataResolver.java | 2 + .../MetadataResolverConverterServiceImpl.java | 13 +++++-- .../admin/util/DurationUtility.java | 39 +++++++++++++++++++ ...ResolversControllerIntegrationTests.groovy | 10 +++-- .../admin/ui/util/TestObjectGenerator.groovy | 16 +++++++- 11 files changed, 103 insertions(+), 23 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/DurationUtility.java diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java index c407bcc3b..74fbd8689 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java @@ -40,6 +40,7 @@ import java.io.IOException; import java.io.StringWriter; import java.net.URI; +import java.util.ArrayList; import java.util.List; import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult; @@ -133,13 +134,14 @@ public ResponseEntity create(@RequestBody MetadataResolver newResolver) throw private void updateChainingMetadataResolver(MetadataResolver persistedResolver) throws IOException, ResolverException { org.opensaml.saml.metadata.resolver.MetadataResolver openSamlResolver = metadataResolverConverterService.convertToOpenSamlRepresentation(persistedResolver); - List resolverList = ((ChainingMetadataResolver) chainingMetadataResolver).getResolvers(); + List resolverList = new ArrayList<>(((ChainingMetadataResolver) chainingMetadataResolver).getResolvers()); for (org.opensaml.saml.metadata.resolver.MetadataResolver resolver : resolverList) { if (resolver.getId().equals(persistedResolver.getResourceId())) { resolverList.remove(resolver); } } resolverList.add(openSamlResolver); + ((ChainingMetadataResolver) chainingMetadataResolver).setResolvers(resolverList); } @PutMapping("/MetadataResolvers/{resourceId}") 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 58da65cb8..76d3d9384 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 @@ -11,6 +11,8 @@ import javax.annotation.Nullable; +import static edu.internet2.tier.shibboleth.admin.util.DurationUtility.toMillis; + /** * @author Bill Smith (wsmith@unicon.net) */ @@ -27,13 +29,15 @@ public OpenSamlFileBackedHTTPMetadataResolver(IndexWriter indexWriter, this.sourceResolver = sourceResolver; this.delegate = new OpenSamlMetadataResolverDelegate(); + this.setId(sourceResolver.getResourceId()); + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromHttpMetadataResolverAttributes( this, sourceResolver.getHttpMetadataResolverAttributes()); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes( this, sourceResolver.getReloadableMetadataResolverAttributes()); this.setBackupFile(sourceResolver.getBackingFile()); - this.setBackupFileInitNextRefreshDelay(Long.parseLong(sourceResolver.getBackupFileInitNextRefreshDelay())); + this.setBackupFileInitNextRefreshDelay(toMillis(sourceResolver.getBackupFileInitNextRefreshDelay())); this.setInitializeFromBackupFile(sourceResolver.getInitializeFromBackupFile()); //TODO: Where does this get set in OpenSAML land? 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 39b5ecca9..94ded9133 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 @@ -25,6 +25,8 @@ public OpenSamlFilesystemMetadataResolver(File metadataFile, this.sourceResolver = sourceResolver; this.delegate = new OpenSamlMetadataResolverDelegate(); + this.setId(sourceResolver.getResourceId()); + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes( this, sourceResolver.getReloadableMetadataResolverAttributes()); } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java index 077bb1671..2887fa85a 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java @@ -21,6 +21,8 @@ public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(IndexWriter indexWriter this.sourceResolver = sourceResolver; this.delegate = new OpenSamlMetadataResolverDelegate(); + this.setId(sourceResolver.getResourceId()); + OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromDynamicMetadataResolverAttributes( this, sourceResolver.getDynamicMetadataResolverAttributes()); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java index b693fa315..abbfbd26b 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java @@ -24,6 +24,8 @@ public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager Date: Tue, 21 Aug 2018 15:27:02 -0700 Subject: [PATCH 06/23] [SHIBUI-661] Added support to XML generation for EntityAttributesFilter for target types CONDITION_SCRIPT and REGEX. Added helper method that evaluates regex and generates tiny script. Unit tests forthcoming. --- .../JPAMetadataResolverServiceImpl.groovy | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index 18796b950..971e64bcd 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -70,6 +70,8 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { (List) (List) entityAttributesFilter.getAttributes() ) } + //TODO: else if CONDITION_SCRIPT/REGEX, add new rule + // new ScriptedPredicate, new EvaluableScript target.setRules(rules) metadataFilters.add(target) } @@ -146,15 +148,47 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { filter.attributes.each { attribute -> mkp.yieldUnescaped(openSamlObjects.marshalToXmlString(attribute, false)) } - if (filter.entityAttributesFilterTarget.entityAttributesFilterTargetType == EntityAttributesFilterTarget - .EntityAttributesFilterTargetType.ENTITY) { - filter.entityAttributesFilterTarget.value.each { - Entity(it) - } + switch (filter.entityAttributesFilterTarget.entityAttributesFilterTargetType) { + case EntityAttributesFilterTarget + .EntityAttributesFilterTargetType.ENTITY: + filter.entityAttributesFilterTarget.value.each { + Entity(it) + } + break + case EntityAttributesFilterTarget + .EntityAttributesFilterTargetType.CONDITION_SCRIPT: + case EntityAttributesFilterTarget + .EntityAttributesFilterTargetType.REGEX: + ConditionScript() { + Script() { + def script + if (filter.entityAttributesFilterTarget.entityAttributesFilterTargetType == + EntityAttributesFilterTarget.EntityAttributesFilterTargetType.CONDITION_SCRIPT) { + script = filter.entityAttributesFilterTarget.value + } else if (filter.entityAttributesFilterTarget.entityAttributesFilterTargetType == + EntityAttributesFilterTarget.EntityAttributesFilterTargetType.REGEX) { + //TODO: Is the "entityId" supposed to be the resourceId of the filter? Or something else? + //TODO: Assuming value is a list of one element? Error check? + script = generateRegexScript(filter.entityAttributesFilterTarget.value.get(0), filter.resourceId) + } + mkp.yieldUnescaped("") + } + } + break + default: + //TODO do nothing? + break } } } + private String generateRegexScript(String regex, String entityId) { + def matched = entityId ==~ ~regex + return '''\ + "use strict"; + ${matched};''' + } + void constructXmlNodeForFilter(EntityRoleWhiteListFilter filter, def markupBuilderDelegate) { markupBuilderDelegate.MetadataFilter( 'xsi:type': 'EntityRoleWhiteList', From 96f27bfb9cf1f4df65bb7b7d74f088976ba24ddc Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Tue, 21 Aug 2018 15:27:02 -0700 Subject: [PATCH 07/23] [SHIBUI-661] Added support to XML generation for EntityAttributesFilter for target types CONDITION_SCRIPT and REGEX. Added helper method that evaluates regex and generates tiny script. Unit tests forthcoming. --- .../JPAMetadataResolverServiceImpl.groovy | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index 18796b950..971e64bcd 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -70,6 +70,8 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { (List) (List) entityAttributesFilter.getAttributes() ) } + //TODO: else if CONDITION_SCRIPT/REGEX, add new rule + // new ScriptedPredicate, new EvaluableScript target.setRules(rules) metadataFilters.add(target) } @@ -146,15 +148,47 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { filter.attributes.each { attribute -> mkp.yieldUnescaped(openSamlObjects.marshalToXmlString(attribute, false)) } - if (filter.entityAttributesFilterTarget.entityAttributesFilterTargetType == EntityAttributesFilterTarget - .EntityAttributesFilterTargetType.ENTITY) { - filter.entityAttributesFilterTarget.value.each { - Entity(it) - } + switch (filter.entityAttributesFilterTarget.entityAttributesFilterTargetType) { + case EntityAttributesFilterTarget + .EntityAttributesFilterTargetType.ENTITY: + filter.entityAttributesFilterTarget.value.each { + Entity(it) + } + break + case EntityAttributesFilterTarget + .EntityAttributesFilterTargetType.CONDITION_SCRIPT: + case EntityAttributesFilterTarget + .EntityAttributesFilterTargetType.REGEX: + ConditionScript() { + Script() { + def script + if (filter.entityAttributesFilterTarget.entityAttributesFilterTargetType == + EntityAttributesFilterTarget.EntityAttributesFilterTargetType.CONDITION_SCRIPT) { + script = filter.entityAttributesFilterTarget.value + } else if (filter.entityAttributesFilterTarget.entityAttributesFilterTargetType == + EntityAttributesFilterTarget.EntityAttributesFilterTargetType.REGEX) { + //TODO: Is the "entityId" supposed to be the resourceId of the filter? Or something else? + //TODO: Assuming value is a list of one element? Error check? + script = generateRegexScript(filter.entityAttributesFilterTarget.value.get(0), filter.resourceId) + } + mkp.yieldUnescaped("") + } + } + break + default: + //TODO do nothing? + break } } } + private String generateRegexScript(String regex, String entityId) { + def matched = entityId ==~ ~regex + return '''\ + "use strict"; + ${matched};''' + } + void constructXmlNodeForFilter(EntityRoleWhiteListFilter filter, def markupBuilderDelegate) { markupBuilderDelegate.MetadataFilter( 'xsi:type': 'EntityRoleWhiteList', From aa01824bd84e8b0ae2c389abd1e72f7c7e76f9ca Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Tue, 21 Aug 2018 15:29:54 -0700 Subject: [PATCH 08/23] [SHIBUI-661] Whitespace OCD. --- .../admin/ui/service/JPAMetadataResolverServiceImpl.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index 971e64bcd..cfa571477 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -183,7 +183,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { } private String generateRegexScript(String regex, String entityId) { - def matched = entityId ==~ ~regex + def matched = entityId ==~ ~regex return '''\ "use strict"; ${matched};''' From e4629e679bfb685917b32b542fab7d58542f0a77 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Tue, 21 Aug 2018 15:37:54 -0700 Subject: [PATCH 09/23] [SHIBUI-661] Added a TODO for myself. --- .../admin/ui/service/JPAMetadataResolverServiceImpl.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index cfa571477..5006be2e4 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -160,6 +160,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { case EntityAttributesFilterTarget .EntityAttributesFilterTargetType.REGEX: ConditionScript() { + //TODO Script() is a defined method. How to get + + + \ No newline at end of file diff --git a/backend/src/test/resources/conf/661.xml b/backend/src/test/resources/conf/661.xml new file mode 100644 index 000000000..30cdd7e0a --- /dev/null +++ b/backend/src/test/resources/conf/661.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file From 34b084e1e96cfcbedea58c8a13e04ce6f7aef478 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 23 Aug 2018 09:59:04 -0700 Subject: [PATCH 16/23] [NOJIRA] Replaced /tmp with /groovytest --- ...adataResolversControllerIntegrationTests.groovy | 14 ++++++++++++++ .../admin/ui/util/TestObjectGenerator.groovy | 7 ++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy index f90b85146..f88df2d1b 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy @@ -160,6 +160,13 @@ class MetadataResolversControllerIntegrationTests extends Specification { result.statusCodeValue == 201 result.headers.Location[0].contains(BASE_URI) + cleanup: + def userHome = System.getProperty("user.home") + def tmpDirectory = new File(userHome + File.separator + 'groovytest') + if (tmpDirectory.exists()) { + tmpDirectory.deleteDir() + } + where: resolverType | _ 'DynamicHttp' | _ @@ -196,6 +203,13 @@ class MetadataResolversControllerIntegrationTests extends Specification { then: updatedResolverMap.name == 'Updated DynamicHttpMetadataResolver' + cleanup: + def userHome = System.getProperty("user.home") + def tmpDirectory = new File(userHome + File.separator + 'groovytest') + if (tmpDirectory.exists()) { + tmpDirectory.deleteDir() + } + where: resolverType | _ 'DynamicHttp' | _ diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy index eea2bbbec..187ec50f8 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy @@ -483,10 +483,15 @@ class TestObjectGenerator { } LocalDynamicMetadataResolver localDynamicMetadataResolver() { + def userHome = System.getProperty("user.home") + def tmpDirectory = new File(userHome + File.separator + 'groovytest') + if (!tmpDirectory.exists()) { + tmpDirectory.mkdir() + } new LocalDynamicMetadataResolver().with { it.name = 'LocalDynamic' it.xmlId = 'LocalDynamic' - it.sourceDirectory = '/tmp' + it.sourceDirectory = userHome + File.separator + 'groovytest' it.dynamicMetadataResolverAttributes = new DynamicMetadataResolverAttributes().with { it } From 4f29233a51f46d44be1a0693f2ff590b25e8d2c6 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 23 Aug 2018 11:19:34 -0700 Subject: [PATCH 17/23] [NOJIRA] Replaced sourceDirectory /groovytest with Files.createTempDirectory --- ...ResolversControllerIntegrationTests.groovy | 27 +++++++++++++------ .../admin/ui/util/TestObjectGenerator.groovy | 9 +++---- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy index f88df2d1b..9775160bd 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy @@ -6,6 +6,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter 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.LocalDynamicMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator import edu.internet2.tier.shibboleth.admin.util.AttributeUtility @@ -152,6 +153,10 @@ class MetadataResolversControllerIntegrationTests extends Specification { def "POST new concrete MetadataResolver of type #resolverType -> /api/MetadataResolvers"(String resolverType) { given: 'New MetadataResolver JSON representation' def resolver = generator.buildRandomMetadataResolverOfType(resolverType) + String sourceDirectory + if (resolverType.equals('Localdynamic')) { + sourceDirectory = ((LocalDynamicMetadataResolver) resolver).sourceDirectory + } when: 'POST request is made with new DynamicHttpMetadataResolver JSON representation' def result = this.restTemplate.postForEntity(BASE_URI, createRequestHttpEntityFor { mapper.writeValueAsString(resolver) }, String) @@ -161,10 +166,11 @@ class MetadataResolversControllerIntegrationTests extends Specification { result.headers.Location[0].contains(BASE_URI) cleanup: - def userHome = System.getProperty("user.home") - def tmpDirectory = new File(userHome + File.separator + 'groovytest') - if (tmpDirectory.exists()) { - tmpDirectory.deleteDir() + if (sourceDirectory != null) { + def tmpDirectory = new File(sourceDirectory) + if (tmpDirectory.exists()) { + tmpDirectory.deleteDir() + } } where: @@ -180,6 +186,10 @@ class MetadataResolversControllerIntegrationTests extends Specification { def "PUT concrete MetadataResolver of type #resolverType with updated changes -> /api/MetadataResolvers/{resourceId}"(String resolverType) { given: 'One resolver is available in data store' def resolver = generator.buildRandomMetadataResolverOfType(resolverType) + String sourceDirectory + if (resolverType.equals('Localdynamic')) { + sourceDirectory = ((LocalDynamicMetadataResolver) resolver).sourceDirectory + } def resolverResourceId = resolver.resourceId metadataResolverRepository.save(resolver) @@ -204,10 +214,11 @@ class MetadataResolversControllerIntegrationTests extends Specification { updatedResolverMap.name == 'Updated DynamicHttpMetadataResolver' cleanup: - def userHome = System.getProperty("user.home") - def tmpDirectory = new File(userHome + File.separator + 'groovytest') - if (tmpDirectory.exists()) { - tmpDirectory.deleteDir() + if (sourceDirectory != null) { + def tmpDirectory = new File(sourceDirectory) + if (tmpDirectory.exists()) { + tmpDirectory.deleteDir() + } } where: diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy index 187ec50f8..e7d227160 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy @@ -10,6 +10,7 @@ import edu.internet2.tier.shibboleth.admin.util.AttributeUtility import edu.internet2.tier.shibboleth.admin.util.MDDCConstants import org.opensaml.saml.saml2.metadata.Organization +import java.nio.file.Files import java.util.function.Supplier /** @@ -483,15 +484,11 @@ class TestObjectGenerator { } LocalDynamicMetadataResolver localDynamicMetadataResolver() { - def userHome = System.getProperty("user.home") - def tmpDirectory = new File(userHome + File.separator + 'groovytest') - if (!tmpDirectory.exists()) { - tmpDirectory.mkdir() - } + def tmpDirectory = Files.createTempDirectory("groovy") new LocalDynamicMetadataResolver().with { it.name = 'LocalDynamic' it.xmlId = 'LocalDynamic' - it.sourceDirectory = userHome + File.separator + 'groovytest' + it.sourceDirectory = tmpDirectory it.dynamicMetadataResolverAttributes = new DynamicMetadataResolverAttributes().with { it } From b6105f857950d7521a4a3613562d7dd3e0f339ba Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 23 Aug 2018 11:39:00 -0700 Subject: [PATCH 18/23] [NOJIRA] Added an attribute filter to force DiffBuilder to ignore sourceDirectory --- .../internet2/tier/shibboleth/admin/ui/util/TestHelpers.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestHelpers.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestHelpers.groovy index 04066c581..29db1fb1d 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestHelpers.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestHelpers.groovy @@ -29,6 +29,7 @@ class TestHelpers { static void generatedXmlIsTheSameAsExpectedXml(String expectedXmlResource, Document generatedXml) { assert !DiffBuilder.compare(Input.fromStream(TestHelpers.getResourceAsStream(expectedXmlResource))) .withTest(Input.fromDocument(generatedXml)) + .withAttributeFilter({attribute -> !attribute.name.equals("sourceDirectory")}) .ignoreComments() .ignoreWhitespace() .build() From 77b208b659924a4b4c9b813025a2dc04e1996d0b Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 23 Aug 2018 14:29:34 -0700 Subject: [PATCH 19/23] [NOJIRA] Updated beans to try to fix circular dep issue. Fixed a couple conversion issues.. because oops. --- .../CoreShibUiConfiguration.java | 44 ++-------------- .../ui/service/DirectoryServiceImpl.java | 3 +- .../ui/service/EntityIdsSearchService.java | 2 +- .../service/EntityIdsSearchServiceImpl.java | 52 +++++++++++++++++++ .../shibboleth/admin/util/LuceneUtility.java | 10 ++-- 5 files changed, 66 insertions(+), 45 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityIdsSearchServiceImpl.java diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CoreShibUiConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CoreShibUiConfiguration.java index 18a8a4953..c9b6493fa 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CoreShibUiConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CoreShibUiConfiguration.java @@ -1,6 +1,5 @@ package edu.internet2.tier.shibboleth.admin.ui.configuration; -import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityIdsSearchResultRepresentation; import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects; import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository; import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; @@ -11,6 +10,7 @@ import edu.internet2.tier.shibboleth.admin.ui.service.DirectoryServiceImpl; import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService; import edu.internet2.tier.shibboleth.admin.ui.service.EntityIdsSearchService; +import edu.internet2.tier.shibboleth.admin.ui.service.EntityIdsSearchServiceImpl; import edu.internet2.tier.shibboleth.admin.ui.service.EntityService; import edu.internet2.tier.shibboleth.admin.ui.service.FilterService; import edu.internet2.tier.shibboleth.admin.ui.service.FilterTargetService; @@ -24,13 +24,6 @@ import edu.internet2.tier.shibboleth.admin.util.AttributeUtility; import edu.internet2.tier.shibboleth.admin.util.LuceneUtility; import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.document.Document; -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.queryparser.classic.ParseException; -import org.apache.lucene.queryparser.classic.QueryParser; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.ScoreDoc; -import org.apache.lucene.search.TopDocs; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -46,9 +39,6 @@ import org.springframework.web.util.UrlPathHelper; import javax.servlet.http.HttpServletRequest; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; @Configuration public class CoreShibUiConfiguration { @@ -92,44 +82,20 @@ public AttributeUtility attributeUtility() { return new AttributeUtility(openSamlObjects()); } - @Autowired - Analyzer fullTokenAnalyzer; - - @Autowired - DirectoryService directoryService; - @Autowired LocaleResolver localeResolver; @Autowired ResourceBundleMessageSource messageSource; - @Autowired - LuceneUtility luceneUtility; - @Bean public EntityDescriptorFilesScheduledTasks entityDescriptorFilesScheduledTasks(EntityDescriptorRepository entityDescriptorRepository) { return new EntityDescriptorFilesScheduledTasks(this.metadataDir, entityDescriptorRepository, openSamlObjects()); } @Bean - public EntityIdsSearchService entityIdsSearchService() { - return (resourceId, term, limit) -> { - List entityIds = new ArrayList<>(); - try { - IndexReader indexReader = luceneUtility.getIndexReader(resourceId); - IndexSearcher searcher = new IndexSearcher(indexReader); - QueryParser parser = new QueryParser("content", fullTokenAnalyzer); - TopDocs topDocs = searcher.search(parser.parse(term.trim()), limit); - for (ScoreDoc scoreDoc : topDocs.scoreDocs) { - Document document = searcher.doc(scoreDoc.doc); - entityIds.add(document.get("id")); - } - } catch (IOException | ParseException e) { - logger.error(e.getMessage(), e); - } - return new EntityIdsSearchResultRepresentation(entityIds); - }; + public EntityIdsSearchService entityIdsSearchService(LuceneUtility luceneUtility, Analyzer fullTokenAnalyzer) { + return new EntityIdsSearchServiceImpl(luceneUtility, fullTokenAnalyzer); } @Bean @@ -199,7 +165,7 @@ public DirectoryService directoryService() { } @Bean - public LuceneUtility luceneUtility() { - return new LuceneUtility(); + public LuceneUtility luceneUtility(DirectoryService directoryService) { + return new LuceneUtility(directoryService); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/DirectoryServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/DirectoryServiceImpl.java index 553af3094..d19591b35 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/DirectoryServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/DirectoryServiceImpl.java @@ -3,6 +3,7 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,6 +26,6 @@ public Directory getDirectory(String resourceId) { @Override public List getDirectories() { - return (List) directoryMap.values(); + return new ArrayList<>(directoryMap.values()); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityIdsSearchService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityIdsSearchService.java index 6639d5b1a..2e1707e4e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityIdsSearchService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityIdsSearchService.java @@ -1,6 +1,7 @@ package edu.internet2.tier.shibboleth.admin.ui.service; import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityIdsSearchResultRepresentation; +import edu.internet2.tier.shibboleth.admin.util.LuceneUtility; import net.andreinc.mockneat.MockNeat; import java.util.ArrayList; @@ -10,7 +11,6 @@ /** * API component responsible for entity ids search. */ -@FunctionalInterface public interface EntityIdsSearchService { /** diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityIdsSearchServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityIdsSearchServiceImpl.java new file mode 100644 index 000000000..337b904b4 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityIdsSearchServiceImpl.java @@ -0,0 +1,52 @@ +package edu.internet2.tier.shibboleth.admin.ui.service; + +import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityIdsSearchResultRepresentation; +import edu.internet2.tier.shibboleth.admin.util.LuceneUtility; +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.queryparser.classic.ParseException; +import org.apache.lucene.queryparser.classic.QueryParser; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.ScoreDoc; +import org.apache.lucene.search.TopDocs; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public class EntityIdsSearchServiceImpl implements EntityIdsSearchService { + private static final Logger logger = LoggerFactory.getLogger(EntityIdsSearchServiceImpl.class); + private Analyzer fullTokenAnalyzer; + private LuceneUtility luceneUtility; + + public EntityIdsSearchServiceImpl(LuceneUtility luceneUtility, Analyzer fullTokenAnalyzer) { + this.luceneUtility = luceneUtility; + this.fullTokenAnalyzer = fullTokenAnalyzer; + } + + @Override + public EntityIdsSearchResultRepresentation findBySearchTermAndOptionalLimit(String resourceId, + String searchTerm, + int limit) { + List entityIds = new ArrayList<>(); + try { + IndexReader indexReader = luceneUtility.getIndexReader(resourceId); + IndexSearcher searcher = new IndexSearcher(indexReader); + QueryParser parser = new QueryParser("content", fullTokenAnalyzer); + TopDocs topDocs = searcher.search(parser.parse(searchTerm.trim()), limit); + for (ScoreDoc scoreDoc : topDocs.scoreDocs) { + Document document = searcher.doc(scoreDoc.doc); + entityIds.add(document.get("id")); + } + } catch (IOException | ParseException e) { + logger.error(e.getMessage(), e); + } + return new EntityIdsSearchResultRepresentation(entityIds); + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/LuceneUtility.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/LuceneUtility.java index 9b53ebdbb..57a96051e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/LuceneUtility.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/LuceneUtility.java @@ -8,7 +8,6 @@ import org.apache.lucene.store.Directory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; import java.util.ArrayList; @@ -19,10 +18,12 @@ */ public class LuceneUtility { private static final Logger logger = LoggerFactory.getLogger(LuceneUtility.class); - - @Autowired private DirectoryService directoryService; + public LuceneUtility(DirectoryService directoryService) { + this.directoryService = directoryService; + } + public IndexReader getIndexReader(String resourceId) throws IOException { IndexReader indexReader; if (StringUtils.isBlank(resourceId)) { @@ -35,7 +36,8 @@ public IndexReader getIndexReader(String resourceId) throws IOException { logger.error(e.getMessage(), e); } }); - IndexReader[] indexReaders = (IndexReader[]) indexReaderList.toArray(); + IndexReader[] indexReaders = new IndexReader[indexReaderList.size()]; + indexReaders = indexReaderList.toArray(indexReaders); indexReader = new MultiReader(indexReaders, true); } else { indexReader = DirectoryReader.open(directoryService.getDirectory(resourceId)); From a2fe5b492ea583086da1556ba1e4c03db5f6fbb8 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 23 Aug 2018 15:24:05 -0700 Subject: [PATCH 20/23] [NOJIRA] Extended ChainingMetadataResolver and swapped it in for the original. It now includes a mutable collection of resolvers. --- .../MetadataResolverConfiguration.java | 3 +- .../OpenSamlChainingMetadataResolver.java | 60 +++++++++++++++++++ .../ui/configuration/TestConfiguration.groovy | 3 +- 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlChainingMetadataResolver.java diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java index 3b2eab911..0222ba46e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java @@ -1,5 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.configuration; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlChainingMetadataResolver; import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects; import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; import edu.internet2.tier.shibboleth.admin.ui.service.IndexWriterService; @@ -39,7 +40,7 @@ public class MetadataResolverConfiguration { @Bean public MetadataResolver metadataResolver() throws ResolverException, ComponentInitializationException { - ChainingMetadataResolver metadataResolver = new ChainingMetadataResolver(); + ChainingMetadataResolver metadataResolver = new OpenSamlChainingMetadataResolver(); metadataResolver.setId("chain"); List resolvers = new ArrayList<>(); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlChainingMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlChainingMetadataResolver.java new file mode 100644 index 000000000..e5265cc29 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlChainingMetadataResolver.java @@ -0,0 +1,60 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; + +import com.google.common.base.Predicates; +import com.google.common.collect.Collections2; +import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import org.opensaml.saml.metadata.resolver.ChainingMetadataResolver; +import org.opensaml.saml.metadata.resolver.MetadataResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public class OpenSamlChainingMetadataResolver extends ChainingMetadataResolver { + @Nonnull private final Logger log = LoggerFactory.getLogger(OpenSamlChainingMetadataResolver.class); + + @Nonnull @NonnullElements private List mutableResolvers; + + public OpenSamlChainingMetadataResolver() { + this.mutableResolvers = Collections.emptyList(); + } + + public OpenSamlChainingMetadataResolver(@Nonnull List mutableResolvers) { + this.mutableResolvers = mutableResolvers; + } + + @Override + public void setResolvers(@Nonnull @NonnullElements final List newResolvers) + throws ResolverException { + if (newResolvers == null || newResolvers.isEmpty()) { + mutableResolvers = Collections.emptyList(); + return; + } + + mutableResolvers = new ArrayList<>(Collections2.filter(newResolvers, Predicates.notNull())); + } + + @Nonnull + @NonnullElements + @Override + public List getResolvers() { + return mutableResolvers; + } + + @Override + protected void doInitialize() throws ComponentInitializationException { + super.doInitialize(); + if (mutableResolvers == null) { + log.warn("OpenSamlChainingMetadataResolver was not configured with any member MetadataResolvers"); + mutableResolvers = Collections.emptyList(); + } + } +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy index 2cb3c7d9d..1796e3b70 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy @@ -1,5 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.configuration +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlChainingMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository import edu.internet2.tier.shibboleth.admin.ui.service.IndexWriterService @@ -36,7 +37,7 @@ class TestConfiguration { @Bean MetadataResolver metadataResolver() { - ChainingMetadataResolver metadataResolver = new ChainingMetadataResolver() + ChainingMetadataResolver metadataResolver = new OpenSamlChainingMetadataResolver() metadataResolver.setId("chain") String resolverId = "test" From f65097c59f2ed87d7faed5c06467a0827ee65d41 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 23 Aug 2018 15:38:29 -0700 Subject: [PATCH 21/23] Made backupFileInitNextRefreshDelay into duration attribute --- .../filebacked-http-common.editor.schema.json | 18 +++++++++++++++++- .../filebacked-http-common.schema.json | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/ui/src/assets/schema/provider/filebacked-http-common.editor.schema.json b/ui/src/assets/schema/provider/filebacked-http-common.editor.schema.json index 2b5d368e4..ca8ea2646 100644 --- a/ui/src/assets/schema/provider/filebacked-http-common.editor.schema.json +++ b/ui/src/assets/schema/provider/filebacked-http-common.editor.schema.json @@ -159,7 +159,23 @@ "initializeFromBackupFile": [ true ] - } + }, + "widget": { + "id": "datalist", + "data": [ + "PT0S", + "PT30S", + "PT1M", + "PT10M", + "PT30M", + "PT1H", + "PT4H", + "PT12H", + "PT24H" + ] + }, + "default": null, + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "requireValidMetadata": { "title": "Require Valid Metadata?", diff --git a/ui/src/assets/schema/provider/filebacked-http-common.schema.json b/ui/src/assets/schema/provider/filebacked-http-common.schema.json index 4e01b4f76..2b318c44c 100644 --- a/ui/src/assets/schema/provider/filebacked-http-common.schema.json +++ b/ui/src/assets/schema/provider/filebacked-http-common.schema.json @@ -96,7 +96,23 @@ "initializeFromBackupFile": [ true ] - } + }, + "widget": { + "id": "datalist", + "data": [ + "PT0S", + "PT30S", + "PT1M", + "PT10M", + "PT30M", + "PT1H", + "PT4H", + "PT12H", + "PT24H" + ] + }, + "default": null, + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "requireValidMetadata": { "title": "Require Valid Metadata?", From ed90378d3329f900a2bc07d6fe14635acdcb85a9 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Fri, 24 Aug 2018 19:37:17 +0000 Subject: [PATCH 22/23] Merged in bugfix/SHIBUI-792 (pull request #177) SHIBUI-792 Fixed responsive nav in provider editor Approved-by: Shibui Jenkins Approved-by: Ryan Mathis --- .../provider-editor-nav.component.html | 24 ++--- .../provider-editor-nav.component.spec.ts | 96 +++++++++++++++++++ .../provider-editor-nav.component.ts | 13 ++- ui/src/app/wizard/reducer/index.ts | 2 +- 4 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 ui/src/app/metadata/provider/component/provider-editor-nav.component.spec.ts diff --git a/ui/src/app/metadata/provider/component/provider-editor-nav.component.html b/ui/src/app/metadata/provider/component/provider-editor-nav.component.html index 3ce1eef57..b130e77d1 100644 --- a/ui/src/app/metadata/provider/component/provider-editor-nav.component.html +++ b/ui/src/app/metadata/provider/component/provider-editor-nav.component.html @@ -1,4 +1,4 @@ - + - +