From f9cbae76ac62710206d2a6490a0250fb72f5b97b Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 10 Aug 2026 18:51:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=B2=BE=E7=AE=80:=20?= =?UTF-8?q?=E5=BA=8F=E5=8F=B7+=E6=96=87=E4=BB=B6=E5=90=8D(=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E5=90=8D=E6=88=AA=E6=96=AD)+=E5=A4=A7=E5=B0=8F;=20?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD/=E5=88=A0=E9=99=A4=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=BA=8F=E5=8F=B7=20(file=5Fid=20=E5=85=BC=E5=AE=B9);=20TUI=20?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E6=94=B9=E5=BA=8F=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/7z-encrypt-client-bin/DEBIAN/control | 2 +- debian/7z-encrypt-client-bin/DEBIAN/md5sums | 6 +++--- debian/7z-encrypt-client/DEBIAN/control | 2 +- debian/7z-encrypt-client/DEBIAN/md5sums | 4 ++-- .../usr/share/7z-encrypt/transfer.py | 19 +++++++++++++++++-- .../usr/share/7z-encrypt/tui.py | 16 ++++++++-------- transfer.py | 19 +++++++++++++++++-- 7 files changed, 49 insertions(+), 19 deletions(-) diff --git a/debian/7z-encrypt-client-bin/DEBIAN/control b/debian/7z-encrypt-client-bin/DEBIAN/control index 8079282..289a715 100644 --- a/debian/7z-encrypt-client-bin/DEBIAN/control +++ b/debian/7z-encrypt-client-bin/DEBIAN/control @@ -3,7 +3,7 @@ Source: 7z-encrypt-client Version: 1.0.0 Architecture: amd64 Maintainer: edgevoid -Installed-Size: 51858 +Installed-Size: 51870 Depends: p7zip-full Conflicts: 7z-encrypt-client Replaces: 7z-encrypt-client diff --git a/debian/7z-encrypt-client-bin/DEBIAN/md5sums b/debian/7z-encrypt-client-bin/DEBIAN/md5sums index 4e54375..eb03afd 100644 --- a/debian/7z-encrypt-client-bin/DEBIAN/md5sums +++ b/debian/7z-encrypt-client-bin/DEBIAN/md5sums @@ -1,6 +1,6 @@ -b7ec4ffff510e79070edf4685f0ba9a1 usr/bin/sz-backup +a7346d13df51c26822c41489cfbbd106 usr/bin/sz-backup 61901c8e9af062eef5c386c715f5f3bb usr/bin/sz-config -02b57eea9c5ca54c63fd82da1d6d960b usr/bin/sz-transfer -8f9902ebfd228e08f7691abe6d471d86 usr/bin/sz-tui +c1b6ac06ad3d991b6ad61ecff97a91d1 usr/bin/sz-transfer +ae6b68e345a0f5f3397aa8ead8a199f1 usr/bin/sz-tui 198943ad7a94f6ba0995cf2d326f66d4 usr/share/doc/7z-encrypt-client-bin/changelog.gz fadf3972cc61c7c76d0ccc20b29a804c usr/share/doc/7z-encrypt-client-bin/copyright diff --git a/debian/7z-encrypt-client/DEBIAN/control b/debian/7z-encrypt-client/DEBIAN/control index 5df66e1..e237568 100644 --- a/debian/7z-encrypt-client/DEBIAN/control +++ b/debian/7z-encrypt-client/DEBIAN/control @@ -2,7 +2,7 @@ Package: 7z-encrypt-client Version: 1.0.0 Architecture: all Maintainer: edgevoid -Installed-Size: 117 +Installed-Size: 118 Depends: python3 (>= 3.10), python3-venv, p7zip-full Section: utils Priority: optional diff --git a/debian/7z-encrypt-client/DEBIAN/md5sums b/debian/7z-encrypt-client/DEBIAN/md5sums index 9f42108..e8ac13e 100644 --- a/debian/7z-encrypt-client/DEBIAN/md5sums +++ b/debian/7z-encrypt-client/DEBIAN/md5sums @@ -8,7 +8,7 @@ dcb31e74e0a6ee8073337fc4fb2acf99 usr/share/7z-encrypt/config.py 21062e04f8c7f4471881a39c489dfa73 usr/share/7z-encrypt/metadata.py 3478ac8277b4b1a38694ad0cc8cdbcdb usr/share/7z-encrypt/splitter.py b90b8c950f99e1439bc273f50a2ee0a6 usr/share/7z-encrypt/state.py -342458cd8e61337d5ee659fc24ccac8b usr/share/7z-encrypt/transfer.py -12cb430b890a6ef5a532dbb8523b0f54 usr/share/7z-encrypt/tui.py +c922430309b2a680ff757f3b02561ec9 usr/share/7z-encrypt/transfer.py +67d4b90265abf5a72af959f66679dd0f usr/share/7z-encrypt/tui.py 198943ad7a94f6ba0995cf2d326f66d4 usr/share/doc/7z-encrypt-client/changelog.gz fadf3972cc61c7c76d0ccc20b29a804c usr/share/doc/7z-encrypt-client/copyright diff --git a/debian/7z-encrypt-client/usr/share/7z-encrypt/transfer.py b/debian/7z-encrypt-client/usr/share/7z-encrypt/transfer.py index 80710fd..052af78 100644 --- a/debian/7z-encrypt-client/usr/share/7z-encrypt/transfer.py +++ b/debian/7z-encrypt-client/usr/share/7z-encrypt/transfer.py @@ -384,6 +384,17 @@ def _load_keyring_path() -> Path: return DEFAULT_KEYRING +def _resolve_id(client: TransferClient, ref: str) -> str: + """文件引用解析: 纯数字 = 列表序号 (1-based), 否则视为 file_id""" + if ref.isdigit(): + files = client.list_files() + idx = int(ref) - 1 + if not 0 <= idx < len(files): + raise TransferError(f"序号越界: {ref} (共 {len(files)} 个文件)") + return files[idx]["file_id"] + return ref + + def main() -> int: ap = argparse.ArgumentParser(description="传输客户端: 上传 / 文件列表 / 下载") ap.add_argument("--server", default=None, help="服务端地址 (默认读配置 server.url)") @@ -454,14 +465,17 @@ def main() -> int: print(f"[错误] {e}") return 1 print(f"[文件] 共 {len(files)} 个:") - for f in files: + for i, f in enumerate(files, 1): size_mb = f["size"] / 1048576 name = _decrypt_name(f["file_name"]) or f["file_name"] - print(f" {f['file_id']} {name} ({size_mb:.1f} MB) {f['created_at']}") + if name.startswith("enc:"): + name = name[:22] + "..." # 加密名截断 (keyring 无对应密钥) + print(f" {i:>2}. {name} ({size_mb:.1f} MB)") return 0 if args.download: try: + args.download = _resolve_id(client, args.download) dest_arg = Path(args.out) if args.out else None if args.decrypt: # 密文先落临时 .enc, 本地解密后删 @@ -549,6 +563,7 @@ def main() -> int: if args.delete: try: + args.delete = _resolve_id(client, args.delete) client.delete_file(args.delete) except TransferError as e: print(f"[错误] {e}") diff --git a/debian/7z-encrypt-client/usr/share/7z-encrypt/tui.py b/debian/7z-encrypt-client/usr/share/7z-encrypt/tui.py index 6e8be77..22cdecb 100644 --- a/debian/7z-encrypt-client/usr/share/7z-encrypt/tui.py +++ b/debian/7z-encrypt-client/usr/share/7z-encrypt/tui.py @@ -239,7 +239,7 @@ def files_list() -> None: def download() -> None: - """下载: 先列文件, 再选 file_id, 本地解密还原""" + """下载: 先列文件, 再选序号, 本地解密还原""" print("--- 下载文件 ---") server = _clean(input(f"服务器 [{_default_server()}]: ")) or _default_server() if not server.startswith(("http://", "https://")): @@ -248,11 +248,11 @@ def download() -> None: if code != 0: print("[失败] 获取列表出错, 无法下载") return - file_id = _clean(input("file_id: ")) - if not file_id: + ref = _clean(input("序号 (列表里的编号, 如 3): ")) + if not ref: return out = _clean(input("保存路径 [当前目录/服务端文件名]: ")) - args = ["transfer.py", "--server", server, "--download", file_id, "--decrypt"] + args = ["transfer.py", "--server", server, "--download", ref, "--decrypt"] if out: args += ["--out", out] code = run(args) @@ -260,7 +260,7 @@ def download() -> None: def delete_file() -> None: - """删除: 先列文件, 再选 file_id 删除""" + """删除: 先列文件, 再选序号删除""" print("--- 删除文件 ---") server = _clean(input(f"服务器 [{_default_server()}]: ")) or _default_server() if not server.startswith(("http://", "https://")): @@ -269,10 +269,10 @@ def delete_file() -> None: if code != 0: print("[失败] 获取列表出错, 无法删除") return - file_id = _clean(input("要删除的 file_id: ")) - if not file_id: + ref = _clean(input("要删除的序号: ")) + if not ref: return - code = run(["transfer.py", "--server", server, "--delete", file_id]) + code = run(["transfer.py", "--server", server, "--delete", ref]) print("[完成]" if code == 0 else "[失败] 删除出错") diff --git a/transfer.py b/transfer.py index 80710fd..052af78 100644 --- a/transfer.py +++ b/transfer.py @@ -384,6 +384,17 @@ def _load_keyring_path() -> Path: return DEFAULT_KEYRING +def _resolve_id(client: TransferClient, ref: str) -> str: + """文件引用解析: 纯数字 = 列表序号 (1-based), 否则视为 file_id""" + if ref.isdigit(): + files = client.list_files() + idx = int(ref) - 1 + if not 0 <= idx < len(files): + raise TransferError(f"序号越界: {ref} (共 {len(files)} 个文件)") + return files[idx]["file_id"] + return ref + + def main() -> int: ap = argparse.ArgumentParser(description="传输客户端: 上传 / 文件列表 / 下载") ap.add_argument("--server", default=None, help="服务端地址 (默认读配置 server.url)") @@ -454,14 +465,17 @@ def main() -> int: print(f"[错误] {e}") return 1 print(f"[文件] 共 {len(files)} 个:") - for f in files: + for i, f in enumerate(files, 1): size_mb = f["size"] / 1048576 name = _decrypt_name(f["file_name"]) or f["file_name"] - print(f" {f['file_id']} {name} ({size_mb:.1f} MB) {f['created_at']}") + if name.startswith("enc:"): + name = name[:22] + "..." # 加密名截断 (keyring 无对应密钥) + print(f" {i:>2}. {name} ({size_mb:.1f} MB)") return 0 if args.download: try: + args.download = _resolve_id(client, args.download) dest_arg = Path(args.out) if args.out else None if args.decrypt: # 密文先落临时 .enc, 本地解密后删 @@ -549,6 +563,7 @@ def main() -> int: if args.delete: try: + args.delete = _resolve_id(client, args.delete) client.delete_file(args.delete) except TransferError as e: print(f"[错误] {e}")