[java-idp-plugin-duo] 01/02: JDUO-92 - Update duo_universal_java to version 1.2.0

Phil Smart philip.smart at jisc.ac.uk
Tue Apr 8 17:30:27 UTC 2025


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

philsmart 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=4d206a0f25609220cafaac9c8eb5b0c5d656aa08

commit 4d206a0f25609220cafaac9c8eb5b0c5d656aa08
Author: Phil Smart <philip.smart at jisc.ac.uk>
AuthorDate: Wed Mar 26 11:19:43 2025 +0000

    JDUO-92 - Update duo_universal_java to version 1.2.0
    
     - Update Duo SDK version to 1.2.0
     - Update packaged library versions for the DuoSDK plugin
     - Remove libraries no longer needed for the DuoSDK plugin
     - cleanup POM versions for the DuoSDK plugin
     - Expose HTTP proxy port and hostname for the Duo SDK variant
     - Update plugin version to 2.2.0-SNAPSHOT
    
    https://shibboleth.atlassian.net/browse/JDUO-92
---
 idp-duo-api/pom.xml                                |  2 +-
 idp-duo-impl/pom.xml                               |  2 +-
 idp-duo-nimbus-client-impl/pom.xml                 |  2 +-
 .../idp/plugin/authn/duo/nimbus/plugin.properties  |  2 +-
 idp-duo-nimbus-distribution/pom.xml                |  2 +-
 idp-duo-sdk-client-impl/pom.xml                    | 47 +++++------
 .../authn/duo/sdk/impl/DuoSDKClientAdaptor.java    | 98 ++++++++++++++++------
 .../authn/duo/sdk/impl/DuoSDKClientFactory.java    | 66 ++++++++++++++-
 .../plugin/authn/duo/duo-client-factory-bean.xml   |  4 +-
 .../authn/duo/sdk/conf/authn/duo-oidc.properties   |  4 +
 .../idp/plugin/authn/duo/sdk/plugin.properties     |  2 +-
 .../duo/sdk/impl/DuoSDKClientFactoryTest.java      |  1 +
 idp-duo-sdk-distribution/pom.xml                   |  2 +-
 pom.xml                                            |  4 +-
 14 files changed, 178 insertions(+), 60 deletions(-)

diff --git a/idp-duo-api/pom.xml b/idp-duo-api/pom.xml
index 81a8efd6..4a75e991 100644
--- a/idp-duo-api/pom.xml
+++ b/idp-duo-api/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>2.1.1-SNAPSHOT</version>
+        <version>2.2.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-api</artifactId>
diff --git a/idp-duo-impl/pom.xml b/idp-duo-impl/pom.xml
index 91099cf8..6ec7a2c8 100644
--- a/idp-duo-impl/pom.xml
+++ b/idp-duo-impl/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>2.1.1-SNAPSHOT</version>
+        <version>2.2.0-SNAPSHOT</version>
     </parent>
 
     <name>Shibboleth IdP :: Plugins :: Duo 2FA Login Flow Impl</name>
diff --git a/idp-duo-nimbus-client-impl/pom.xml b/idp-duo-nimbus-client-impl/pom.xml
index e4a8b0c1..61c5e647 100644
--- a/idp-duo-nimbus-client-impl/pom.xml
+++ b/idp-duo-nimbus-client-impl/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>2.1.1-SNAPSHOT</version>
+        <version>2.2.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-nimbus-client-impl</artifactId>
diff --git a/idp-duo-nimbus-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/nimbus/plugin.properties b/idp-duo-nimbus-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/nimbus/plugin.properties
index 545541ca..2d3400c7 100644
--- a/idp-duo-nimbus-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/nimbus/plugin.properties
+++ b/idp-duo-nimbus-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/nimbus/plugin.properties
@@ -2,7 +2,7 @@
 
 plugin.id = net.shibboleth.idp.plugin.authn.duo.nimbus
 # Only used when package manifest is not available
-plugin.version = 2.1.0
+plugin.version = 2.1.1
 
 # prereqs
 plugin.modules.required = idp.oidc.common.4
