patch pyftpdlib, fixes #539

upgrading pyftpdlib brings only pain and no benefits
so grafting a patch for this instead
This commit is contained in:
ed 2025-08-10 11:23:22 +00:00
parent 3c78c6a880
commit 8ba98877ee
2 changed files with 42 additions and 0 deletions

View file

@ -217,6 +217,7 @@ necho() {
tar -zxf $f tar -zxf $f
mv pyftpdlib-*/pyftpdlib . mv pyftpdlib-*/pyftpdlib .
rm -rf pyftpdlib-* pyftpdlib/test rm -rf pyftpdlib-* pyftpdlib/test
patch -p1 <../scripts/patches/pyftpdlib-win313.patch
for f in pyftpdlib/_async{hat,ore}.py; do for f in pyftpdlib/_async{hat,ore}.py; do
[ -e "$f" ] || continue; [ -e "$f" ] || continue;
iawk 'NR<4||NR>27||!/^#/;NR==4{print"# license: https://opensource.org/licenses/ISC\n"}' $f iawk 'NR<4||NR>27||!/^#/;NR==4{print"# license: https://opensource.org/licenses/ISC\n"}' $f

View file

@ -0,0 +1,41 @@
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)