mirror of
1
Fork 0
forgejo/routers/web/auth
Gergely Nagy e35d2af2e5
Rate limit pre-activation email change separately
Changing the email address before any email address is activated should
be subject to a different rate limit than the normal activation email
resending. If there's only one rate limit for both, then if a newly
signed up quickly discovers they gave a wrong email address, they'd have
to wait three minutes to change it.

With the two separate limits, they don't - but they'll have to wait
three minutes before they can change the email address again.

The downside of this setup is that a malicious actor can alternate
between resending and changing the email address (to something like
`user+$idx@domain`, delivered to the same inbox) to effectively halving
the rate limit. I do not think there's a better solution, and this feels
like such a small attack surface that I'd deem it acceptable.

The way the code works after this change is that `ActivatePost` will now
check the `MailChangeLimit_user` key rather than `MailResendLimit_user`,
and if we're within the limit, it will set `MailChangedJustNow_user`. The
`Activate` method - which sends the activation email, whether it is a
normal resend, or one following an email change - will check
`MailChangedJustNow_user`, and if it is set, it will check the rate
limit against `MailChangedLimit_user`, otherwise against
`MailResendLimit_user`, and then will delete the
`MailChangedJustNow_user` key from the cache.

Fixes #2040.

Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
2023-12-27 12:09:16 +01:00
..
2fa.go
auth.go Rate limit pre-activation email change separately 2023-12-27 12:09:16 +01:00
linkaccount.go Final round of `db.DefaultContext` refactor (#27587) 2023-10-14 08:37:24 +00:00
main_test.go
oauth.go [GITEA] oauth2: use link_account page when email/username is missing (#1757) 2023-12-25 13:41:49 +01:00
oauth_test.go
openid.go
password.go Always enable caches (#28527) 2023-12-19 09:29:05 +00:00
webauthn.go