diff --git a/idp-duo-nimbus-distribution/pom.xml b/idp-duo-nimbus-distribution/pom.xml
index ecbf8a3c..0a11ba1e 100644
--- a/idp-duo-nimbus-distribution/pom.xml
+++ b/idp-duo-nimbus-distribution/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>2.1.1-SNAPSHOT</version>
+        <version>2.2.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-nimbus-dist</artifactId>
diff --git a/idp-duo-sdk-client-impl/pom.xml b/idp-duo-sdk-client-impl/pom.xml
index 65bee79c..4677d52a 100644
--- a/idp-duo-sdk-client-impl/pom.xml
+++ b/idp-duo-sdk-client-impl/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>2.1.1-SNAPSHOT</version>
+        <version>2.2.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-sdk-client-impl</artifactId>
@@ -17,6 +17,12 @@
     <properties>
         <checkstyle.configLocation>${project.basedir}/../resources/checkstyle/checkstyle.xml</checkstyle.configLocation>
         <automatic.module.name>net.shibboleth.idp.plugin.authn.duo.sdk.impl</automatic.module.name>
+        <retrofit2.retrofit.version>2.11.0</retrofit2.retrofit.version>
+        <retrofit2.converter-jackson.version>2.11.0</retrofit2.converter-jackson.version>
+        <okhttp3.okhttp.version>3.14.9</okhttp3.okhttp.version>
+        <okio.okio.version>1.17.2</okio.okio.version>
+        <bytebuddy.byte-buddy.version>1.15.4</bytebuddy.byte-buddy.version>
+        <auth0.java-jwt.version>4.0.0</auth0.java-jwt.version>
     </properties>
 
     <dependencies>
@@ -48,43 +54,36 @@
         <dependency>
             <groupId>com.squareup.retrofit2</groupId>
             <artifactId>retrofit</artifactId>
-            <version>2.9.0</version>
-        </dependency>
+            <version>${retrofit2.retrofit.version}</version>
+        </dependency>  
         <dependency>
             <groupId>com.squareup.okhttp3</groupId>
             <artifactId>okhttp</artifactId>
-            <version>3.14.9</version>
-        </dependency>
+            <version>${okhttp3.okhttp.version}</version>
+        </dependency> 
         <dependency>
-	        <groupId>com.squareup.okio</groupId>
-	        <artifactId>okio</artifactId>
-	        <version>1.15.0</version>
-        </dependency>
+            <groupId>com.squareup.okio</groupId>
+            <artifactId>okio</artifactId>
+            <version>${okio.okio.version}</version>
+        </dependency>     
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy</artifactId>
+            <version>${bytebuddy.byte-buddy.version}</version>
+            <scope>runtime</scope>
+        </dependency>       
         <dependency>
             <groupId>com.squareup.retrofit2</groupId>
             <artifactId>converter-jackson</artifactId>
-            <version>2.9.0</version>
+            <version>${retrofit2.converter-jackson.version}</version>
             <scope>runtime</scope>
         </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <version>1.18.20</version>
-            <scope>provided</scope>
-        </dependency> 
         <dependency>
             <groupId>com.auth0</groupId>
             <artifactId>java-jwt</artifactId>
-            <version>3.3.0</version>
+            <version>${auth0.java-jwt.version}</version>
             <scope>runtime</scope>
         </dependency>
-        <dependency>
-            <groupId>com.squareup.okhttp3</groupId>
-            <artifactId>logging-interceptor</artifactId>
-            <version>4.9.1</version>
-            <scope>runtime</scope>
-        </dependency>
-
         <!-- provided dependencies -->
         <dependency>
             <groupId>${oidc-common.groupId}</groupId>
