| Index: client/third_party/google/auth/_cloud_sdk.py
|
| diff --git a/client/third_party/google/auth/_cloud_sdk.py b/client/third_party/google/auth/_cloud_sdk.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..428b612c664defce1ccc82a940a3064c069aed6f
|
| --- /dev/null
|
| +++ b/client/third_party/google/auth/_cloud_sdk.py
|
| @@ -0,0 +1,133 @@
|
| +# Copyright 2015 Google Inc.
|
| +#
|
| +# Licensed under the Apache License, Version 2.0 (the "License");
|
| +# you may not use this file except in compliance with the License.
|
| +# You may obtain a copy of the License at
|
| +#
|
| +# http://www.apache.org/licenses/LICENSE-2.0
|
| +#
|
| +# Unless required by applicable law or agreed to in writing, software
|
| +# distributed under the License is distributed on an "AS IS" BASIS,
|
| +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +# See the License for the specific language governing permissions and
|
| +# limitations under the License.
|
| +
|
| +"""Helpers for reading the Google Cloud SDK's configuration."""
|
| +
|
| +import json
|
| +import os
|
| +import subprocess
|
| +
|
| +import six
|
| +
|
| +from google.auth import environment_vars
|
| +import google.oauth2.credentials
|
| +
|
| +# The Google OAuth 2.0 token endpoint. Used for authorized user credentials.
|
| +_GOOGLE_OAUTH2_TOKEN_ENDPOINT = 'https://accounts.google.com/o/oauth2/token'
|
| +
|
| +# The ~/.config subdirectory containing gcloud credentials.
|
| +_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
|
| +# credentials.
|
| +_CREDENTIALS_FILENAME = 'application_default_credentials.json'
|
| +# The command to get the Cloud SDK configuration
|
| +_CLOUD_SDK_CONFIG_COMMAND = (
|
| + 'gcloud', 'config', 'config-helper', '--format', 'json')
|
| +
|
| +
|
| +def get_config_path():
|
| + """Returns the absolute path the the Cloud SDK's configuration directory.
|
| +
|
| + Returns:
|
| + str: The Cloud SDK config path.
|
| + """
|
| + # If the path is explicitly set, return that.
|
| + try:
|
| + return os.environ[environment_vars.CLOUD_SDK_CONFIG_DIR]
|
| + except KeyError:
|
| + pass
|
| +
|
| + # 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%\gcloud
|
| + else:
|
| + try:
|
| + return os.path.join(
|
| + 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_application_default_credentials_path():
|
| + """Gets the path to the application default credentials file.
|
| +
|
| + The path may or may not exist.
|
| +
|
| + Returns:
|
| + str: The full path to application default credentials.
|
| + """
|
| + config_path = get_config_path()
|
| + return os.path.join(config_path, _CREDENTIALS_FILENAME)
|
| +
|
| +
|
| +def load_authorized_user_credentials(info):
|
| + """Loads an authorized user credential.
|
| +
|
| + Args:
|
| + info (Mapping[str, str]): The loaded file's data.
|
| +
|
| + Returns:
|
| + google.oauth2.credentials.Credentials: The constructed credentials.
|
| +
|
| + Raises:
|
| + ValueError: if the info is in the wrong format or missing data.
|
| + """
|
| + keys_needed = set(('refresh_token', 'client_id', 'client_secret'))
|
| + missing = keys_needed.difference(six.iterkeys(info))
|
| +
|
| + if missing:
|
| + raise ValueError(
|
| + 'Authorized user info was not in the expected format, missing '
|
| + 'fields {}.'.format(', '.join(missing)))
|
| +
|
| + return google.oauth2.credentials.Credentials(
|
| + None, # No access token, must be refreshed.
|
| + refresh_token=info['refresh_token'],
|
| + token_uri=_GOOGLE_OAUTH2_TOKEN_ENDPOINT,
|
| + client_id=info['client_id'],
|
| + client_secret=info['client_secret'])
|
| +
|
| +
|
| +def get_project_id():
|
| + """Gets the project ID from the Cloud SDK.
|
| +
|
| + Returns:
|
| + Optional[str]: The project ID.
|
| + """
|
| +
|
| + try:
|
| + output = subprocess.check_output(
|
| + _CLOUD_SDK_CONFIG_COMMAND,
|
| + stderr=subprocess.STDOUT)
|
| + except (subprocess.CalledProcessError, OSError, IOError):
|
| + return None
|
| +
|
| + try:
|
| + configuration = json.loads(output.decode('utf-8'))
|
| + except ValueError:
|
| + return None
|
| +
|
| + try:
|
| + return configuration['configuration']['properties']['core']['project']
|
| + except KeyError:
|
| + return None
|
|
|