From 2b6a2cf26b3d7c14e1d18b1b83b5999424b88817 Mon Sep 17 00:00:00 2001 From: Carl Lundin <108372512+clundin25@users.noreply.github.com> Date: Thu, 13 Jul 2023 06:44:12 +0000 Subject: [PATCH 01/13] chore: Remove six. (#1346) Based on https://togithub.com/googleapis/google-auth-library-python/pull/778 --- google/auth/_cloud_sdk.py | 4 +-- google/auth/_credentials_async.py | 11 ++----- google/auth/_default.py | 12 ++++---- google/auth/_default_async.py | 8 ++---- google/auth/_exponential_backoff.py | 4 +-- google/auth/_helpers.py | 17 ++++------- google/auth/_oauth2client.py | 6 ++-- google/auth/_service_account_info.py | 4 +-- google/auth/aws.py | 7 ++--- google/auth/compute_engine/_metadata.py | 10 +++---- google/auth/compute_engine/credentials.py | 6 ++-- google/auth/credentials.py | 11 ++----- google/auth/crypt/__init__.py | 4 +-- google/auth/crypt/_python_rsa.py | 9 +++--- google/auth/crypt/base.py | 11 ++----- google/auth/downscoped.py | 12 ++++---- google/auth/external_account.py | 4 +-- google/auth/iam.py | 3 +- google/auth/impersonated_credentials.py | 6 ++-- google/auth/jwt.py | 27 +++++++----------- google/auth/transport/__init__.py | 14 +++------ google/auth/transport/_aiohttp_requests.py | 5 ++-- google/auth/transport/_custom_tls_signer.py | 3 +- google/auth/transport/_http_client.py | 8 ++---- google/auth/transport/_mtls_helper.py | 6 ++-- google/auth/transport/grpc.py | 16 ++++------- google/auth/transport/mtls.py | 6 ++-- google/auth/transport/requests.py | 19 ++++-------- google/auth/transport/urllib3.py | 19 +++++------- google/oauth2/_client.py | 20 ++++++------- google/oauth2/_client_async.py | 10 +++---- google/oauth2/_id_token_async.py | 6 ++-- google/oauth2/_reauth_async.py | 2 -- google/oauth2/challenges.py | 5 +--- google/oauth2/credentials.py | 8 ++---- google/oauth2/id_token.py | 6 ++-- google/oauth2/reauth.py | 2 -- google/oauth2/sts.py | 5 ++-- google/oauth2/utils.py | 5 +--- noxfile.py | 1 - setup.py | 1 - system_tests/noxfile.py | 1 + system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes .../test_external_accounts.py | 7 +++-- tests/compute_engine/test__metadata.py | 16 +++++------ tests/crypt/test__python_rsa.py | 4 +-- tests/oauth2/test__client.py | 7 ++--- tests/oauth2/test_gdch_credentials.py | 3 +- tests/oauth2/test_service_account.py | 3 +- tests/oauth2/test_sts.py | 4 +-- tests/test__helpers.py | 2 +- tests/test__oauth2client.py | 8 +++--- tests/test__service_account_info.py | 3 +- tests/test_aws.py | 4 +-- tests/test_downscoped.py | 4 +-- tests/test_external_account.py | 4 +-- .../test_external_account_authorized_user.py | 2 +- tests/test_iam.py | 2 +- tests/test_identity_pool.py | 4 +-- tests/test_impersonated_credentials.py | 5 +--- tests/test_pluggable.py | 8 ------ tests/transport/compliance.py | 2 +- tests/transport/test_requests.py | 2 +- tests/transport/test_urllib3.py | 2 +- tests_async/oauth2/test__client_async.py | 7 ++--- tests_async/transport/async_compliance.py | 2 +- 66 files changed, 163 insertions(+), 286 deletions(-) diff --git a/google/auth/_cloud_sdk.py b/google/auth/_cloud_sdk.py index 36c5b0158..a94411949 100644 --- a/google/auth/_cloud_sdk.py +++ b/google/auth/_cloud_sdk.py @@ -17,8 +17,6 @@ import os import subprocess -import six - from google.auth import _helpers from google.auth import environment_vars from google.auth import exceptions @@ -152,4 +150,4 @@ def get_auth_access_token(account=None): new_exc = exceptions.UserAccessTokenError( "Failed to obtain access token", caught_exc ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc diff --git a/google/auth/_credentials_async.py b/google/auth/_credentials_async.py index d4d4e2c0e..760758d85 100644 --- a/google/auth/_credentials_async.py +++ b/google/auth/_credentials_async.py @@ -18,13 +18,10 @@ import abc import inspect -import six - from google.auth import credentials -@six.add_metaclass(abc.ABCMeta) -class Credentials(credentials.Credentials): +class Credentials(credentials.Credentials, metaclass=abc.ABCMeta): """Async inherited credentials class from google.auth.credentials. The added functionality is the before_request call which requires async/await syntax. @@ -84,8 +81,7 @@ class AnonymousCredentials(credentials.AnonymousCredentials, Credentials): """ -@six.add_metaclass(abc.ABCMeta) -class ReadOnlyScoped(credentials.ReadOnlyScoped): +class ReadOnlyScoped(credentials.ReadOnlyScoped, metaclass=abc.ABCMeta): """Interface for credentials whose scopes can be queried. OAuth 2.0-based credentials allow limiting access using scopes as described @@ -171,6 +167,5 @@ def with_scopes_if_required(credentials, scopes): return credentials -@six.add_metaclass(abc.ABCMeta) -class Signing(credentials.Signing): +class Signing(credentials.Signing, metaclass=abc.ABCMeta): """Interface for credentials that can cryptographically sign messages.""" diff --git a/google/auth/_default.py b/google/auth/_default.py index 1ae26b4eb..f77fa1808 100644 --- a/google/auth/_default.py +++ b/google/auth/_default.py @@ -23,8 +23,6 @@ import os import warnings -import six - from google.auth import environment_vars from google.auth import exceptions import google.auth.transport._http_client @@ -124,7 +122,7 @@ def load_credentials_from_file( new_exc = exceptions.DefaultCredentialsError( "File {} is not a valid json file.".format(filename), caught_exc ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc return _load_credentials_from_info( filename, info, scopes, default_scopes, quota_project_id, request ) @@ -440,7 +438,7 @@ def _get_authorized_user_credentials(filename, info, scopes=None): except ValueError as caught_exc: msg = "Failed to load authorized user credentials from {}".format(filename) new_exc = exceptions.DefaultCredentialsError(msg, caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc return credentials, None @@ -454,7 +452,7 @@ def _get_service_account_credentials(filename, info, scopes=None, default_scopes except ValueError as caught_exc: msg = "Failed to load service account credentials from {}".format(filename) new_exc = exceptions.DefaultCredentialsError(msg, caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc return credentials, info.get("project_id") @@ -500,7 +498,7 @@ def _get_impersonated_service_account_credentials(filename, info, scopes): filename ) new_exc = exceptions.DefaultCredentialsError(msg, caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc return credentials, None @@ -514,7 +512,7 @@ def _get_gdch_service_account_credentials(filename, info): except ValueError as caught_exc: msg = "Failed to load GDCH service account credentials from {}".format(filename) new_exc = exceptions.DefaultCredentialsError(msg, caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc return credentials, info.get("project") diff --git a/google/auth/_default_async.py b/google/auth/_default_async.py index 93a570c77..2e53e2088 100644 --- a/google/auth/_default_async.py +++ b/google/auth/_default_async.py @@ -21,8 +21,6 @@ import json import os -import six - from google.auth import _default from google.auth import environment_vars from google.auth import exceptions @@ -63,7 +61,7 @@ def load_credentials_from_file(filename, scopes=None, quota_project_id=None): new_exc = exceptions.DefaultCredentialsError( "File {} is not a valid json file.".format(filename), caught_exc ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc # The type key should indicate that the file is either a service account # credentials file or an authorized user credentials file. @@ -79,7 +77,7 @@ def load_credentials_from_file(filename, scopes=None, quota_project_id=None): except ValueError as caught_exc: msg = "Failed to load authorized user credentials from {}".format(filename) new_exc = exceptions.DefaultCredentialsError(msg, caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc if quota_project_id: credentials = credentials.with_quota_project(quota_project_id) if not credentials.quota_project_id: @@ -96,7 +94,7 @@ def load_credentials_from_file(filename, scopes=None, quota_project_id=None): except ValueError as caught_exc: msg = "Failed to load service account credentials from {}".format(filename) new_exc = exceptions.DefaultCredentialsError(msg, caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc return credentials, info.get("project_id") else: diff --git a/google/auth/_exponential_backoff.py b/google/auth/_exponential_backoff.py index b5801bec9..0dd621a94 100644 --- a/google/auth/_exponential_backoff.py +++ b/google/auth/_exponential_backoff.py @@ -15,8 +15,6 @@ import random import time -import six - # The default amount of retry attempts _DEFAULT_RETRY_TOTAL_ATTEMPTS = 3 @@ -38,7 +36,7 @@ """ -class ExponentialBackoff(six.Iterator): +class ExponentialBackoff: """An exponential backoff iterator. This can be used in a for loop to perform requests with exponential backoff. diff --git a/google/auth/_helpers.py b/google/auth/_helpers.py index 30fbafb64..ad2c095f2 100644 --- a/google/auth/_helpers.py +++ b/google/auth/_helpers.py @@ -18,9 +18,7 @@ import calendar import datetime import sys - -import six -from six.moves import urllib +import urllib from google.auth import exceptions @@ -89,9 +87,6 @@ def datetime_to_secs(value): def to_bytes(value, encoding="utf-8"): """Converts a string value to bytes, if necessary. - Unfortunately, ``six.b`` is insufficient for this task since in - Python 2 because it does not modify ``unicode`` objects. - Args: value (Union[str, bytes]): The value to be converted. encoding (str): The encoding to use to convert unicode to bytes. @@ -104,8 +99,8 @@ def to_bytes(value, encoding="utf-8"): Raises: google.auth.exceptions.InvalidValue: If the value could not be converted to bytes. """ - result = value.encode(encoding) if isinstance(value, six.text_type) else value - if isinstance(result, six.binary_type): + result = value.encode(encoding) if isinstance(value, str) else value + if isinstance(result, bytes): return result else: raise exceptions.InvalidValue( @@ -126,8 +121,8 @@ def from_bytes(value): Raises: google.auth.exceptions.InvalidValue: If the value could not be converted to unicode. """ - result = value.decode("utf-8") if isinstance(value, six.binary_type) else value - if isinstance(result, six.text_type): + result = value.decode("utf-8") if isinstance(value, bytes) else value + if isinstance(result, str): return result else: raise exceptions.InvalidValue( @@ -171,7 +166,7 @@ def update_query(url, params, remove=None): query_params.update(params) # Remove any values specified in remove. query_params = { - key: value for key, value in six.iteritems(query_params) if key not in remove + key: value for key, value in query_params.items() if key not in remove } # Re-encoded the query string. new_query = urllib.parse.urlencode(query_params, doseq=True) diff --git a/google/auth/_oauth2client.py b/google/auth/_oauth2client.py index a86ba8dd6..8b83ff23c 100644 --- a/google/auth/_oauth2client.py +++ b/google/auth/_oauth2client.py @@ -21,8 +21,6 @@ from __future__ import absolute_import -import six - from google.auth import _helpers import google.auth.app_engine import google.auth.compute_engine @@ -34,7 +32,7 @@ import oauth2client.contrib.gce # type: ignore import oauth2client.service_account # type: ignore except ImportError as caught_exc: - six.raise_from(ImportError("oauth2client is not installed."), caught_exc) + raise ImportError("oauth2client is not installed.") from caught_exc try: import oauth2client.contrib.appengine # type: ignore @@ -166,4 +164,4 @@ def convert(credentials): return _CLASS_CONVERSION_MAP[credentials_class](credentials) except KeyError as caught_exc: new_exc = ValueError(_CONVERT_ERROR_TMPL.format(credentials_class)) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc diff --git a/google/auth/_service_account_info.py b/google/auth/_service_account_info.py index b17f34f5c..6b64adcae 100644 --- a/google/auth/_service_account_info.py +++ b/google/auth/_service_account_info.py @@ -17,8 +17,6 @@ import io import json -import six - from google.auth import crypt from google.auth import exceptions @@ -46,7 +44,7 @@ def from_dict(data, require=None, use_rsa_signer=True): """ keys_needed = set(require if require is not None else []) - missing = keys_needed.difference(six.iterkeys(data)) + missing = keys_needed.difference(data.keys()) if missing: raise exceptions.MalformedError( diff --git a/google/auth/aws.py b/google/auth/aws.py index 072c67bad..6e0e4e864 100644 --- a/google/auth/aws.py +++ b/google/auth/aws.py @@ -39,14 +39,13 @@ import hashlib import hmac +import http.client as http_client import json import os import posixpath import re - -from six.moves import http_client -from six.moves import urllib -from six.moves.urllib.parse import urljoin +import urllib +from urllib.parse import urljoin from google.auth import _helpers from google.auth import environment_vars diff --git a/google/auth/compute_engine/_metadata.py b/google/auth/compute_engine/_metadata.py index c5b9d5a2b..04abe178f 100644 --- a/google/auth/compute_engine/_metadata.py +++ b/google/auth/compute_engine/_metadata.py @@ -18,13 +18,11 @@ """ import datetime +import http.client as http_client import json import logging import os - -import six -from six.moves import http_client -from six.moves.urllib import parse as urlparse +from urllib.parse import urljoin from google.auth import _helpers from google.auth import environment_vars @@ -185,7 +183,7 @@ def get( google.auth.exceptions.TransportError: if an error occurred while retrieving metadata. """ - base_url = urlparse.urljoin(root, path) + base_url = urljoin(root, path) query_params = {} if params is None else params headers_to_use = _METADATA_HEADERS.copy() @@ -228,7 +226,7 @@ def get( "Received invalid JSON from the Google Compute Engine " "metadata service: {:.20}".format(content) ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc else: return content else: diff --git a/google/auth/compute_engine/credentials.py b/google/auth/compute_engine/credentials.py index 930d88617..7ae673880 100644 --- a/google/auth/compute_engine/credentials.py +++ b/google/auth/compute_engine/credentials.py @@ -21,8 +21,6 @@ import datetime -import six - from google.auth import _helpers from google.auth import credentials from google.auth import exceptions @@ -118,7 +116,7 @@ def refresh(self, request): ) except exceptions.TransportError as caught_exc: new_exc = exceptions.RefreshError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc @property def service_account_email(self): @@ -386,7 +384,7 @@ def _call_metadata_identity_endpoint(self, request): ) except exceptions.TransportError as caught_exc: new_exc = exceptions.RefreshError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc _, payload, _, _ = jwt._unverified_decode(id_token) return id_token, datetime.datetime.utcfromtimestamp(payload["exp"]) diff --git a/google/auth/credentials.py b/google/auth/credentials.py index c27721dbb..3ae9c4011 100644 --- a/google/auth/credentials.py +++ b/google/auth/credentials.py @@ -18,15 +18,12 @@ import abc import os -import six - from google.auth import _helpers, environment_vars from google.auth import exceptions from google.auth import metrics -@six.add_metaclass(abc.ABCMeta) -class Credentials(object): +class Credentials(metaclass=abc.ABCMeta): """Base class for all credentials. All credentials have a :attr:`token` that is used for authentication and @@ -232,8 +229,7 @@ def before_request(self, request, method, url, headers): """Anonymous credentials do nothing to the request.""" -@six.add_metaclass(abc.ABCMeta) -class ReadOnlyScoped(object): +class ReadOnlyScoped(metaclass=abc.ABCMeta): """Interface for credentials whose scopes can be queried. OAuth 2.0-based credentials allow limiting access using scopes as described @@ -374,8 +370,7 @@ def with_scopes_if_required(credentials, scopes, default_scopes=None): return credentials -@six.add_metaclass(abc.ABCMeta) -class Signing(object): +class Signing(metaclass=abc.ABCMeta): """Interface for credentials that can cryptographically sign messages.""" @abc.abstractmethod diff --git a/google/auth/crypt/__init__.py b/google/auth/crypt/__init__.py index 9f91f0d0b..6d147e706 100644 --- a/google/auth/crypt/__init__.py +++ b/google/auth/crypt/__init__.py @@ -37,8 +37,6 @@ version is at least 1.4.0. """ -import six - from google.auth.crypt import base from google.auth.crypt import rsa @@ -90,7 +88,7 @@ class to use for verification. This can be used to select different Returns: bool: True if the signature is valid, otherwise False. """ - if isinstance(certs, (six.text_type, six.binary_type)): + if isinstance(certs, (str, bytes)): certs = [certs] for cert in certs: diff --git a/google/auth/crypt/_python_rsa.py b/google/auth/crypt/_python_rsa.py index e8595440c..e553c25ed 100644 --- a/google/auth/crypt/_python_rsa.py +++ b/google/auth/crypt/_python_rsa.py @@ -21,12 +21,13 @@ from __future__ import absolute_import +import io + from pyasn1.codec.der import decoder # type: ignore from pyasn1_modules import pem # type: ignore from pyasn1_modules.rfc2459 import Certificate # type: ignore from pyasn1_modules.rfc5208 import PrivateKeyInfo # type: ignore import rsa # type: ignore -import six from google.auth import _helpers from google.auth import exceptions @@ -53,9 +54,9 @@ def _bit_list_to_bytes(bit_list): """ num_bits = len(bit_list) byte_vals = bytearray() - for start in six.moves.xrange(0, num_bits, 8): + for start in range(0, num_bits, 8): curr_bits = bit_list[start : start + 8] - char_val = sum(val * digit for val, digit in six.moves.zip(_POW2, curr_bits)) + char_val = sum(val * digit for val, digit in zip(_POW2, curr_bits)) byte_vals.append(char_val) return bytes(byte_vals) @@ -153,7 +154,7 @@ def from_string(cls, key, key_id=None): """ key = _helpers.from_bytes(key) # PEM expects str in Python 3 marker_id, key_bytes = pem.readPemBlocksFromFile( - six.StringIO(key), _PKCS1_MARKER, _PKCS8_MARKER + io.StringIO(key), _PKCS1_MARKER, _PKCS8_MARKER ) # Key is in pkcs1 format. diff --git a/google/auth/crypt/base.py b/google/auth/crypt/base.py index 573211d7c..ad871c311 100644 --- a/google/auth/crypt/base.py +++ b/google/auth/crypt/base.py @@ -18,16 +18,13 @@ import io import json -import six - from google.auth import exceptions _JSON_FILE_PRIVATE_KEY = "private_key" _JSON_FILE_PRIVATE_KEY_ID = "private_key_id" -@six.add_metaclass(abc.ABCMeta) -class Verifier(object): +class Verifier(metaclass=abc.ABCMeta): """Abstract base class for crytographic signature verifiers.""" @abc.abstractmethod @@ -47,8 +44,7 @@ def verify(self, message, signature): raise NotImplementedError("Verify must be implemented") -@six.add_metaclass(abc.ABCMeta) -class Signer(object): +class Signer(metaclass=abc.ABCMeta): """Abstract base class for cryptographic signers.""" @abc.abstractproperty @@ -71,8 +67,7 @@ def sign(self, message): raise NotImplementedError("Sign must be implemented") -@six.add_metaclass(abc.ABCMeta) -class FromServiceAccountMixin(object): +class FromServiceAccountMixin(metaclass=abc.ABCMeta): """Mix-in to enable factory constructors for a Signer.""" @abc.abstractmethod diff --git a/google/auth/downscoped.py b/google/auth/downscoped.py index a84ac4af6..b4d9d386e 100644 --- a/google/auth/downscoped.py +++ b/google/auth/downscoped.py @@ -50,8 +50,6 @@ import datetime -import six - from google.auth import _helpers from google.auth import credentials from google.auth import exceptions @@ -224,7 +222,7 @@ def available_resource(self, value): Raises: google.auth.exceptions.InvalidType: If the value is not a string. """ - if not isinstance(value, six.string_types): + if not isinstance(value, str): raise exceptions.InvalidType( "The provided available_resource is not a string." ) @@ -252,7 +250,7 @@ def available_permissions(self, value): InvalidValue: If the value is not valid. """ for available_permission in value: - if not isinstance(available_permission, six.string_types): + if not isinstance(available_permission, str): raise exceptions.InvalidType( "Provided available_permissions are not a list of strings." ) @@ -355,7 +353,7 @@ def expression(self, value): Raises: google.auth.exceptions.InvalidType: If the value is not of type string. """ - if not isinstance(value, six.string_types): + if not isinstance(value, str): raise exceptions.InvalidType("The provided expression is not a string.") self._expression = value @@ -378,7 +376,7 @@ def title(self, value): Raises: google.auth.exceptions.InvalidType: If the value is not of type string or None. """ - if not isinstance(value, six.string_types) and value is not None: + if not isinstance(value, str) and value is not None: raise exceptions.InvalidType("The provided title is not a string or None.") self._title = value @@ -401,7 +399,7 @@ def description(self, value): Raises: google.auth.exceptions.InvalidType: If the value is not of type string or None. """ - if not isinstance(value, six.string_types) and value is not None: + if not isinstance(value, str) and value is not None: raise exceptions.InvalidType( "The provided description is not a string or None." ) diff --git a/google/auth/external_account.py b/google/auth/external_account.py index fc311ac2d..001b26f7f 100644 --- a/google/auth/external_account.py +++ b/google/auth/external_account.py @@ -34,8 +34,6 @@ import json import re -import six - from google.auth import _helpers from google.auth import credentials from google.auth import exceptions @@ -56,11 +54,11 @@ _DEFAULT_UNIVERSE_DOMAIN = "googleapis.com" -@six.add_metaclass(abc.ABCMeta) class Credentials( credentials.Scoped, credentials.CredentialsWithQuotaProject, credentials.CredentialsWithTokenUri, + metaclass=abc.ABCMeta, ): """Base class for all external account credentials. diff --git a/google/auth/iam.py b/google/auth/iam.py index 5d63dc5d8..e9df84417 100644 --- a/google/auth/iam.py +++ b/google/auth/iam.py @@ -20,10 +20,9 @@ """ import base64 +import http.client as http_client import json -from six.moves import http_client - from google.auth import _helpers from google.auth import crypt from google.auth import exceptions diff --git a/google/auth/impersonated_credentials.py b/google/auth/impersonated_credentials.py index ba6012123..816b9ea31 100644 --- a/google/auth/impersonated_credentials.py +++ b/google/auth/impersonated_credentials.py @@ -28,11 +28,9 @@ import base64 import copy from datetime import datetime +import http.client as http_client import json -import six -from six.moves import http_client - from google.auth import _helpers from google.auth import credentials from google.auth import exceptions @@ -117,7 +115,7 @@ def _make_iam_token_request( ), response_body, ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc class Credentials( diff --git a/google/auth/jwt.py b/google/auth/jwt.py index 026aec554..1ebd565d4 100644 --- a/google/auth/jwt.py +++ b/google/auth/jwt.py @@ -48,10 +48,9 @@ import copy import datetime import json +import urllib import cachetools -import six -from six.moves import urllib from google.auth import _helpers from google.auth import _service_account_info @@ -125,7 +124,7 @@ def _decode_jwt_segment(encoded_section): new_exc = exceptions.MalformedError( "Can't parse segment: {0}".format(section_bytes) ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc def _unverified_decode(token): @@ -269,21 +268,15 @@ def decode(token, certs=None, verify=True, audience=None, clock_skew_in_seconds= verifier_cls = _ALGORITHM_TO_VERIFIER_CLASS[key_alg] except KeyError as exc: if key_alg in _CRYPTOGRAPHY_BASED_ALGORITHMS: - six.raise_from( - exceptions.InvalidValue( - "The key algorithm {} requires the cryptography package " - "to be installed.".format(key_alg) - ), - exc, - ) + raise exceptions.InvalidValue( + "The key algorithm {} requires the cryptography package to be installed.".format( + key_alg + ) + ) from exc else: - six.raise_from( - exceptions.InvalidValue( - "Unsupported signature algorithm {}".format(key_alg) - ), - exc, - ) - + raise exceptions.InvalidValue( + "Unsupported signature algorithm {}".format(key_alg) + ) from exc # If certs is specified as a dictionary of key IDs to certificates, then # use the certificate identified by the key ID in the token header. if isinstance(certs, Mapping): diff --git a/google/auth/transport/__init__.py b/google/auth/transport/__init__.py index 8334145a1..724568e58 100644 --- a/google/auth/transport/__init__.py +++ b/google/auth/transport/__init__.py @@ -25,17 +25,13 @@ """ import abc - -import six -from six.moves import http_client - -TOO_MANY_REQUESTS = 429 # Python 2.7 six is missing this status code. +import http.client as http_client DEFAULT_RETRYABLE_STATUS_CODES = ( http_client.INTERNAL_SERVER_ERROR, http_client.SERVICE_UNAVAILABLE, http_client.REQUEST_TIMEOUT, - TOO_MANY_REQUESTS, + http_client.TOO_MANY_REQUESTS, ) """Sequence[int]: HTTP status codes indicating a request can be retried. """ @@ -50,8 +46,7 @@ """int: How many times to refresh the credentials and retry a request.""" -@six.add_metaclass(abc.ABCMeta) -class Response(object): +class Response(metaclass=abc.ABCMeta): """HTTP Response data.""" @abc.abstractproperty @@ -70,8 +65,7 @@ def data(self): raise NotImplementedError("data must be implemented.") -@six.add_metaclass(abc.ABCMeta) -class Request(object): +class Request(metaclass=abc.ABCMeta): """Interface for a callable that makes HTTP requests. Specific transport implementations should provide an implementation of diff --git a/google/auth/transport/_aiohttp_requests.py b/google/auth/transport/_aiohttp_requests.py index 364570e31..3a8da917a 100644 --- a/google/auth/transport/_aiohttp_requests.py +++ b/google/auth/transport/_aiohttp_requests.py @@ -24,7 +24,6 @@ import functools import aiohttp # type: ignore -import six import urllib3 # type: ignore from google.auth import exceptions @@ -191,11 +190,11 @@ async def __call__( except aiohttp.ClientError as caught_exc: new_exc = exceptions.TransportError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc except asyncio.TimeoutError as caught_exc: new_exc = exceptions.TransportError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc class AuthorizedSession(aiohttp.ClientSession): diff --git a/google/auth/transport/_custom_tls_signer.py b/google/auth/transport/_custom_tls_signer.py index dfef6d00f..07f14df02 100644 --- a/google/auth/transport/_custom_tls_signer.py +++ b/google/auth/transport/_custom_tls_signer.py @@ -24,7 +24,6 @@ import sys import cffi # type: ignore -import six from google.auth import exceptions @@ -212,7 +211,7 @@ def load_libraries(self): new_exc = exceptions.MutualTLSChannelError( "enterprise cert file is invalid", caught_exc ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc self._offload_lib = load_offload_lib(offload_library) self._signer_lib = load_signer_lib(signer_library) diff --git a/google/auth/transport/_http_client.py b/google/auth/transport/_http_client.py index c153763ef..cec0ab73f 100644 --- a/google/auth/transport/_http_client.py +++ b/google/auth/transport/_http_client.py @@ -14,12 +14,10 @@ """Transport adapter for http.client, for internal use only.""" +import http.client as http_client import logging import socket - -import six -from six.moves import http_client -from six.moves import urllib +import urllib from google.auth import exceptions from google.auth import transport @@ -109,7 +107,7 @@ def __call__( except (http_client.HTTPException, socket.error) as caught_exc: new_exc = exceptions.TransportError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc finally: connection.close() diff --git a/google/auth/transport/_mtls_helper.py b/google/auth/transport/_mtls_helper.py index 4dccb1062..1b9b9c285 100644 --- a/google/auth/transport/_mtls_helper.py +++ b/google/auth/transport/_mtls_helper.py @@ -20,8 +20,6 @@ import re import subprocess -import six - from google.auth import exceptions CONTEXT_AWARE_METADATA_PATH = "~/.secureConnect/context_aware_metadata.json" @@ -82,7 +80,7 @@ def _read_dca_metadata_file(metadata_path): metadata = json.load(f) except ValueError as caught_exc: new_exc = exceptions.ClientCertError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc return metadata @@ -110,7 +108,7 @@ def _run_cert_provider_command(command, expect_encrypted_key=False): stdout, stderr = process.communicate() except OSError as caught_exc: new_exc = exceptions.ClientCertError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc # Check cert provider command execution error. if process.returncode != 0: diff --git a/google/auth/transport/grpc.py b/google/auth/transport/grpc.py index 55764b6f6..9a817976d 100644 --- a/google/auth/transport/grpc.py +++ b/google/auth/transport/grpc.py @@ -19,8 +19,6 @@ import logging import os -import six - from google.auth import environment_vars from google.auth import exceptions from google.auth.transport import _mtls_helper @@ -29,13 +27,9 @@ try: import grpc # type: ignore except ImportError as caught_exc: # pragma: NO COVER - six.raise_from( - ImportError( - "gRPC is not installed, please install the grpcio package " - "to use the gRPC transport." - ), - caught_exc, - ) + raise ImportError( + "gRPC is not installed from please install the grpcio package to use the gRPC transport." + ) from caught_exc _LOGGER = logging.getLogger(__name__) @@ -88,7 +82,7 @@ def _get_authorization_headers(self, context): self._request, context.method_name, context.service_url, headers ) - return list(six.iteritems(headers)) + return list(headers.items()) def __call__(self, context, callback): """Passes authorization metadata into the given callback. @@ -337,7 +331,7 @@ def ssl_credentials(self): ) except exceptions.ClientCertError as caught_exc: new_exc = exceptions.MutualTLSChannelError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc else: self._ssl_credentials = grpc.ssl_channel_credentials() diff --git a/google/auth/transport/mtls.py b/google/auth/transport/mtls.py index b40bfbedf..c5707617f 100644 --- a/google/auth/transport/mtls.py +++ b/google/auth/transport/mtls.py @@ -14,8 +14,6 @@ """Utilites for mutual TLS.""" -import six - from google.auth import exceptions from google.auth.transport import _mtls_helper @@ -53,7 +51,7 @@ def callback(): _, cert_bytes, key_bytes = _mtls_helper.get_client_cert_and_key() except (OSError, RuntimeError, ValueError) as caught_exc: new_exc = exceptions.MutualTLSChannelError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc return cert_bytes, key_bytes @@ -98,7 +96,7 @@ def callback(): key_file.write(key_bytes) except (exceptions.ClientCertError, OSError) as caught_exc: new_exc = exceptions.MutualTLSChannelError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc return cert_path, key_path, passphrase_bytes diff --git a/google/auth/transport/requests.py b/google/auth/transport/requests.py index 2c746f8d7..b9bcad359 100644 --- a/google/auth/transport/requests.py +++ b/google/auth/transport/requests.py @@ -25,21 +25,14 @@ try: import requests except ImportError as caught_exc: # pragma: NO COVER - import six - - six.raise_from( - ImportError( - "The requests library is not installed, please install the " - "requests package to use the requests transport." - ), - caught_exc, - ) + raise ImportError( + "The requests library is not installed from please install the requests package to use the requests transport." + ) from caught_exc import requests.adapters # pylint: disable=ungrouped-imports import requests.exceptions # pylint: disable=ungrouped-imports from requests.packages.urllib3.util.ssl_ import ( # type: ignore create_urllib3_context, ) # pylint: disable=ungrouped-imports -import six # pylint: disable=ungrouped-imports from google.auth import environment_vars from google.auth import exceptions @@ -196,7 +189,7 @@ def __call__( return _Response(response) except requests.exceptions.RequestException as caught_exc: new_exc = exceptions.TransportError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc class _MutualTlsAdapter(requests.adapters.HTTPAdapter): @@ -465,7 +458,7 @@ def configure_mtls_channel(self, client_cert_callback=None): import OpenSSL except ImportError as caught_exc: new_exc = exceptions.MutualTLSChannelError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc try: ( @@ -485,7 +478,7 @@ def configure_mtls_channel(self, client_cert_callback=None): OpenSSL.crypto.Error, ) as caught_exc: new_exc = exceptions.MutualTLSChannelError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc def request( self, diff --git a/google/auth/transport/urllib3.py b/google/auth/transport/urllib3.py index 4abc26b52..053d6f7b7 100644 --- a/google/auth/transport/urllib3.py +++ b/google/auth/transport/urllib3.py @@ -31,19 +31,14 @@ except ImportError: # pragma: NO COVER certifi = None # type: ignore -import six - try: import urllib3 # type: ignore import urllib3.exceptions # type: ignore except ImportError as caught_exc: # pragma: NO COVER - six.raise_from( - ImportError( - "The urllib3 library is not installed, please install the " - "urllib3 package to use the urllib3 transport." - ), - caught_exc, - ) + raise ImportError( + "The urllib3 library is not installed from please install the " + "urllib3 package to use the urllib3 transport." + ) from caught_exc from google.auth import environment_vars from google.auth import exceptions @@ -141,7 +136,7 @@ def __call__( return _Response(response) except urllib3.exceptions.HTTPError as caught_exc: new_exc = exceptions.TransportError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc def _make_default_http(): @@ -333,7 +328,7 @@ def configure_mtls_channel(self, client_cert_callback=None): import OpenSSL except ImportError as caught_exc: new_exc = exceptions.MutualTLSChannelError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc try: found_cert_key, cert, key = transport._mtls_helper.get_client_cert_and_key( @@ -350,7 +345,7 @@ def configure_mtls_channel(self, client_cert_callback=None): OpenSSL.crypto.Error, ) as caught_exc: new_exc = exceptions.MutualTLSChannelError(caught_exc) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc if self._has_user_provided_http: self._has_user_provided_http = False diff --git a/google/oauth2/_client.py b/google/oauth2/_client.py index e2c9509a9..d2af6c8aa 100644 --- a/google/oauth2/_client.py +++ b/google/oauth2/_client.py @@ -24,11 +24,9 @@ """ import datetime +import http.client as http_client import json - -import six -from six.moves import http_client -from six.moves import urllib +import urllib from google.auth import _exponential_backoff from google.auth import _helpers @@ -61,7 +59,7 @@ def _handle_error_response(response_data, retryable_error): retryable_error = retryable_error if retryable_error else False - if isinstance(response_data, six.string_types): + if isinstance(response_data, str): raise exceptions.RefreshError(response_data, retryable=retryable_error) try: error_details = "{}: {}".format( @@ -95,9 +93,7 @@ def _can_retry(status_code, response_data): error_desc = response_data.get("error_description") or "" error_code = response_data.get("error") or "" - if not isinstance(error_code, six.string_types) or not isinstance( - error_desc, six.string_types - ): + if not isinstance(error_code, str) or not isinstance(error_desc, str): return False # Per Oauth 2.0 RFC https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.2.1 @@ -325,7 +321,7 @@ def jwt_grant(request, token_uri, assertion, can_retry=True): new_exc = exceptions.RefreshError( "No access token in response.", response_data, retryable=False ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc expiry = _parse_expiry(response_data) @@ -362,7 +358,7 @@ def call_iam_generate_id_token_endpoint(request, signer_email, audience, access_ new_exc = exceptions.RefreshError( "No ID token in response.", response_data, retryable=False ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc payload = jwt.decode(id_token, verify=False) expiry = datetime.datetime.utcfromtimestamp(payload["exp"]) @@ -414,7 +410,7 @@ def id_token_jwt_grant(request, token_uri, assertion, can_retry=True): new_exc = exceptions.RefreshError( "No ID token in response.", response_data, retryable=False ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc payload = jwt.decode(id_token, verify=False) expiry = datetime.datetime.utcfromtimestamp(payload["exp"]) @@ -445,7 +441,7 @@ def _handle_refresh_grant_response(response_data, refresh_token): new_exc = exceptions.RefreshError( "No access token in response.", response_data, retryable=False ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc refresh_token = response_data.get("refresh_token", refresh_token) expiry = _parse_expiry(response_data) diff --git a/google/oauth2/_client_async.py b/google/oauth2/_client_async.py index 428084a70..2858d862b 100644 --- a/google/oauth2/_client_async.py +++ b/google/oauth2/_client_async.py @@ -24,11 +24,9 @@ """ import datetime +import http.client as http_client import json - -import six -from six.moves import http_client -from six.moves import urllib +import urllib from google.auth import _exponential_backoff from google.auth import exceptions @@ -183,7 +181,7 @@ async def jwt_grant(request, token_uri, assertion, can_retry=True): new_exc = exceptions.RefreshError( "No access token in response.", response_data, retryable=False ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc expiry = client._parse_expiry(response_data) @@ -228,7 +226,7 @@ async def id_token_jwt_grant(request, token_uri, assertion, can_retry=True): new_exc = exceptions.RefreshError( "No ID token in response.", response_data, retryable=False ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc payload = jwt.decode(id_token, verify=False) expiry = datetime.datetime.utcfromtimestamp(payload["exp"]) diff --git a/google/oauth2/_id_token_async.py b/google/oauth2/_id_token_async.py index c32dfa47d..6594e416a 100644 --- a/google/oauth2/_id_token_async.py +++ b/google/oauth2/_id_token_async.py @@ -58,12 +58,10 @@ .. _CacheControl: https://cachecontrol.readthedocs.io """ +import http.client as http_client import json import os -import six -from six.moves import http_client - from google.auth import environment_vars from google.auth import exceptions from google.auth import jwt @@ -264,7 +262,7 @@ async def fetch_id_token(request, audience): "GOOGLE_APPLICATION_CREDENTIALS is not valid service account credentials.", caught_exc, ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc # 2. Try to fetch ID token from metada server if it exists. The code works # for GAE and Cloud Run metadata server as well. diff --git a/google/oauth2/_reauth_async.py b/google/oauth2/_reauth_async.py index 6b69c6e67..de3675c52 100644 --- a/google/oauth2/_reauth_async.py +++ b/google/oauth2/_reauth_async.py @@ -34,8 +34,6 @@ import sys -from six.moves import range - from google.auth import exceptions from google.oauth2 import _client from google.oauth2 import _client_async diff --git a/google/oauth2/challenges.py b/google/oauth2/challenges.py index 6fe982d1c..c55796323 100644 --- a/google/oauth2/challenges.py +++ b/google/oauth2/challenges.py @@ -20,8 +20,6 @@ import getpass import sys -import six - from google.auth import _helpers from google.auth import exceptions @@ -47,8 +45,7 @@ def get_user_password(text): return getpass.getpass(text) -@six.add_metaclass(abc.ABCMeta) -class ReauthChallenge(object): +class ReauthChallenge(metaclass=abc.ABCMeta): """Base class for reauth challenges.""" @property diff --git a/google/oauth2/credentials.py b/google/oauth2/credentials.py index 5c40ab097..5becb7c1d 100644 --- a/google/oauth2/credentials.py +++ b/google/oauth2/credentials.py @@ -37,8 +37,6 @@ import logging import warnings -import six - from google.auth import _cloud_sdk from google.auth import _helpers from google.auth import credentials @@ -307,7 +305,7 @@ def refresh(self, request): if self._refresh_token is None and self.refresh_handler: token, expiry = self.refresh_handler(request, scopes=scopes) # Validate returned data. - if not isinstance(token, six.string_types): + if not isinstance(token, str): raise exceptions.RefreshError( "The refresh_handler returned token is not a string." ) @@ -394,7 +392,7 @@ def from_authorized_user_info(cls, info, scopes=None): ValueError: If the info is not in the expected format. """ keys_needed = set(("refresh_token", "client_id", "client_secret")) - missing = keys_needed.difference(six.iterkeys(info)) + missing = keys_needed.difference(info.keys()) if missing: raise ValueError( @@ -414,7 +412,7 @@ def from_authorized_user_info(cls, info, scopes=None): # process scopes, which needs to be a seq if scopes is None and "scopes" in info: scopes = info.get("scopes") - if isinstance(scopes, six.string_types): + if isinstance(scopes, str): scopes = scopes.split(" ") return cls( diff --git a/google/oauth2/id_token.py b/google/oauth2/id_token.py index 48f5b0a59..2b1abec2b 100644 --- a/google/oauth2/id_token.py +++ b/google/oauth2/id_token.py @@ -55,12 +55,10 @@ .. _CacheControl: https://cachecontrol.readthedocs.io """ +import http.client as http_client import json import os -import six -from six.moves import http_client - from google.auth import environment_vars from google.auth import exceptions from google.auth import jwt @@ -274,7 +272,7 @@ def fetch_id_token_credentials(audience, request=None): "GOOGLE_APPLICATION_CREDENTIALS is not valid service account credentials.", caught_exc, ) - six.raise_from(new_exc, caught_exc) + raise new_exc from caught_exc # 2. Try to fetch ID token from metada server if it exists. The code # works for GAE and Cloud Run metadata server as well. diff --git a/google/oauth2/reauth.py b/google/oauth2/reauth.py index c679a9e8b..587034773 100644 --- a/google/oauth2/reauth.py +++ b/google/oauth2/reauth.py @@ -34,8 +34,6 @@ import sys -from six.moves import range - from google.auth import exceptions from google.auth import metrics from google.oauth2 import _client diff --git a/google/oauth2/sts.py b/google/oauth2/sts.py index 5cf06d4d4..ad3962735 100644 --- a/google/oauth2/sts.py +++ b/google/oauth2/sts.py @@ -31,10 +31,9 @@ .. _rfc8693 section 2.2.1: https://tools.ietf.org/html/rfc8693#section-2.2.1 """ +import http.client as http_client import json - -from six.moves import http_client -from six.moves import urllib +import urllib from google.oauth2 import utils diff --git a/google/oauth2/utils.py b/google/oauth2/utils.py index 593f03236..d72ff1916 100644 --- a/google/oauth2/utils.py +++ b/google/oauth2/utils.py @@ -45,8 +45,6 @@ import enum import json -import six - from google.auth import exceptions @@ -77,8 +75,7 @@ def __init__(self, client_auth_type, client_id, client_secret=None): self.client_secret = client_secret -@six.add_metaclass(abc.ABCMeta) -class OAuthClientAuthHandler(object): +class OAuthClientAuthHandler(metaclass=abc.ABCMeta): """Abstract class for handling client authentication in OAuth-based operations. """ diff --git a/noxfile.py b/noxfile.py index b9d183385..48b0347d1 100644 --- a/noxfile.py +++ b/noxfile.py @@ -79,7 +79,6 @@ def mypy(session): "types-pyOpenSSL", "types-requests", "types-setuptools", - "types-six", "types-mock", ) session.run("mypy", "-p", "google", "-p", "tests", "-p", "tests_async") diff --git a/setup.py b/setup.py index 4a91925dd..b3c0e6de2 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,6 @@ # https://github.com/sybrenstuvel/python-rsa/issues/152#issuecomment-643470233 "rsa>=3.1.4,<5", # install enum34 to support 2.7. enum34 only works up to python version 3.3. - "six>=1.9.0", "urllib3<2.0", ) diff --git a/system_tests/noxfile.py b/system_tests/noxfile.py index e44dc5660..eb22108bb 100644 --- a/system_tests/noxfile.py +++ b/system_tests/noxfile.py @@ -283,6 +283,7 @@ def compute_engine(session): @nox.session(python=PYTHON_VERSIONS_SYNC) def grpc(session): session.install(LIBRARY_DIR) + session.install("six") session.install(*TEST_DEPENDENCIES_SYNC, "google-cloud-pubsub==1.7.2") session.env[EXPLICIT_CREDENTIALS_ENV] = SERVICE_ACCOUNT_FILE default( diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 0c81b08f517c8f84b4db29fb33b247d768acd7ab..15589afb983a2fcdb5dd8972bfd455aac6483b38 100644 GIT binary patch literal 10324 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 literal 10324 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 diff --git a/system_tests/system_tests_sync/test_external_accounts.py b/system_tests/system_tests_sync/test_external_accounts.py index e7a81963b..837d0064b 100644 --- a/system_tests/system_tests_sync/test_external_accounts.py +++ b/system_tests/system_tests_sync/test_external_accounts.py @@ -44,7 +44,8 @@ import google.auth from google.auth import _helpers from googleapiclient import discovery -from six.moves import BaseHTTPServer +from http.server import BaseHTTPRequestHandler +from http.server import HTTPServer from google.oauth2 import service_account import pytest from mock import patch @@ -245,7 +246,7 @@ def check_impersonation_expiration(): # This test makes sure that setting up an http server to provide credentials # works to allow access to Google resources. def test_url_based_external_account(dns_access, oidc_credentials, service_account_info): - class TestResponseHandler(BaseHTTPServer.BaseHTTPRequestHandler): + class TestResponseHandler(BaseHTTPRequestHandler): def do_GET(self): if self.headers["my-header"] != "expected-value": self.send_response(400) @@ -269,7 +270,7 @@ def do_GET(self): json.dumps({"access_token": oidc_credentials.token}).encode("utf-8") ) - class TestHTTPServer(BaseHTTPServer.HTTPServer, object): + class TestHTTPServer(HTTPServer, object): def __init__(self): self.port = self._find_open_port() super(TestHTTPServer, self).__init__(("", self.port), TestResponseHandler) diff --git a/tests/compute_engine/test__metadata.py b/tests/compute_engine/test__metadata.py index f543426d3..a940feb25 100644 --- a/tests/compute_engine/test__metadata.py +++ b/tests/compute_engine/test__metadata.py @@ -13,13 +13,13 @@ # limitations under the License. import datetime +import http.client as http_client +import importlib import json import os import mock import pytest # type: ignore -from six.moves import http_client -from six.moves import reload_module from google.auth import _helpers from google.auth import environment_vars @@ -144,13 +144,13 @@ def test_ping_success_custom_root(mock_metrics_header_value): fake_ip = "1.2.3.4" os.environ[environment_vars.GCE_METADATA_IP] = fake_ip - reload_module(_metadata) + importlib.reload(_metadata) try: assert _metadata.ping(request) finally: del os.environ[environment_vars.GCE_METADATA_IP] - reload_module(_metadata) + importlib.reload(_metadata) request.assert_called_once_with( method="GET", @@ -257,13 +257,13 @@ def test_get_success_custom_root_new_variable(): fake_root = "another.metadata.service" os.environ[environment_vars.GCE_METADATA_HOST] = fake_root - reload_module(_metadata) + importlib.reload(_metadata) try: _metadata.get(request, PATH) finally: del os.environ[environment_vars.GCE_METADATA_HOST] - reload_module(_metadata) + importlib.reload(_metadata) request.assert_called_once_with( method="GET", @@ -277,13 +277,13 @@ def test_get_success_custom_root_old_variable(): fake_root = "another.metadata.service" os.environ[environment_vars.GCE_METADATA_ROOT] = fake_root - reload_module(_metadata) + importlib.reload(_metadata) try: _metadata.get(request, PATH) finally: del os.environ[environment_vars.GCE_METADATA_ROOT] - reload_module(_metadata) + importlib.reload(_metadata) request.assert_called_once_with( method="GET", diff --git a/tests/crypt/test__python_rsa.py b/tests/crypt/test__python_rsa.py index 9d832f044..4a4ebe44e 100644 --- a/tests/crypt/test__python_rsa.py +++ b/tests/crypt/test__python_rsa.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import io import json import os @@ -19,7 +20,6 @@ from pyasn1_modules import pem # type: ignore import pytest # type: ignore import rsa # type: ignore -import six from google.auth import _helpers from google.auth.crypt import _python_rsa @@ -141,7 +141,7 @@ def test_from_string_pkcs8(self): def test_from_string_pkcs8_extra_bytes(self): key_bytes = PKCS8_KEY_BYTES _, pem_bytes = pem.readPemBlocksFromFile( - six.StringIO(_helpers.from_bytes(key_bytes)), _python_rsa._PKCS8_MARKER + io.StringIO(_helpers.from_bytes(key_bytes)), _python_rsa._PKCS8_MARKER ) key_info, remaining = None, "extra" diff --git a/tests/oauth2/test__client.py b/tests/oauth2/test__client.py index 9450fa1fd..4cbd3a8ad 100644 --- a/tests/oauth2/test__client.py +++ b/tests/oauth2/test__client.py @@ -13,14 +13,13 @@ # limitations under the License. import datetime +import http.client as http_client import json import os +import urllib import mock import pytest # type: ignore -import six -from six.moves import http_client -from six.moves import urllib from google.auth import _helpers from google.auth import crypt @@ -273,7 +272,7 @@ def verify_request_params(request, params): request_body = request.call_args[1]["body"].decode("utf-8") request_params = urllib.parse.parse_qs(request_body) - for key, value in six.iteritems(params): + for key, value in params.items(): assert request_params[key][0] == value diff --git a/tests/oauth2/test_gdch_credentials.py b/tests/oauth2/test_gdch_credentials.py index 60944ed41..63075aba0 100644 --- a/tests/oauth2/test_gdch_credentials.py +++ b/tests/oauth2/test_gdch_credentials.py @@ -20,7 +20,6 @@ import mock import pytest # type: ignore import requests -import six from google.auth import exceptions from google.auth import jwt @@ -69,7 +68,7 @@ def test__create_jwt(self): expected_iss_sub_value = ( "system:serviceaccount:project_foo:service_identity_name" ) - assert isinstance(jwt_token, six.text_type) + assert isinstance(jwt_token, str) assert header["alg"] == "ES256" assert header["kid"] == self.PRIVATE_KEY_ID assert payload["iss"] == expected_iss_sub_value diff --git a/tests/oauth2/test_service_account.py b/tests/oauth2/test_service_account.py index 36565b721..058fc3f7d 100644 --- a/tests/oauth2/test_service_account.py +++ b/tests/oauth2/test_service_account.py @@ -18,7 +18,6 @@ import mock import pytest # type: ignore -import six from google.auth import _helpers from google.auth import crypt @@ -525,7 +524,7 @@ def test_refresh_with_jwt_credentials_token_type_check(self): credentials.refresh(mock.Mock()) # Credentials token should be a JWT string. - assert isinstance(credentials.token, six.string_types) + assert isinstance(credentials.token, str) payload = jwt.decode(credentials.token, verify=False) assert payload["aud"] == "https://pubsub.googleapis.com" diff --git a/tests/oauth2/test_sts.py b/tests/oauth2/test_sts.py index a543d42a8..e0fb4ae23 100644 --- a/tests/oauth2/test_sts.py +++ b/tests/oauth2/test_sts.py @@ -12,12 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +import http.client as http_client import json +import urllib import mock import pytest # type: ignore -from six.moves import http_client -from six.moves import urllib from google.auth import exceptions from google.auth import transport diff --git a/tests/test__helpers.py b/tests/test__helpers.py index 8c71f3e51..c1f1d812e 100644 --- a/tests/test__helpers.py +++ b/tests/test__helpers.py @@ -13,9 +13,9 @@ # limitations under the License. import datetime +import urllib import pytest # type: ignore -from six.moves import urllib from google.auth import _helpers diff --git a/tests/test__oauth2client.py b/tests/test__oauth2client.py index 8802ba17f..9f0c192ae 100644 --- a/tests/test__oauth2client.py +++ b/tests/test__oauth2client.py @@ -13,12 +13,12 @@ # limitations under the License. import datetime +import importlib import os import sys import mock import pytest # type: ignore -from six.moves import reload_module try: import oauth2client.client # type: ignore @@ -159,19 +159,19 @@ def test_convert_not_found(): @pytest.fixture def reset__oauth2client_module(): """Reloads the _oauth2client module after a test.""" - reload_module(_oauth2client) + importlib.reload(_oauth2client) def test_import_has_app_engine( mock_oauth2client_gae_imports, reset__oauth2client_module ): - reload_module(_oauth2client) + importlib.reload(_oauth2client) assert _oauth2client._HAS_APPENGINE def test_import_without_oauth2client(monkeypatch, reset__oauth2client_module): monkeypatch.setitem(sys.modules, "oauth2client", None) with pytest.raises(ImportError) as excinfo: - reload_module(_oauth2client) + importlib.reload(_oauth2client) assert excinfo.match("oauth2client") diff --git a/tests/test__service_account_info.py b/tests/test__service_account_info.py index 9ad9f0fc8..4fa85a599 100644 --- a/tests/test__service_account_info.py +++ b/tests/test__service_account_info.py @@ -16,7 +16,6 @@ import os import pytest # type: ignore -import six from google.auth import _service_account_info from google.auth import crypt @@ -67,7 +66,7 @@ def test_from_dict_bad_format(): def test_from_filename(): info, signer = _service_account_info.from_filename(SERVICE_ACCOUNT_JSON_FILE) - for key, value in six.iteritems(SERVICE_ACCOUNT_INFO): + for key, value in SERVICE_ACCOUNT_INFO.items(): assert info[key] == value assert isinstance(signer, crypt.RSASigner) diff --git a/tests/test_aws.py b/tests/test_aws.py index 1c8c5d41a..39138ab12 100644 --- a/tests/test_aws.py +++ b/tests/test_aws.py @@ -13,13 +13,13 @@ # limitations under the License. import datetime +import http.client as http_client import json import os +import urllib.parse import mock import pytest # type: ignore -from six.moves import http_client -from six.moves import urllib from google.auth import _helpers from google.auth import aws diff --git a/tests/test_downscoped.py b/tests/test_downscoped.py index 7d0768a18..b011380bd 100644 --- a/tests/test_downscoped.py +++ b/tests/test_downscoped.py @@ -13,12 +13,12 @@ # limitations under the License. import datetime +import http.client as http_client import json +import urllib import mock import pytest # type: ignore -from six.moves import http_client -from six.moves import urllib from google.auth import _helpers from google.auth import credentials diff --git a/tests/test_external_account.py b/tests/test_external_account.py index f05a5a11a..fd511aa44 100644 --- a/tests/test_external_account.py +++ b/tests/test_external_account.py @@ -13,12 +13,12 @@ # limitations under the License. import datetime +import http.client as http_client import json +import urllib import mock import pytest # type: ignore -from six.moves import http_client -from six.moves import urllib from google.auth import _helpers from google.auth import exceptions diff --git a/tests/test_external_account_authorized_user.py b/tests/test_external_account_authorized_user.py index db18450a8..7ffd5078c 100644 --- a/tests/test_external_account_authorized_user.py +++ b/tests/test_external_account_authorized_user.py @@ -13,11 +13,11 @@ # limitations under the License. import datetime +import http.client as http_client import json import mock import pytest # type: ignore -from six.moves import http_client from google.auth import exceptions from google.auth import external_account_authorized_user diff --git a/tests/test_iam.py b/tests/test_iam.py index ae482765b..6706afb4b 100644 --- a/tests/test_iam.py +++ b/tests/test_iam.py @@ -14,11 +14,11 @@ import base64 import datetime +import http.client as http_client import json import mock import pytest # type: ignore -from six.moves import http_client from google.auth import _helpers from google.auth import exceptions diff --git a/tests/test_identity_pool.py b/tests/test_identity_pool.py index 7262e644c..e469cf731 100644 --- a/tests/test_identity_pool.py +++ b/tests/test_identity_pool.py @@ -13,13 +13,13 @@ # limitations under the License. import datetime +import http.client as http_client import json import os +import urllib import mock import pytest # type: ignore -from six.moves import http_client -from six.moves import urllib from google.auth import _helpers from google.auth import exceptions diff --git a/tests/test_impersonated_credentials.py b/tests/test_impersonated_credentials.py index f79db8f6a..161ff3b04 100644 --- a/tests/test_impersonated_credentials.py +++ b/tests/test_impersonated_credentials.py @@ -13,15 +13,12 @@ # limitations under the License. import datetime +import http.client as http_client import json import os -# Because Python 2.7 -# from typing import List - import mock import pytest # type: ignore -from six.moves import http_client from google.auth import _helpers from google.auth import crypt diff --git a/tests/test_pluggable.py b/tests/test_pluggable.py index 7d601dfd4..9b0da9273 100644 --- a/tests/test_pluggable.py +++ b/tests/test_pluggable.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# import datetime import json import os import subprocess @@ -20,17 +19,10 @@ import mock import pytest # type: ignore -# from six.moves import http_client -# from six.moves import urllib - -# from google.auth import _helpers from google.auth import exceptions from google.auth import pluggable from tests.test__default import WORKFORCE_AUDIENCE -# from google.auth import transport - - CLIENT_ID = "username" CLIENT_SECRET = "password" # Base64 encoding of "username:password". diff --git a/tests/transport/compliance.py b/tests/transport/compliance.py index faf39b9ba..b3cd7e823 100644 --- a/tests/transport/compliance.py +++ b/tests/transport/compliance.py @@ -12,12 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +import http.client as http_client import time import flask # type: ignore import pytest # type: ignore from pytest_localserver.http import WSGIServer # type: ignore -from six.moves import http_client from google.auth import exceptions diff --git a/tests/transport/test_requests.py b/tests/transport/test_requests.py index 9532117b5..d96281434 100644 --- a/tests/transport/test_requests.py +++ b/tests/transport/test_requests.py @@ -14,6 +14,7 @@ import datetime import functools +import http.client as http_client import os import sys @@ -23,7 +24,6 @@ import pytest # type: ignore import requests import requests.adapters -from six.moves import http_client from google.auth import environment_vars from google.auth import exceptions diff --git a/tests/transport/test_urllib3.py b/tests/transport/test_urllib3.py index 5bdfac95e..e83230032 100644 --- a/tests/transport/test_urllib3.py +++ b/tests/transport/test_urllib3.py @@ -12,13 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +import http.client as http_client import os import sys import mock import OpenSSL import pytest # type: ignore -from six.moves import http_client import urllib3 # type: ignore from google.auth import environment_vars diff --git a/tests_async/oauth2/test__client_async.py b/tests_async/oauth2/test__client_async.py index 402083672..add1b4e60 100644 --- a/tests_async/oauth2/test__client_async.py +++ b/tests_async/oauth2/test__client_async.py @@ -13,13 +13,12 @@ # limitations under the License. import datetime +import http.client as http_client import json +import urllib import mock import pytest # type: ignore -import six -from six.moves import http_client -from six.moves import urllib from google.auth import _helpers from google.auth import _jwt_async as jwt @@ -202,7 +201,7 @@ def verify_request_params(request, params): request_body = request.call_args[1]["body"].decode("utf-8") request_params = urllib.parse.parse_qs(request_body) - for key, value in six.iteritems(params): + for key, value in params.items(): assert request_params[key][0] == value diff --git a/tests_async/transport/async_compliance.py b/tests_async/transport/async_compliance.py index 36fe7a301..f3a36079c 100644 --- a/tests_async/transport/async_compliance.py +++ b/tests_async/transport/async_compliance.py @@ -12,12 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +import http.client as http_client import time import flask # type: ignore import pytest # type: ignore from pytest_localserver.http import WSGIServer # type: ignore -from six.moves import http_client from google.auth import exceptions from tests.transport import compliance From a4135a3e9620a2cbf99957858c13780b92ff707c Mon Sep 17 00:00:00 2001 From: sai-sunder-s <4540365+sai-sunder-s@users.noreply.github.com> Date: Thu, 13 Jul 2023 09:43:01 -0700 Subject: [PATCH 02/13] fix: Skip checking projectid on cred if env var is set (#1349) * fix: Skip checking projectid on cred if env var is set * add test for legacy project --------- Co-authored-by: Carl Lundin <108372512+clundin25@users.noreply.github.com> --- google/auth/_default.py | 7 +++--- tests/test__default.py | 55 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/google/auth/_default.py b/google/auth/_default.py index f77fa1808..63009dfb8 100644 --- a/google/auth/_default.py +++ b/google/auth/_default.py @@ -660,24 +660,25 @@ def default(scopes=None, request=None, quota_project_id=None, default_scopes=Non credentials, scopes, default_scopes=default_scopes ) + effective_project_id = explicit_project_id or project_id + # For external account credentials, scopes are required to determine # the project ID. Try to get the project ID again if not yet # determined. - if not project_id and callable( + if not effective_project_id and callable( getattr(credentials, "get_project_id", None) ): if request is None: import google.auth.transport.requests request = google.auth.transport.requests.Request() - project_id = credentials.get_project_id(request=request) + effective_project_id = credentials.get_project_id(request=request) if quota_project_id and isinstance( credentials, CredentialsWithQuotaProject ): credentials = credentials.with_quota_project(quota_project_id) - effective_project_id = explicit_project_id or project_id if not effective_project_id: _LOGGER.warning( "No project ID could be determined. Consider running " diff --git a/tests/test__default.py b/tests/test__default.py index affbb7624..4f59c5497 100644 --- a/tests/test__default.py +++ b/tests/test__default.py @@ -1030,6 +1030,61 @@ def test_default_environ_external_credentials_identity_pool_impersonated( assert project_id is mock.sentinel.project_id assert credentials.scopes == ["https://www.google.com/calendar/feeds"] + # The credential.get_project_id should have been used in _get_external_account_credentials and default + assert get_project_id.call_count == 2 + + +@EXTERNAL_ACCOUNT_GET_PROJECT_ID_PATCH +@mock.patch.dict(os.environ) +def test_default_environ_external_credentials_project_from_env( + get_project_id, monkeypatch, tmpdir +): + project_from_env = "project_from_env" + os.environ[environment_vars.PROJECT] = project_from_env + + config_file = tmpdir.join("config.json") + config_file.write(json.dumps(IMPERSONATED_IDENTITY_POOL_DATA)) + monkeypatch.setenv(environment_vars.CREDENTIALS, str(config_file)) + + credentials, project_id = _default.default( + scopes=["https://www.google.com/calendar/feeds"] + ) + + assert isinstance(credentials, identity_pool.Credentials) + assert not credentials.is_user + assert not credentials.is_workforce_pool + assert project_id == project_from_env + assert credentials.scopes == ["https://www.google.com/calendar/feeds"] + + # The credential.get_project_id should have been used only in _get_external_account_credentials + assert get_project_id.call_count == 1 + + +@EXTERNAL_ACCOUNT_GET_PROJECT_ID_PATCH +@mock.patch.dict(os.environ) +def test_default_environ_external_credentials_legacy_project_from_env( + get_project_id, monkeypatch, tmpdir +): + project_from_env = "project_from_env" + os.environ[environment_vars.LEGACY_PROJECT] = project_from_env + + config_file = tmpdir.join("config.json") + config_file.write(json.dumps(IMPERSONATED_IDENTITY_POOL_DATA)) + monkeypatch.setenv(environment_vars.CREDENTIALS, str(config_file)) + + credentials, project_id = _default.default( + scopes=["https://www.google.com/calendar/feeds"] + ) + + assert isinstance(credentials, identity_pool.Credentials) + assert not credentials.is_user + assert not credentials.is_workforce_pool + assert project_id == project_from_env + assert credentials.scopes == ["https://www.google.com/calendar/feeds"] + + # The credential.get_project_id should have been used only in _get_external_account_credentials + assert get_project_id.call_count == 1 + @EXTERNAL_ACCOUNT_GET_PROJECT_ID_PATCH def test_default_environ_external_credentials_aws_impersonated( From 9f52f665247ada59278ffddaaef3ada9e419154c Mon Sep 17 00:00:00 2001 From: wj-chen Date: Tue, 8 Aug 2023 14:17:16 -0700 Subject: [PATCH 03/13] feat: add get_bq_config_path() to _cloud_sdk.py (#1358) feat: add get_bq_config_path() to _cloud_sdk.py --- google/auth/_cloud_sdk.py | 43 ++++++++++++++++++------ system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes tests/test__cloud_sdk.py | 61 ++++++++++++++++++++++++++++------- 3 files changed, 83 insertions(+), 21 deletions(-) diff --git a/google/auth/_cloud_sdk.py b/google/auth/_cloud_sdk.py index a94411949..7cd41434a 100644 --- a/google/auth/_cloud_sdk.py +++ b/google/auth/_cloud_sdk.py @@ -23,7 +23,9 @@ # The ~/.config subdirectory containing gcloud credentials. -_CONFIG_DIRECTORY = "gcloud" +_CONFIG_DIRECTORY_GCLOUD = "gcloud" +# The ~/.config subdirectory containing gcloud credentials for bq. +_CONFIG_DIRECTORY_BQ = "bq" # Windows systems store config at %APPDATA%\gcloud _WINDOWS_CONFIG_ROOT_ENV_VAR = "APPDATA" # The name of the file in the Cloud SDK config that contains default @@ -42,11 +44,14 @@ ) -def get_config_path(): - """Returns the absolute path the the Cloud SDK's configuration directory. +def get_config_path(config_directory=_CONFIG_DIRECTORY_GCLOUD): + """Returns the absolute path of the given configuration directory. + + Args: + config_directory: The absolute path of the configuration directory. Returns: - str: The Cloud SDK config path. + str: The config path. """ # If the path is explicitly set, return that. try: @@ -54,20 +59,38 @@ def get_config_path(): except KeyError: pass - # Non-windows systems store this at ~/.config/gcloud + # Non-windows systems store this at ~/.config/. if os.name != "nt": - return os.path.join(os.path.expanduser("~"), ".config", _CONFIG_DIRECTORY) - # Windows systems store config at %APPDATA%\gcloud + return os.path.join(os.path.expanduser("~"), ".config", config_directory) + # Windows systems store config at %APPDATA%\. else: try: return os.path.join( - os.environ[_WINDOWS_CONFIG_ROOT_ENV_VAR], _CONFIG_DIRECTORY + os.environ[_WINDOWS_CONFIG_ROOT_ENV_VAR], config_directory ) except KeyError: # This should never happen unless someone is really # messing with things, but we'll cover the case anyway. drive = os.environ.get("SystemDrive", "C:") - return os.path.join(drive, "\\", _CONFIG_DIRECTORY) + return os.path.join(drive, "\\", config_directory) + + +def get_gcloud_config_path(): + """Returns the absolute path of Cloud CLI's configuration directory. + + Returns: + str: The Cloud CLI config path. + """ + return get_config_path(config_directory=_CONFIG_DIRECTORY_GCLOUD) + + +def get_bq_config_path(): + """Returns the absolute path of bq's configuration directory. + + Returns: + str: The bq config path. + """ + return get_config_path(config_directory=_CONFIG_DIRECTORY_BQ) def get_application_default_credentials_path(): @@ -78,7 +101,7 @@ def get_application_default_credentials_path(): Returns: str: The full path to application default credentials. """ - config_path = get_config_path() + config_path = get_gcloud_config_path() return os.path.join(config_path, _CREDENTIALS_FILENAME) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 15589afb983a2fcdb5dd8972bfd455aac6483b38..8ff3d379221c9cb03aa0f66ef25b79aa2b6eefd5 100644 GIT binary patch literal 10324 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
    l&7O?pc!E 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 literal 10324 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 diff --git a/tests/test__cloud_sdk.py b/tests/test__cloud_sdk.py index e45c65bd9..4eaf1b18f 100644 --- a/tests/test__cloud_sdk.py +++ b/tests/test__cloud_sdk.py @@ -112,40 +112,79 @@ def test_get_application_default_credentials_path(get_config_dir): ) -def test_get_config_path_env_var(monkeypatch): +def test_get_gcloud_config_path_env_var(monkeypatch): config_path_sentinel = "config_path" monkeypatch.setenv(environment_vars.CLOUD_SDK_CONFIG_DIR, config_path_sentinel) - config_path = _cloud_sdk.get_config_path() + config_path = _cloud_sdk.get_gcloud_config_path() assert config_path == config_path_sentinel @mock.patch("os.path.expanduser") -def test_get_config_path_unix(expanduser): +def test_get_gcloud_config_path_unix(expanduser): expanduser.side_effect = lambda path: path - config_path = _cloud_sdk.get_config_path() + config_path = _cloud_sdk.get_gcloud_config_path() - assert os.path.split(config_path) == ("~/.config", _cloud_sdk._CONFIG_DIRECTORY) + assert os.path.split(config_path) == ( + "~/.config", + _cloud_sdk._CONFIG_DIRECTORY_GCLOUD, + ) + + +@mock.patch("os.name", new="nt") +def test_get_gcloud_config_path_windows(monkeypatch): + appdata = "appdata" + monkeypatch.setenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, appdata) + + config_path = _cloud_sdk.get_gcloud_config_path() + + assert os.path.split(config_path) == (appdata, _cloud_sdk._CONFIG_DIRECTORY_GCLOUD) + + +@mock.patch("os.name", new="nt") +def test_get_gcloud_config_path_no_appdata(monkeypatch): + monkeypatch.delenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, raising=False) + monkeypatch.setenv("SystemDrive", "G:") + + config_path = _cloud_sdk.get_gcloud_config_path() + + assert os.path.split(config_path) == ("G:/\\", _cloud_sdk._CONFIG_DIRECTORY_GCLOUD) + + +def test_get_bq_config_path_env_var(monkeypatch): + config_path_sentinel = "config_path" + monkeypatch.setenv(environment_vars.CLOUD_SDK_CONFIG_DIR, config_path_sentinel) + config_path = _cloud_sdk.get_bq_config_path() + assert config_path == config_path_sentinel + + +@mock.patch("os.path.expanduser") +def test_get_bq_config_path_unix(expanduser): + expanduser.side_effect = lambda path: path + + config_path = _cloud_sdk.get_bq_config_path() + + assert os.path.split(config_path) == ("~/.config", _cloud_sdk._CONFIG_DIRECTORY_BQ) @mock.patch("os.name", new="nt") -def test_get_config_path_windows(monkeypatch): +def test_get_bq_config_path_windows(monkeypatch): appdata = "appdata" monkeypatch.setenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, appdata) - config_path = _cloud_sdk.get_config_path() + config_path = _cloud_sdk.get_bq_config_path() - assert os.path.split(config_path) == (appdata, _cloud_sdk._CONFIG_DIRECTORY) + assert os.path.split(config_path) == (appdata, _cloud_sdk._CONFIG_DIRECTORY_BQ) @mock.patch("os.name", new="nt") -def test_get_config_path_no_appdata(monkeypatch): +def test_get_bq_config_path_no_appdata(monkeypatch): monkeypatch.delenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, raising=False) monkeypatch.setenv("SystemDrive", "G:") - config_path = _cloud_sdk.get_config_path() + config_path = _cloud_sdk.get_bq_config_path() - assert os.path.split(config_path) == ("G:/\\", _cloud_sdk._CONFIG_DIRECTORY) + assert os.path.split(config_path) == ("G:/\\", _cloud_sdk._CONFIG_DIRECTORY_BQ) @mock.patch("os.name", new="nt") From 9bc80179c6b1e85e1ed783b0c4142fe7c7d20ad7 Mon Sep 17 00:00:00 2001 From: Carl Lundin <108372512+clundin25@users.noreply.github.com> Date: Tue, 8 Aug 2023 15:00:23 -0700 Subject: [PATCH 04/13] chore: Refresh system test creds. (#1366) --- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 8ff3d379221c9cb03aa0f66ef25b79aa2b6eefd5..2ce1a1a0e050e4920c5698a698c7a41ad31cb2dc 100644 GIT binary patch literal 10324 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
      l&7O?pc!E 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 From 65481be78b6e398fe54b976d7eca801db362cab2 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 21:32:17 -0400 Subject: [PATCH 05/13] build: [autoapprove] bump cryptography from 41.0.2 to 41.0.3 (#1363) Source-Link: https://github.com/googleapis/synthtool/commit/352b9d4c068ce7c05908172af128b294073bf53c Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:3e3800bb100af5d7f9e810d48212b37812c1856d20ffeafb99ebe66461b61fc7 Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 4 +- .kokoro/docker/docs/Dockerfile | 2 +- .kokoro/populate-secrets.sh | 2 +- .kokoro/publish-docs.sh | 2 +- .kokoro/release.sh | 2 +- .kokoro/requirements.txt | 56 +++++++++++++++------------- .kokoro/test-samples-against-head.sh | 2 +- .kokoro/test-samples-impl.sh | 2 +- .kokoro/test-samples.sh | 2 +- .kokoro/trampoline.sh | 2 +- .kokoro/trampoline_v2.sh | 2 +- .trampolinerc | 4 +- 12 files changed, 42 insertions(+), 40 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 98994f474..a3da1b0d4 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:2d816f26f728ac8b24248741e7d4c461c09764ef9f7be3684d557c9632e46dbd -# created: 2023-06-28T17:03:33.371210701Z + digest: sha256:3e3800bb100af5d7f9e810d48212b37812c1856d20ffeafb99ebe66461b61fc7 +# created: 2023-08-02T10:53:29.114535628Z diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index f8137d0ae..8e39a2cc4 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -1,4 +1,4 @@ -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/populate-secrets.sh b/.kokoro/populate-secrets.sh index f52514257..6f3972140 100755 --- a/.kokoro/populate-secrets.sh +++ b/.kokoro/populate-secrets.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC. +# Copyright 2023 Google LLC. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/publish-docs.sh b/.kokoro/publish-docs.sh index 1c4d62370..9eafe0be3 100755 --- a/.kokoro/publish-docs.sh +++ b/.kokoro/publish-docs.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/release.sh b/.kokoro/release.sh index ce4182c34..020ec9baf 100755 --- a/.kokoro/release.sh +++ b/.kokoro/release.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index c7929db6d..029bd342d 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -20,9 +20,9 @@ cachetools==5.2.0 \ --hash=sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757 \ --hash=sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db # via google-auth -certifi==2022.12.7 \ - --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ - --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 +certifi==2023.7.22 \ + --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ + --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 # via requests cffi==1.15.1 \ --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ @@ -113,26 +113,30 @@ commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 # via rich -cryptography==41.0.0 \ - --hash=sha256:0ddaee209d1cf1f180f1efa338a68c4621154de0afaef92b89486f5f96047c55 \ - --hash=sha256:14754bcdae909d66ff24b7b5f166d69340ccc6cb15731670435efd5719294895 \ - --hash=sha256:344c6de9f8bda3c425b3a41b319522ba3208551b70c2ae00099c205f0d9fd3be \ - --hash=sha256:34d405ea69a8b34566ba3dfb0521379b210ea5d560fafedf9f800a9a94a41928 \ - --hash=sha256:3680248309d340fda9611498a5319b0193a8dbdb73586a1acf8109d06f25b92d \ - --hash=sha256:3c5ef25d060c80d6d9f7f9892e1d41bb1c79b78ce74805b8cb4aa373cb7d5ec8 \ - --hash=sha256:4ab14d567f7bbe7f1cdff1c53d5324ed4d3fc8bd17c481b395db224fb405c237 \ - --hash=sha256:5c1f7293c31ebc72163a9a0df246f890d65f66b4a40d9ec80081969ba8c78cc9 \ - --hash=sha256:6b71f64beeea341c9b4f963b48ee3b62d62d57ba93eb120e1196b31dc1025e78 \ - --hash=sha256:7d92f0248d38faa411d17f4107fc0bce0c42cae0b0ba5415505df72d751bf62d \ - --hash=sha256:8362565b3835ceacf4dc8f3b56471a2289cf51ac80946f9087e66dc283a810e0 \ - --hash=sha256:84a165379cb9d411d58ed739e4af3396e544eac190805a54ba2e0322feb55c46 \ - --hash=sha256:88ff107f211ea696455ea8d911389f6d2b276aabf3231bf72c8853d22db755c5 \ - --hash=sha256:9f65e842cb02550fac96536edb1d17f24c0a338fd84eaf582be25926e993dde4 \ - --hash=sha256:a4fc68d1c5b951cfb72dfd54702afdbbf0fb7acdc9b7dc4301bbf2225a27714d \ - --hash=sha256:b7f2f5c525a642cecad24ee8670443ba27ac1fab81bba4cc24c7b6b41f2d0c75 \ - --hash=sha256:b846d59a8d5a9ba87e2c3d757ca019fa576793e8758174d3868aecb88d6fc8eb \ - --hash=sha256:bf8fc66012ca857d62f6a347007e166ed59c0bc150cefa49f28376ebe7d992a2 \ - --hash=sha256:f5d0bf9b252f30a31664b6f64432b4730bb7038339bd18b1fafe129cfc2be9be +cryptography==41.0.3 \ + --hash=sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306 \ + --hash=sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84 \ + --hash=sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47 \ + --hash=sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d \ + --hash=sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116 \ + --hash=sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207 \ + --hash=sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81 \ + --hash=sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087 \ + --hash=sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd \ + --hash=sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507 \ + --hash=sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858 \ + --hash=sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae \ + --hash=sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34 \ + --hash=sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906 \ + --hash=sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd \ + --hash=sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922 \ + --hash=sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7 \ + --hash=sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4 \ + --hash=sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574 \ + --hash=sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1 \ + --hash=sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c \ + --hash=sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e \ + --hash=sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de # via # gcp-releasetool # secretstorage @@ -392,9 +396,9 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pygments==2.13.0 \ - --hash=sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1 \ - --hash=sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42 +pygments==2.15.0 \ + --hash=sha256:77a3299119af881904cd5ecd1ac6a66214b6e9bed1f2db16993b54adede64094 \ + --hash=sha256:f7e36cffc4c517fbc252861b9a6e4644ca0e5abadf9a113c72d1358ad09b9500 # via # readme-renderer # rich diff --git a/.kokoro/test-samples-against-head.sh b/.kokoro/test-samples-against-head.sh index ba3a707b0..63ac41dfa 100755 --- a/.kokoro/test-samples-against-head.sh +++ b/.kokoro/test-samples-against-head.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/test-samples-impl.sh b/.kokoro/test-samples-impl.sh index 2c6500cae..5a0f5fab6 100755 --- a/.kokoro/test-samples-impl.sh +++ b/.kokoro/test-samples-impl.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2021 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/test-samples.sh b/.kokoro/test-samples.sh index 11c042d34..50b35a48c 100755 --- a/.kokoro/test-samples.sh +++ b/.kokoro/test-samples.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/trampoline.sh b/.kokoro/trampoline.sh index f39236e94..d85b1f267 100755 --- a/.kokoro/trampoline.sh +++ b/.kokoro/trampoline.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 Google Inc. +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.kokoro/trampoline_v2.sh b/.kokoro/trampoline_v2.sh index 4af6cdc26..59a7cf3a9 100755 --- a/.kokoro/trampoline_v2.sh +++ b/.kokoro/trampoline_v2.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.trampolinerc b/.trampolinerc index 0eee72ab6..a7dfeb42c 100644 --- a/.trampolinerc +++ b/.trampolinerc @@ -1,4 +1,4 @@ -# Copyright 2020 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Template for .trampolinerc - # Add required env vars here. required_envvars+=( ) From a4ec88c5526d300eeebbc82337780b04a20f1f37 Mon Sep 17 00:00:00 2001 From: Carl Lundin <108372512+clundin25@users.noreply.github.com> Date: Wed, 9 Aug 2023 10:10:47 -0700 Subject: [PATCH 06/13] Revert "feat: add get_bq_config_path() to _cloud_sdk.py (#1358)" (#1367) This reverts commit 9f52f665247ada59278ffddaaef3ada9e419154c. --- google/auth/_cloud_sdk.py | 43 +++++++-------------------- tests/test__cloud_sdk.py | 61 +++++++-------------------------------- 2 files changed, 21 insertions(+), 83 deletions(-) diff --git a/google/auth/_cloud_sdk.py b/google/auth/_cloud_sdk.py index 7cd41434a..a94411949 100644 --- a/google/auth/_cloud_sdk.py +++ b/google/auth/_cloud_sdk.py @@ -23,9 +23,7 @@ # The ~/.config subdirectory containing gcloud credentials. -_CONFIG_DIRECTORY_GCLOUD = "gcloud" -# The ~/.config subdirectory containing gcloud credentials for bq. -_CONFIG_DIRECTORY_BQ = "bq" +_CONFIG_DIRECTORY = "gcloud" # Windows systems store config at %APPDATA%\gcloud _WINDOWS_CONFIG_ROOT_ENV_VAR = "APPDATA" # The name of the file in the Cloud SDK config that contains default @@ -44,14 +42,11 @@ ) -def get_config_path(config_directory=_CONFIG_DIRECTORY_GCLOUD): - """Returns the absolute path of the given configuration directory. - - Args: - config_directory: The absolute path of the configuration directory. +def get_config_path(): + """Returns the absolute path the the Cloud SDK's configuration directory. Returns: - str: The config path. + str: The Cloud SDK config path. """ # If the path is explicitly set, return that. try: @@ -59,38 +54,20 @@ def get_config_path(config_directory=_CONFIG_DIRECTORY_GCLOUD): except KeyError: pass - # Non-windows systems store this at ~/.config/. + # Non-windows systems store this at ~/.config/gcloud if os.name != "nt": - return os.path.join(os.path.expanduser("~"), ".config", config_directory) - # Windows systems store config at %APPDATA%\. + return os.path.join(os.path.expanduser("~"), ".config", _CONFIG_DIRECTORY) + # Windows systems store config at %APPDATA%\gcloud else: try: return os.path.join( - os.environ[_WINDOWS_CONFIG_ROOT_ENV_VAR], config_directory + os.environ[_WINDOWS_CONFIG_ROOT_ENV_VAR], _CONFIG_DIRECTORY ) except KeyError: # This should never happen unless someone is really # messing with things, but we'll cover the case anyway. drive = os.environ.get("SystemDrive", "C:") - return os.path.join(drive, "\\", config_directory) - - -def get_gcloud_config_path(): - """Returns the absolute path of Cloud CLI's configuration directory. - - Returns: - str: The Cloud CLI config path. - """ - return get_config_path(config_directory=_CONFIG_DIRECTORY_GCLOUD) - - -def get_bq_config_path(): - """Returns the absolute path of bq's configuration directory. - - Returns: - str: The bq config path. - """ - return get_config_path(config_directory=_CONFIG_DIRECTORY_BQ) + return os.path.join(drive, "\\", _CONFIG_DIRECTORY) def get_application_default_credentials_path(): @@ -101,7 +78,7 @@ def get_application_default_credentials_path(): Returns: str: The full path to application default credentials. """ - config_path = get_gcloud_config_path() + config_path = get_config_path() return os.path.join(config_path, _CREDENTIALS_FILENAME) diff --git a/tests/test__cloud_sdk.py b/tests/test__cloud_sdk.py index 4eaf1b18f..e45c65bd9 100644 --- a/tests/test__cloud_sdk.py +++ b/tests/test__cloud_sdk.py @@ -112,79 +112,40 @@ def test_get_application_default_credentials_path(get_config_dir): ) -def test_get_gcloud_config_path_env_var(monkeypatch): +def test_get_config_path_env_var(monkeypatch): config_path_sentinel = "config_path" monkeypatch.setenv(environment_vars.CLOUD_SDK_CONFIG_DIR, config_path_sentinel) - config_path = _cloud_sdk.get_gcloud_config_path() + config_path = _cloud_sdk.get_config_path() assert config_path == config_path_sentinel @mock.patch("os.path.expanduser") -def test_get_gcloud_config_path_unix(expanduser): +def test_get_config_path_unix(expanduser): expanduser.side_effect = lambda path: path - config_path = _cloud_sdk.get_gcloud_config_path() + config_path = _cloud_sdk.get_config_path() - assert os.path.split(config_path) == ( - "~/.config", - _cloud_sdk._CONFIG_DIRECTORY_GCLOUD, - ) - - -@mock.patch("os.name", new="nt") -def test_get_gcloud_config_path_windows(monkeypatch): - appdata = "appdata" - monkeypatch.setenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, appdata) - - config_path = _cloud_sdk.get_gcloud_config_path() - - assert os.path.split(config_path) == (appdata, _cloud_sdk._CONFIG_DIRECTORY_GCLOUD) - - -@mock.patch("os.name", new="nt") -def test_get_gcloud_config_path_no_appdata(monkeypatch): - monkeypatch.delenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, raising=False) - monkeypatch.setenv("SystemDrive", "G:") - - config_path = _cloud_sdk.get_gcloud_config_path() - - assert os.path.split(config_path) == ("G:/\\", _cloud_sdk._CONFIG_DIRECTORY_GCLOUD) - - -def test_get_bq_config_path_env_var(monkeypatch): - config_path_sentinel = "config_path" - monkeypatch.setenv(environment_vars.CLOUD_SDK_CONFIG_DIR, config_path_sentinel) - config_path = _cloud_sdk.get_bq_config_path() - assert config_path == config_path_sentinel - - -@mock.patch("os.path.expanduser") -def test_get_bq_config_path_unix(expanduser): - expanduser.side_effect = lambda path: path - - config_path = _cloud_sdk.get_bq_config_path() - - assert os.path.split(config_path) == ("~/.config", _cloud_sdk._CONFIG_DIRECTORY_BQ) + assert os.path.split(config_path) == ("~/.config", _cloud_sdk._CONFIG_DIRECTORY) @mock.patch("os.name", new="nt") -def test_get_bq_config_path_windows(monkeypatch): +def test_get_config_path_windows(monkeypatch): appdata = "appdata" monkeypatch.setenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, appdata) - config_path = _cloud_sdk.get_bq_config_path() + config_path = _cloud_sdk.get_config_path() - assert os.path.split(config_path) == (appdata, _cloud_sdk._CONFIG_DIRECTORY_BQ) + assert os.path.split(config_path) == (appdata, _cloud_sdk._CONFIG_DIRECTORY) @mock.patch("os.name", new="nt") -def test_get_bq_config_path_no_appdata(monkeypatch): +def test_get_config_path_no_appdata(monkeypatch): monkeypatch.delenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, raising=False) monkeypatch.setenv("SystemDrive", "G:") - config_path = _cloud_sdk.get_bq_config_path() + config_path = _cloud_sdk.get_config_path() - assert os.path.split(config_path) == ("G:/\\", _cloud_sdk._CONFIG_DIRECTORY_BQ) + assert os.path.split(config_path) == ("G:/\\", _cloud_sdk._CONFIG_DIRECTORY) @mock.patch("os.name", new="nt") From 117e3253d27ca4519dabe169825a3a0473aff482 Mon Sep 17 00:00:00 2001 From: Carl Lundin <108372512+clundin25@users.noreply.github.com> Date: Wed, 23 Aug 2023 14:17:08 -0700 Subject: [PATCH 07/13] chore: Remove support for Python 3.6 (#1354) * chore: Remove support for Python 3.6 * chore: Refresh system test creds. * Revert "chore: Remove support for Python 3.6" This reverts commit 3bfd7ba2679b613e1f02e8559a7ded4abda9ef23. * Add deprecation notice for 3.6 and 3.7. * chore: Refresh system test creds. * Revert "Revert "chore: Remove support for Python 3.6"" This reverts commit c9f006b1e7e901f28f2dc52cb5377b17c89ff610. * Revert "Add deprecation notice for 3.6 and 3.7." This reverts commit fb6b619899db0229ffaf5d7889af0470cda35095. * Bump mypy Python version. * PR feedback. --- .kokoro/samples/python3.6/common.cfg | 40 -------------------- .kokoro/samples/python3.6/continuous.cfg | 7 ---- .kokoro/samples/python3.6/periodic-head.cfg | 11 ------ .kokoro/samples/python3.6/periodic.cfg | 6 --- .kokoro/samples/python3.6/presubmit.cfg | 6 --- CONTRIBUTING.rst | 2 +- README.rst | 5 ++- google/auth/pluggable.py | 4 +- mypy.ini | 2 +- noxfile.py | 2 +- setup.py | 3 +- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes testing/constraints-3.6.txt | 13 ------- tests/test_pluggable.py | 4 +- 14 files changed, 12 insertions(+), 93 deletions(-) delete mode 100644 .kokoro/samples/python3.6/common.cfg delete mode 100644 .kokoro/samples/python3.6/continuous.cfg delete mode 100644 .kokoro/samples/python3.6/periodic-head.cfg delete mode 100644 .kokoro/samples/python3.6/periodic.cfg delete mode 100644 .kokoro/samples/python3.6/presubmit.cfg delete mode 100644 testing/constraints-3.6.txt diff --git a/.kokoro/samples/python3.6/common.cfg b/.kokoro/samples/python3.6/common.cfg deleted file mode 100644 index 57feb84b3..000000000 --- a/.kokoro/samples/python3.6/common.cfg +++ /dev/null @@ -1,40 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Build logs will be here -action { - define_artifacts { - regex: "**/*sponge_log.xml" - } -} - -# Specify which tests to run -env_vars: { - key: "RUN_TESTS_SESSION" - value: "py-3.6" -} - -# Declare build specific Cloud project. -env_vars: { - key: "BUILD_SPECIFIC_GCLOUD_PROJECT" - value: "python-docs-samples-tests-py36" -} - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/google-auth-library-python/.kokoro/test-samples.sh" -} - -# Configure the docker image for kokoro-trampoline. -env_vars: { - key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker" -} - -# Download secrets for samples -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples" - -# Download trampoline resources. -gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" - -# Use the trampoline script to run in docker. -build_file: "google-auth-library-python/.kokoro/trampoline_v2.sh" \ No newline at end of file diff --git a/.kokoro/samples/python3.6/continuous.cfg b/.kokoro/samples/python3.6/continuous.cfg deleted file mode 100644 index 7218af149..000000000 --- a/.kokoro/samples/python3.6/continuous.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "INSTALL_LIBRARY_FROM_SOURCE" - value: "True" -} - diff --git a/.kokoro/samples/python3.6/periodic-head.cfg b/.kokoro/samples/python3.6/periodic-head.cfg deleted file mode 100644 index 83eace873..000000000 --- a/.kokoro/samples/python3.6/periodic-head.cfg +++ /dev/null @@ -1,11 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "INSTALL_LIBRARY_FROM_SOURCE" - value: "True" -} - -env_vars: { - key: "TRAMPOLINE_BUILD_FILE" - value: "github/google-auth-library-python/.kokoro/test-samples-against-head.sh" -} diff --git a/.kokoro/samples/python3.6/periodic.cfg b/.kokoro/samples/python3.6/periodic.cfg deleted file mode 100644 index 71cd1e597..000000000 --- a/.kokoro/samples/python3.6/periodic.cfg +++ /dev/null @@ -1,6 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "INSTALL_LIBRARY_FROM_SOURCE" - value: "False" -} diff --git a/.kokoro/samples/python3.6/presubmit.cfg b/.kokoro/samples/python3.6/presubmit.cfg deleted file mode 100644 index a1c8d9759..000000000 --- a/.kokoro/samples/python3.6/presubmit.cfg +++ /dev/null @@ -1,6 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -env_vars: { - key: "INSTALL_LIBRARY_FROM_SOURCE" - value: "True" -} \ No newline at end of file diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 255f33c74..3d07261ec 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -19,7 +19,7 @@ A few notes on making changes to ``google-auth-library-python``. using ``nox -s docgen``. - The change must work fully on the following CPython versions: - 3.6, 3.7, 3.8, 3.9, 3.10 across macOS, Linux, and Windows. + 3.7, 3.8, 3.9, 3.10 across macOS, Linux, and Windows. - The codebase *must* have 100% test statement coverage after each commit. You can test coverage via ``nox -e cover``. diff --git a/README.rst b/README.rst index d8f28b39a..cdd19bed5 100644 --- a/README.rst +++ b/README.rst @@ -35,7 +35,7 @@ Note that the extras pyopenssl and enterprise_cert should not be used together b Supported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^ -Python >= 3.6 +Python >= 3.7 Unsupported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -45,6 +45,9 @@ Unsupported Python Versions - Python 3.5: The last version of this library with support for Python 3.5 was `google.auth == 1.23.0`. +- Python 3.6: The last version of this library with support for Python 3.6 + was `google.auth == 2.22.0`. + Documentation ------------- diff --git a/google/auth/pluggable.py b/google/auth/pluggable.py index 3f8d47c94..53b4eac5b 100644 --- a/google/auth/pluggable.py +++ b/google/auth/pluggable.py @@ -193,7 +193,7 @@ def retrieve_subject_token(self, request): if not _helpers.is_python_3(): raise exceptions.RefreshError( - "Pluggable auth is only supported for python 3.6+" + "Pluggable auth is only supported for python 3.7+" ) # Inject env vars. @@ -255,7 +255,7 @@ def revoke(self, request): if not _helpers.is_python_3(): raise exceptions.RefreshError( - "Pluggable auth is only supported for python 3.6+" + "Pluggable auth is only supported for python 3.7+" ) # Inject variables diff --git a/mypy.ini b/mypy.ini index 4505b4854..574c5aed3 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,3 +1,3 @@ [mypy] -python_version = 3.6 +python_version = 3.7 namespace_packages = True diff --git a/noxfile.py b/noxfile.py index 48b0347d1..4ec313407 100644 --- a/noxfile.py +++ b/noxfile.py @@ -84,7 +84,7 @@ def mypy(session): session.run("mypy", "-p", "google", "-p", "tests", "-p", "tests_async") -@nox.session(python=["3.6", "3.7", "3.8", "3.9", "3.10", "3.11"]) +@nox.session(python=["3.7", "3.8", "3.9", "3.10", "3.11"]) def unit(session): constraints_path = str( CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" diff --git a/setup.py b/setup.py index b3c0e6de2..922c505e6 100644 --- a/setup.py +++ b/setup.py @@ -62,12 +62,11 @@ ), install_requires=DEPENDENCIES, extras_require=extras, - python_requires=">=3.6", + python_requires=">=3.7", license="Apache 2.0", keywords="google auth oauth client", classifiers=[ "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 2ce1a1a0e050e4920c5698a698c7a41ad31cb2dc..f63d2895ad921e7c4faaacbf731f8c247400e26a 100644 GIT binary patch literal 10324 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 literal 10324 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 m4@e9lSR1Rhugk~5?;yc= 1.14.0, < 2.0.0dev", -# Then this file should have foo==1.14.0 -cachetools==2.0.0 -pyasn1-modules==0.2.1 -setuptools==40.3.0 -rsa==3.1.4 -aiohttp==3.6.2 -requests==2.20.0 diff --git a/tests/test_pluggable.py b/tests/test_pluggable.py index 9b0da9273..1773b40d4 100644 --- a/tests/test_pluggable.py +++ b/tests/test_pluggable.py @@ -1233,7 +1233,7 @@ def test_retrieve_subject_token_python_2(self): with pytest.raises(exceptions.RefreshError) as excinfo: _ = credentials.retrieve_subject_token(None) - assert excinfo.match(r"Pluggable auth is only supported for python 3.6+") + assert excinfo.match(r"Pluggable auth is only supported for python 3.7+") @mock.patch.dict(os.environ, {"GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES": "1"}) def test_revoke_subject_token_python_2(self): @@ -1247,4 +1247,4 @@ def test_revoke_subject_token_python_2(self): with pytest.raises(exceptions.RefreshError) as excinfo: _ = credentials.revoke(None) - assert excinfo.match(r"Pluggable auth is only supported for python 3.6+") + assert excinfo.match(r"Pluggable auth is only supported for python 3.7+") From 36c1d54c0e64fa08f177f4a32b12988a980be401 Mon Sep 17 00:00:00 2001 From: Jack Wotherspoon Date: Thu, 31 Aug 2023 13:56:13 -0400 Subject: [PATCH 08/13] chore: remove duplicate variable (#1375) The global variable [`_DEFAULT_TOKEN_LIFETIME_SECS`](https://togithub.com/googleapis/google-auth-library-python/blob/main/google/auth/impersonated_credentials.py#L40-L61) is set twice. Can we get rid of this duplicate? --- google/auth/impersonated_credentials.py | 2 -- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes 2 files changed, 2 deletions(-) diff --git a/google/auth/impersonated_credentials.py b/google/auth/impersonated_credentials.py index 816b9ea31..828465367 100644 --- a/google/auth/impersonated_credentials.py +++ b/google/auth/impersonated_credentials.py @@ -37,8 +37,6 @@ from google.auth import jwt from google.auth import metrics -_DEFAULT_TOKEN_LIFETIME_SECS = 3600 # 1 hour in seconds - _IAM_SCOPE = ["https://www.googleapis.com/auth/iam"] _IAM_ENDPOINT = ( diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index f63d2895ad921e7c4faaacbf731f8c247400e26a..5485e9242ad16076c7cec7ff119c8175733c9176 100644 GIT binary patch literal 10324 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 From 7d453dc6408b908e24312a7bd3dc380ad43220be Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Thu, 31 Aug 2023 14:38:16 -0700 Subject: [PATCH 09/13] fix: missing ssj for impersonate cred (#1377) --- google/auth/impersonated_credentials.py | 7 +++++++ system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes tests/test_impersonated_credentials.py | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/google/auth/impersonated_credentials.py b/google/auth/impersonated_credentials.py index 828465367..c272a3ca2 100644 --- a/google/auth/impersonated_credentials.py +++ b/google/auth/impersonated_credentials.py @@ -226,6 +226,13 @@ def __init__( # their original scopes modified. if isinstance(self._source_credentials, credentials.Scoped): self._source_credentials = self._source_credentials.with_scopes(_IAM_SCOPE) + # If the source credential is service account and self signed jwt + # is needed, we need to create a jwt credential inside it + if ( + hasattr(self._source_credentials, "_create_self_signed_jwt") + and self._source_credentials._always_use_jwt_access + ): + self._source_credentials._create_self_signed_jwt(None) self._target_principal = target_principal self._target_scopes = target_scopes self._delegates = delegates diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 5485e9242ad16076c7cec7ff119c8175733c9176..c1792fbd9fa93c7be906b26738ffb3be57698fa5 100644 GIT binary patch literal 10324 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 mbg7HflT%c(%Ik*Dr% Date: Wed, 6 Sep 2023 18:00:24 +0200 Subject: [PATCH 10/13] fix: Make external_account resistant to string type 'expires_in' responses from non-compliant services (#1379) Make external_account resistant to string type 'expires_in' responses from non-compliant services. This is to complete [#1208](https://togithub.com/googleapis/google-auth-library-python/pull/1208/). A client run into this error. --- google/auth/external_account.py | 9 ++++++++- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes tests/test_external_account.py | 7 ++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/google/auth/external_account.py b/google/auth/external_account.py index 001b26f7f..c45e6f213 100644 --- a/google/auth/external_account.py +++ b/google/auth/external_account.py @@ -385,7 +385,14 @@ def refresh(self, request): additional_headers=additional_headers, ) self.token = response_data.get("access_token") - lifetime = datetime.timedelta(seconds=response_data.get("expires_in")) + expires_in = response_data.get("expires_in") + # Some services do not respect the OAUTH2.0 RFC and send expires_in as a + # JSON String. + if isinstance(expires_in, str): + expires_in = int(expires_in) + + lifetime = datetime.timedelta(seconds=expires_in) + self.expiry = now + lifetime @_helpers.copy_docstring(credentials.CredentialsWithQuotaProject) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index c1792fbd9fa93c7be906b26738ffb3be57698fa5..fd667ebc8ffeacc7e07feedd0545ec975a64bac9 100644 GIT binary patch literal 10324 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 ma9KA6ZPtOjHd4QY6X9D?`PCyKw7C3b_@0 Date: Thu, 7 Sep 2023 10:00:36 -0700 Subject: [PATCH 11/13] fix: expose universe domain in credentials (#1380) * fix: expose universe domain in credentials * update --- google/auth/credentials.py | 8 ++++++++ google/oauth2/credentials.py | 1 + tests/oauth2/test_service_account.py | 4 ++-- tests/test_credentials.py | 1 + tests/test_external_account.py | 7 +++++++ 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/google/auth/credentials.py b/google/auth/credentials.py index 3ae9c4011..80a2a5c0b 100644 --- a/google/auth/credentials.py +++ b/google/auth/credentials.py @@ -54,6 +54,9 @@ def __init__(self): self._trust_boundary = None """Optional[str]: Encoded string representation of credentials trust boundary.""" + self._universe_domain = "googleapis.com" + """Optional[str]: The universe domain value, default is googleapis.com + """ @property def expired(self): @@ -85,6 +88,11 @@ def quota_project_id(self): """Project to use for quota and billing purposes.""" return self._quota_project_id + @property + def universe_domain(self): + """The universe domain value.""" + return self._universe_domain + @abc.abstractmethod def refresh(self, request): """Refreshes the access token. diff --git a/google/oauth2/credentials.py b/google/oauth2/credentials.py index 5becb7c1d..4643fdbea 100644 --- a/google/oauth2/credentials.py +++ b/google/oauth2/credentials.py @@ -173,6 +173,7 @@ def __setstate__(self, d): self._rapt_token = d.get("_rapt_token") self._enable_reauth_refresh = d.get("_enable_reauth_refresh") self._trust_boundary = d.get("_trust_boundary") + self._universe_domain = d.get("_universe_domain") # The refresh_handler setter should be used to repopulate this. self._refresh_handler = None diff --git a/tests/oauth2/test_service_account.py b/tests/oauth2/test_service_account.py index 058fc3f7d..b963b157c 100644 --- a/tests/oauth2/test_service_account.py +++ b/tests/oauth2/test_service_account.py @@ -70,7 +70,7 @@ def test_constructor_no_universe_domain(self): credentials = service_account.Credentials( SIGNER, self.SERVICE_ACCOUNT_EMAIL, self.TOKEN_URI, universe_domain=None ) - assert credentials._universe_domain == service_account._DEFAULT_UNIVERSE_DOMAIN + assert credentials.universe_domain == service_account._DEFAULT_UNIVERSE_DOMAIN def test_from_service_account_info(self): credentials = service_account.Credentials.from_service_account_info( @@ -88,7 +88,7 @@ def test_from_service_account_info_non_gdu(self): SERVICE_ACCOUNT_INFO_NON_GDU ) - assert credentials._universe_domain == FAKE_UNIVERSE_DOMAIN + assert credentials.universe_domain == FAKE_UNIVERSE_DOMAIN assert credentials._always_use_jwt_access def test_from_service_account_info_args(self): diff --git a/tests/test_credentials.py b/tests/test_credentials.py index 594c3e58a..99235cda6 100644 --- a/tests/test_credentials.py +++ b/tests/test_credentials.py @@ -42,6 +42,7 @@ def test_credentials_constructor(): assert not credentials.expiry assert not credentials.expired assert not credentials.valid + assert credentials.universe_domain == "googleapis.com" def test_expired_and_valid(): diff --git a/tests/test_external_account.py b/tests/test_external_account.py index 9e9d1f58a..0b165bc70 100644 --- a/tests/test_external_account.py +++ b/tests/test_external_account.py @@ -498,6 +498,13 @@ def test_info(self): "universe_domain": "dummy_universe.com", } + def test_universe_domain(self): + credentials = self.make_credentials(universe_domain="dummy_universe.com") + assert credentials.universe_domain == "dummy_universe.com" + + credentials = self.make_credentials() + assert credentials.universe_domain == external_account._DEFAULT_UNIVERSE_DOMAIN + def test_info_workforce_pool(self): credentials = self.make_workforce_pool_credentials( workforce_pool_user_project=self.WORKFORCE_POOL_USER_PROJECT From 7877e726164929cc47b82da1dc6f2efa88e93c33 Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Mon, 11 Sep 2023 11:28:34 -0700 Subject: [PATCH 12/13] chore: update sys test cred (#1381) --- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index fd667ebc8ffeacc7e07feedd0545ec975a64bac9..1409f0b83ea76b9350d02f23b239193e70f9d695 100644 GIT binary patch literal 10324 zcmV-aD67{BB>?tKRTJ>2VnA+MwiFJ8eP-k~yD^D&BlhTpO&(@W?2{jPt#cBpPyn$b zkPKG(P@OkyK_gp`Vg`)V|4E=zF6?3-¦_n&9u@dX=Zx#b{#Q>{|+P+JQ#uST5u zdbM0tI}gi^*0IQpcOTX7P+hh_1sq9poSL(u@ON!3c=QAzA~VB;kImvtsy_3oGbB&@ z1&|u__7GOhgDav^ZPIE|Li!~-qQW-&tVa#0bUk=+Wm@?^>W#cdA(yo-zC@*%uTmjG zWo?Xxaqbea)_Ol zxe&J(GThp$ z=)}6X6!gDq3y4|fo_?iQy(dO+J(%ply3XBN&YE%nKgg{&pVL?ycRWwS{DUjDC1?MF z#Fy4o?d|}gUz;*JwPkNNp&a3D%b}>h<1hqzk$o%YW7m0~O}4CUmBgihin~Bz(#2)2 z{v`|UP});Gl89?fHF91dHFhuAjbI=Tyt^zf`1d3@!a`3-9xbY0<$A(pD5Pp25cP+@ zl9ywRlw5Y{rOKT0i7n_eO&q*dY?Z+DjTS})X4(V6q$YomWQhr^u&ng5muNnj{8u01 z)gA+WEbIg_Y{5N)SSVyx#`o=o*rT!OD=U}Q5M!9Oa0-?-8N2)-|e7xiL z$(W`)DyO)(>Ca;2(cahhAzc^D>M?>+D})TVB6O00Jv!K~u+DKIS^g^>~Pu(zESi(ZkbG?(3*F zCuwLcMJM?sjLy;WjsP%fos>(iI48?Zp2Ff0n~ZF-x77X(fVtX9GK%D?YsdovAYUU> z+JZjW$hn)sHS+4i_re$gMPKwJo4%%&+r! zGK5FPi-UFSoy@Ft>+3t?euX6JoOWKUUXvRY35HNm1@@>__pz)wK93`j`)>{-ir{-MfZC&*A2~&E8 z+}pX@u+qAvfo(o`EMB)Ni5^QF(Yp=1ZE2Ja;!eqzt<0Hv8|BMY-1cJOL#c|2 zdtFPKFkhOswW}*F>8P18fY!}kpxm$vtbib6y59!lyXBdFrdDb-1S`aj$52XcD`O$P zY9|BI&;QgR2}bS(H&>W6ZF`Aje#kYbU+%AP-K4N~e54I3d06fql7Hd}L|V;zEFAN8 zy6BU;m5`HDTu+Rnc5ZeJE$Uyma@WfS51IY@GI)sEfOwz!c+e$1tb`0AJZwy_c075m zA8$Yp!PpexcvN3?DfoRN;ZI?4)hirtTkB`4+*ZdG$G&tPc1q@; zB=^kTBRORuT7e0MUDiuRj*XVZU)%t3z$p{vj2>}kNc+#vs$SG2@48>1VP%s10wP3v zTym7d&^v@oodRSwVS%!-5FQ4No z^LS$_Y#pCP)5bu8+}K?+4&Hc}T0&NS&@8KOZML|5#gi#hFLdEhc{M{OzAK47=OIvm3Sqw}=!!u>ADt zH87d%b%N83ymSW2NlWU^%%1zmM*@%5x|d^95nHf0@G&2u_n?3>9NEpsu8xl_>uDL7 z2@&ZrNNK;J(?X*nzYg;2feynspU0uFalg}P_avM{OO}E&n2>FOqDK&Rn)Kb*QJQmVZCu;-=!ykUu!06z)aY-KLfzzL6=ojpcqz{}p0o;%@4AUST=S!TPS+a_{JecNJv@a#@O81I_=` z!;M};1+3VZUUg=0u}`2t92Z4SkbI|vbo(O05KEW?;>sgIZvsUKj4W)7*5;HyV8l#} zAz#kY0B5M?@JOs4QY~65R0Jsq^R@uJOvc$C1Jfo7Pvl2HX{Ym>tj(#9cVN_!?ZYDH3c$q)jEF%Rnyifzpy zz*6~0RBNo^`J8Kp%Vbg5WDEmG!@mGK;^W%w`fWCc{hGjPp-V>$fMrll1Q4Q zBrFhD4G0!9tCk>tS>uJWabq6S0Tg`+NLJhhjAF`#VUm8?@pkro((E+dJo>0^vYlcL zkwZ}PaOaVQ+ne7z#wudi?&qutS?foYbKw+LU#BvU`K21{q^oj~%Du!PIm2mwu??vi z^L3R8ml~^Rx(|RLym?OX&e=F(auR*Fof+J)Z?D(wXb30Tt&5Q3AsMVqX9*-!6_|kL z`LRJ36WRO;%@B9+2S^l1Rx49P%08m8JQ1W1pyPtS2DX2pc&qCX8l(%;AFS$=+^NfO z8^e$S27H!bbXjRkJzp>wCi5FkeuY9G@6# zs&WOvvt~1gu^pIR2bRFP_i>oa$J46L94VCq!AY7W+Hv>JcyLG07h8rL6`{U+gti>K zK^Zv(S&`{hCWpQE5Z5~)O=Cihg|Gm0?!mu~qA9pVw!Sbl!3wuJW+wzK?fNB+ViNyZ|{?!Api_JH*;c5yFP+mf$VBm{fkA*cL{H$D^V_=^J-S| z8@a*rJnWldquQA}VSqcZhE7V9N9TII;TMfl>nX$0I5~L_^WPrA(dcIYapAg~+O}xk zV}t;B4|$UM76>nad8f?Zzotc;_)(Pnj!$5nLL`(QkLMCg^$WDkx(31C$08HYn2Z6M zmXgR{jCy=a5ywX5m8n-o84_RJ5njF6jmnPATRSIXZ)%*&MnBx3w3239%D^-*wQ4 zxtZ2#AiL8py)vvt8h7ESXYz%toq;gIueW+hHo{L57u5K`TRRw*BpfL2)qi9X+kXj; zVu*MbY}ly2TU}8mTH5rF@o=8 zPQl-DZk2vlsnXQbIaH!SRm(u)IvZwykbKS}n3RX>1iIB{9eLe-UrW$mhXVTJ+)j8D zbjo;l`Pk9bi{X%*fnOVu?f)t0Far{Jf|q4rkDj#15^i?C-*=rvdqK zs(4PPex5vc)GyV zaG(s1l|ioyv|#oH~1oxT-~YW!TqY+L>q@L3_15QN0ig)wniu!;&qk zGx)v)LVx#qn9!_(1wCOdIVE#L=YV5h=d>0n*P`isaYX=i`r(a*!*piK!U1N2mTxi3 z%v*Wp_WXmZXig68kuGdt%Kff%NCk7!;?|-(wHV|Ay_O6+Ml`0@**rA#Ul}-oeY!2? z{Ym&MPZi>33Sz5sqrx`3L13hC z+Y%27e3o3Kc>x(Ob#GDR)t%~fAjyLe#-AVf74k9|fbePd>L^UXLL)}GH0FkBLO>b1 z&NlV_1F=YiqX;M(ID^MD)sUvv+X$I021FNaJ~ZE2KDgJ*p_0RCDHfCB~Y zI#Kz?Zegf9aKgQ27g2X;d))WOnNh`utotE)$kI+C&8;?EJ+TYV)G6zX?T$lEweCeN z@;k9b?}|*51nor3wL)PaK(7-??l;qlncB=AeMsQc$zKFx5vL63>%VlvZUNTvl8IiY zML`>n08WYB<(eQxiAHH`io`td!lOK0kYV+ck{S)MtX_<7a&VS&)MMEwN1jNlKqVnp zzVE68BPNvQTy6cCKsR*@hf)7BNE8UdNpPO8im77eRHTINu2q(4XY&*$5D=x9holO7 zh+UI>!WhPhMNcn&%mDw+=!iX&+J2fF*#8NT=}Q^kX%P5Hh_tqR{GH(V%iiUBfOmFb z$yG03`m`;C8C{sc3sK%OA6!F0zIuQy%h+0~?ftm(RxEeVs!Q9!eUKRF-YN3s_OwJg zy~EYNwI$V+Bs`Ul!vCURerQo|3f>FO_?<4qT)50UBO=LkvX`X|aF*RXL8=H8Vo-@C z5WK!hC3~fcfM6QJ_^bva5q1|Af*PL3{?3uw@IYsDBy$T96rtVLy_Z4k-6|bgy?FQ3 zU-~x&jIoqi`)$CeUh86F2~xs;Epg`1M0zUMxO}?zCwJIm*NU#0go#U;9GVJf;DxsV zfL^je9D23{3g}MX`>|Jb8KhV)iyLf#$TnyVgrYI|!4d=I#|`C>Oe(WjX;|5Mqgpqn zwN|8gT9%;tS}>F%MR{TY6dnUG@{%zZ{Q{TOKlqH*2lwAZm+CI!VdwjXO*ER{BcDY; z@8JZ0UjZ#DvX^&V097i1^O8u&wC98EHP+y`e)8N)qx=1*0nk_ejgr0r#HG8Lz}iQp zKS|lV-D}OzQT_$Fx4jw`$H*QG5SR~21nRlT`~$>2db}b&!OG0xz`WAhaq7Zk+iViL z9VAehr@P_mUETHpNCYDuloR52z~m}jS81*VBwyiX6IqZ|*K?S;$0US%yVXqpib$)t z3yP%muNBuphILdf+f0<1LQ=ito?%7qvW-$i`wT6UVM*o-h?i$ot>Hn~!caMUVoP3% zhNI>ntbP%knz$L0EFJ5);LCARbI_x`_HcaiAUReakFP%PWl!3QhA=y`eGOeArC{NR z^kQj2#~9`r4fjQAc>T{y`z^*XaTxpn$e&IclP`bsWgvlq{Z+%bIXHa3oduDLLgus=IbZ12l}A+rZwrG^-y|b%LuC zsh!?Lm6`gRe%Knm|X!024%SnWrI7i4|>vBpt$P}Cq*R0`PRpU~P8F-a3 z_W$l;etMs7{>+h=TCM{NH*g5D=~VC}bTf61=wsQzC`87HWr*;i1_MdoXI%qrCjkr< zmQLF*cq-S*65Lj@KI2lB7f^DZ4GN~v@5G((WQ8ZAcWVol7(v8nt%yhm{!{8# zjODyyMSNnFpxXTm_NY}4yXuTa?!G7n_7AZ}Ve@PV;D<8|RA1ox7e22Wx+mCEuZKqF zPD=EK#U5hQ%ppCcTa|Pq37OOM6cVC;zNF1u1A1|RvNJFOwL#jPyC0Os)PEbg%6=e> zGfLHUlk0uv%qz-)S725*QUFRt<6tbn1e&Py!FV)q{=PPJ8IZ#0!a-T!A8_)?EUyWBNniy}7No^PES%l_tZ{Uk9SUAdAh%gktq zZiKq6@3s%@w~ra@$@p?f)T=IFiA7F{&8c8{lhs!IK(r1|(9WvZm*X&8?~LDS6^4@Z zyokNwN=^qgb{&jhWik2|5Egh+j2%-qYVa74RAzKk656EUZ<1{nbN`1{jXEY4MoMM%TD30=DoMf(iLQznb_!FG4v*NL!35@GoL|(Ow!IeXL z{ndeWSIueSfNRBRuQmFtK_t~%zl zi6-OkP>E=YT`c`#uXjg0cg~j?20>yc^tnT7ye?RqC{Y_7&h8AMllSzM`GsK0Kvzxe zFSz$p#qH!;#nCXgOBEwSMyH1i*Jj)+u7Ub?=mtaya; zid9ug*Fq_P^spH)`s+Ocu{BiD#gKlJjm+X0jn?L|9#SlrOC}jz5%Lka-ii*P`3xos zU>#xs!dgguCPb-0Y(STm7AnUbXz-uv^Q*k(Od zFCEdZkOW2*<(DXyUMsByGF+I?S*ebHwHF}5Dj%}VPs+kxhW{6=X~Y9kWBbOTjn+Mj z-CjGIcTl1*$-E1LFOQshfTQLi`HM$>UB6~_@p6>MAhE+v0Vz6npInNYPw^78g>1dMk6ak)k%coIy83+Ngt!9L6vsh{5HFB!C#Z24vnkjg*zb#kxag zFrD3E1i3~Xf8;U*l)pXT_ei@4Qh-hxArFlGR6RN>fW87i$ij!`%B0GzuCxr|v%R_k z?qEd~#vGmdl%k<-9POaUh7gS0lci34A~2SfIOXfpACA$Vq|e^pOl|J?V@U5%AQN;; zn7orX5is?V)^+8FOtdVy9e=coD`@^tpA2?liDOzDDffd6rK*t0zgL-wrLvDcuBulLtn71Gz~-VzW8GKL5@6uzZh*+Y3l-a{X!-A zPrnLS9EM%97z%ZQ4PpWu2FbXlvYt7xyP2JsF9EaD5MqCx()ZeDos6ubmuTWpeB?_b z%$e^){~2L$$iqXcM#yCis!gL6){JL*t((e;bgnIS2Y@}7m;y}dFtk;)XN0l9@wzD( zv*$xOjyKXUoLPEGE%SHZMLNCvvkFK@d($Vk7fl6G0)#wiP-Rrqz|Ogi(IRTx+PgxQ z5@UCZ0txxZrnvg7I)jXo+JR*~U)HVWg{PL0&Bc75_9m8^^~lidqRjIAQy`WeC@)`x zhM-$?&fPI6hn6$U`n9kJf6WSd&J{mv|&Hip7AeGTfNj1UPJgmsS zcWX88S=`_}P3mSq&q@}6=Ka-W3zSulSC+NfcPX2?>7a6~S5$IBCiU>P8sR*DD!@9m zGsSNl>F1KGzW6)S+&b?v940YWWiu^ryV72FTp%U}(EZgDSliSVlSX~~kk%O~3sO$o zhuqSGJJ3vaLM)@r4sRS(})7*-z>? z|71VC^Db8=HL?kb|H_RA>I0N+aDmxbCNWxb3D+IT`!>t=O29hL_{%Ym{J7jn!`^WX zpEy_|O*-x$tM$Zsske^E3juac^O^aA41w}j+c%oJ>Mba4{vcs%$P>r3{+J&C>kOvH zVB!r01Gfi)!$y9u(`V65vO;gL=SfMda6Nv4zD71u(*?^F5ggoes2z6916*G%P_59P|H#q8?VWF>WE zKW@V(yj&R_>~3jalWM!An%443A$h1`1%^Nne;H8NPYk!?ZEB}|uM$&owQ0~$#)qRg z2m9(-yKMOJw?>Vh?nc3|wR!7i)pv~nE832Dh;L<2zKn}L$t;c*e)r+)fJ>i`9=rd+ znAC>9yZz@olHLq16iH)xyo>bEFW!gv&3j(ree-C?y2?y$1#OkofB*qwRc)%{$T%{C zgVZ5as(oyQHrwwe^Jp)paCtp4>`N1pi0G9T<2@ZEt_ygo5=OY=+(8z*maiXe)hwHV zA>>D+CvcfXubFy3oB?nemR2!glbh8&Re21ZFfT0ea&mOID;Lf681!*J9q zMkuS}L+uxCH_08|D$dKy($(d#MHtVqGo=p|jr)Qq))+kmtl+~|D_~yNb~U|3iJk)+ftT?IImt>!R(l3$ z&qm7kzZJd?;*wWn)#M9zX~ztl{LKr|-yHbQWDJSWfyM`ieRfGqJ&^pp8iYMXs@(6c ze(+tCO8dYTU5Egq8c-2cKkF()U;bkHt~n;(aOe)AAD}6jGhy5J2awH#$Dovs06%5m!QBiq6-QB7R*?P`2~3lh(2}tdnT~h z%M51Ml}3z7;jF#Rfcya)>|z@wf;}%nz=eslccNhUtnGarUxYslw9k;W0>C0W^rSS?4KOEjQ) zna&v-V*EJYhnoK#}d(|jOMp3Cds>u1WZR$GiPP{6c4*4S(Amc zl0V7zl2ZIM`8EawvpTY2ek3IlIUc4gl0#M6OXE_shdgD8QCF{6QcbtKevgJG*QTvN z{<~9P4ZtF)mQQVyX@mywT}k5C;;azLWt6Y@J9IGl#^iDG2+mA926jI!kFeYYIZJI=f5Zcwg_I%+br}y` zY4gcd%+z3vsgcXFK8Bcinu%drGngw=X^@8=k}1q0*wcIs#Grzwr8pBTr9FKS));4& zKn!;547Wc+MXF2(ihPC#ZoR7vhP_fdf>FSxHTA7f{Acl4)V!eZ4mJt(9B11Ut63&; zw>Oiyr)i@%8;mZF%4|-JaDyz*v9ACha(!b57qe4XyLxj(20;rIaSwvq*sfO3iOYdC zP~v)g993|%6yYT3jlzFPWkCmSA>+h7a%ie|n7gDMO!;wL&h*>E^@p6AWn90Ynww_J)_D z;M-Sm?qi?_^m}t-1KZ6TYD>lQ!UaM5FLk-iuo)`{f~3~WO~`PWxFR$1Dr8&YP%*gn zDxt)VfRaF=e3uEWjo`c~`heAg;w@n0=rmCiLT>%v7NyL&RMj24Ag5oLky084^^0-z z5b>E)$LDo4A|5_TU#I@=xk9p6x9Xb~)VPosYJ~}sz5p_MNDu9RkaglRDIV_pueyVY z*u%_{aI=mOrWzPq)}^_6WFIPX!@KEFJ)5f*t`${Jk1R1a$#IHwJV`t5uX}99oTE#I zHl}M@JR@uMs6(Hx-Ma2zM@b?Uil{qz)BYdG#v2%^5 zS4iG39jUPQT@{a$QXxr$1ebkq2e*Z~dH?X7Z5*C5)~M{!4I79t&(L`fsF4eBaAFT5 zMc`@Ue){+GqmBQUwv{fA5i(`ZdD-pfM)DGZGpFt-ySWegzK-gm3J%Ik8cY~X?Vi>O zOXwckoG5FZe#-_F@96F4U-+PYP3HwXeJXd#w4)%3^s%$tRGwJ*2IlFvJM#{g-E?}T zPM%VM#+XkMdg3@04m-a4v%0`BcYts|fFHzme*QLf)BC@07{?O*O*yoP zSL{qrPXqHDlrkDSzhl=J8FfMK;QKF?s)`V)=>i7p*884kfAow8#jCK!c?HEdiFKF_ zpsm-@1cplLwr1$64p)%@_t+&v`5h*F{PcrPll4FGmd*_@w!y6kLe917qf(Wd4+?T2 z@g+iu{d_9M2Ns&g89HTy08j0Tl?u5YQY7`#5N~+=0_U8^INTHt4hWvdAIp5~ua&G` zyb&bje79o6fg>dcwz2kt@vrLy3$UhJX1W<%AF5nD^*;yTfgfqj0xOpIX57naj)xq=q`=51DEm&ENmMI{rFCB^pX#-LIL4QsrM>x{T zIgG->jAS8@Thj3VU4TRkLfG8e)Dq;BE=9JL#F|<9#|bP)jN8ia+Q(uw}1LH~T)B|W*{zh!uata_A? zg?vMm3V8ahKr92jr+X7)UDZEkTmcJ~yIP!W6D|y`bs63s<);yzfk6l3JP(SjQwZt# zS^1V@GFhQW7=;GF5lK zf#f2Jar$a?bfo4DIjy3Wxfli&4pp50 z?`{^iESOv*bX3yZ!eC5qYT`KBi(yeK(llEMqgqrtpu~VX|5;~G{%+ILr~io*NL~Cu z(k>;qlh-1j5BYY;3ENRl+JN5kge+|$70Tck-+mbV$a8joHos2W41SF_H;{wS^DvI6 z+C4W~yJiiGy!_{o`V!oSif=r_rwQlunNpIpGD2)wkLtScsY)wl2|rP<(FmAr5YE1B z?P>fJD1X50tHWc{Or|$-uA1qZEZ+1O`VsLSLnj0pPpFN1w?85+GHK{6C@@?`7(`0+ zE(TR@eA^SJvff!^Qj<9CM1F}u&?H=F&n29Xm!6wwI0OuLk0QG|6w&O41MFcJ+qo6> m^XeV~WeJ9omTyucSeNv2HLEjBQ=Zm-X+AqGRI`h)(!+49oA?F* literal 10324 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 Date: Mon, 11 Sep 2023 11:55:44 -0700 Subject: [PATCH 13/13] chore(main): release 2.23.0 (#1350) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 16 ++++++++++++++++ google/auth/version.py | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62b97cba8..b9c164ba4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,22 @@ [1]: https://pypi.org/project/google-auth/#history +## [2.23.0](https://github.com/googleapis/google-auth-library-python/compare/v2.22.0...v2.23.0) (2023-09-11) + + +### Features + +* Add get_bq_config_path() to _cloud_sdk.py ([9f52f66](https://github.com/googleapis/google-auth-library-python/commit/9f52f665247ada59278ffddaaef3ada9e419154c)) +* Add get_bq_config_path() to _cloud_sdk.py ([#1358](https://github.com/googleapis/google-auth-library-python/issues/1358)) ([9f52f66](https://github.com/googleapis/google-auth-library-python/commit/9f52f665247ada59278ffddaaef3ada9e419154c)) + + +### Bug Fixes + +* Expose universe domain in credentials ([#1380](https://github.com/googleapis/google-auth-library-python/issues/1380)) ([8b8fce6](https://github.com/googleapis/google-auth-library-python/commit/8b8fce6a1e1ca6e0199cb5f15a90af477bf1c853)) +* Make external_account resistant to string type 'expires_in' responses from non-compliant services ([#1379](https://github.com/googleapis/google-auth-library-python/issues/1379)) ([01d3770](https://github.com/googleapis/google-auth-library-python/commit/01d37706d6750c20952cf01b6a616b23aafa5be9)) +* Missing ssj for impersonate cred ([#1377](https://github.com/googleapis/google-auth-library-python/issues/1377)) ([7d453dc](https://github.com/googleapis/google-auth-library-python/commit/7d453dc6408b908e24312a7bd3dc380ad43220be)) +* Skip checking projectid on cred if env var is set ([#1349](https://github.com/googleapis/google-auth-library-python/issues/1349)) ([a4135a3](https://github.com/googleapis/google-auth-library-python/commit/a4135a3e9620a2cbf99957858c13780b92ff707c)) + ## [2.22.0](https://github.com/googleapis/google-auth-library-python/compare/v2.21.0...v2.22.0) (2023-07-06) diff --git a/google/auth/version.py b/google/auth/version.py index 1e886a112..491187e6d 100644 --- a/google/auth/version.py +++ b/google/auth/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.22.0" +__version__ = "2.23.0"