Date: Tue, 22 Oct 2024 12:47:30 +0200 Subject: Workaround for isabs() on Windows + Python 3.13 (#652) Starting from Python 3.13, `os.path.isabs("/foo")` on Windows return `False` diff --git a/pyftpdlib/filesystems.py b/pyftpdlib/filesystems.py index 9b9326bf..320ffe40 100644 --- a/pyftpdlib/filesystems.py +++ b/pyftpdlib/filesystems.py @@ -132,6 +132,16 @@ def cwd(self, path): # --- Pathname / conversion utilities + @staticmethod + def _isabs(path, _windows=os.name == "nt"): + # Windows + Python 3.13: isabs() changed so that a path + # starting with "/" is no longer considered absolute. + # https://github.com/python/cpython/issues/44626 + # https://github.com/python/cpython/pull/113829/ + if _windows and path.startswith("/"): + return True + return os.path.isabs(path) + def ftpnorm(self, ftppath): """Normalize a "virtual" ftp pathname (typically the raw string coming from client) depending on the current working directory. @@ -146,3 +156,3 @@ assert isinstance(ftppath, unicode), ftppath - if os.path.isabs(ftppath): + if self._isabs(ftppath): p = os.path.normpath(ftppath) @@ -162,3 +172,3 @@ # This is for extra protection, maybe not really necessary. - if not os.path.isabs(p): + if not self._isabs(p): p = u("/") @@ -201,3 +211,3 @@ assert isinstance(fspath, unicode), fspath - if os.path.isabs(fspath): + if self._isabs(fspath): p = os.path.normpath(fspath)