in dev, allow dev FE
[akkoma] / lib / pleroma / captcha / kocaptcha.ex
index abccbf6d395886fb2584c2fd887b0da54723977e..eac6dfa365a4c0d8b536ea4f3c08f508611b0ab4 100644 (file)
@@ -1,37 +1,38 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.Captcha.Kocaptcha do
   alias Pleroma.Captcha.Service
   @behaviour Service
 
-  @ets __MODULE__.Ets
-
   @impl Service
-  def new() do
+  def new do
     endpoint = Pleroma.Config.get!([__MODULE__, :endpoint])
-    case HTTPoison.get(endpoint <> "/new") do
-      {:error, _} ->
-        %{error: "Kocaptcha service unavailable"}
-      {:ok, res} ->
-        json_resp = Poison.decode!(res.body)
 
-        token = json_resp["token"]
+    case Pleroma.HTTP.get(endpoint <> "/new") do
+      {:error, _} ->
+        %{error: :kocaptcha_service_unavailable}
 
-        true = :ets.insert(@ets, {token, json_resp["md5"]})
+      {:ok, res} ->
+        json_resp = Jason.decode!(res.body)
 
-        %{type: :kocaptcha, token: token, url: endpoint <> json_resp["url"]}
+        %{
+          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) 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)
-
-      true
-    else
-      _ -> false
-    end
+  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