First
[anni] / lib / pleroma / captcha / kocaptcha.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Captcha.Kocaptcha do
6   alias Pleroma.Captcha.Service
7   @behaviour Service
8
9   @impl Service
10   def new do
11     endpoint = Pleroma.Config.get!([__MODULE__, :endpoint])
12
13     case Pleroma.HTTP.get(endpoint <> "/new") do
14       {:error, _} ->
15         %{error: :kocaptcha_service_unavailable}
16
17       {:ok, res} ->
18         json_resp = Jason.decode!(res.body)
19
20         %{
21           type: :kocaptcha,
22           token: json_resp["token"],
23           url: endpoint <> json_resp["url"],
24           answer_data: json_resp["md5"],
25           seconds_valid: Pleroma.Config.get([Pleroma.Captcha, :seconds_valid])
26         }
27     end
28   end
29
30   @impl Service
31   def validate(_token, captcha, answer_data) do
32     # Here the token is unsed, because the unencrypted captcha answer is just passed to method
33     if not is_nil(captcha) and
34          :crypto.hash(:md5, captcha) |> Base.encode16() == String.upcase(answer_data),
35        do: :ok,
36        else: {:error, :invalid}
37   end
38 end