method: Pleroma.Captcha.Kocaptcha
# Kocaptcha is a very simple captcha service, the source code is here: https://github.com/koto-bank/kocaptcha
-config :pleroma, Pleroma.Captcha.Kocaptcha,
- endpoint: "http://localhost:9093"
+config :pleroma, Pleroma.Captcha.Kocaptcha, endpoint: "http://localhost:9093"
# Upload configuration
config :pleroma, Pleroma.Upload,
defmodule Pleroma.Captcha.Service do
-
@doc """
Request new captcha from a captcha service.
`true` if captcha is valid, `false` if not
"""
- @callback validate(token :: String.t, captcha :: String.t) :: boolean
+ @callback validate(token :: String.t(), captcha :: String.t()) :: boolean
end
@impl Service
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)
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
+ true <- :crypto.hash(:md5, captcha) |> Base.encode16() == String.upcase(saved_md5) do
# Clear the saved value
:ets.delete(@ets, token)
captcha_enabled = Pleroma.Config.get([Pleroma.Captcha, :enabled])
# true if captcha is disabled or enabled and valid, false otherwise
- captcha_ok = if !captcha_enabled do
- true
- else
- Pleroma.Captcha.validate(params[:captcha_token], params[:captcha_solution])
- end
+ captcha_ok =
+ if !captcha_enabled do
+ true
+ else
+ Pleroma.Captcha.validate(params[:captcha_token], params[:captcha_solution])
+ end
# Captcha invalid
if not captcha_ok do
# no need to query DB if registration is open
token =
unless registrations_open || is_nil(tokenString) do
- Repo.get_by(UserInviteToken, %{token: tokenString})
- end
+ Repo.get_by(UserInviteToken, %{token: tokenString})
+ end
cond do
registrations_open || (!is_nil(token) && !token.used) ->
else
{:error, changeset} ->
errors =
- Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
- |> Jason.encode!()
+ Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
+ |> Jason.encode!()
- {:error, %{error: errors}}
+ {:error, %{error: errors}}
end
-
!registrations_open && is_nil(token) ->
- {:error, "Invalid token"}
+ {:error, "Invalid token"}
!registrations_open && token.used ->
- {:error, "Expired token"}
+ {:error, "Expired token"}
end
end
end