[java-oidc-common] branch main updated: JCOMOIDC-23 - Add OpenID Provider Configuration Document Resolver

Phil Smart philip.smart at jisc.ac.uk
Tue Feb 22 17:28:27 UTC 2022


This is an automated email from the git hooks/post-receive script.

philsmart pushed a commit to branch main
in repository java-oidc-common.

View the commit online:
http://git.shibboleth.net/view/?p=java-oidc-common.git;a=commit;h=03701898f29846a2de11ae0e697e357acd90dc7a

The following commit(s) were added to refs/heads/main by this push:
     new 0370189  JCOMOIDC-23 - Add OpenID Provider Configuration Document Resolver
0370189 is described below

commit 03701898f29846a2de11ae0e697e357acd90dc7a
Author: Phil Smart <philip.smart at jisc.ac.uk>
AuthorDate: Tue Feb 22 17:28:22 2022 +0000

    JCOMOIDC-23 - Add OpenID Provider Configuration Document Resolver
    
    Allow Default file loading strategy to accept null resources. Returning
    null on apply.
    
    https://shibboleth.atlassian.net/browse/JCOMOIDC-23
---
 .../metadata/cache/impl/BatchMetadataCache.java    | 21 ++++----
 .../cache/impl/DefaultFileLoadingStrategy.java     | 29 +++++++----
 .../impl/DefaultFileLoadingStrategyTest.java       | 58 ++++++++++++++++++++++
 .../metadata/impl/file-loading-strategy-test.txt   |  1 +
 4 files changed, 89 insertions(+), 20 deletions(-)

diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCache.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCache.java
index 4b1b648..06baff7 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCache.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/BatchMetadataCache.java
@@ -371,9 +371,9 @@ public class BatchMetadataCache<IdentifierType, MetadataType>
             
             // Any exception here is caught
             final byte[] rawFetchedMetadata = loadingStrategy.apply(createLoadingContext());
