1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-08 19:26:48 +00:00
webvirtcloud/accounts
catborise da63e570e5 fix(accounts): the "Lost OTP?" page cannot be used to flood or break
/accounts/email_otp/ mails a user their OTP QR code and needs no login.
Measured with the default settings (OTP disabled):

- It was reachable although OTP was off, and created OTP devices.
- Every request sent a mail: 20 requests for one address, 20 mails, so
  anyone who knew an address could fill that mailbox.
- An address shared by two users, or a mail server that could not be
  reached, ended in an error page (500).
- Inactive users were mailed too.

The page now exists only while OTP_ENABLED is set. It mails a single
active user whose address matches (case-insensitively), at most once
every 5 minutes per user (Django's cache: with several workers the
bound is per worker), and logs a failed delivery. The answer is the
same in every case, so it does not reveal whether an address belongs
to a user.

The QR codes come from django-qr-code (segno); both the mail and the
account page render them without the qrcode package removed earlier.
The new tests fail on the previous code.
2026-10-05 20:06:02 +03:00
..
migrations fix(accounts): migrate no longer overrides the change-password permission 2026-10-04 20:26:53 +03:00
templates fix: require POST for user block/unblock and OTP email, flag console cookie 2026-10-02 22:44:00 +03:00
templatetags lint with black python. convert f style strings to old one. some small fixes 2020-11-05 12:34:31 +03:00
__init__.py Fixe migrations for new deployments 2020-05-28 18:19:25 +06:00
apps.py fix(accounts): migrate no longer overrides the change-password permission 2026-10-04 20:26:53 +03:00
checks.py fix(accounts): migrate no longer overrides the change-password permission 2026-10-04 20:26:53 +03:00
forms.py format python code with black 2022-11-02 08:54:35 +03:00
middleware.py fix(accounts): first-login password change is stored, not in the session 2026-10-04 01:08:11 +03:00
models.py fix(accounts): first-login password change is stored, not in the session 2026-10-04 01:08:11 +03:00
test_admin_email_otp.py chore: drop references to the local roadmap from code and tests 2026-10-04 11:09:25 +03:00
test_admin_password.py chore: drop references to the local roadmap from code and tests 2026-10-04 11:09:25 +03:00
test_change_password_permission.py fix(accounts): migrate no longer overrides the change-password permission 2026-10-04 20:26:53 +03:00
test_checks.py feat(accounts): Django's LoginRequiredMiddleware replaces the package 2026-10-04 01:08:11 +03:00
test_email_otp.py fix(accounts): the "Lost OTP?" page cannot be used to flood or break 2026-10-05 20:06:02 +03:00
test_first_login_password.py chore: drop references to the local roadmap from code and tests 2026-10-04 11:09:25 +03:00
test_security_fixes.py feat(security): enforce require_POST on power actions, prevent open redirects, and isolate instance permissions 2026-09-27 13:20:45 +03:00
test_utils.py ci: replace super-linter with ruff 2026-10-04 01:08:11 +03:00
tests.py build: Django 5.2.17 LTS 2026-10-04 01:08:11 +03:00
urls.py fix(tests): decouple tests from local libvirt, support configurable test host, and fix URL/logging bugs 2026-09-25 11:51:45 +03:00
utils.py feat(security): enforce require_POST on power actions, prevent open redirects, and isolate instance permissions 2026-09-27 13:20:45 +03:00
views.py fix(accounts): the "Lost OTP?" page cannot be used to flood or break 2026-10-05 20:06:02 +03:00