diff --git a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientAdaptor.java b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientAdaptor.java
index 53d10350..49a66e58 100644
--- a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientAdaptor.java
+++ b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientAdaptor.java
@@ -90,32 +90,82 @@ public final class DuoSDKClientAdaptor extends AbstractDuoOIDCClient{
      */
      DuoSDKClientAdaptor(@Nonnull final DuoOIDCIntegration integration, 
             @Nullable final List<String> caCerts) throws DuoClientException {
-        super();
-        duoIntegration = Constraint.isNotNull(integration,"Duo SDK Client requires a non-null Duo Integration");
-        healthCheckResponseConverter = new DefaultHealthCheckResponseConverter();
-        tokenResponseConverter = new DefaultTokenResponseConverter();
+         super();
+         duoIntegration = Constraint.isNotNull(integration,"Duo SDK Client requires a non-null Duo Integration");
+         healthCheckResponseConverter = new DefaultHealthCheckResponseConverter();
+         tokenResponseConverter = new DefaultTokenResponseConverter();
 
-        try {
-            if (caCerts == null) {
-                //will use the default certs in the Client if the caCerts are null
-                final Client newClient = new Client.Builder(integration.getClientId(), integration.getSecretKey(),
-                        integration.getAPIHost(), integration.getRedirectURI()).setUseDuoCodeAttribute(false).build();
-                assert newClient != null;
-                client = newClient;
-            } else {
-                final Client newClient = new Client.Builder(integration.getClientId(), integration.getSecretKey(),
-                        integration.getAPIHost(), integration.getRedirectURI()).setCACerts(
-                                caCerts.toArray(new String[caCerts.size()]))
-                        .setUseDuoCodeAttribute(false).build();
-                assert newClient != null;
-                client = newClient;
-            }
-        } catch (final DuoException e) {
-            //wrap exception and throw
-            throw new DuoClientException(e);
-        }
- 
+         try {
+             if (caCerts == null) {
+                 //will use the default certs in the Client if the caCerts are null
+                 final Client newClient = new Client.Builder(integration.getClientId(), integration.getSecretKey(),
+                         integration.getAPIHost(), integration.getRedirectURI())
+                         .setUseDuoCodeAttribute(false)
+                         .build();
+                 assert newClient != null;
+                 client = newClient;
+             } else {
+                 final Client newClient = new Client.Builder(integration.getClientId(), integration.getSecretKey(),
+                         integration.getAPIHost(), integration.getRedirectURI()).setCACerts(
+                                 caCerts.toArray(new String[caCerts.size()]))
+                         .setUseDuoCodeAttribute(false)
+                         .build();
+                 assert newClient != null;
+                 client = newClient;
+             }
+         } catch (final DuoException e) {
+             //wrap exception and throw
+             throw new DuoClientException(e);
+         }
     }
+     
+     /**
+      * 
+      * Package-private constructor. Initialises the native Duo SDK client.
+      * 
+      * <p>Should only be instantiated by the {@link DuoSDKClientFactory}.</p>
+      *
+      * @param integration the Duo integration to initialize the client from. Never {@code null}.
+      * @param caCerts the list of CA Certificates used to validate connections to Duo. Can be {@code null}.
+      * @param proxyHost the HTTP proxy host.
+      * @param proxyPort the HTTP proxy port.
+      * 
+      * @throws DuoClientException if there is an error instantiating the client
+      * 
+      * @since 2.2.0
+      */
+     DuoSDKClientAdaptor(@Nonnull final DuoOIDCIntegration integration, 
+             @Nullable final List<String> caCerts, @Nonnull @NotEmpty final String proxyHost, 
+             @Nonnull final Integer proxyPort) throws DuoClientException {
+         super();
+         duoIntegration = Constraint.isNotNull(integration,"Duo SDK Client requires a non-null Duo Integration");
+         healthCheckResponseConverter = new DefaultHealthCheckResponseConverter();
+         tokenResponseConverter = new DefaultTokenResponseConverter();
+
+         try {
+             if (caCerts == null) {
+                 //will use the default certs in the Client if the caCerts are null
+                 final Client newClient = new Client.Builder(integration.getClientId(), integration.getSecretKey(),
+                         integration.getAPIHost(), proxyPort, proxyHost, integration.getRedirectURI())
+                         .setUseDuoCodeAttribute(false)
+                         .build();
+                 assert newClient != null;
+                 client = newClient;
+             } else {
+                 final Client newClient = new Client.Builder(integration.getClientId(), integration.getSecretKey(),
+                         integration.getAPIHost(), proxyPort, proxyHost, integration.getRedirectURI()).setCACerts(
+                                 caCerts.toArray(new String[caCerts.size()]))
+                         .setUseDuoCodeAttribute(false)
+                         .build();
+                 assert newClient != null;
+                 client = newClient;
+             }
+         } catch (final DuoException e) {
+             //wrap exception and throw
+             throw new DuoClientException(e);
+         }
+  
+     }
 
 
     /** {@inheritDoc} */
diff --git a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactory.java b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactory.java
index 1b1c6e24..d5a4d3f7 100644
--- a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactory.java
+++ b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactory.java
@@ -26,6 +26,7 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClient;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientFactory;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -38,6 +39,12 @@ public final class DuoSDKClientFactory extends AbstractInitializableComponent im
     
     /** List of CA Certificate pins. If null, the client's default set are used.*/
     @GuardedBy("this") @Nullable @NonnullElements @Unmodifiable private List<String> caCerts;
+    
+    /** The optional HTTP proxy hostname.*/
+    @GuardedBy("this") @Nullable @NotEmpty private String proxyHost;
+
+    /** The optional HTTP proxy port number.*/
+    @GuardedBy("this") @Nullable private Integer proxyPort;
       
     /**
      * Sets the list of CA certificate pins used to verify the Duo client connection
@@ -63,14 +70,69 @@ public final class DuoSDKClientFactory extends AbstractInitializableComponent im
      * @return the caCerts.
      */
     @Nullable @NonnullElements @Unmodifiable private synchronized List<String> getCaCerts(){
+        checkComponentActive();
         return caCerts;
     }
-
+    
+    /**
+     * Set the HTTP proxy host, guarded by this objects monitor. 
+     * 
+     * @param proxyHost the proxy host to set.
+     * 
+     * @since 2.2.0
+     */
+    public synchronized void setProxyHost(@Nullable @NotEmpty final String host) {
+        checkSetterPreconditions();
+        proxyHost = host;
+    }
+    
+    /**
+     * Get the HTTP proxy host, guarded by this objects monitor.
+     * 
+     * @return the proxy host.
+     * 
+     * @since 2.2.0
+     */
+    @Nullable @NotEmpty private synchronized String getProxyHost() {
+        checkComponentActive();
+        return proxyHost;
+    }
+    
+    /**
+     * Set the HTTP proxy port, guarded by this objects monitor.
+     * 
+     * @param proxyPort the proxy port to set.
+     * 
+     * @since 2.2.0
+     */
+    public synchronized void setProxyPort(@Nullable final Integer port) {
+        checkSetterPreconditions();
+        this.proxyPort = port;
+    }
+    
+    /**
+     * Get the HTTP proxy port, guarded by this objects monitor.
+     * 
+     * @return the proxy port.
+     * 
+     * @since 2.2.0
+     */
+    @Nullable private synchronized Integer getProxyPort() {
+        checkComponentActive();
+        return proxyPort;
+    }
+    
     @Override
     @Nonnull public DuoOIDCClient createInstance(@Nonnull final DuoOIDCIntegration integration) 
             throws DuoClientException {
         //every integration shares the same list of caCert pins.
-        return new DuoSDKClientAdaptor(integration, getCaCerts());
+        final var localProxyHost = StringSupport.trimOrNull(getProxyHost());
+        final var localProxyPort = getProxyPort();
+        if (localProxyPort != null && localProxyHost != null) {
+            return new DuoSDKClientAdaptor(integration, getCaCerts(), localProxyHost, localProxyPort);
+        } else {
+            return new DuoSDKClientAdaptor(integration, getCaCerts());
+        }
     }
 
 }
