# which includes the fix to <https://twistedmatrix.com/trac/ticket/411>.
# * The SFTP frontend depends on Twisted 11.0.0 to fix the SSH server
# rekeying bug <https://twistedmatrix.com/trac/ticket/4395>
+ # * The FTP frontend depends on Twisted >=11.1.0 for
+ # filepath.Permissions
# * We don't want Twisted >= 12.2.0 to avoid a dependency of its endpoints
# code on pywin32. <https://tahoe-lafs.org/trac/tahoe-lafs/ticket/2028>
#
- "Twisted >= 11.0.0, <= 12.1.0",
+ "Twisted >= 11.1.0, <= 12.1.0",
# * We need Nevow >= 0.9.33 to avoid a bug in Nevow's setup.py
# which imported twisted at setup time.
class NoParentError(Exception):
pass
-if hasattr(filepath, "Permissions"):
- # filepath.Permissions was added in Twisted-11.1.0, but we're compatible
- # back to 11.0.0 (on windows). Fortunately we don't really need to
- # provide anything more than an int until Twisted-15.0.0 .
- class IntishPermissions(filepath.Permissions):
- def __init__(self, statModeInt):
- self.statModeInt = statModeInt
- filepath.Permissions.__init__(self, statModeInt)
- def __and__(self, other):
- return self.statModeInt & other
-else:
- IntishPermissions = lambda statModeInt: statModeInt
+# filepath.Permissions was added in Twisted-11.1.0, which we require. Twisted
+# <15.0.0 expected an int, and only does '&' on it. Twisted >=15.0.0 expects
+# a filepath.Permissions. This satisfies both.
+
+class IntishPermissions(filepath.Permissions):
+ def __init__(self, statModeInt):
+ self._tahoe_statModeInt = statModeInt
+ filepath.Permissions.__init__(self, statModeInt)
+ def __and__(self, other):
+ return self._tahoe_statModeInt & other
class Handler:
implements(ftp.IFTPShell)
elif key == "directory":
value = isdir
elif key == "permissions":
- # Twisted-14.0.2 expected an int, and used it in a rendering
- # function that did (mode & NUMBER). Twisted-15.0.0 expects a
+ # Twisted-14.0.2 (and earlier) expected an int, and used it
+ # in a rendering function that did (mode & NUMBER).
+ # Twisted-15.0.0 expects a
# twisted.python.filepath.Permissions , and calls its
- # .shorthand() method. Try to provide both.
+ # .shorthand() method. This provides both both.
value = IntishPermissions(0600)
elif key == "hardlinks":
value = 1
actual_list, expected_list))
for (a, b) in zip(actual_list, expected_list):
(name, meta) = a
- # convert meta.permissions to int for comparison. When we run
- # against many (but not all) versions of Twisted, this is a
- # filepath.Permissions object, not an int
- meta = list(meta)
- meta[2] = meta[2] & 0xffffffff
(expected_name, expected_meta) = b
self.failUnlessReallyEqual(name, expected_name)
self.failUnlessReallyEqual(meta, expected_meta)
expected_root = [
('loop',
- [0, True, 0600, 1, self.FALL_OF_BERLIN_WALL, 'alice', 'alice', '??']),
+ [0, True, ftpd.IntishPermissions(0600), 1, self.FALL_OF_BERLIN_WALL, 'alice', 'alice', '??']),
('immutable',
- [23, False, 0600, 1, self.TURN_OF_MILLENIUM, 'alice', 'alice', '??']),
+ [23, False, ftpd.IntishPermissions(0600), 1, self.TURN_OF_MILLENIUM, 'alice', 'alice', '??']),
('mutable',
# timestamp should be 0 if no timestamp metadata is present
- [0, False, 0600, 1, 0, 'alice', 'alice', '??'])]
+ [0, False, ftpd.IntishPermissions(0600), 1, 0, 'alice', 'alice', '??'])]
d.addCallback(lambda root: self._compareDirLists(root, expected_root))