@@ -123,6 +123,20 @@ defmodule PlausibleWeb.AuthController do
123123 def activate ( conn , % { "code" => code } ) do
124124 user = conn . assigns [ :current_user ]
125125
126+ with :ok <- Auth . rate_limit ( :activation_ip , conn ) ,
127+ :ok <- Auth . rate_limit ( :activation_user , user ) do
128+ do_activate ( conn , user , code )
129+ else
130+ { :error , { :rate_limit , _ } } ->
131+ render_error (
132+ conn ,
133+ 429 ,
134+ "Too many activation attempts. Wait a few minutes before trying again."
135+ )
136+ end
137+ end
138+
139+ defp do_activate ( conn , user , code ) do
126140 has_any_invitations? = Plausible.Teams.Users . has_sites? ( user , include_pending?: true )
127141 has_any_memberships? = Plausible.Teams.Users . has_sites? ( user , include_pending?: false )
128142
@@ -167,11 +181,20 @@ defmodule PlausibleWeb.AuthController do
167181
168182 def request_activation_code ( conn , _params ) do
169183 user = conn . assigns . current_user
170- Auth.EmailVerification . issue_code ( user )
171184
172- conn
173- |> put_flash ( :success , "Activation code was sent to #{ user . email } " )
174- |> redirect ( to: Routes . auth_path ( conn , :activate_form ) )
185+ with :ok <- Auth . rate_limit ( :activation_request_ip , conn ) ,
186+ :ok <- Auth . rate_limit ( :activation_request_user , user ) do
187+ Auth.EmailVerification . issue_code ( user )
188+
189+ conn
190+ |> put_flash ( :success , "Activation code was sent to #{ user . email } " )
191+ |> redirect ( to: Routes . auth_path ( conn , :activate_form ) )
192+ else
193+ { :error , { :rate_limit , _ } } ->
194+ conn
195+ |> put_flash ( :error , "Too many code requests. Please wait before requesting another." )
196+ |> redirect ( to: Routes . auth_path ( conn , :activate_form ) )
197+ end
175198 end
176199
177200 def password_reset_request_form ( conn , _ ) do
@@ -396,11 +419,21 @@ defmodule PlausibleWeb.AuthController do
396419 end
397420
398421 def verify_2fa_setup ( conn , % { "code" => code } ) do
399- case Auth.TOTP . enable ( conn . assigns . current_user , code ) do
400- { :ok , _ , % { recovery_codes: codes } } ->
401- conn
402- |> put_flash ( :success , "Two-Factor Authentication is fully enabled" )
403- |> render ( "generate_2fa_recovery_codes.html" , recovery_codes: codes , from_setup: true )
422+ user = conn . assigns . current_user
423+
424+ with :ok <- Auth . rate_limit ( :totp_setup_ip , conn ) ,
425+ :ok <- Auth . rate_limit ( :totp_setup_user , user ) ,
426+ { :ok , _ , % { recovery_codes: codes } } <- Auth.TOTP . enable ( user , code ) do
427+ conn
428+ |> put_flash ( :success , "Two-Factor Authentication is fully enabled" )
429+ |> render ( "generate_2fa_recovery_codes.html" , recovery_codes: codes , from_setup: true )
430+ else
431+ { :error , { :rate_limit , _ } } ->
432+ render_error (
433+ conn ,
434+ 429 ,
435+ "Too many attempts. Wait a minute before trying again."
436+ )
404437
405438 { :error , :invalid_code } ->
406439 conn
0 commit comments