aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/captcha/kocaptcha.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pleroma/captcha/kocaptcha.ex')
-rw-r--r--lib/pleroma/captcha/kocaptcha.ex38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/pleroma/captcha/kocaptcha.ex b/lib/pleroma/captcha/kocaptcha.ex
new file mode 100644
index 0000000..e786e28
--- /dev/null
+++ b/lib/pleroma/captcha/kocaptcha.ex
@@ -0,0 +1,38 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Captcha.Kocaptcha do
+ alias Pleroma.Captcha.Service
+ @behaviour Service
+
+ @impl Service
+ def new do
+ endpoint = Pleroma.Config.get!([__MODULE__, :endpoint])
+
+ case Pleroma.HTTP.get(endpoint <> "/new") do
+ {:error, _} ->
+ %{error: :kocaptcha_service_unavailable}
+
+ {:ok, res} ->
+ json_resp = Jason.decode!(res.body)
+
+ %{
+ type: :kocaptcha,
+ token: json_resp["token"],
+ url: endpoint <> json_resp["url"],
+ answer_data: json_resp["md5"],
+ seconds_valid: Pleroma.Config.get([Pleroma.Captcha, :seconds_valid])
+ }
+ end
+ end
+
+ @impl Service
+ def validate(_token, captcha, answer_data) do
+ # Here the token is unsed, because the unencrypted captcha answer is just passed to method
+ if not is_nil(captcha) and
+ :crypto.hash(:md5, captcha) |> Base.encode16() == String.upcase(answer_data),
+ do: :ok,
+ else: {:error, :invalid}
+ end
+end