diff --git a/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/duo-client-factory-bean.xml b/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/duo-client-factory-bean.xml
index a8d1600c..69c1d883 100644
--- a/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/duo-client-factory-bean.xml
+++ b/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/duo-client-factory-bean.xml
@@ -12,7 +12,9 @@
     <!-- Client factory with is own unique ID but common (default) alias/name  -->
     <bean id="shibboleth.authn.DuoOIDC.sdk.clientFactory" name="shibboleth.authn.DuoOIDC.clientFactory"
         class="net.shibboleth.idp.plugin.authn.duo.sdk.impl.DuoSDKClientFactory" scope="singleton"
-        p:caCerts="#{getObject('shibboleth.authn.DuoOIDC.sdk.TrustedCertificates') ?: getObject('shibboleth.authn.DuoOIDC.sdk.DefaultTrustedCertificates')}">
+        p:caCerts="#{getObject('shibboleth.authn.DuoOIDC.sdk.TrustedCertificates') ?: getObject('shibboleth.authn.DuoOIDC.sdk.DefaultTrustedCertificates')}"
+        p:proxyPort="%{idp.duo.oidc.http.proxy.port:#{null}}"
+        p:proxyHost="%{idp.duo.oidc.http.proxy.host:#{null}}">
 
     </bean>
 
