[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