diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/captcha/captcha.ex | 15 | ||||
-rw-r--r-- | lib/pleroma/captcha/captcha_service.ex | 5 | ||||
-rw-r--r-- | lib/pleroma/captcha/kocaptcha.ex | 11 |
3 files changed, 29 insertions, 2 deletions
diff --git a/lib/pleroma/captcha/captcha.ex b/lib/pleroma/captcha/captcha.ex index df33406ee..2dcbc4717 100644 --- a/lib/pleroma/captcha/captcha.ex +++ b/lib/pleroma/captcha/captcha.ex @@ -38,7 +38,13 @@ defmodule Pleroma.Captcha do if !enabled do {:reply, %{type: :none}, state} else - {:reply, method().new(), state} + new_captcha = method().new() + + minutes_retained = Pleroma.Config.get!([__MODULE__, :minutes_retained]) + # Wait several minutes and if the captcha is still there, delete it + Process.send_after(self(), {:cleanup, new_captcha.token}, 1000 * 60 * minutes_retained) + + {:reply, new_captcha, state} end end @@ -47,5 +53,12 @@ defmodule Pleroma.Captcha do {:reply, method().validate(token, captcha), state} end + @doc false + def handle_info({:cleanup, token}, state) do + method().cleanup(token) + + {:noreply, state} + end + defp method, do: Pleroma.Config.get!([__MODULE__, :method]) end diff --git a/lib/pleroma/captcha/captcha_service.ex b/lib/pleroma/captcha/captcha_service.ex index 907a73ad0..fe5a6bf66 100644 --- a/lib/pleroma/captcha/captcha_service.ex +++ b/lib/pleroma/captcha/captcha_service.ex @@ -20,4 +20,9 @@ defmodule Pleroma.Captcha.Service do `true` if captcha is valid, `false` if not """ @callback validate(token :: String.t(), captcha :: String.t()) :: boolean + + @doc """ + This function is called periodically to clean up old captchas + """ + @callback cleanup(token :: String.t()) :: :ok end diff --git a/lib/pleroma/captcha/kocaptcha.ex b/lib/pleroma/captcha/kocaptcha.ex index 4ecd1a81f..9891d4031 100644 --- a/lib/pleroma/captcha/kocaptcha.ex +++ b/lib/pleroma/captcha/kocaptcha.ex @@ -29,11 +29,20 @@ defmodule Pleroma.Captcha.Kocaptcha do [{^token, saved_md5}] <- :ets.lookup(@ets, token), true <- :crypto.hash(:md5, captcha) |> Base.encode16() == String.upcase(saved_md5) do # Clear the saved value - :ets.delete(@ets, token) + cleanup(token) true else _ -> false end end + + @impl Service + def cleanup(token) do + # Only delete the entry if it exists in the table, because ets:delete raises an exception if it does not + case :ets.lookup(@ets, token) do + [{^token, _}] -> :ets.delete(@ets, token) + _ -> true + end + end end |