diff --git a/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/sdk/conf/authn/duo-oidc.properties b/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/sdk/conf/authn/duo-oidc.properties
index 0de63343..39aa0725 100644
--- a/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/sdk/conf/authn/duo-oidc.properties
+++ b/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/sdk/conf/authn/duo-oidc.properties
@@ -21,6 +21,10 @@ idp.duo.oidc.redirectURL = https://<hostname>:<port>/idp/profile/Authn/Duo/2FA/d
 # We suggest defining this in credentials/secrets.properties
 #idp.duo.oidc.secretKey = key
 
+# HTTP Proxy settings for Duo's HTTP client
+#idp.duo.oidc.http.proxy.port = 
+#idp.duo.oidc.http.proxy.host = 
+
 ## Enable the Duo health check for every 2FA request. Defaults to true to tightly follow 
 ## the Duo described workflow. However, it is not *strictly* required. 
 #idp.duo.oidc.healthcheck.enabled=true
diff --git a/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/sdk/plugin.properties b/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/sdk/plugin.properties
index 577f1b1d..15207ae8 100644
--- a/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/sdk/plugin.properties
+++ b/idp-duo-sdk-client-impl/src/main/resources/net/shibboleth/idp/plugin/authn/duo/sdk/plugin.properties
@@ -2,7 +2,7 @@
 
 plugin.id = net.shibboleth.idp.plugin.authn.duo.sdk
 # Only used when package manifest is not available
-plugin.version = 2.1.0
+plugin.version = 2.1.1
 plugin.license =/net/shibboleth/idp/plugin/authn/duo/sdk/doc/Duo-LICENSE.txt
 
 # prereqs
diff --git a/idp-duo-sdk-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactoryTest.java b/idp-duo-sdk-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactoryTest.java
index 161b0f36..bed64710 100644
--- a/idp-duo-sdk-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactoryTest.java
+++ b/idp-duo-sdk-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactoryTest.java
@@ -95,6 +95,7 @@ public class DuoSDKClientFactoryTest {
         assertNotNull(registeredRedirect);
         assert registeredRedirect != null;
         integ.setRedirectURIIfAbsent(registeredRedirect);
+        factory.initialize();
         final DuoOIDCClient client = factory.createInstance(integ);
         assertNotNull(client);
     }
diff --git a/idp-duo-sdk-distribution/pom.xml b/idp-duo-sdk-distribution/pom.xml
index 5121c168..c4fd3acf 100644
--- a/idp-duo-sdk-distribution/pom.xml
+++ b/idp-duo-sdk-distribution/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>2.1.1-SNAPSHOT</version>
+        <version>2.2.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-sdk-dist</artifactId>
diff --git a/pom.xml b/pom.xml
index 5f6d3ee6..e8a8042c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
 
     <groupId>net.shibboleth.idp.plugin.authn</groupId>
     <artifactId>idp-plugin-duo-parent</artifactId>
-    <version>2.1.1-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
     <name>Shibboleth IdP :: Plugins :: Duo 2FA Login Flow</name>
     <packaging>pom</packaging>
 
@@ -23,7 +23,7 @@
         <shibboleth.projectName>java-idp-plugin-duo</shibboleth.projectName>
         <idp.groupId>net.shibboleth.idp</idp.groupId>
         <idp.version>5.0.0</idp.version>
-        <duo.client.version>1.1.3</duo.client.version>
+        <duo.client.version>1.2.0</duo.client.version>
         <okhttp3.mockserver.version>4.9.3</okhttp3.mockserver.version>
         <okhttp3.tls.version>4.9.3</okhttp3.tls.version>
         <opensaml.groupId>org.opensaml</opensaml.groupId>

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


More information about the commits mailing list