diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 426cf83e2..a79f06271 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest - digest: sha256:b0b1c1c89570e229b1026372a2b8989ba31495007055b8d30178b7648503eefa + digest: sha256:2567a120ce90fadb6201999b87d649d9f67459de28815ad239bce9ebfaa18a74 +# created: 2022-05-19T15:12:45.278246753Z diff --git a/.github/auto-label.yaml b/.github/auto-label.yaml new file mode 100644 index 000000000..4caef688b --- /dev/null +++ b/.github/auto-label.yaml @@ -0,0 +1,15 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +requestsize: + enabled: true diff --git a/.github/release-please.yml b/.github/release-please.yml index 8d3d01fa2..29f5a1fca 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -10,3 +10,7 @@ branches: handleGHRelease: true releaseType: java-backport branch: 1.32.x + - bumpMinorPreMajor: true + handleGHRelease: true + releaseType: java-backport + branch: 1.33.x diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index bd24a070e..e53201cf4 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -41,6 +41,19 @@ branchProtectionRules: - dependencies (11) - clirr - cla/google + - pattern: 1.33.x + isAdminEnforced: true + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: false + requiredStatusCheckContexts: + - checkstyle + - units (8) + - units (11) + - dependencies (8) + - dependencies (11) + - clirr + - cla/google permissionRules: - team: yoshi-admins permission: admin diff --git a/.kokoro/build.sh b/.kokoro/build.sh index 3e4bc4a59..fbd237f26 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -74,6 +74,11 @@ graalvm) mvn -B ${INTEGRATION_TEST_ARGS} -ntp -Pnative -Penable-integration-tests test RETURN_CODE=$? ;; +graalvm17) + # Run Unit and Integration Tests with Native Image + mvn -B ${INTEGRATION_TEST_ARGS} -ntp -Pnative -Penable-integration-tests test + RETURN_CODE=$? + ;; samples) SAMPLES_DIR=samples # only run ITs in snapshot/ on presubmit PRs. run ITs in all 3 samples/ subdirectories otherwise. diff --git a/.kokoro/presubmit/graalvm-native-17.cfg b/.kokoro/presubmit/graalvm-native-17.cfg new file mode 100644 index 000000000..a3f7fb9d4 --- /dev/null +++ b/.kokoro/presubmit/graalvm-native-17.cfg @@ -0,0 +1,33 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/graalvm17" +} + +env_vars: { + key: "JOB_TYPE" + value: "graalvm17" +} + +# TODO: remove this after we've migrated all tests and scripts +env_vars: { + key: "GCLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_CLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_APPLICATION_CREDENTIALS" + value: "secret_manager/java-it-service-account" +} + +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "java-it-service-account" +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 93fe0d758..0d6e52859 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [1.34.0](https://github.com/googleapis/google-oauth-java-client/compare/v1.33.3...v1.34.0) (2022-06-02) + + +### Features + +* add build scripts for native image testing in Java 17 ([#1440](https://github.com/googleapis/google-oauth-java-client/issues/1440)) ([#890](https://github.com/googleapis/google-oauth-java-client/issues/890)) ([373891e](https://github.com/googleapis/google-oauth-java-client/commit/373891e2dc9742fdf8954cc590b18caf4c8c44f7)) +* next release from main branch is 1.34.0 ([#875](https://github.com/googleapis/google-oauth-java-client/issues/875)) ([187651e](https://github.com/googleapis/google-oauth-java-client/commit/187651eeb963c490c1a5595222548bbdba660c22)) + + +### Bug Fixes + +* fix IdTokenVerifier so it does not cache empty entries ([#892](https://github.com/googleapis/google-oauth-java-client/issues/892)) ([773b388](https://github.com/googleapis/google-oauth-java-client/commit/773b38844cd6a0a72a360cc25692412e9b36b1e7)) + ### [1.33.3](https://github.com/googleapis/google-oauth-java-client/compare/v1.33.2...v1.33.3) (2022-04-13) diff --git a/google-oauth-client-appengine/pom.xml b/google-oauth-client-appengine/pom.xml index bf4791cdb..d3cf6c28c 100644 --- a/google-oauth-client-appengine/pom.xml +++ b/google-oauth-client-appengine/pom.xml @@ -4,7 +4,7 @@ com.google.oauth-client google-oauth-client-parent - 1.33.3 + 1.34.0 ../pom.xml google-oauth-client-appengine @@ -77,7 +77,7 @@ org.apache.felix maven-bundle-plugin - 5.1.4 + 5.1.6 com.google.oauth-client-appengine diff --git a/google-oauth-client-assembly/pom.xml b/google-oauth-client-assembly/pom.xml index f2f9fa86a..e2e076c37 100644 --- a/google-oauth-client-assembly/pom.xml +++ b/google-oauth-client-assembly/pom.xml @@ -4,7 +4,7 @@ com.google.oauth-client google-oauth-client-parent - 1.33.3 + 1.34.0 ../pom.xml com.google.oauth-client diff --git a/google-oauth-client-bom/pom.xml b/google-oauth-client-bom/pom.xml index 7038c3511..8d3948f6c 100644 --- a/google-oauth-client-bom/pom.xml +++ b/google-oauth-client-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.oauth-client google-oauth-client-bom - 1.33.3 + 1.34.0 pom Google OAuth Client Library for Java BOM @@ -63,27 +63,27 @@ com.google.oauth-client google-oauth-client - 1.33.3 + 1.34.0 com.google.oauth-client google-oauth-client-appengine - 1.33.3 + 1.34.0 com.google.oauth-client google-oauth-client-java6 - 1.33.3 + 1.34.0 com.google.oauth-client google-oauth-client-jetty - 1.33.3 + 1.34.0 com.google.oauth-client google-oauth-client-servlet - 1.33.3 + 1.34.0 @@ -92,7 +92,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.12 + 1.6.13 true sonatype-nexus-staging @@ -102,14 +102,14 @@ maven-javadoc-plugin - 3.3.2 + 3.4.0 true maven-site-plugin - 3.11.0 + 3.12.0 true diff --git a/google-oauth-client-java6/pom.xml b/google-oauth-client-java6/pom.xml index 27f31364a..424519046 100644 --- a/google-oauth-client-java6/pom.xml +++ b/google-oauth-client-java6/pom.xml @@ -4,7 +4,7 @@ com.google.oauth-client google-oauth-client-parent - 1.33.3 + 1.34.0 ../pom.xml google-oauth-client-java6 @@ -62,7 +62,7 @@ org.apache.felix maven-bundle-plugin - 5.1.4 + 5.1.6 com.google.oauth-client-java6 diff --git a/google-oauth-client-jetty/pom.xml b/google-oauth-client-jetty/pom.xml index 7a44c7313..76ed3c6fe 100644 --- a/google-oauth-client-jetty/pom.xml +++ b/google-oauth-client-jetty/pom.xml @@ -4,7 +4,7 @@ com.google.oauth-client google-oauth-client-parent - 1.33.3 + 1.34.0 ../pom.xml google-oauth-client-jetty @@ -64,7 +64,7 @@ org.apache.felix maven-bundle-plugin - 5.1.4 + 5.1.6 com.google.oauth-client-jetty diff --git a/google-oauth-client-servlet/pom.xml b/google-oauth-client-servlet/pom.xml index b586b268d..d8be701c4 100644 --- a/google-oauth-client-servlet/pom.xml +++ b/google-oauth-client-servlet/pom.xml @@ -4,7 +4,7 @@ com.google.oauth-client google-oauth-client-parent - 1.33.3 + 1.34.0 ../pom.xml google-oauth-client-servlet @@ -88,7 +88,7 @@ org.apache.felix maven-bundle-plugin - 5.1.4 + 5.1.6 com.google.oauth-client-servlet diff --git a/google-oauth-client/pom.xml b/google-oauth-client/pom.xml index 2786be697..31d9a161f 100644 --- a/google-oauth-client/pom.xml +++ b/google-oauth-client/pom.xml @@ -4,7 +4,7 @@ com.google.oauth-client google-oauth-client-parent - 1.33.3 + 1.34.0 ../pom.xml google-oauth-client @@ -55,7 +55,7 @@ org.apache.felix maven-bundle-plugin - 5.1.4 + 5.1.6 com.google.oauth-client diff --git a/google-oauth-client/src/main/java/com/google/api/client/auth/openidconnect/IdTokenVerifier.java b/google-oauth-client/src/main/java/com/google/api/client/auth/openidconnect/IdTokenVerifier.java index 9f3c446ad..c3650b69e 100644 --- a/google-oauth-client/src/main/java/com/google/api/client/auth/openidconnect/IdTokenVerifier.java +++ b/google-oauth-client/src/main/java/com/google/api/client/auth/openidconnect/IdTokenVerifier.java @@ -233,12 +233,9 @@ public final Collection getAudience() { * @return {@code true} if verified successfully or {@code false} if failed */ public boolean verify(IdToken idToken) { - boolean tokenFieldsValid = - (issuers == null || idToken.verifyIssuer(issuers)) - && (audience == null || idToken.verifyAudience(audience)) - && idToken.verifyTime(clock.currentTimeMillis(), acceptableTimeSkewSeconds); + boolean payloadValid = verifyPayload(idToken); - if (!tokenFieldsValid) { + if (!payloadValid) { return false; } @@ -254,6 +251,35 @@ public boolean verify(IdToken idToken) { } } + /** + * Verifies the payload of the given ID token + * + *

