[java-idp-plugin-duo] branch main updated: Null cleanup.

Scott Cantor cantor.2 at osu.edu
Tue Dec 19 14:56:55 UTC 2023


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

scantor pushed a commit to branch main
in repository java-idp-plugin-duo.

View the commit online:
http://git.shibboleth.net/view/?p=java-idp-plugin-duo.git;a=commit;h=d884006fbb561234acc145d64a2f5e9137765a8e

The following commit(s) were added to refs/heads/main by this push:
     new d884006f Null cleanup.
d884006f is described below

commit d884006fbb561234acc145d64a2f5e9137765a8e
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue Dec 19 09:56:53 2023 -0500

    Null cleanup.
---
 .../authn/duo/DefaultDuoOIDCIntegration.java       |  46 ++++-----
 .../plugin/authn/duo/SimpleDuoOIDCIntegration.java |  61 ++++++------
 .../AbstractDuoTokenClaimsAuditExtractor.java      |  11 ++-
 .../authn/duo/DefaultDuoOIDCIntegrationTest.java   |   1 +
 .../authn/duo/impl/DualDuoIntegrationStrategy.java |   4 +-
 .../plugin/authn/duo/impl/DuoAuthnFlowTest.java    | 104 +++++++++------------
 .../authn/duo/impl/DuoOIDCAuthnControllerTest.java |   7 +-
 .../duo/impl/InMemoryCredentialValidator.java      |  15 ++-
 .../mock/MockDuoOIDCClientFactory_FAIL_Client.java |   4 +-
 .../mock/MockDuoOIDCClientFactory_OK_Client.java   |   4 +-
 .../plugin/authn/mock/MockDuoOIDCClient_FAIL.java  |  15 +--
 .../plugin/authn/mock/MockDuoOIDCClient_OK.java    |  15 +--
 .../mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java   |  15 +--
 .../authn/mock/MockDuoOIDCClient_UNKNOWN.java      |  15 +--
 .../spring/CustomFlowRelativeResourceLoader.java   |   8 +-
 .../plugin/authn/duo/nimbus/impl/NimbusClient.java |   2 +-
 .../authn/duo/nimbus/impl/NimbusClientFactory.java |   2 +-
 17 files changed, 174 insertions(+), 155 deletions(-)

diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegration.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegration.java
index a89b9336..41b7503d 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegration.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegration.java
@@ -102,14 +102,14 @@ public final class DefaultDuoOIDCIntegration
                 Constraint.isNotNull(hosts, "Types cannot be null")));
     }
     
-    @Override
+    /** {@inheritDoc} */
     @Nonnull @NotLive @Unmodifiable public synchronized Set<String> getAllowedOrigins() {
         //set is unmodifiable and string is immutable - so not live. 
         return CollectionSupport.copyToSet(allowedOrigins);
     }
 
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getAPIHost() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getAPIHost() {
         checkComponentActive();
         assert apiHost != null;
         return apiHost;
@@ -125,8 +125,8 @@ public final class DefaultDuoOIDCIntegration
         apiHost = Constraint.isNotNull(StringSupport.trimOrNull(host), "API host cannot be null or empty");
     }
     
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getHealthCheckEndpoint() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getHealthCheckEndpoint() {
         checkComponentActive();
         assert healthEndpoint != null;
         return healthEndpoint;
@@ -143,8 +143,8 @@ public final class DefaultDuoOIDCIntegration
                 "Health check endpoint cannot be null or empty");
     }
 
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getAuthorizeEndpoint() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getAuthorizeEndpoint() {
         checkComponentActive();
         assert authorizeEndpoint != null;
         return authorizeEndpoint;
@@ -161,8 +161,8 @@ public final class DefaultDuoOIDCIntegration
                 "Authorize endpoint cannot be null or empty");
     }
 
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getTokenEndpoint() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getTokenEndpoint() {
         checkComponentActive();
         assert tokenEndpoint != null;
         return tokenEndpoint;
@@ -179,7 +179,7 @@ public final class DefaultDuoOIDCIntegration
                 "Token endpoint cannot be null or empty");
     }
     
-    @Override
+    /** {@inheritDoc} */
     @Nullable public synchronized String getRedirectURI() {
         return redirectURI;
     }
@@ -194,12 +194,12 @@ public final class DefaultDuoOIDCIntegration
         registeredRedirectURI = StringSupport.trimOrNull(uri);
     }
     
-    @Override
+    /** {@inheritDoc} */
     @Nullable public synchronized String getRegisteredRedirectURI() {
         return registeredRedirectURI;
     }
     
-    @Override
+    /** {@inheritDoc} */
     public synchronized boolean isRedirectURIPreregistered() {
         if (getRegisteredRedirectURI() == null) {
             return false;
@@ -207,7 +207,7 @@ public final class DefaultDuoOIDCIntegration
         return true;
     }
     
-    @Override
+    /** {@inheritDoc} */
     public synchronized void setRedirectURIIfAbsent(
             @Nonnull @NotEmpty final String computedRedirectURI){   
         // Specifically do not check if component has been initialized. This can change during use.
@@ -229,8 +229,8 @@ public final class DefaultDuoOIDCIntegration
         clientId = Constraint.isNotNull(StringSupport.trimOrNull(id), "ClientID cannot be null or empty");
     }
     
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getClientId() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getClientId() {
         checkComponentActive();
         assert clientId != null;
         return clientId;
@@ -246,15 +246,15 @@ public final class DefaultDuoOIDCIntegration
         secretKey = Constraint.isNotNull(StringSupport.trimOrNull(key), "Secret key cannot be null or empty");
     }
     
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getSecretKey() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getSecretKey() {
         checkComponentActive();
         assert secretKey != null;
         return secretKey;
     }
     
 
-    @Override
+    /** {@inheritDoc} */
     @Nonnull @NonnullElements @Unmodifiable
     public synchronized <T extends Principal> Set<T> getSupportedPrincipals(@Nonnull final Class<T> c) {
         final Set<T> result = supportedPrincipals.getPrincipals(c);
@@ -281,6 +281,7 @@ public final class DefaultDuoOIDCIntegration
         }
     }
 
