امنیت و معماری
NotifyTrap بهعنوان یک مونولیت ماژولار (Modular Monolith) پیادهسازی شده که در یک فرایند دسکتاپ واحد و بدون وابستگی ابری اجرا میشود.
معماری لایهای در Rust (src-tauri/src/)
| لایه | مسئولیت |
|---|---|
domain/ | مدلهای هسته، وضعیتها، قوانین اعتبارسنجی و نوعهای خطای دامین (thiserror) |
application/ | سرویسهای کاربردی و Use Caseها برای شکار، مدیریت کانالها و جستوجو |
infrastructure/ | پیادهسازی SQLite، رمزنگاری AES-256-GCM، پالایشگر HTML (ammonia) و سرویس Keyring |
services/ | سرورهای لوکال Axum (HTTP) و Tokio (SMTP) در تردهای ایزوله پسزمینه |
commands/ و events/ | پل ارتباطی امن بین فرانتاند Nuxt و لایه application در Tauri IPC |
لایههای امنیتی اصلی
۱. ایزولاسیون محتوای HTML ایمیل و پیوستهای cid:
بدنه ایمیلها پیش از ارسال به UI توسط کتابخانه ammonia در بکاند Rust پالایش میشوند تا تگها و صفتهای ناامن (مانند <script>، on* و <img>های ریموت http:///https:// ردیاب) حذف شوند و فقط تصاویر درونخطی cid: مجاز بمانند. در فرانتاند نیز تصاویر cid: بهصورت محلی از SQLite به data: URI تبدیل شده و در <iframe sandbox="" referrerpolicy="no-referrer"> با سیاست سختگیرانه script-src 'none'; connect-src 'none'; img-src data:; رندر میشوند (پیشنمایش SVG درونبرنامهای مسدود است).
۲. رمزنگاری Credentialها و نگهداری کلید
- کلید اصلی رمزنگاری در Keyring بومی سیستمعامل (
macOS Keychain،Windows Credential ManagerیاLinux Secret Service) نگهداری میشود. - برای محیطهایی که Secret Service در سیستمعامل راهاندازی نشده باشد، مسیر fallback لوکال رمزنگاریشده با محدودیت سطح دسترسی فایل (
0600) پیشبینی شده تا در نشستهای بعدی همچنان قابلیت Reveal حفظ شود. - هنگام احراز هویت دریافتی، مقایسه هش با زمان ثابت (
constant-time comparison) انجام میشود.
۳. بدون ارسال به بیرون (Zero External Delivery)
هیچ منطقی برای فوروارد ایمیل، رله SMTP یا فراخوانی URLهای خارجی وجود ندارد. شما میتوانید با خیال راحت از دادههای واقعی یا تولیدی همتاسازیشده در محیط توسعه بدون ریسک ارسال تصادفی به کاربران واقعی استفاده کنید.
۴. استخراج آفلاین OTP و کوئریهای ایزوله
- کدهای OTP و لینکهای تایید بهصورت قطعی در ماژول
domain/verification_extractor.rsهنگام خواندن استخراج میشوند و توکن اضافی در دیتابیس ذخیره نمیشود. - برچسب تست
X-NotifyTrap-Run(مایگریشن0003_add_test_run_identifier.sql) و مسیرهایGET /api/v1/notifications*با اعتبارسنجی ثابتزمان کلید کانال ایزوله شدهاند.
۵. بازپخش انحصاری Loopback و قوانین Chaos (v1.3.0)
- بازپخش وبهوک مستقیماً روی
tokio::net::TcpStream(infrastructure/http/loopback_replay.rs) اجرا میشود و منحصراً آدرسهایhttp://127.0.0.1،http://localhostوhttp://[::1](بدون userinfo و fragment) را با سقف پاسخ ۱ مگابایت میپذیرد. - تنظیمات Mock و Chaos در ستونهای
webhook_mock_jsonوchaos_rule_json(مایگریشن0004_add_channel_rules.sql) ذخیره شده و فقط روی شنوندههای محلی HTTP و SMTP اعمال میشوند.
