forgejo/routers
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
..
api [GITEA] Revert "Deprecate query string auth tokens (#28390)" 2023-12-25 13:41:50 +01:00
common Clean up template locale usage (#27856) 2023-10-31 22:11:48 +08:00
install [GITEA] Add password length check on install page 2023-12-25 13:30:06 +01:00
private [CLI] implement forgejo-cli 2023-12-25 10:25:16 +01:00
utils Implement FSFE REUSE for golang files (#21840) 2022-11-27 18:20:29 +00:00
web Rate limit pre-activation email change separately 2023-12-27 12:09:16 +01:00
init.go [API] Forgejo API /api/forgejo/v1 2023-12-25 11:00:49 +01:00