# ۱۷ — فاز ۷: پنل ادمین (با اصول امنیتی)

درخواست کاربر: «پنل ادمین رو برای پروژه با دقت بالا و رعایت اصول امنیتی بساز»

## معماری

صفحه‌ی مستقل `client/admin.html` + `client/js/admin/app.js` — **جدا از اپ کودک** (هیچ لینک/ import مشترکی نیست؛ کد کودک هرگز JS ادمین را نمی‌بیند). ورود: `/admin.html`

## لایه‌های امنیتی پیاده‌شده

| لایه | پیاده‌سازی |
|---|---|
| 🔑 احراز هویت جدا | JWT با `scope=admin` (جدا از parent/child) · عمر کوتاه **۲ ساعت** · bcrypt **cost 12** (والدین ۱۰) |
| 🚫 بدون خودثبت‌نامی | ایجاد ادمین فقط از env (`ALPHABET_ADMIN_EMAIL/PASSWORD`) یا رمز تصادفی که یک‌بار در console چاپ می‌شود — هیچ مسیر API ادمین نمی‌سازد |
| 🧱 جدایی نقش‌ها | `requireAdmin` روی همه‌ی مسیرها (جز login): توکن والد یا جلسه‌ی کودک → **403**، بدون توکن → 401 |
| ⏱ ضد brute-force | rate limit لاگین ادمین: **۱۰ تلاش در ۱۵ دقیقه/IP** (`ADMIN_AUTH_MAX`) — جدا و سخت‌گیرانه‌تر از بقیه |
| 🕶 ضد user-enumeration | پیام یکسان «ایمیل یا رمز درست نیست» برای حساب موجود/ناموجود + bcrypt حتی وقتی حساب نیست (زمان یکسان) |
| 🎭 حریم خصوصی | ایمیل والدین در همه‌ی فهرست‌ها ماسک: `te***@test.com` |
| 🧾 audit log | جدول `admin_audit`: ورود موفق/شکست، حذف والد، آپلود/حذف صدا، تغییر رمز/شکستش — با IP و زمان؛ قابل مشاهده در تب «وقایع» |
| 🔒 توکن در لاگ ممنوع | لاگ‌های API و auth فقط `req.path` چاپ می‌کنند — کوئری‌های `?pt=/?at=` (توکن) هرگز در لاگ نمی‌نشینند (قبلاً می‌نشست!) |
| 🧹 حذف امن والد | آبشاری (کودکان/دستگاه/پیشرفت/رویداد) + پاک‌سازی فایل‌های صدای او از دیسک |
| 🛡 هدرها | `X-Content-Type-Options: nosniff` + `Referrer-Policy: no-referrer` سراسری (X-Frame-Options عمداً نیست — پیش‌نمایش iframe) |
| 📴 SW | `/admin.html` و `/js/admin/` هرگز کش نمی‌شوند — کد مدیریتی همیشه تازه از شبکه |
| 🔐 سمت کلاینت | توکن فقط در SafeSession (تب) نه localStorage · سه کانال توکن (Authorization/X-Admin-Token/?at= — درس پروکسی) · escape همه‌ی داده‌ها (XSS) · 401 → خروج خودکار |

## قابلیت‌های پنل

- **📊 داشبورد**: والدین · کودکان · دستگاه فعال ۷روزه · رویداد ۷روزه · صداهای ادمین/والدین · توزیع کودکان per پک
- **👨‍👩‍👧 والدین**: جدول با ایمیل ماسک‌شده + تعداد کودک + دیدن کودکان + حذف (با تأیید)
- **🎙️ صداها**: آپلود صدای ادمین با انتخاب پک/حرف/کلمه (همان seed فاز ۵، حالا UI دارد) + فهرست همه‌ی صداها با پخش و حذف
- **🧾 وقایع**: ۱۰۰ رخداد امنیتی آخر
- **🔑 تغییر رمز** با تأیید رمز فعلی + حداقل ۱۰ نویسه

## تست

- `tests/admin.test.js` — **۱۷ تست امنیتی** با دو سرور ایزوله: بوت‌استرپ، پیام عمومی، 403 والد/کودک، ماسک ایمیل، حذف آبشاری+audit، آپلود/پخش/حذف صدا، 403 والد روی مسیر مدیریتی، سیاست رمز، تغییر رمز، rate limit (سرور دوم با سقف ۳)
- `tests/e2e-admin.mjs` — **۸ استپ مرورگر واقعی**: ورود غلط/درست، داشبورد، ماسک ایمیل در UI، آیتم‌های پک در آپلود، audit، مودال تغییر رمز، بدون خطای کنسول
- imports.test.js بهبود یافت: نام‌های تعریف‌شده‌ی محلی false positive نمی‌دهند
- اپ کودک پس از تغییرات: E2E **۱۴/۱۴** ✓

## وضعیت

- واحد: **۱۱۶/۱۱۶** (… + admin 17)
- E2E: اپ ۱۴/۱۴ + ادمین ۸/۸
- نسخه: **1.3.0**
- اتصال: `/admin.html` — ایمیل/رمز از env سرور (در استقرار واقعی حتماً از env بده و بعد از اولین ورود رمز را عوض کن)
