Security review: staff admin lockdown, unicode-safe login/phone/grade inputs, demo guest not upgradable, home cache not floodable

- accounts admin: phone/is_guest read-only for non-superusers, device_id filter lookups refused,
  auth.User/Group admin writable only by superusers
- campaigns: delivery log needs view permission
- phone/OTP/birth date: any Unicode digit normalised or rejected with 400; unknown gradeId is 400
- shared demo guest is never turned into a person's account by logging in
- /api/home with unknown gradeId is no longer cached (LocMemCache flood reset throttle counters)
- /api/progress/nodes: one query, huge unit is 400
- BazaarCredential token filter lookups refused

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-05 09:34:42 +03:30
parent fedd10ff22
commit 28b8527760
15 changed files with 422 additions and 41 deletions

View File

@@ -122,6 +122,12 @@ class BazaarCredentialAdmin(admin.ModelAdmin):
def connected(self, obj):
return bool(obj.refresh_token)
def lookup_allowed(self, lookup, value, request=None):
# فیلترِ querystring (?refresh_token__startswith=a) با شمردنِ نتیجه توکن را حرف‌به‌حرف لو می‌دهد.
if lookup.split('__')[0] in ('refresh_token', 'pending_state'):
return False
return super().lookup_allowed(lookup, value, request)
def changelist_view(self, request, extra_context=None):
BazaarCredential.objects.get_or_create(pk=1)
return super().changelist_view(request, extra_context)