diff options
author | Ekaterina Vaartis <vaartis@cock.li> | 2018-12-15 01:31:19 +0300 |
---|---|---|
committer | Ekaterina Vaartis <vaartis@cock.li> | 2018-12-15 03:12:44 +0300 |
commit | a2399c1c7c17ee1c8e85ae0b6095405c7cb9f6f1 (patch) | |
tree | dfeb13506c7cd497fc0eb68d187a72793eeaa612 /lib/pleroma/captcha.ex | |
parent | e74f384b685edff5e4fac9da788a7516dd83fe94 (diff) | |
download | pleroma-a2399c1c7c17ee1c8e85ae0b6095405c7cb9f6f1.tar.gz |
Add base CAPTCHA support (currently only kocaptcha)
Diffstat (limited to 'lib/pleroma/captcha.ex')
-rw-r--r-- | lib/pleroma/captcha.ex | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/pleroma/captcha.ex b/lib/pleroma/captcha.ex new file mode 100644 index 000000000..31f3bc797 --- /dev/null +++ b/lib/pleroma/captcha.ex @@ -0,0 +1,68 @@ +defmodule Pleroma.Captcha do + use GenServer + + @ets __MODULE__.Ets + @ets_options [:ordered_set, :private, :named_table, {:read_concurrency, true}] + + + @doc false + def start_link() do + GenServer.start_link(__MODULE__, [], name: __MODULE__) + end + + + @doc false + def init(_) do + @ets = :ets.new(@ets, @ets_options) + + {:ok, nil} + end + + def new() do + GenServer.call(__MODULE__, :new) + end + + def validate(token, captcha) do + GenServer.call(__MODULE__, {:validate, token, captcha}) + end + + @doc false + def handle_call(:new, _from, state) do + method = Pleroma.Config.get!([__MODULE__, :method]) + + case method do + __MODULE__.Kocaptcha -> + endpoint = Pleroma.Config.get!([method, :endpoint]) + case HTTPoison.get(endpoint <> "/new") do + {:error, _} -> + %{error: "Kocaptcha service unavailable"} + {:ok, res} -> + json_resp = Poison.decode!(res.body) + + token = json_resp["token"] + + true = :ets.insert(@ets, {token, json_resp["md5"]}) + + { + :reply, + %{type: :kocaptcha, token: token, url: endpoint <> json_resp["url"]}, + state + } + end + end + end + + @doc false + def handle_call({:validate, token, captcha}, _from, state) do + with false <- is_nil(captcha), + [{^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) + + {:reply, true, state} + else + e -> IO.inspect(e); {:reply, false, state} + end + end +end |