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 105c1ddf6..3cb37ee1b 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 @@ -30,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ResourceBundleMessageSource; @@ -47,9 +48,6 @@ public class CoreShibUiConfiguration { private static final Logger logger = LoggerFactory.getLogger(CoreShibUiConfiguration.class); - @Value("${shibui.metadata-dir:/opt/shibboleth-idp/metadata/generated}") - private String metadataDir; - @Bean public OpenSamlObjects openSamlObjects() { return new OpenSamlObjects(); @@ -92,8 +90,9 @@ public AttributeUtility attributeUtility() { ResourceBundleMessageSource messageSource; @Bean - public EntityDescriptorFilesScheduledTasks entityDescriptorFilesScheduledTasks(EntityDescriptorRepository entityDescriptorRepository) { - return new EntityDescriptorFilesScheduledTasks(this.metadataDir, entityDescriptorRepository, openSamlObjects()); + @ConditionalOnProperty(name = "shibui.metadata-dir") + public EntityDescriptorFilesScheduledTasks entityDescriptorFilesScheduledTasks(EntityDescriptorRepository entityDescriptorRepository, @Value("${shibui.metadata-dir}") final String metadataDir) { + return new EntityDescriptorFilesScheduledTasks(metadataDir, entityDescriptorRepository, openSamlObjects()); } @Bean 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 f1e551b8e..d7d124a0a 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 @@ -8,6 +8,7 @@ import org.apache.http.impl.client.HttpClients; import org.apache.lucene.index.IndexWriter; import org.joda.time.DateTime; +import org.joda.time.chrono.ISOChronology; import org.opensaml.saml.metadata.resolver.filter.FilterException; import org.opensaml.saml.metadata.resolver.filter.MetadataFilterChain; import org.opensaml.saml.metadata.resolver.impl.FileBackedHTTPMetadataResolver; @@ -92,4 +93,34 @@ public void refilter() { logger.error("An error occurred while attempting to filter metadata!", e); } } + + //TODO: This is a band-aid for the negative refresh issue. This override should go away once we figure out + // why the negative refresh is occurring. + @Override + public synchronized void refresh() throws ResolverException { + // In case a destroy() thread beat this thread into the monitor. + if (isDestroyed()) { + return; + } + + try { + + DateTime now = new DateTime(ISOChronology.getInstanceUTC()); + String mdId = getMetadataIdentifier(); + + final byte[] mdBytes = fetchMetadata(); + if (mdBytes == null) { + processCachedMetadata(mdId, now); + } else { + processNewMetadata(mdId, now, mdBytes); + } + } catch (final Throwable t) { + if (t instanceof Exception) { + throw new ResolverException((Exception) t); + } else { + throw new ResolverException(String.format("Saw an error of type '%s' with message '%s'", + t.getClass().getName(), t.getMessage())); + } + } + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/scheduled/EntityDescriptorFilesScheduledTasks.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/scheduled/EntityDescriptorFilesScheduledTasks.java index de1c2472b..6e93a7d99 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/scheduled/EntityDescriptorFilesScheduledTasks.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/scheduled/EntityDescriptorFilesScheduledTasks.java @@ -8,6 +8,8 @@ import org.opensaml.core.xml.io.MarshallingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.transaction.annotation.Transactional; @@ -31,6 +33,8 @@ * * @since 1.0 */ +@Configuration +@ConditionalOnProperty(name = "shibui-metadata-dir") public class EntityDescriptorFilesScheduledTasks { private static final Logger LOGGER = LoggerFactory.getLogger(EntityDescriptorFilesScheduledTasks.class); diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 13527e4df..634d32c5b 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -42,7 +42,7 @@ spring.jpa.properties.hibernate.format_sql=false spring.jpa.hibernate.use-new-id-generator-mappings=true -shibui.metadata-dir=/opt/shibboleth-idp/metadata/generated +# shibui.metadata-dir=/opt/shibboleth-idp/metadata/generated shibui.logout-url=/dashboard spring.profiles.active=default