Skip to content

Commit 5376ec4

Browse files
committed
fix(wcdb): 修复dll选择路径
1 parent 9dd7f45 commit 5376ec4

2 files changed

Lines changed: 74 additions & 13 deletions

File tree

src/wechat_decrypt_tool/wcdb_realtime.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,41 @@ class WCDBRealtimeError(RuntimeError):
2626
_WCDB_API_DLL_SELECTED: Optional[Path] = None
2727

2828

29+
def _is_project_wcdb_api_dll_path(path: Path) -> bool:
30+
try:
31+
resolved = path.resolve(strict=False)
32+
except Exception:
33+
resolved = path
34+
35+
try:
36+
default_resolved = _DEFAULT_WCDB_API_DLL.resolve(strict=False)
37+
except Exception:
38+
default_resolved = _DEFAULT_WCDB_API_DLL
39+
40+
if resolved == default_resolved:
41+
return True
42+
43+
parts = tuple(str(part).lower() for part in resolved.parts)
44+
allowed_suffixes = (
45+
("backend", "native", "wcdb_api.dll"),
46+
("wechat_decrypt_tool", "native", "wcdb_api.dll"),
47+
)
48+
return any(parts[-len(suffix) :] == suffix for suffix in allowed_suffixes)
49+
50+
2951
def _candidate_wcdb_api_dll_paths() -> list[Path]:
30-
"""Return possible locations for wcdb_api.dll (prefer WeFlow's newer build when present)."""
52+
"""Return allowed locations for wcdb_api.dll."""
3153
cands: list[Path] = []
3254

3355
env = str(os.environ.get("WECHAT_TOOL_WCDB_API_DLL_PATH", "") or "").strip()
3456
if env:
35-
cands.append(Path(env))
36-
37-
# Repo checkout convenience: reuse bundled WeFlow / echotrace DLLs when available.
38-
try:
39-
repo_root = Path(__file__).resolve().parents[2]
40-
except Exception:
41-
repo_root = Path.cwd()
57+
env_path = Path(env)
58+
if _is_project_wcdb_api_dll_path(env_path):
59+
cands.append(env_path)
60+
else:
61+
logger.warning("[wcdb] ignore external wcdb_api.dll override: %s", env_path)
4262

43-
for p in [
44-
repo_root / "WeFlow" / "resources" / "wcdb_api.dll",
45-
repo_root / "echotrace" / "assets" / "dll" / "wcdb_api.dll",
46-
_DEFAULT_WCDB_API_DLL,
47-
]:
63+
for p in (_DEFAULT_WCDB_API_DLL,):
4864
if p not in cands:
4965
cands.append(p)
5066

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import os
2+
import sys
3+
import unittest
4+
from pathlib import Path
5+
from unittest.mock import patch
6+
7+
8+
ROOT = Path(__file__).resolve().parents[1]
9+
sys.path.insert(0, str(ROOT / "src"))
10+
11+
from wechat_decrypt_tool import wcdb_realtime
12+
13+
14+
class TestWcdbRealtimeDllPathSelection(unittest.TestCase):
15+
def setUp(self) -> None:
16+
wcdb_realtime._WCDB_API_DLL_SELECTED = None
17+
18+
def tearDown(self) -> None:
19+
wcdb_realtime._WCDB_API_DLL_SELECTED = None
20+
21+
def test_resolve_prefers_project_dll_over_weflow(self) -> None:
22+
weflow_dll = ROOT / "WeFlow" / "resources" / "wcdb_api.dll"
23+
self.assertTrue(weflow_dll.exists())
24+
self.assertTrue(wcdb_realtime._DEFAULT_WCDB_API_DLL.exists())
25+
26+
with patch.dict(os.environ, {"WECHAT_TOOL_WCDB_API_DLL_PATH": str(weflow_dll)}, clear=False):
27+
resolved = wcdb_realtime._resolve_wcdb_api_dll_path()
28+
29+
self.assertEqual(
30+
resolved.resolve(),
31+
wcdb_realtime._DEFAULT_WCDB_API_DLL.resolve(),
32+
)
33+
34+
def test_resolve_accepts_project_packaged_override(self) -> None:
35+
packaged_dll = ROOT / "desktop" / "resources" / "backend" / "native" / "wcdb_api.dll"
36+
self.assertTrue(packaged_dll.exists())
37+
38+
with patch.dict(os.environ, {"WECHAT_TOOL_WCDB_API_DLL_PATH": str(packaged_dll)}, clear=False):
39+
resolved = wcdb_realtime._resolve_wcdb_api_dll_path()
40+
41+
self.assertEqual(resolved.resolve(), packaged_dll.resolve())
42+
43+
44+
if __name__ == "__main__":
45+
unittest.main()

0 commit comments

Comments
 (0)