+    /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
         synchronized (this) {
@@ -296,11 +297,13 @@ public final class DefaultDuoOIDCIntegration
        
     }
 
+    /** {@inheritDoc} */
     @Override
     public int hashCode() {
         return Objects.hash(getClientId());
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean equals(final Object obj) {
         if (this == obj) {
@@ -316,6 +319,7 @@ public final class DefaultDuoOIDCIntegration
         return Objects.equals(getClientId(), other.getClientId());
     }
 
+    /** {@inheritDoc} */
     @Override
     public String toString() {
         final StringBuilder builder = new StringBuilder();
@@ -329,8 +333,4 @@ public final class DefaultDuoOIDCIntegration
         return builder.toString();
     }
 
-    
-    
-    
-
-}
+}
\ No newline at end of file
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/SimpleDuoOIDCIntegration.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/SimpleDuoOIDCIntegration.java
index 8bd8aca7..29067330 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/SimpleDuoOIDCIntegration.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/SimpleDuoOIDCIntegration.java
@@ -25,8 +25,6 @@ import javax.annotation.concurrent.GuardedBy;
 import javax.annotation.concurrent.ThreadSafe;
 import javax.security.auth.Subject;
 
-import org.slf4j.Logger;
-
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
@@ -34,7 +32,6 @@ import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
-import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 
@@ -44,10 +41,7 @@ import net.shibboleth.shared.primitive.StringSupport;
 @ThreadSafe
 public final class SimpleDuoOIDCIntegration 
             extends AbstractInitializableComponent implements DuoOIDCIntegration{
-    
-    /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(SimpleDuoOIDCIntegration.class);
-    
+        
     /** API host. */
     @GuardedBy("this") @NonnullAfterInit @NotEmpty private String apiHost;
     
@@ -76,11 +70,11 @@ public final class SimpleDuoOIDCIntegration
     public SimpleDuoOIDCIntegration() {
         supportedPrincipals = new Subject();
     }
-    
-    
 
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getAPIHost() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getAPIHost() {
+        checkComponentActive();
+        assert apiHost != null;
         return apiHost;
     }
     
@@ -96,8 +90,10 @@ public final class SimpleDuoOIDCIntegration
         apiHost = Constraint.isNotNull(StringSupport.trimOrNull(host), "API host cannot be null or empty");
     }
     
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getHealthCheckEndpoint() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getHealthCheckEndpoint() {
+        checkComponentActive();
+        assert healthEndpoint != null;
         return healthEndpoint;
     }
     
@@ -114,8 +110,10 @@ public final class SimpleDuoOIDCIntegration
                 "Health check endpoint cannot be null or empty");
     }
 
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getAuthorizeEndpoint() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getAuthorizeEndpoint() {
+        checkComponentActive();
+        assert authorizeEndpoint != null;
         return authorizeEndpoint;
     }
     
@@ -132,8 +130,10 @@ public final class SimpleDuoOIDCIntegration
                 "Authorize endpoint cannot be null or empty");
     }
 
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getTokenEndpoint() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getTokenEndpoint() {
+        checkComponentActive();
+        assert tokenEndpoint != null;
         return tokenEndpoint;
     }
     
@@ -150,7 +150,7 @@ public final class SimpleDuoOIDCIntegration
                 "Token endpoint cannot be null or empty");
     }
     
-    @Override
+    /** {@inheritDoc} */
     @Nullable public synchronized String getRedirectURI() {
         return redirectURI;
     }
@@ -180,8 +180,10 @@ public final class SimpleDuoOIDCIntegration
         clientId = Constraint.isNotNull(StringSupport.trimOrNull(id), "ClientID cannot be null or empty");
     }
     
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getClientId() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getClientId() {
+        checkComponentActive();
+        assert clientId != null;
         return clientId;
     }
 
@@ -197,13 +199,16 @@ public final class SimpleDuoOIDCIntegration
         secretKey = Constraint.isNotNull(StringSupport.trimOrNull(key), "Secret key cannot be null or empty");
     }
     
-    @Override
-    @NonnullAfterInit @NotEmpty public synchronized String getSecretKey() {
+    /** {@inheritDoc} */
+    @Nonnull @NotEmpty public synchronized String getSecretKey() {
+        checkComponentActive();
+        assert secretKey != null;
         return secretKey;
     }
     
 
-    @Override
+    /** {@inheritDoc} */
+    @SuppressWarnings("null")
     @Nonnull @NonnullElements @Unmodifiable
     public synchronized <T extends Principal> Set<T> getSupportedPrincipals(@Nonnull final Class<T> c) {
         return supportedPrincipals.getPrincipals(c);
@@ -230,6 +235,7 @@ public final class SimpleDuoOIDCIntegration
         }
     }
 
+    /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
         if (getAPIHost() == null || getClientId() == null || getSecretKey() == null 
@@ -241,11 +247,13 @@ public final class SimpleDuoOIDCIntegration
         }
     }
 
