| 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
 | 
| 
 |