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 15589afb9..8ff3d3792 100644 Binary files a/system_tests/secrets.tar.enc and b/system_tests/secrets.tar.enc differ 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")