+    /** {@inheritDoc} */
     @Override
     public int hashCode() {
         return Objects.hash(getClientId());
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean equals(final Object obj) {
         if (this == obj) {
@@ -261,6 +269,7 @@ public final class SimpleDuoOIDCIntegration
         return Objects.equals(getClientId(), other.getClientId());
     }
 
+    /** {@inheritDoc} */
     @Override
     public String toString() {
         final StringBuilder builder = new StringBuilder();
@@ -274,8 +283,4 @@ public final class SimpleDuoOIDCIntegration
         return builder.toString();
     }
 
-    
-    
-    
-
-}
+}
\ No newline at end of file
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/AbstractDuoTokenClaimsAuditExtractor.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/AbstractDuoTokenClaimsAuditExtractor.java
index 98cb4f90..1a34c71d 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/AbstractDuoTokenClaimsAuditExtractor.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/AbstractDuoTokenClaimsAuditExtractor.java
@@ -38,23 +38,26 @@ import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
 @ThreadSafe
 public abstract class AbstractDuoTokenClaimsAuditExtractor<T> extends AbstractDuoAuditExtractor<T> {
     
-    
-    @Override
+
+    /** {@inheritDoc} */
     @Nullable public T apply(@Nullable final ProfileRequestContext profileRequestContext) {
         
         if (profileRequestContext == null) {
             return null;
         }
+        
         final AuthenticationContext authnContext = 
                 profileRequestContext.getSubcontext(AuthenticationContext.class);
         if (authnContext == null) {
             return null;
         }
+        
         final DuoOIDCAuthenticationContext duoContext = authnContext.getSubcontext(DuoOIDCAuthenticationContext.class);
         final JWT authToken = duoContext != null ? duoContext.getAuthToken() : null;
-        if (authToken == null) {
+        if (duoContext == null || authToken == null) {
             return null;
         }
+        
         JWTClaimsSet claimsSet = null;
         try {
             claimsSet = authToken.getJWTClaimsSet();
@@ -64,9 +67,11 @@ public abstract class AbstractDuoTokenClaimsAuditExtractor<T> extends AbstractDu
         } catch (final ParseException e) {
             return null;
         }
+        
         return doLookup(claimsSet, duoContext);
     }
     
+    /** {@inheritDoc} */
     @Override
     @Nullable protected T doLookup(@Nonnull final DuoOIDCAuthenticationContext duoContext) {
         JWTClaimsSet claimsSet = null;
diff --git a/idp-duo-api/src/test/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegrationTest.java b/idp-duo-api/src/test/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegrationTest.java
index fac30382..aff0fe41 100644
--- a/idp-duo-api/src/test/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegrationTest.java
+++ b/idp-duo-api/src/test/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegrationTest.java
@@ -21,6 +21,7 @@ import org.testng.annotations.Test;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Test for the DefaultDuoOIDCIntegration. */
+ at SuppressWarnings("javadoc")
 public class DefaultDuoOIDCIntegrationTest {
 
     /**
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java
index 53e69b97..1e442dbf 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java
@@ -55,10 +55,10 @@ public class DualDuoIntegrationStrategy implements Function<ProfileRequestContex
             int2.initialize();
             
             if (DuoAuthnFlowTest.FIRST_INTEGRATION_SP.equals(
-                    prc.getSubcontext(RelyingPartyContext.class).getRelyingPartyId())) {
+                    prc.ensureSubcontext(RelyingPartyContext.class).getRelyingPartyId())) {
                 return int1;
             } else if (DuoAuthnFlowTest.SECOND_INTEGRATION_SP.equals(
-                    prc.getSubcontext(RelyingPartyContext.class).getRelyingPartyId())){
+                    prc.ensureSubcontext(RelyingPartyContext.class).getRelyingPartyId())){
                 return int2;
             }
             //fail if none chosen.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java
index 24f3c6ce..5c6a07a3 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java
@@ -21,11 +21,11 @@ import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
+import javax.security.auth.Subject;
 
 import org.junit.Test;
 import org.opensaml.profile.context.EventContext;
 import org.opensaml.profile.context.ProfileRequestContext;
-import org.slf4j.Logger;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.webflow.core.collection.LocalAttributeMap;
 import org.springframework.webflow.engine.Flow;
@@ -42,6 +42,7 @@ import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
 import net.shibboleth.idp.authn.impl.ExternalAuthenticationImpl;
 import net.shibboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
+import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClientFactory_FAIL_Client;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClientFactory_OK_Client;
@@ -53,7 +54,6 @@ import net.shibboleth.profile.context.RelyingPartyContext;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.component.ComponentInitializationException;
-import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Test the Duo 2FA flow using SWF flow testing.
@@ -75,19 +75,10 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
     /** Duo client ID of the integration needed for the {@link #SECOND_INTEGRATION_SP}.*/
     @Nonnull public static final String SECOND_INTEGRATION_CLIENT_ID = "SECOND_INTEGRATION";
     
-    /** The username of the user to test.*/
-    @Nonnull private static final String USERNAME = "jdoe";
-    
-    /** The password of the user to test.*/
-    @Nonnull private static final String PASSWORD = "changeit";
-    
     /** Path to the flow to be tested.*/
     @Nonnull private static final String FLOW = 
             "/META-INF/net/shibboleth/idp/flows/authn/DuoOIDC/duo-oidc-authn-flow.xml";
     
-    /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(DuoAuthnFlowTest.class);
-    
     /** List of mocked subflows.*/
     @Nonnull @NonnullElements @Unmodifiable private final List<Flow> subflows = 
             List.of(MockFlowBuilder.MockNoOpFlow("c14n"));
@@ -213,13 +204,13 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         assertCurrentStateEquals("Duo2FAAuthorizationRequest");
         
         assertNotNull(prcOne.getSubcontext(AuthenticationContext.class));
-        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
+        assertNotNull(prcOne.ensureSubcontext(AuthenticationContext.class).getSubcontext(
                 DuoOIDCAuthenticationContext.class));
-        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
-                DuoOIDCAuthenticationContext.class).getIntegration());
-        assertEquals(FIRST_INTEGRATION_CLIENT_ID,prcOne.getSubcontext(AuthenticationContext.class)
-                .getSubcontext(DuoOIDCAuthenticationContext.class).getIntegration().getClientId());
-
+        
+        final DuoOIDCIntegration integration = prcOne.ensureSubcontext(AuthenticationContext.class).ensureSubcontext(
+                DuoOIDCAuthenticationContext.class).getIntegration(); 
+        assert integration != null;
+        assertEquals(FIRST_INTEGRATION_CLIENT_ID, integration.getClientId());
     }
     
     /** Test the Duo flow up to the external authorization request using the dynamically selected
@@ -258,13 +249,13 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         assertCurrentStateEquals("Duo2FAAuthorizationRequest");
         
         assertNotNull(prcOne.getSubcontext(AuthenticationContext.class));
-        final var ac = prcOne.getSubcontext(AuthenticationContext.class);
-        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
+        assertNotNull(prcOne.ensureSubcontext(AuthenticationContext.class).getSubcontext(
                 DuoOIDCAuthenticationContext.class));
-        assertNotNull(prcOne.getSubcontext(AuthenticationContext.class).getSubcontext(
-                DuoOIDCAuthenticationContext.class).getIntegration());
-        assertEquals(SECOND_INTEGRATION_CLIENT_ID,prcOne.getSubcontext(AuthenticationContext.class)
-                .getSubcontext(DuoOIDCAuthenticationContext.class).getIntegration().getClientId());
+        
+        final DuoOIDCIntegration integration = prcOne.ensureSubcontext(AuthenticationContext.class).ensureSubcontext(
+                DuoOIDCAuthenticationContext.class).getIntegration(); 
+        assert integration != null;
+        assertEquals(SECOND_INTEGRATION_CLIENT_ID, integration.getClientId());
 
     }
     
@@ -352,11 +343,11 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         integ.initialize();
         duoContext.setIntegration(integ);
         
-      //add the mock client as was not added by the populate stage
-        duoContext.setClient(new MockDuoOIDCClient_OK(duoContext.getIntegration()));
+        //add the mock client as was not added by the populate stage
+        duoContext.setClient(new MockDuoOIDCClient_OK(integ));
         
-        prc.getSubcontext(AuthenticationContext.class).addSubcontext(duoContext);
-        prc.getSubcontext(AuthenticationContext.class)
+        prc.ensureSubcontext(AuthenticationContext.class).addSubcontext(duoContext);
+        prc.ensureSubcontext(AuthenticationContext.class)
                     .addSubcontext(new ExternalAuthenticationContext(new ExternalAuthenticationImpl(false)));
         flowExecution.getConversationScope().put("opensamlProfileRequestContext",prc);
         updateFlowExecution(flowExecution);
@@ -370,11 +361,12 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         assertFlowExecutionEnded();
         assertNotNull(prc.getSubcontext(AuthenticationContext.class));
         assertNotNull(prc.getSubcontext(SubjectCanonicalizationContext.class));
-        assertEquals(prc.getSubcontext(SubjectCanonicalizationContext.class).getPrincipalName(),"jdoe");
+        assertEquals(prc.ensureSubcontext(SubjectCanonicalizationContext.class).getPrincipalName(),"jdoe");
         
         //now test the ACR was added
-        final Set<AuthnContextClassRefPrincipal> principals = prc.getSubcontext(SubjectCanonicalizationContext.class)
-                .getSubject().getPrincipals(AuthnContextClassRefPrincipal.class);
+        final Subject subject = prc.ensureSubcontext(SubjectCanonicalizationContext.class).getSubject();
+        assert subject != null;
+        final Set<AuthnContextClassRefPrincipal> principals = subject.getPrincipals(AuthnContextClassRefPrincipal.class);
         assertEquals(1,principals.size());
         assertEquals("http://example.org/ac/classes/mfa/strong",principals.iterator().next().getName());
     }
@@ -434,10 +426,10 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         
         
         //add the mock client as was not added by the populate stage
-        duoContext.setClient(new MockDuoOIDCClient_OK(duoContext.getIntegration()));
+        duoContext.setClient(new MockDuoOIDCClient_OK(integ));
         
-        prc.getSubcontext(AuthenticationContext.class).addSubcontext(duoContext);
-        prc.getSubcontext(AuthenticationContext.class)
+        prc.ensureSubcontext(AuthenticationContext.class).addSubcontext(duoContext);
+        prc.ensureSubcontext(AuthenticationContext.class)
                     .addSubcontext(new ExternalAuthenticationContext(new ExternalAuthenticationImpl(false)));
         flowExecution.getConversationScope().put("opensamlProfileRequestContext",prc);
         updateFlowExecution(flowExecution);
@@ -450,13 +442,13 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         //assert success conditions
         assertFlowExecutionEnded();
         assertNotNull(prc.getSubcontext(AuthenticationContext.class));
-        assertNotNull(prc.getSubcontext(AuthenticationContext.class).
+        assertNotNull(prc.ensureSubcontext(AuthenticationContext.class).
                 getSubcontext(DuoOIDCAuthenticationContext.class));
-        final DuoOIDCAuthenticationContext contextFromPrc = prc.getSubcontext(AuthenticationContext.class).
-                getSubcontext(DuoOIDCAuthenticationContext.class);
+        final DuoOIDCAuthenticationContext contextFromPrc = prc.ensureSubcontext(AuthenticationContext.class).
+                ensureSubcontext(DuoOIDCAuthenticationContext.class);
         assertNotNull(contextFromPrc.getAuthToken());
-        assertNotNull(prc.getSubcontext(SubjectCanonicalizationContext.class));
-        assertEquals(prc.getSubcontext(SubjectCanonicalizationContext.class).getPrincipalName(),"jdoe");
+        assertNotNull(prc.ensureSubcontext(SubjectCanonicalizationContext.class));
+        assertEquals(prc.ensureSubcontext(SubjectCanonicalizationContext.class).getPrincipalName(),"jdoe");
         
     }
     
@@ -513,10 +505,10 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         duoContext.setIntegration(integ);
         
         //add the mock client as was not added by the populate stage
-        duoContext.setClient(new MockDuoOIDCClient_OK(duoContext.getIntegration()));
+        duoContext.setClient(new MockDuoOIDCClient_OK(integ));
         
-        prc.getSubcontext(AuthenticationContext.class).addSubcontext(duoContext);
-        prc.getSubcontext(AuthenticationContext.class)
+        prc.ensureSubcontext(AuthenticationContext.class).addSubcontext(duoContext);
+        prc.ensureSubcontext(AuthenticationContext.class)
                     .addSubcontext(new ExternalAuthenticationContext(new ExternalAuthenticationImpl(false)));
         
         //add a requested principal context.
@@ -526,13 +518,13 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
                 List.of(new AuthnContextClassRefPrincipal("http://example.org/ac/classes/mfa"));
         rpc.setRequestedPrincipals(requestedPrincipals);
         rpc.setOperator("exact");
-        prc.getSubcontext(AuthenticationContext.class).addSubcontext(rpc);
+        prc.ensureSubcontext(AuthenticationContext.class).addSubcontext(rpc);
         
         //override the authflowdescriptor
         final AuthenticationFlowDescriptor afd = new AuthenticationFlowDescriptor();
         afd.setId("authn/DuoOIDC");
         afd.setSupportedPrincipals(List.of(new AuthnContextClassRefPrincipal("http://example.org/ac/classes/mfa")));
-        prc.getSubcontext(AuthenticationContext.class).setAttemptedFlow(afd);
+        prc.ensureSubcontext(AuthenticationContext.class).setAttemptedFlow(afd);
         
         flowExecution.getConversationScope().put("opensamlProfileRequestContext",prc);
         updateFlowExecution(flowExecution);
@@ -545,13 +537,13 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         //assert success conditions
         assertFlowExecutionEnded();
         assertNotNull(prc.getSubcontext(AuthenticationContext.class));
-        assertNotNull(prc.getSubcontext(AuthenticationContext.class).
+        assertNotNull(prc.ensureSubcontext(AuthenticationContext.class).
                 getSubcontext(DuoOIDCAuthenticationContext.class));
-        final DuoOIDCAuthenticationContext contextFromPrc = prc.getSubcontext(AuthenticationContext.class).
-                getSubcontext(DuoOIDCAuthenticationContext.class);
+        final DuoOIDCAuthenticationContext contextFromPrc = prc.ensureSubcontext(AuthenticationContext.class).
+                ensureSubcontext(DuoOIDCAuthenticationContext.class);
         assertNotNull(contextFromPrc.getAuthToken());
         assertNotNull(prc.getSubcontext(SubjectCanonicalizationContext.class));
-        assertEquals(prc.getSubcontext(SubjectCanonicalizationContext.class).getPrincipalName(),"jdoe");
+        assertEquals(prc.ensureSubcontext(SubjectCanonicalizationContext.class).getPrincipalName(),"jdoe");
         
     }
 
@@ -607,10 +599,10 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         duoContext.setIntegration(integ);
         
         //add the mock client as was not added by the populate stage
-        duoContext.setClient(new MockDuoOIDCClient_OK_OLD_AUTH_TIME(duoContext.getIntegration()));
+        duoContext.setClient(new MockDuoOIDCClient_OK_OLD_AUTH_TIME(integ));
         
-        prc.getSubcontext(AuthenticationContext.class).addSubcontext(duoContext);
-        prc.getSubcontext(AuthenticationContext.class)
+        prc.ensureSubcontext(AuthenticationContext.class).addSubcontext(duoContext);
+        prc.ensureSubcontext(AuthenticationContext.class)
                     .addSubcontext(new ExternalAuthenticationContext(new ExternalAuthenticationImpl(false)));
         flowExecution.getConversationScope().put("opensamlProfileRequestContext",prc);
         updateFlowExecution(flowExecution);
@@ -623,14 +615,10 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
         //assert success conditions
         assertFlowExecutionEnded();        
         assertNotNull(prc.getSubcontext(EventContext.class));
-        assertNotNull(prc.getSubcontext(EventContext.class).getEvent());
-        assertTrue(prc.getSubcontext(EventContext.class).getEvent() instanceof String);
-        assertEquals(AuthnEventIds.NO_CREDENTIALS, prc.getSubcontext(EventContext.class).getEvent());
+        assertNotNull(prc.ensureSubcontext(EventContext.class).getEvent());
+        assertTrue(prc.ensureSubcontext(EventContext.class).getEvent() instanceof String);
+        assertEquals(AuthnEventIds.NO_CREDENTIALS, prc.ensureSubcontext(EventContext.class).getEvent());
         
     }
    
-}
-
-
-
-
+}
\ No newline at end of file
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java
index 1069bdfc..c0fed87f 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java
@@ -126,16 +126,17 @@ public class DuoOIDCAuthnControllerTest extends AbstractTestNGSpringContextTests
      * @throws Exception on exception.
      */
     @Test
-    @SuppressWarnings("null")
     public void testSuccessfulAuthorizeRequest() throws Exception {
         
         final MvcResult result = mockMvc.perform(get("/Authn/Duo/2FA/authorize")
                 .param("conversation", "e1s1"))
                 .andDo(print())
                 .andExpect(status().is3xxRedirection()).andReturn();
-        assertNotNull(result.getResponse().getHeader("Location"));
+        final String location = result.getResponse().getHeader("Location"); 
+        assert location != null;
         //basic check of the URL - contains the API host
-        assertTrue(result.getResponse().getHeader("Location").contains(API_HOST));
+        
+        assertTrue(location.contains(API_HOST));
 
     }
     
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/InMemoryCredentialValidator.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/InMemoryCredentialValidator.java
index c322a4e5..94f5d11d 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/InMemoryCredentialValidator.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/InMemoryCredentialValidator.java
@@ -15,6 +15,7 @@
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 import javax.security.auth.Subject;
 import javax.security.auth.login.LoginException;
@@ -47,6 +48,12 @@ public class InMemoryCredentialValidator extends AbstractUsernamePasswordCredent
     /** The configured password.*/
     @Nonnull private final String password;
 
+    /**
+     * Constructor.
+     *
+     * @param uname username
+     * @param pssword password
+     */
     public InMemoryCredentialValidator(@Nonnull @NotEmpty final String uname, 
             @Nonnull @NotEmpty final String pssword) {
         username = Constraint.isNotEmpty(uname, "Username can not be null or empty");
@@ -59,10 +66,12 @@ public class InMemoryCredentialValidator extends AbstractUsernamePasswordCredent
         super.doInitialize();
     }
 
+    /** {@inheritDoc} */
     @Override
-    protected Subject doValidate(final ProfileRequestContext profileRequestContext,
-            final AuthenticationContext authenticationContext, final UsernamePasswordContext usernamePasswordContext,
-            final WarningHandler warningHandler, final ErrorHandler errorHandler) throws Exception {
+    protected Subject doValidate(@Nonnull final ProfileRequestContext profileRequestContext,
+            @Nonnull final AuthenticationContext authenticationContext,
+            @Nonnull final UsernamePasswordContext usernamePasswordContext,
+            @Nullable final WarningHandler warningHandler, @Nullable final ErrorHandler errorHandler) throws Exception {
 
 
         final String requestUsername = usernamePasswordContext.getTransformedUsername();
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClientFactory_FAIL_Client.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClientFactory_FAIL_Client.java
index 4bd05338..e34cf524 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClientFactory_FAIL_Client.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClientFactory_FAIL_Client.java
@@ -14,6 +14,8 @@
 
 package net.shibboleth.idp.plugin.authn.mock;
 
+import javax.annotation.Nonnull;
+
 import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClient;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientFactory;
@@ -25,7 +27,7 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 public class MockDuoOIDCClientFactory_FAIL_Client implements DuoOIDCClientFactory {
 
     @Override
-    public DuoOIDCClient createInstance(final DuoOIDCIntegration integration) throws DuoClientException {
+    @Nonnull  public DuoOIDCClient createInstance(@Nonnull final DuoOIDCIntegration integration) throws DuoClientException {
         return new MockDuoOIDCClient_FAIL(integration);
     }
 
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClientFactory_OK_Client.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClientFactory_OK_Client.java
index dea86890..49705287 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClientFactory_OK_Client.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClientFactory_OK_Client.java
@@ -14,6 +14,8 @@
 
 package net.shibboleth.idp.plugin.authn.mock;
 
+import javax.annotation.Nonnull;
+
 import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClient;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientFactory;
@@ -25,7 +27,7 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 public class MockDuoOIDCClientFactory_OK_Client implements DuoOIDCClientFactory {
 
     @Override
-    public DuoOIDCClient createInstance(final DuoOIDCIntegration integration) throws DuoClientException {
+    @Nonnull public DuoOIDCClient createInstance(@Nonnull final DuoOIDCIntegration integration) throws DuoClientException {
         return new MockDuoOIDCClient_OK(integration);
     }
 
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_FAIL.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_FAIL.java
index 3b55cc2f..8c3fb268 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_FAIL.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_FAIL.java
@@ -21,6 +21,7 @@ import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import com.nimbusds.jose.JOSEException;
 import com.nimbusds.jose.JWSAlgorithm;
@@ -56,22 +57,22 @@ public class MockDuoOIDCClient_FAIL implements DuoOIDCClient{
     }
 
     @Override
-    public DuoHealthCheck healthCheck() throws DuoClientException {
+    @Nonnull public DuoHealthCheck healthCheck() throws DuoClientException {
         return DuoHealthCheck.builder().withStatus(STATUS).
                 withTimestamp(Long.toString(System.currentTimeMillis())).build();
     }
 
     @Override
-    public String createAuthUrl(final String username, final String state, 
-            final String nonce, final String redirect) throws DuoClientException {
+    @Nonnull public String createAuthUrl(@Nonnull final String username, @Nonnull final String state, 
+            @Nullable final String nonce, @Nullable final String redirect) throws DuoClientException {
         return format("https://%s%s?scope=openid&response_type=code&redirect_uri=%s&client_id=%s&request=%s",
                 integration.getAPIHost(),"/oauth/v1/authorize", integration.getRedirectURI(),
                 integration.getClientId(), "JWT");
     }
 
     @Override
-    public JWT exchangeAuthorizationCodeFor2FAResult(final String code, 
-            final String username, final String redirect) throws DuoClientException {
+    @Nonnull public JWT exchangeAuthorizationCodeFor2FAResult(@Nonnull final String code, 
+            @Nonnull final String username, @Nullable final String redirect) throws DuoClientException {
         
         final String jwtJson = "{\n" + 
                 "    \"iss\": \"https://"+integration.getAPIHost()+"oauth/v1/token\",\n" + 
@@ -135,7 +136,7 @@ public class MockDuoOIDCClient_FAIL implements DuoOIDCClient{
     }
 
     @Override
-    public String getClientId() {
+    @Nonnull public String getClientId() {
         return "MockDuoClient_FAIL";
     }
     
@@ -146,7 +147,7 @@ public class MockDuoOIDCClient_FAIL implements DuoOIDCClient{
 
 
     @Override
-    public DuoOIDCClientCapabilities getCapabilities() {
+    @Nonnull public DuoOIDCClientCapabilities getCapabilities() {
         return new DuoOIDCClientCapabilities() {
             
             @Override
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK.java
index b1ccd11b..08b0cfb0 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK.java
@@ -21,6 +21,7 @@ import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import com.nimbusds.jose.JOSEException;
 import com.nimbusds.jose.JWSAlgorithm;
@@ -53,22 +54,22 @@ public class MockDuoOIDCClient_OK implements DuoOIDCClient{
     }
 
     @Override
-    public DuoHealthCheck healthCheck() throws DuoClientException {
+    @Nonnull public DuoHealthCheck healthCheck() throws DuoClientException {
         return DuoHealthCheck.builder().withStatus(STATUS).
                 withTimestamp(Long.toString(System.currentTimeMillis())).build();
     }
 
     @Override
-    public String createAuthUrl(final String username, final String state, 
-            final String nonce, final String redirect) throws DuoClientException {
+    @Nonnull public String createAuthUrl(@Nonnull final String username, @Nonnull final String state, 
+            @Nullable final String nonce, @Nullable final String redirect) throws DuoClientException {
         return format("https://%s%s?scope=openid&response_type=code&redirect_uri=%s&client_id=%s&request=%s",
                 integration.getAPIHost(),"/oauth/v1/authorize", integration.getRedirectURI(), 
                 integration.getClientId(), "JWT");
     }
 
     @Override
-    public JWT exchangeAuthorizationCodeFor2FAResult(final String code, 
-            final String username, final String redirect) throws DuoClientException {
+    @Nonnull public JWT exchangeAuthorizationCodeFor2FAResult(@Nonnull final String code, 
+            @Nonnull final String username, @Nullable final String redirect) throws DuoClientException {
         
            final String jwtJson = "{\n" + 
                    "    \"iss\": \"https://"+integration.getAPIHost()+"/oauth/v1/token\",\n" + 
@@ -132,7 +133,7 @@ public class MockDuoOIDCClient_OK implements DuoOIDCClient{
     }
     
     @Override
-    public String getClientId() {
+    @Nonnull public String getClientId() {
         return "MockDuoClient_OK";
     }
     
@@ -143,7 +144,7 @@ public class MockDuoOIDCClient_OK implements DuoOIDCClient{
 
 
     @Override
-    public DuoOIDCClientCapabilities getCapabilities() {
+    @Nonnull public DuoOIDCClientCapabilities getCapabilities() {
         return new DuoOIDCClientCapabilities() {
             
             @Override
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java
index 3cca1f99..e20c2c9e 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java
@@ -21,6 +21,7 @@ import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import com.nimbusds.jose.JOSEException;
 import com.nimbusds.jose.JWSAlgorithm;
@@ -55,22 +56,22 @@ public class MockDuoOIDCClient_OK_OLD_AUTH_TIME implements DuoOIDCClient{
     }
 
     @Override
-    public DuoHealthCheck healthCheck() throws DuoClientException {
+    @Nonnull public DuoHealthCheck healthCheck() throws DuoClientException {
         return DuoHealthCheck.builder().withStatus(STATUS).
                 withTimestamp(Long.toString(System.currentTimeMillis())).build();
     }
 
     @Override
-    public String createAuthUrl(final String username, final String state, 
-            final String nonce, final String redirect) throws DuoClientException {
+    @Nonnull public String createAuthUrl(@Nonnull final String username, @Nonnull final String state, 
+            @Nullable final String nonce, @Nullable final String redirect) throws DuoClientException {
         return format("https://%s%s?scope=openid&response_type=code&redirect_uri=%s&client_id=%s&request=%s",
                 integration.getAPIHost(),"/oauth/v1/authorize", integration.getRedirectURI(), 
                 integration.getClientId(), "JWT");
     }
 
     @Override
-    public JWT exchangeAuthorizationCodeFor2FAResult(final String code, 
-            final String username, final String redirect) throws DuoClientException {
+    @Nonnull public JWT exchangeAuthorizationCodeFor2FAResult(@Nonnull final String code, 
+            @Nonnull final String username, @Nullable final String redirect) throws DuoClientException {
         
         final String jwtJson = "{\n" + 
                 "    \"iss\": \"https://"+integration.getAPIHost()+"/oauth/v1/token\",\n" + 
@@ -134,7 +135,7 @@ public class MockDuoOIDCClient_OK_OLD_AUTH_TIME implements DuoOIDCClient{
     }
     
     @Override
-    public String getClientId() {
+    @Nonnull public String getClientId() {
         return "MockDuoClient_OLD_AUTH_TIME";
     }
     
@@ -145,7 +146,7 @@ public class MockDuoOIDCClient_OK_OLD_AUTH_TIME implements DuoOIDCClient{
 
 
     @Override
-    public DuoOIDCClientCapabilities getCapabilities() {
+    @Nonnull public DuoOIDCClientCapabilities getCapabilities() {
         return new DuoOIDCClientCapabilities() {
             
             @Override
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_UNKNOWN.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_UNKNOWN.java
index 1e6ea4b2..e8353c7a 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_UNKNOWN.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_UNKNOWN.java
@@ -21,6 +21,7 @@ import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import com.nimbusds.jose.JOSEException;
 import com.nimbusds.jose.JWSAlgorithm;
@@ -53,22 +54,22 @@ public class MockDuoOIDCClient_UNKNOWN implements DuoOIDCClient{
     }
 
     @Override
-    public DuoHealthCheck healthCheck() throws DuoClientException {
+    @Nonnull public DuoHealthCheck healthCheck() throws DuoClientException {
         return DuoHealthCheck.builder().withStatus(STATUS).
                 withTimestamp(Long.toString(System.currentTimeMillis())).build();
     }
 
     @Override
-    public String createAuthUrl(final String username, final String state, 
-            final String nonce, final String redirect) throws DuoClientException {
+    @Nonnull public String createAuthUrl(@Nonnull final String username, @Nonnull final String state, 
+            @Nullable final String nonce, @Nullable final String redirect) throws DuoClientException {
         return format("https://%s%s?scope=openid&response_type=code&redirect_uri=%s&client_id=%s&request=%s",
                 integration.getAPIHost(),"/oauth/v1/authorize", integration.getRedirectURI(),
                 integration.getClientId(), "JWT");
     }
 
     @Override
-    public JWT exchangeAuthorizationCodeFor2FAResult(final String code, 
-            final String username, final String redirect) throws DuoClientException {
+    @Nonnull public JWT exchangeAuthorizationCodeFor2FAResult(@Nonnull final String code, 
+            @Nonnull final String username, @Nullable final String redirect) throws DuoClientException {
         final String jwtJson = "{\n" + 
                 "    \"iss\": \"https://"+integration.getAPIHost()+"oauth/v1/token\",\n" + 
                 "    \"sub\": \""+SUB+"\",\n" + 
@@ -130,7 +131,7 @@ public class MockDuoOIDCClient_UNKNOWN implements DuoOIDCClient{
     }
     
     @Override
-    public String getClientId() {
+    @Nonnull public String getClientId() {
         return "MockDuoClient_UNKNOWN";
     }
 
@@ -141,7 +142,7 @@ public class MockDuoOIDCClient_UNKNOWN implements DuoOIDCClient{
 
 
     @Override
-    public DuoOIDCClientCapabilities getCapabilities() {
+    @Nonnull public DuoOIDCClientCapabilities getCapabilities() {
         return new DuoOIDCClientCapabilities() {
             
             @Override
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/spring/CustomFlowRelativeResourceLoader.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/spring/CustomFlowRelativeResourceLoader.java
index 2bcf4721..22f6839b 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/spring/CustomFlowRelativeResourceLoader.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/spring/CustomFlowRelativeResourceLoader.java
@@ -17,6 +17,8 @@ import java.io.IOException;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.ProtocolResolver;
 import org.springframework.core.io.Resource;
@@ -33,12 +35,12 @@ public class CustomFlowRelativeResourceLoader implements ResourceLoader {
 
     private final Resource flowResource;
     
-    public void addProtocolResolver(final ProtocolResolver resolver) {
+    public void addProtocolResolver(@Nonnull final ProtocolResolver resolver) {
         Assert.notNull(resolver, "ProtocolResolver must not be null");
         this.protocolResolvers.add(resolver);
     }
 
-    public CustomFlowRelativeResourceLoader(final Resource resource) {
+    public CustomFlowRelativeResourceLoader(@Nonnull final Resource resource) {
         this.flowResource = resource;
     }
 
@@ -48,7 +50,7 @@ public class CustomFlowRelativeResourceLoader implements ResourceLoader {
     }
 
     @Override
-    public Resource getResource(final String location) {
+    @Nonnull public Resource getResource(@Nonnull final String location) {
         Assert.notNull(location, "Location must not be null");
 
         for (final ProtocolResolver protocolResolver : protocolResolvers) {
diff --git a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClient.java b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClient.java
index 8bd2e50e..02e058d4 100644
--- a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClient.java
+++ b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClient.java
@@ -162,7 +162,7 @@ public final class NimbusClient extends AbstractDuoOIDCClient{
     }
 
     @Override
-    public JWT exchangeAuthorizationCodeFor2FAResult(@Nonnull final String code, 
+    @Nonnull public JWT exchangeAuthorizationCodeFor2FAResult(@Nonnull final String code, 
             @Nonnull final String username, @Nullable final String redirectURIOverride) throws DuoClientException {
         Constraint.isNotEmpty(code, "Auth_code can not be null");
         
diff --git a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactory.java b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactory.java
index 0a4e6fc6..d3ac404e 100644
--- a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactory.java
+++ b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactory.java
@@ -55,7 +55,7 @@ public final class NimbusClientFactory extends AbstractInitializableComponent im
     @GuardedBy("this") @NonnullAfterInit private ObjectMapper objectMapper;
 
     @Override
-    public DuoOIDCClient createInstance(@Nonnull final DuoOIDCIntegration integration) throws DuoClientException {
+    @Nonnull public DuoOIDCClient createInstance(@Nonnull final DuoOIDCIntegration integration) throws DuoClientException {
         return new NimbusClient(integration, getHttpClient(), getHttpClientSecurityParameters(), getObjectMapper());
     }
 

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


More information about the commits mailing list