X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fcaptcha%2Fkocaptcha.ex;h=eac6dfa365a4c0d8b536ea4f3c08f508611b0ab4;hb=a079ec3a3cdfd42d2cbd51c7698c2c87828e5778;hp=9891d403179422b650a02765330446c704eed998;hpb=6062885df6178c09544b6a0b5b731a554786397e;p=akkoma diff --git a/lib/pleroma/captcha/kocaptcha.ex b/lib/pleroma/captcha/kocaptcha.ex index 9891d4031..eac6dfa36 100644 --- a/lib/pleroma/captcha/kocaptcha.ex +++ b/lib/pleroma/captcha/kocaptcha.ex @@ -1,48 +1,38 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors +# 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 Tesla.get(endpoint <> "/new") do + case Pleroma.HTTP.get(endpoint <> "/new") do {:error, _} -> - %{error: "Kocaptcha service unavailable"} + %{error: :kocaptcha_service_unavailable} {:ok, res} -> - json_resp = Poison.decode!(res.body) - - token = json_resp["token"] - - true = :ets.insert(@ets, {token, json_resp["md5"]}) - - %{type: :kocaptcha, token: token, url: endpoint <> json_resp["url"]} + 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) 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 - cleanup(token) - - true - else - _ -> false - end - end - - @impl Service - def cleanup(token) do - # Only delete the entry if it exists in the table, because ets:delete raises an exception if it does not - case :ets.lookup(@ets, token) do - [{^token, _}] -> :ets.delete(@ets, token) - _ -> true - 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