diff --git a/copyparty/__main__.py b/copyparty/__main__.py index bd166936c..01e7b3901 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -1700,6 +1700,7 @@ def add_sftp(ap): ap2.add_argument("--sftp-anon", metavar="TXT", type=u, default="", help="allow anonymous/unauthenticated connections with \033[33mTXT\033[0m as username") ap2.add_argument("--sftp-hostk", metavar="FP", type=u, default=E.cfg, help="path to folder with hostkeys, for example 'ssh_host_rsa_key'; missing keys will be generated") ap2.add_argument("--sftp-fastldr", action="store_true", help="speedhack for 'loading hostkeys' on old CPUs; only use with known-good hostkeys") + ap2.add_argument("--sftp-chattr", metavar="T", default="s", help="which attributes can be modified with chattr? [\033[32ms\033[0m]=size, [\033[32mt\033[0m]=mtime, [\033[32mp\033[0m]=permissions, [\033[32mu\033[0m]=uid/gid. Example: [\033[32mstpu\033[0m]") ap2.add_argument("--sftp-banner", metavar="T", type=u, default="", help="bannertext to send when someone connects; can be @filepath") ap2.add_argument("--sftp-ipa", metavar="CIDR", type=u, default="", help="only accept connections from IP-addresses inside \033[33mCIDR\033[0m (comma-separated); specify [\033[32many\033[0m] to disable inheriting \033[33m--ipa\033[0m / \033[33m--ipar\033[0m. Examples: [\033[32mlan\033[0m] or [\033[32m10.89.0.0/16, 192.168.33.0/24\033[0m]") ap2.add_argument("--sftp-hs-t", metavar="SEC", type=int, default=15, help="connection handshake timeout in seconds") diff --git a/copyparty/sftpd.py b/copyparty/sftpd.py index 657aded87..921f95127 100644 --- a/copyparty/sftpd.py +++ b/copyparty/sftpd.py @@ -311,6 +311,17 @@ class SFTP_Srv(paramiko.SFTPServerInterface): if self.uname == LEELOO_DALLAS: raise Exception("send her back") + cm = 0 + for zs, zi in ( + ("s", SATTR.FLAG_SIZE), + ("t", SATTR.FLAG_AMTIME), + ("p", SATTR.FLAG_PERMISSIONS), + ("u", SATTR.FLAG_UIDGID), + ): + if zs in self.args.sftp_chattr: + cm |= zi + self.chattr_mask = cm + self.vols = [ vp for vp, vn in self.asrv.vfs.all_vols.items() @@ -735,6 +746,7 @@ class SFTP_Srv(paramiko.SFTPServerInterface): def _chattr(self, vp: str, attr: SATTR) -> int: self.log("chattr(%s, %s)" % (vp, attr)) try: + attr._flags &= self.chattr_mask ap, _, _ = self.v2a(vp, w=True, d=True) paramiko.SFTPServer.set_file_attr(ap, attr) return SFTP_OK