aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/captcha/captcha.ex15
-rw-r--r--lib/pleroma/captcha/captcha_service.ex5
-rw-r--r--lib/pleroma/captcha/kocaptcha.ex11
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