tui: 菜单 7 密钥导出 (红色风险警告 + 二次确认 yes/CONFIRM, 导出权限 600)
This commit is contained in:
@@ -10,6 +10,7 @@ vue-tui 的 raw mode 输入无法配合 IME, Python cooked-mode input() 可以)
|
||||
import glob
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
@@ -186,6 +187,41 @@ def delete_file() -> None:
|
||||
print("[完成]" if code == 0 else "[失败] 删除出错")
|
||||
|
||||
|
||||
def export_key() -> None:
|
||||
"""密钥导出: 红色风险警告 + 二次确认 (防误操作)"""
|
||||
print("--- 密钥导出 ---")
|
||||
print()
|
||||
print("\033[91m" + "═" * 52 + "\033[0m")
|
||||
print("\033[91m ⚠ 危险操作警告\033[0m")
|
||||
print()
|
||||
print("\033[91m 密钥是解密你所有文件的唯一凭证!\033[0m")
|
||||
print("\033[91m 导出后:\033[0m")
|
||||
print("\033[91m · 任何人拿到此文件都能解密你服务器上的全部密文\033[0m")
|
||||
print("\033[91m · 密钥泄露 = 数据完全暴露, 无法撤销\033[0m")
|
||||
print("\033[91m · 请确保导出文件安全存放, 不要发到聊天/网盘/邮件\033[0m")
|
||||
print("\033[91m · 用途: 备份 / 迁移到新设备 (新设备导入后可解密)\033[0m")
|
||||
print("\033[91m" + "═" * 52 + "\033[0m")
|
||||
print()
|
||||
c1 = input("是否了解风险并继续? (输入 yes 继续): ").strip().lower()
|
||||
if c1 != "yes":
|
||||
print("[取消] 未导出")
|
||||
return
|
||||
c2 = input("再次确认: 输入 CONFIRM 才执行导出: ").strip()
|
||||
if c2 != "CONFIRM":
|
||||
print("[取消] 未导出")
|
||||
return
|
||||
keyring = Path(f"{CLIENT_DIR}/config/keyring.json")
|
||||
if not keyring.exists():
|
||||
print("[错误] 密钥文件不存在, 无法导出")
|
||||
return
|
||||
out = _clean(input(f"导出到路径 [~/keyring-export.json]: "))
|
||||
out = out or str(Path.home() / "keyring-export.json")
|
||||
shutil.copy2(keyring, out)
|
||||
os.chmod(out, 0o600) # 密钥文件权限 600
|
||||
print(f"[完成] 密钥已导出 -> {out} (权限 600)")
|
||||
print("[提示] 新设备导入: 将该文件覆盖到客户端 config/keyring.json 即可")
|
||||
|
||||
|
||||
def main() -> int:
|
||||
print("7z-encrypt 客户端 (Python TUI)")
|
||||
print("安全文件传输 · 加密 / 分卷 / 上传")
|
||||
@@ -198,6 +234,7 @@ def main() -> int:
|
||||
print(" 4. 文件列表 (ls)")
|
||||
print(" 5. 下载文件")
|
||||
print(" 6. 删除文件")
|
||||
print(" 7. 密钥导出")
|
||||
print(" q. 退出")
|
||||
choice = input("> ").strip().lower()
|
||||
if choice == "1":
|
||||
@@ -215,6 +252,8 @@ def main() -> int:
|
||||
download()
|
||||
elif choice == "6":
|
||||
delete_file()
|
||||
elif choice == "7":
|
||||
export_key()
|
||||
elif choice == "q":
|
||||
print("再见")
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user