def _prepare_credentials(self, **config): from azure.identity.aio import DefaultAzureCredential # Disable spam from failed cred types for DefaultAzureCredential logging.getLogger("azure.identity.aio").setLevel(logging.ERROR) login_info = {} login_info["connection_string"] = config.get( "connection_string", _az_config().get("storage", "connection_string", None), ) login_info["account_name"] = config.get( "account_name", _az_config().get("storage", "account", None)) login_info["account_key"] = config.get( "account_key", _az_config().get("storage", "key", None)) login_info["sas_token"] = config.get( "sas_token", _az_config().get("storage", "sas_token", None)) login_info["tenant_id"] = config.get("tenant_id") login_info["client_id"] = config.get("client_id") login_info["client_secret"] = config.get("client_secret") if not (login_info["account_name"] or login_info["connection_string"]): raise AzureAuthError( "Authentication to Azure Blob Storage requires either " "account_name or connection_string.\nLearn more about " "configuration settings at " + format_link("https://man.dvc.org/remote/modify")) any_secondary = any(value for key, value in login_info.items() if key != "account_name") if (login_info["account_name"] and not any_secondary and not config.get("allow_anonymous_login", False)): with fsspec_loop(): login_info["credential"] = DefaultAzureCredential( exclude_interactive_browser_credential=False) for login_method, required_keys in [ # noqa ("connection string", ["connection_string"]), ( "AD service principal", ["tenant_id", "client_id", "client_secret"], ), ("account key", ["account_name", "account_key"]), ("SAS token", ["account_name", "sas_token"]), ( f"default credentials ({_DEFAULT_CREDS_STEPS})", ["account_name", "credential"], ), ("anonymous login", ["account_name"]), ]: if all(login_info.get(key) is not None for key in required_keys): break else: login_method = None self.login_method = login_method return login_info
def _prepare_credentials(self, **config): import aiohttp from fsspec.asyn import fsspec_loop from dvc.config import ConfigError credentials = {} client_kwargs = credentials.setdefault("client_kwargs", {}) if config.get("auth"): user = config.get("user") password = config.get("password") custom_auth_header = config.get("custom_auth_header") if password is None and config.get("ask_password"): password = ask_password(config.get("url"), user or "custom") auth_method = config["auth"] if auth_method == "basic": if user is None or password is None: raise ConfigError( "HTTP 'basic' authentication require both " "'user' and 'password'") client_kwargs["auth"] = aiohttp.BasicAuth(user, password) elif auth_method == "custom": if custom_auth_header is None or password is None: raise ConfigError( "HTTP 'custom' authentication require both " "'custom_auth_header' and 'password'") credentials["headers"] = {custom_auth_header: password} else: raise NotImplementedError( f"Auth method {auth_method!r} is not supported.") # Force cleanup of closed SSL transports. # https://github.com/iterative/dvc/issues/7414 connector_kwargs = {"enable_cleanup_closed": True} if "ssl_verify" in config: connector_kwargs.update(ssl=make_context(config["ssl_verify"])) with fsspec_loop(): client_kwargs["connector"] = aiohttp.TCPConnector( **connector_kwargs) # The connector should not be owned by aiohttp.ClientSession since # it is closed by fsspec (HTTPFileSystem.close_session) client_kwargs["connector_owner"] = False # Allow reading proxy configurations from the environment. client_kwargs["trust_env"] = True credentials["get_client"] = self.get_client self.upload_method = config.get("method", "POST") return credentials
def _prepare_credentials(self, **config): import aiohttp from fsspec.asyn import fsspec_loop from dvc.config import ConfigError credentials = {} client_kwargs = credentials.setdefault("client_kwargs", {}) if config.get("auth"): user = config.get("user") password = config.get("password") custom_auth_header = config.get("custom_auth_header") if password is None and config.get("ask_password"): password = ask_password(config.get("url"), user or "custom") auth_method = config["auth"] if auth_method == "basic": if user is None or password is None: raise ConfigError( "HTTP 'basic' authentication require both " "'user' and 'password'" ) client_kwargs["auth"] = aiohttp.BasicAuth(user, password) elif auth_method == "custom": if custom_auth_header is None or password is None: raise ConfigError( "HTTP 'custom' authentication require both " "'custom_auth_header' and 'password'" ) credentials["headers"] = {custom_auth_header: password} else: raise NotImplementedError( f"Auth method {auth_method!r} is not supported." ) if "ssl_verify" in config: with fsspec_loop(): client_kwargs["connector"] = aiohttp.TCPConnector( ssl=make_context(config["ssl_verify"]) ) # Allow reading proxy configurations from the environment. client_kwargs["trust_env"] = True credentials["get_client"] = self.get_client self.upload_method = config.get("method", "POST") return credentials