secure the admin session and make traffic visible from outside
دو شکاف که وقتی آدمهای دیگر به پروژه وصل میشوند مهمتر میشوند. کوکیِ نشستِ پنلِ ادمین و توکنِ CSRF بدونِ پرچمِ secure رد و بدل میشدند. احرازِ هویتِ خودِ API کوکی نیست و اینها فقط برای ادمیناند — یعنی دقیقاً همانجایی که اعتبارنامهی واقعی وارد میشود. حالا خارج از DEBUG امناند، و SECURE_PROXY_SSL_HEADER هم اضافه شد چون TLS روی nginx تمام میشود و بدونش جنگو درخواست را HTTP میبیند و کوکیِ امن اصلاً ست نمیشود. SECURE_SSL_REDIRECT و HSTS عمداً روشن نشدند: اولی پشتِ پراکسیِ بدتنظیم حلقهی ریدایرکت میسازد و کلِ سایت را میخواباند، دومی در مرورگرِ کاربر کش میشود و عملاً برگشتناپذیر است. هر دو تصمیمِ زیرساختیاند نه کد. /api/health حالا ترافیک را هم گزارش میدهد: تعدادِ کاربر، فعالهای ۲۴ ساعتِ اخیر، و زمانِ آخرین فعالیت. تا امروز هیچ راهی نبود از بیرون بفهمیم فرانت واقعاً به سرور رسیده یا نه — باید منتظر میماندیم کسی بگوید. فقط شمارش و زمان؛ تست جداگانه بررسی میکند هیچ شماره یا نامی بیرون نرود. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -229,3 +229,44 @@ class ReplaceCountTests(TestCase):
|
||||
|
||||
result = import_questions(parse(payload), replace=True)
|
||||
self.assertEqual(result['removed'], 1, 'باید ۱ باشد نه ۵')
|
||||
|
||||
|
||||
class HealthTrafficTests(TestCase):
|
||||
"""
|
||||
سیگنالِ «کسی وصل شده یا نه» — تنها راهی که از بیرون میشود فهمید فرانت
|
||||
واقعاً به سرور رسیده است.
|
||||
"""
|
||||
|
||||
def test_reports_counts_and_last_activity(self):
|
||||
from django.utils import timezone
|
||||
|
||||
from accounts.models import User
|
||||
|
||||
User.objects.create(phone='09120000009', last_activity_at=timezone.now())
|
||||
traffic = self.client.get('/api/health').json()['traffic']
|
||||
|
||||
self.assertEqual(traffic['users'], 1)
|
||||
self.assertEqual(traffic['activeLast24h'], 1)
|
||||
self.assertIsNotNone(traffic['lastActivityAt'])
|
||||
|
||||
def test_an_idle_user_is_not_counted_as_active(self):
|
||||
from datetime import timedelta
|
||||
|
||||
from django.utils import timezone
|
||||
|
||||
from accounts.models import User
|
||||
|
||||
User.objects.create(phone='09120000010',
|
||||
last_activity_at=timezone.now() - timedelta(days=3))
|
||||
traffic = self.client.get('/api/health').json()['traffic']
|
||||
self.assertEqual(traffic['users'], 1)
|
||||
self.assertEqual(traffic['activeLast24h'], 0)
|
||||
|
||||
def test_it_leaks_no_personal_data(self):
|
||||
from accounts.models import User
|
||||
|
||||
User.objects.create(phone='09121234567', name='علی')
|
||||
raw = self.client.get('/api/health').content.decode()
|
||||
self.assertNotIn('09121234567', raw)
|
||||
self.assertNotIn('علی', raw)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user