diff --git a/dvc/dirs.py b/dvc/dirs.py index 59223b767..c6737678d 100644 --- a/dvc/dirs.py +++ b/dvc/dirs.py @@ -21,6 +21,19 @@ def global_config_dir(): def site_cache_dir(): + from platformdirs import PlatformDirs + from platformdirs.unix import Unix + + if issubclass(Unix, PlatformDirs): + # Return the cache directory shared by users, e.g. `/var/tmp/$appname` + # NOTE: platformdirs>=5 changed `site_cache_dir` to return /var/cache/$appname. + # as the following path is considered insecure. + # For details, see: https://github.com/tox-dev/platformdirs/pull/239 + + # FIXME: keeping the old behavior temporarily to avoid dependency conflict. + # In the future, consider migrating to a more secure directory. + return f"/var/tmp/{APPNAME}" # noqa: S108 + return os.getenv(env.DVC_SITE_CACHE_DIR) or platformdirs.site_cache_dir( APPNAME, APPAUTHOR, opinion=True ) diff --git a/pyproject.toml b/pyproject.toml index 4a72156d8..7bc860c08 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,7 +57,7 @@ dependencies = [ "omegaconf", "packaging>=19", "pathspec>=0.10.3", - "platformdirs<4,>=3.1.1", + "platformdirs<5,>=3.1.1", "psutil>=5.8", "pydot>=1.2.4", "pygtrie>=2.3.2", diff --git a/tests/unit/test_dirs.py b/tests/unit/test_dirs.py index 5ae2acba0..0098c0cbf 100644 --- a/tests/unit/test_dirs.py +++ b/tests/unit/test_dirs.py @@ -1,4 +1,8 @@ -from dvc.dirs import global_config_dir +import sys + +import pytest + +from dvc.dirs import global_config_dir, site_cache_dir from dvc.env import DVC_GLOBAL_CONFIG_DIR @@ -6,3 +10,8 @@ def test_global_config_dir_respects_env_var(monkeypatch): path = "/some/random/path" monkeypatch.setenv(DVC_GLOBAL_CONFIG_DIR, path) assert global_config_dir() == path + + +@pytest.mark.skipif(sys.platform != "linux", reason="Only for Unix platforms") +def test_site_cache_dir_on_unix(): + assert site_cache_dir() == "/var/tmp/dvc"