From 993ac1ed47bace2cc127f0358b4c73d0045eeb76 Mon Sep 17 00:00:00 2001 From: jackwener Date: Thu, 16 Apr 2026 14:48:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20review=20=E5=8F=91?= =?UTF-8?q?=E7=8E=B0=E7=9A=84=204=20=E4=B8=AA=E9=AB=98=E4=BC=98=E5=85=88?= =?UTF-8?q?=E7=BA=A7=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cargo.toml: libc 依赖范围从 macos 改为 unix(修复 Linux 编译失败) - scanner/macos.rs: VM_REGION_BASIC_INFO_COUNT_64 改为硬编码 9(修复 mach_vm_region 调用失败) - crypto/wal.rs: WAL 第一页帧不走主 DB 第一页特殊路径(修复 WAL 数据损坏) - daemon/query.rs: 全局搜索传入正确 names_map(修复 sender 字段为空) --- .claude/settings.local.json | 19 +++++++++++++++++++ .claude/worktrees/agent-aa71385e | 1 + Cargo.toml | 2 +- find_all_keys_macos | Bin 0 -> 35200 bytes src/crypto/wal.rs | 4 +++- src/daemon/query.rs | 3 ++- src/scanner/macos.rs | 5 ++--- 7 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 .claude/settings.local.json create mode 160000 .claude/worktrees/agent-aa71385e create mode 100755 find_all_keys_macos diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..c6a693a --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,19 @@ +{ + "permissions": { + "allow": [ + "Bash(grep -E \"\\\\.py$|\\\\.md$\")", + "Bash(git checkout:*)", + "Bash(python3 -c \"import ast; ast.parse\\(open\\(''wx_daemon.py''\\).read\\(\\)\\); print\\(''wx_daemon.py OK''\\)\")", + "Bash(python3 -c \"import ast; ast.parse\\(open\\(''wx.py''\\).read\\(\\)\\); print\\(''wx.py OK''\\)\")", + "Bash(pip install:*)", + "Bash(pip show:*)", + "Bash(pip3 install:*)", + "Bash(python3 -c \"import click; print\\(''click'', click.__version__\\)\")", + "Bash(python3 wx.py --help)", + "Bash(python3 wx.py sessions --help)", + "Bash(python3 -c \"import sys; print\\(sys.executable\\)\")", + "Bash(uv pip:*)", + "Bash(uv venv:*)" + ] + } +} diff --git a/.claude/worktrees/agent-aa71385e b/.claude/worktrees/agent-aa71385e new file mode 160000 index 0000000..69a2f44 --- /dev/null +++ b/.claude/worktrees/agent-aa71385e @@ -0,0 +1 @@ +Subproject commit 69a2f442405d35393bec4b807540af4782cfa6dc diff --git a/Cargo.toml b/Cargo.toml index 75aa5f4..fc17ffb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,7 +49,7 @@ md5 = "0.7" # 正则表达式 regex = "1" -[target.'cfg(target_os = "macos")'.dependencies] +[target.'cfg(unix)'.dependencies] libc = "0.2" [target.'cfg(target_os = "windows")'.dependencies] diff --git a/find_all_keys_macos b/find_all_keys_macos new file mode 100755 index 0000000000000000000000000000000000000000..43c2cd3453b9414bcd42371869641f4486df5e5a GIT binary patch literal 35200 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 awe?;6yWU@H+A;2}_1`*h{+G|R@AzNL+e7dG literal 0 HcmV?d00001 diff --git a/src/crypto/wal.rs b/src/crypto/wal.rs index abd7fc0..4e3d85d 100644 --- a/src/crypto/wal.rs +++ b/src/crypto/wal.rs @@ -61,7 +61,9 @@ pub fn apply_wal(wal_path: &Path, out_path: &Path, enc_key: &[u8; 32]) -> Result page_buf.resize(PAGE_SZ, 0); } - let dec = decrypt_page(enc_key, &page_buf, pgno)?; + // WAL 帧中的页数据不含 SALT 头,所以对 pgno=1 的帧也用普通页解密路径 + // (区别于主数据库第一页需要跳过 SALT 并写入 SQLite 魔数) + let dec = decrypt_page(enc_key, &page_buf, if pgno == 1 { 2 } else { pgno })?; let file_offset = (pgno as u64 - 1) * PAGE_SZ as u64; db_file.seek(SeekFrom::Start(file_offset))?; db_file.write_all(&dec)?; diff --git a/src/daemon/query.rs b/src/daemon/query.rs index 8793a28..29c6406 100644 --- a/src/daemon/query.rs +++ b/src/daemon/query.rs @@ -259,13 +259,14 @@ pub async fn q_search( let until2 = until; let limit2 = limit * 3; + let names_map2 = names.map.clone(); let found: Vec = tokio::task::spawn_blocking(move || { let conn = Connection::open(&db_path)?; let mut all = Vec::new(); for (tname, display, uname) in &table_list { let is_group = uname.contains("@chatroom"); let rows = search_in_table(&conn, tname, &uname, is_group, - &HashMap::new(), &kw2, since2, until2, limit2)?; + &names_map2, &kw2, since2, until2, limit2)?; for mut row in rows { if row.get("chat").map(|v| v.as_str().unwrap_or("")).unwrap_or("").is_empty() { if let Some(obj) = row.as_object_mut() { diff --git a/src/scanner/macos.rs b/src/scanner/macos.rs index a98cecd..f0734e7 100644 --- a/src/scanner/macos.rs +++ b/src/scanner/macos.rs @@ -152,9 +152,8 @@ fn scan_memory(task: mach_port_t) -> Result> { let mut results: Vec<(String, String)> = Vec::new(); let mut addr: mach_vm_address_t = 0; - // VM_REGION_BASIC_INFO_COUNT_64 = sizeof(vm_region_basic_info_64) / sizeof(int32_t) - let info_count_expected: mach_msg_type_number_t = - (std::mem::size_of::() / 4) as u32; + // VM_REGION_BASIC_INFO_COUNT_64 = 9(来自 ,固定值,不能用 sizeof 计算) + let info_count_expected: mach_msg_type_number_t = 9; loop { let mut size: mach_vm_size_t = 0;