From 8b510597a69d0020b47908b1c2f26fef6926e83f Mon Sep 17 00:00:00 2001 From: Zareian Date: Fri, 25 Sep 2026 12:34:37 +0330 Subject: [PATCH] record the 2026-09-25 SMS deploy: 0580aec is live, Kavenegar on, test user 17 to purge Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 27 ++++++++++++++++++++++++--- docs/security-before-production.md | 6 ++++-- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 197857c..915aa4d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -294,9 +294,12 @@ reliably pull the final answer out of a solution and produced ~40% broken output - Grades 8–12 are fully covered: every node holds a four-question quiz. 39 of the 145 nodes in grades 3/6/7 (the other team's books) still hold fewer than four; none is empty, so every node still plays. -- Kavenegar is unconfigured, so `POST /api/auth/otp/request` returns 503. With `DEBUG=0` - there is no way to log into the API without creating an `OTPCode` row in the admin - (`/admin/accounts/otpcode/add/`) — this is how to hand a tester a working login. +- Kavenegar is live on the server since 2026-09-25 (`/api/health` → `sms: true`), so every + OTP request costs real credit. Real SMS *delivery* to a phone was not yet observed by us; + sending is plain `sms/send` from the account's default line, not a `verify/lookup` + template, so numbers that block promotional SMS may never get the code. An `OTPCode` + row made in the admin (`/admin/accounts/otpcode/add/`) still hands a tester a login + without SMS. ## The server: read this before running anything on it @@ -396,6 +399,24 @@ preferred setup, because there is then no key to leak. **Never let the server ru `django-insecure-…` fallback from `config/settings.py`: that string is committed here, so anyone who can read this repo can forge a token for any user.** +## وضعیت ۲۰۲۶-۰۹-۲۵ (عصر) — پیامکِ واقعی روشن شد + +**روی سرور:** `0580aec` دیپلوی و سرویس واقعاً ری‌استارت شد (۱۲:۳۲). `KAVENEGAR_API_KEY` +در `.env` سرور و لوکال است (حسابِ Master، ~۳۲۶ هزار ریال اعتبار در آن روز). بکاپ‌های پیش از آن: +`.deploy-backups/env-before-kavenegar-20260925-122959` و +`db-before-otp-hardening-20260925-122959.sqlite3`. + +- **از این به بعد هر درخواستِ OTP پول است.** برای همین: شماره به `09XXXXXXXXX` نرمال + می‌شود و غیرِ موبایلِ ایران ۴۰۰ می‌گیرد؛ cooldown و سقفِ روزانه‌ی هر شماره (۱۰) و سقفِ + روزانه‌ی کلِ سامانه (۳۰۰، ضدِ SMS pumping) در دیتابیس شمرده می‌شوند نه کشِ per-worker. + جزئیات در بندِ ۱۷ِ `docs/security-before-production.md`، تست‌ها در `accounts/tests_otp_limits.py`. +- مسیرِ کاملِ کاربرِ تازه روی سرورِ زنده سبز شد، **بدونِ پیامکِ واقعی**: کد مستقیم در + دیتابیس ساخته شد. کاربرِ تستیِ آن **کاربرِ ۱۷ با شماره‌ی `09000000001`** (نام «کاربر + تست»، یک جزیره تمام‌شده) روی پروداکشن مانده و مثلِ داده‌ی دمو پیش از کاربرِ واقعی باید پاک شود. +- رسیدنِ پیامک به یک گوشیِ واقعی را هنوز ما ندیده‌ایم؛ اولین تستِ سینیور همین است. +- ⚠️ زیاد SSH زدن پشتِ سرِ هم یک بار «Permission denied» با رمزِ درست داد؛ با + `ControlMaster` (سوکت در مسیرِ کوتاهِ `/tmp`، macOS سقفِ ۱۰۴ بایت دارد) یک اتصال باز کنید. + ## وضعیت ۲۰۲۶-۰۹-۲۵ — این را اول بخوان کیفیتِ دستیار و گیرِ نقشه (جزئیات و دلیل‌ها در `docs/architecture.md`). **۵۷۹ تست سبز.** diff --git a/docs/security-before-production.md b/docs/security-before-production.md index fdf24b1..ca59794 100644 --- a/docs/security-before-production.md +++ b/docs/security-before-production.md @@ -72,6 +72,8 @@ ## ۳. داده‌ی دمو و مهمانِ عمومی +- **افزوده ۲۰۲۶-۰۹-۲۵:** کاربرِ ۱۷ (`09000000001`، «کاربر تست»، `deviceId = + deploy-check-20260925`) از تستِ دیپلویِ پیامک؛ همراهِ بقیه پاک شود. - **چیست:** کاربرهای ۶ (`deviceId = frontend-test-device`) و ۱۰ تا ۱۵، با درس، گفتگو، تیکت، خانواده و زیرمجموعه، روی دیتابیسِ پروداکشن ساخته شده‌اند. `frontend-test-device` در ریپو نوشته شده؛ هر کس `POST /api/auth/session` با همین `deviceId` بزند، توکنِ همان @@ -220,8 +222,8 @@ - **رفع:** یک تابعِ `normalize_phone` (ارقامِ فارسی/عربی → لاتین، `+98`/`0098`/`98` → `0`، فقط `09\d{9}`) در هر سه serializer، و migrationِ داده برای ردیف‌های موجود. - **چطور بسنجید:** دو درخواستِ OTP پشتِ‌سرِهم با `0912…` و `+98912…` باید دومی ۴۲۹ بگیرد. -- **✅ بسته شد ۲۰۲۶-۰۹-۲۵** (همان روزی که کلیدِ کاوه‌نگار روی سرور رفت؛ کامیت: _پس از کامیت - اینجا بنویسید_). `accounts/phone.py::normalize_phone` در ورود، درخواستِ OTP، دعوتِ +- **✅ بسته شد ۲۰۲۶-۰۹-۲۵** (همان روزی که کلیدِ کاوه‌نگار روی سرور رفت؛ کامیت `0580aec`، + روی سرور از ۱۲:۳۲). `accounts/phone.py::normalize_phone` در ورود، درخواستِ OTP، دعوتِ خانواده و کلیدهای `TEST_LOGIN_PHONES`؛ migrationِ `accounts.0005` شماره‌های موجود را نرمال می‌کند (ردیفی که شکلِ نرمالش مالِ کاربرِ دیگری است دست نمی‌خورد و فقط شمرده می‌شود). `parentPhone` در پروفایل هنوز نرمال **نمی‌شود**. همراهش، چون از این تاریخ پیامکِ واقعی