Up captcha timer to 60 secs again, save used captchas in cachex

This commit is contained in:
Ekaterina Vaartis 2018-12-27 00:12:20 +03:00
parent d112990776
commit 448af3601a
3 changed files with 29 additions and 4 deletions

View File

@ -12,7 +12,7 @@ config :pleroma, Pleroma.Repo, types: Pleroma.PostgresTypes
config :pleroma, Pleroma.Captcha,
enabled: false,
seconds_valid: 20,
seconds_valid: 60,
method: Pleroma.Captcha.Kocaptcha
config :pleroma, Pleroma.Captcha.Kocaptcha, endpoint: "https://captcha.kotobank.ch"

View File

@ -25,6 +25,16 @@ defmodule Pleroma.Application do
supervisor(Pleroma.Repo, []),
worker(Pleroma.Emoji, []),
worker(Pleroma.Captcha, []),
worker(
Cachex,
[
:used_captcha_cache,
[
ttl_interval: :timer.seconds(60 * 2)
]
],
id: :cachex_used_captcha_cache
),
worker(
Cachex,
[

View File

@ -80,9 +80,24 @@ defmodule Pleroma.Captcha do
result =
with {:ok, data} <- MessageEncryptor.decrypt(answer_data, secret, sign_secret),
%{at: at, answer_data: answer_md5} <- :erlang.binary_to_term(data) do
if DateTime.after?(at, valid_if_after),
do: method().validate(token, captcha, answer_md5),
else: {:error, "CAPTCHA expired"}
try do
if DateTime.before?(at, valid_if_after), do: throw({:error, "CAPTCHA expired"})
if not is_nil(Cachex.get!(:used_captcha_cache, token)),
do: throw({:error, "CAPTCHA already used"})
res = method().validate(token, captcha, answer_md5)
# Throw if an error occurs
if res != :ok, do: throw(res)
# Mark this captcha as used
{:ok, _} =
Cachex.put(:used_captcha_cache, token, true, ttl: :timer.seconds(seconds_valid))
:ok
catch
:throw, e -> e
end
else
_ -> {:error, "Invalid answer data"}
end