-            
-            if (sourceMetadataValidPredicate.test(rawFetchedMetadata)) {            
-                if (rawFetchedMetadata != null) {
+            if (rawFetchedMetadata != null) {
+                if (sourceMetadataValidPredicate.test(rawFetchedMetadata)) {           
+                    
                     final List<MetadataType> parsedMetadata = parsingStrategy.apply(rawFetchedMetadata);
                     if (parsedMetadata != null) {
                         log.info("{} Parsed {} metadata candidates, loading into cache", 
@@ -382,16 +382,17 @@ public class BatchMetadataCache<IdentifierType, MetadataType>
                         // Store away the original, raw, metadata bytes.
                         getBackingStore().setOriginalValue(rawFetchedMetadata);
                     } 
+                 
+                    // Compute metadata expiration from whatever is in the cache (updated or not) will
+                    // remain null if no cached original value.            
+                    metadataExpiration = sourceMetadataExpiryStrategy.apply(getBackingStore().getOriginalValue());
                 } else {
-                    log.info("{} Metadata has not changed since last refresh", getLogPrefix());
+                    // Metadata is not valid
+                    log.warn("{} Source metadata is not valid");
+                    //TODO MUST FINISH THIS !!
                 }
-                // Compute metadata expiration from whatever is in the cache (updated or not) will
-                // remain null if no cached original value.            
-                metadataExpiration = sourceMetadataExpiryStrategy.apply(getBackingStore().getOriginalValue());
             } else {
-                // Metadata is not valid
-                log.warn("{} Source metadata is not valid");
-                //TODO MUST FINISH THIS !!
+                log.info("{} Metadata has not changed since last refresh", getLogPrefix());
             }
             
         } catch (final Throwable t) {
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultFileLoadingStrategy.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultFileLoadingStrategy.java
index 0091926..8292643 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultFileLoadingStrategy.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/cache/impl/DefaultFileLoadingStrategy.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.time.Instant;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 
 import org.slf4j.Logger;
@@ -33,7 +34,7 @@ import org.springframework.core.io.Resource;
 import net.shibboleth.oidc.metadata.cache.CacheLoadingContext;
 import net.shibboleth.oidc.metadata.cache.LoadingStrategy;
 import net.shibboleth.oidc.metadata.impl.ResolverHelper;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.resolver.ResolverException;
 
 /** Default strategy for loading information from a file.*/
@@ -44,23 +45,28 @@ public class DefaultFileLoadingStrategy implements LoadingStrategy {
     @Nonnull private final Logger log = LoggerFactory.getLogger(DefaultFileLoadingStrategy.class);
     
     /** The metadata file. */
-    @Nonnull private final File metadataFile;
+    @Nullable private final File metadataFile;
     
     /** The metadata file name to use in logs. */
-    @Nonnull private final String metadataFileFriendlyName;
+    @Nonnull @NotEmpty private final String metadataFileFriendlyName;
     
     /**
      * 
      * Constructor.
      *
-     * @param metadata the metadata file resource
+     * @param metadata the metadata file resource. Can be {@literal null}.
      * 
      * @throws IOException if the file does not exist.
      */
-    public DefaultFileLoadingStrategy(@Nonnull final Resource metadata) throws IOException {
-       Constraint.isNotNull(metadata, "The metadata file can not be null");
-       metadataFile = metadata.getFile();
-       metadataFileFriendlyName = metadata.getDescription();
+    public DefaultFileLoadingStrategy(@Nullable final Resource metadata) throws IOException {
+       if (metadata == null) {
+           log.warn("File resource is null, no bytes will be returned");
+           metadataFile = null;
+           metadataFileFriendlyName = "No file specified";
+       } else {
+           metadataFile = metadata.getFile();
+           metadataFileFriendlyName = metadata.getDescription();
+       }
     }
     
     /**
@@ -72,7 +78,10 @@ public class DefaultFileLoadingStrategy implements LoadingStrategy {
     }
 
     @Override
-    public byte[] apply(@Nonnull final CacheLoadingContext context) {
+    @Nullable public byte[] apply(@Nonnull final CacheLoadingContext context) {
+        if (metadataFile == null) {
+            return null;
+        }
         try {
             ResolverHelper.validateMetadataFile(metadataFile);
             final Instant metadataUpdateTime = getMetadataUpdateTime();
@@ -92,7 +101,7 @@ public class DefaultFileLoadingStrategy implements LoadingStrategy {
     }
 
     @Override
-    public String getSourceIdentifier() {
+    @Nonnull public String getSourceIdentifier() {
        return metadataFileFriendlyName;
     }
 
diff --git a/oidc-common-metadata-impl/src/test/java/net/shibboleth/oidc/metadata/impl/DefaultFileLoadingStrategyTest.java b/oidc-common-metadata-impl/src/test/java/net/shibboleth/oidc/metadata/impl/DefaultFileLoadingStrategyTest.java
new file mode 100644
index 0000000..9cd618b
--- /dev/null
+++ b/oidc-common-metadata-impl/src/test/java/net/shibboleth/oidc/metadata/impl/DefaultFileLoadingStrategyTest.java
@@ -0,0 +1,58 @@
+package net.shibboleth.oidc.metadata.impl;
+
+import static org.junit.Assert.assertNull;
+import static org.testng.Assert.assertEquals;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.testng.annotations.Test;
+
+import net.shibboleth.oidc.metadata.cache.CacheLoadingContext;
+import net.shibboleth.oidc.metadata.cache.impl.DefaultFileLoadingStrategy;
+
+/** Tests for the DefaultFileLoadingStrategy.*/
+public class DefaultFileLoadingStrategyTest {
+    
+    private DefaultFileLoadingStrategy strategy;
+    
+    private final static String EXAMPLE_FILE_CONTENT = "test";
+    
+    @Test
+    public void testFileLoads() throws IOException {
+        final Resource resource = 
+                new ClassPathResource("/net/shibboleth/oidc/metadata/impl/file-loading-strategy-test.txt");
+        strategy = new DefaultFileLoadingStrategy(resource);
+        final byte[] loaded = strategy.apply(new CacheLoadingContext(null, null));
+        assertEquals(loaded, EXAMPLE_FILE_CONTENT.getBytes(StandardCharsets.UTF_8));
+    }
+    
+    @Test(expectedExceptions = FileNotFoundException.class)
+    public void testFileDoesNotExist() throws IOException {
+        final Resource resource = 
+                new ClassPathResource("/net/shibboleth/oidc/metadata/impl/no-file.txt");
+        strategy = new DefaultFileLoadingStrategy(resource);
+    }
+    
+    @Test
+    public void testNullFile_NullResponse() throws IOException {
+        strategy = new DefaultFileLoadingStrategy(null);
+        final byte[] loaded = strategy.apply(new CacheLoadingContext(null, null));
+        assertNull(loaded);
+    }
+    
+    @Test
+    public void testNullResponse_FileNotUpdatedSinceLastLoad() throws IOException {
+        final Resource resource = 
+                new ClassPathResource("/net/shibboleth/oidc/metadata/impl/file-loading-strategy-test.txt");
+        strategy = new DefaultFileLoadingStrategy(resource);
+        final byte[] loaded = strategy.apply(new CacheLoadingContext(Instant.MAX, Instant.MAX));
+        assertNull(loaded);
+    }
+    
+
+}
diff --git a/oidc-common-metadata-impl/src/test/resources/net/shibboleth/oidc/metadata/impl/file-loading-strategy-test.txt b/oidc-common-metadata-impl/src/test/resources/net/shibboleth/oidc/metadata/impl/file-loading-strategy-test.txt
new file mode 100644
index 0000000..30d74d2
--- /dev/null
+++ b/oidc-common-metadata-impl/src/test/resources/net/shibboleth/oidc/metadata/impl/file-loading-strategy-test.txt
@@ -0,0 +1 @@
+test
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list