It verifies: + * + *

    + *
  • The issuer is one of {@link #getIssuers()} by calling {@link + * IdToken#verifyIssuer(String)}. + *
  • The audience is one of {@link #getAudience()} by calling {@link + * IdToken#verifyAudience(Collection)}. + *
  • The current time against the issued at and expiration time, using the {@link #getClock()} + * and allowing for a time skew specified in {@link #getAcceptableTimeSkewSeconds()} , by + * calling {@link IdToken#verifyTime(long, long)}. + *
+ * + *

Overriding is allowed, but it must call the super implementation. + * + * @param idToken ID token + * @return {@code true} if verified successfully or {@code false} if failed + */ + protected boolean verifyPayload(IdToken idToken) { + boolean tokenPayloadValid = + (issuers == null || idToken.verifyIssuer(issuers)) + && (audience == null || idToken.verifyAudience(audience)) + && idToken.verifyTime(clock.currentTimeMillis(), acceptableTimeSkewSeconds); + + return tokenPayloadValid; + } + @VisibleForTesting boolean verifySignature(IdToken idToken) throws VerificationException { if (Boolean.parseBoolean(environment.getVariable(SKIP_SIGNATURE_ENV_VAR))) { @@ -272,12 +298,12 @@ boolean verifySignature(IdToken idToken) throws VerificationException { publicKeyToUse = publicKeyCache.get(certificateLocation).get(idToken.getHeader().getKeyId()); } catch (ExecutionException | UncheckedExecutionException e) { throw new VerificationException( - "Error fetching PublicKey from certificate location " + certificatesLocation, e); + "Error fetching public key from certificate location " + certificatesLocation, e); } if (publicKeyToUse == null) { throw new VerificationException( - "Could not find PublicKey for provided keyId: " + idToken.getHeader().getKeyId()); + "Could not find public key for provided keyId: " + idToken.getHeader().getKeyId()); } try { @@ -380,7 +406,7 @@ public Builder setIssuer(String issuer) { } /** - * Override the location URL that contains published public keys. Defaults to well-known Google + * Overrides the location URL that contains published public keys. Defaults to well-known Google * locations. * * @param certificatesLocation URL to published public keys @@ -534,7 +560,7 @@ public Map load(String certificateUrl) throws Exception { Level.WARNING, "Failed to get a certificate from certificate location " + certificateUrl, io); - return ImmutableMap.of(); + throw io; } ImmutableMap.Builder keyCacheBuilder = new ImmutableMap.Builder<>(); @@ -556,6 +582,13 @@ public Map load(String certificateUrl) throws Exception { } } + ImmutableMap keyCache = keyCacheBuilder.build(); + + if (keyCache.isEmpty()) { + throw new VerificationException( + "No valid public key returned by the keystore: " + certificateUrl); + } + return keyCacheBuilder.build(); } diff --git a/google-oauth-client/src/test/java/com/google/api/client/auth/openidconnect/IdTokenVerifierTest.java b/google-oauth-client/src/test/java/com/google/api/client/auth/openidconnect/IdTokenVerifierTest.java index cf32e8ee8..75f644061 100644 --- a/google-oauth-client/src/test/java/com/google/api/client/auth/openidconnect/IdTokenVerifierTest.java +++ b/google-oauth-client/src/test/java/com/google/api/client/auth/openidconnect/IdTokenVerifierTest.java @@ -33,12 +33,15 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; +import java.util.ArrayDeque; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Queue; import junit.framework.TestCase; +import org.junit.Assert; /** * Tests {@link IdTokenVerifier}. @@ -101,7 +104,7 @@ public void testBuilder() throws Exception { assertEquals(TRUSTED_CLIENT_IDS, Lists.newArrayList(verifier.getAudience())); } - public void testVerify() throws Exception { + public void testVerifyPayload() throws Exception { MockClock clock = new MockClock(); MockEnvironment testEnvironment = new MockEnvironment(); testEnvironment.setVariable(IdTokenVerifier.SKIP_SIGNATURE_ENV_VAR, "true"); @@ -121,21 +124,31 @@ public void testVerify() throws Exception { clock.timeMillis = 1500000L; IdToken idToken = newIdToken(ISSUER, CLIENT_ID); assertTrue(verifier.verify(idToken)); + assertTrue(verifier.verifyPayload(idToken)); assertTrue(verifierFlexible.verify(newIdToken(ISSUER2, CLIENT_ID))); + assertTrue(verifierFlexible.verifyPayload(newIdToken(ISSUER2, CLIENT_ID))); assertFalse(verifier.verify(newIdToken(ISSUER2, CLIENT_ID))); + assertFalse(verifier.verifyPayload(newIdToken(ISSUER2, CLIENT_ID))); assertTrue(verifier.verify(newIdToken(ISSUER3, CLIENT_ID))); + assertTrue(verifier.verifyPayload(newIdToken(ISSUER3, CLIENT_ID))); // audience assertTrue(verifierFlexible.verify(newIdToken(ISSUER, CLIENT_ID2))); + assertTrue(verifierFlexible.verifyPayload(newIdToken(ISSUER, CLIENT_ID2))); assertFalse(verifier.verify(newIdToken(ISSUER, CLIENT_ID2))); + assertFalse(verifier.verifyPayload(newIdToken(ISSUER, CLIENT_ID2))); // time clock.timeMillis = 700000L; assertTrue(verifier.verify(idToken)); + assertTrue(verifier.verifyPayload(idToken)); clock.timeMillis = 2300000L; assertTrue(verifier.verify(idToken)); + assertTrue(verifier.verifyPayload(idToken)); clock.timeMillis = 699999L; assertFalse(verifier.verify(idToken)); + assertFalse(verifier.verifyPayload(idToken)); clock.timeMillis = 2300001L; assertFalse(verifier.verify(idToken)); + assertFalse(verifier.verifyPayload(idToken)); } public void testEmptyIssuersFails() throws Exception { @@ -187,28 +200,52 @@ public void testMissingAudience() throws VerificationException { public void testVerifyEs256TokenPublicKeyMismatch() throws Exception { // Mock HTTP requests - HttpTransportFactory httpTransportFactory = - new HttpTransportFactory() { + MockLowLevelHttpRequest failedRequest = + new MockLowLevelHttpRequest() { @Override - public HttpTransport create() { - return new MockHttpTransport() { - @Override - public LowLevelHttpRequest buildRequest(String method, String url) - throws IOException { - return new MockLowLevelHttpRequest() { - @Override - public LowLevelHttpResponse execute() throws IOException { - MockLowLevelHttpResponse response = new MockLowLevelHttpResponse(); - response.setStatusCode(200); - response.setContentType("application/json"); - response.setContent(""); - return response; - } - }; - } - }; + public LowLevelHttpResponse execute() throws IOException { + throw new IOException("test io exception"); + } + }; + + MockLowLevelHttpRequest badRequest = + new MockLowLevelHttpRequest() { + @Override + public LowLevelHttpResponse execute() throws IOException { + MockLowLevelHttpResponse response = new MockLowLevelHttpResponse(); + response.setStatusCode(404); + response.setContentType("application/json"); + response.setContent(""); + return response; + } + }; + + MockLowLevelHttpRequest emptyRequest = + new MockLowLevelHttpRequest() { + @Override + public LowLevelHttpResponse execute() throws IOException { + MockLowLevelHttpResponse response = new MockLowLevelHttpResponse(); + response.setStatusCode(200); + response.setContentType("application/json"); + response.setContent("{\"keys\":[]}"); + return response; + } + }; + + MockLowLevelHttpRequest goodRequest = + new MockLowLevelHttpRequest() { + @Override + public LowLevelHttpResponse execute() throws IOException { + MockLowLevelHttpResponse response = new MockLowLevelHttpResponse(); + response.setStatusCode(200); + response.setContentType("application/json"); + response.setContent(readResourceAsString("iap_keys.json")); + return response; } }; + + HttpTransportFactory httpTransportFactory = + mockTransport(failedRequest, badRequest, emptyRequest, goodRequest); IdTokenVerifier tokenVerifier = new IdTokenVerifier.Builder() .setClock(FIXED_CLOCK) @@ -219,8 +256,24 @@ public LowLevelHttpResponse execute() throws IOException { tokenVerifier.verifySignature(IdToken.parse(JSON_FACTORY, ES256_TOKEN)); fail("Should have failed verification"); } catch (VerificationException ex) { - assertTrue(ex.getMessage().contains("Error fetching PublicKey")); + assertTrue(ex.getMessage().contains("Error fetching public key")); + } + + try { + tokenVerifier.verifySignature(IdToken.parse(JSON_FACTORY, ES256_TOKEN)); + fail("Should have failed verification"); + } catch (VerificationException ex) { + assertTrue(ex.getMessage().contains("Error fetching public key")); } + + try { + tokenVerifier.verifySignature(IdToken.parse(JSON_FACTORY, ES256_TOKEN)); + fail("Should have failed verification"); + } catch (VerificationException ex) { + assertTrue(ex.getCause().getMessage().contains("No valid public key returned")); + } + + Assert.assertTrue(tokenVerifier.verifySignature(IdToken.parse(JSON_FACTORY, ES256_TOKEN))); } public void testVerifyEs256Token() throws VerificationException, IOException { @@ -284,6 +337,25 @@ static String readResourceAsString(String resourceName) throws IOException { } } + static HttpTransportFactory mockTransport(LowLevelHttpRequest... requests) { + final LowLevelHttpRequest firstRequest = requests[0]; + final Queue requestQueue = new ArrayDeque<>(); + for (LowLevelHttpRequest request : requests) { + requestQueue.add(request); + } + return new HttpTransportFactory() { + @Override + public HttpTransport create() { + return new MockHttpTransport() { + @Override + public LowLevelHttpRequest buildRequest(String method, String url) throws IOException { + return requestQueue.poll(); + } + }; + } + }; + } + static HttpTransportFactory mockTransport(String url, String certificates) { final String certificatesContent = certificates; final String certificatesUrl = url; diff --git a/pom.xml b/pom.xml index 951e06e69..24086c6aa 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.google.oauth-client google-oauth-client-parent - 1.33.3 + 1.34.0 pom Parent for the Google OAuth Client Library for Java Google OAuth Client Library for Java @@ -184,7 +184,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.12 + 1.6.13 true ossrh @@ -220,7 +220,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.3.2 + 3.4.0 attach-javadocs @@ -272,12 +272,12 @@ org.apache.maven.plugins maven-project-info-reports-plugin - 3.2.2 + 3.3.0 org.apache.maven.plugins maven-site-plugin - 3.11.0 + 3.12.0 @@ -459,9 +459,9 @@ - google-api-java-client/google-api-client-assembly/android-properties (make the filenames match the version here) - Internally, update the default features.json file --> - 2.0.4 + 2.0.5 UTF-8 - 1.41.7 + 1.41.8 3.0.2 31.1-android 1.1.4c @@ -470,7 +470,7 @@ 1.1 3.2.15 3.2.8 - 5.2.10 + 5.2.11 5.2.1 2.5 false @@ -534,7 +534,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.3.2 + 3.4.0 com.microsoft.doclet.DocFxDoclet false diff --git a/samples/dailymotion-cmdline-sample/pom.xml b/samples/dailymotion-cmdline-sample/pom.xml index d167f15c5..28a9e1c9d 100644 --- a/samples/dailymotion-cmdline-sample/pom.xml +++ b/samples/dailymotion-cmdline-sample/pom.xml @@ -4,7 +4,7 @@ com.google.oauth-client google-oauth-client-parent - 1.33.3 + 1.34.0 ../../pom.xml dailymotion-simple-cmdline-sample @@ -76,7 +76,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.12 + 1.6.13 true diff --git a/samples/keycloak-pkce-cmdline-sample/pom.xml b/samples/keycloak-pkce-cmdline-sample/pom.xml index 617f2da4f..4367cda9e 100644 --- a/samples/keycloak-pkce-cmdline-sample/pom.xml +++ b/samples/keycloak-pkce-cmdline-sample/pom.xml @@ -4,7 +4,7 @@ com.google.oauth-client google-oauth-client-parent - 1.33.3 + 1.34.0 ../../pom.xml keycloak-pkce-cmdline-sample @@ -76,7 +76,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.12 + 1.6.13 true diff --git a/samples/pom.xml b/samples/pom.xml index d53604cff..e06c7da36 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -46,7 +46,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.12 + 1.6.13 true diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 42c5cfb43..eb14ac814 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -30,7 +30,7 @@ com.google.cloud libraries-bom - 25.1.0 + 25.3.0 pom import @@ -41,7 +41,7 @@ com.google.oauth-client google-oauth-client - 1.33.2 + 1.33.3 diff --git a/versions.txt b/versions.txt index 4ba075e33..1607fd6e4 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -google-oauth-client:1.33.3:1.33.3 +google-oauth-client:1.34.0:1.34.0