philomena/lib/philomena_web/plugs/captcha_plug.ex

54 lines
1.1 KiB
Elixir
Raw Permalink Normal View History

2019-11-24 19:36:21 +01:00
defmodule PhilomenaWeb.CaptchaPlug do
alias Philomena.Captcha
import Plug.Conn
import Phoenix.Controller
2019-11-24 19:36:21 +01:00
def init([]), do: false
def call(conn, _opts) do
case captcha_enabled?() do
true -> maybe_check_captcha(conn, conn.assigns.current_user)
false -> conn
end
2019-11-24 19:36:21 +01:00
end
defp maybe_check_captcha(conn, nil) do
case Captcha.valid_solution?(conn.params) do
2020-01-11 05:20:19 +01:00
true ->
conn
2019-11-24 19:36:21 +01:00
false ->
conn
|> put_flash(
2020-01-11 05:20:19 +01:00
:error,
"There was an error verifying you're not a robot. Please try again."
)
|> do_failure_response(ajax?(conn))
|> halt()
2019-11-24 19:36:21 +01:00
end
end
2020-01-11 05:20:19 +01:00
2019-11-24 19:36:21 +01:00
defp maybe_check_captcha(conn, _user), do: conn
defp do_failure_response(conn, true) do
conn
|> put_status(:multiple_choices)
|> text("")
end
defp do_failure_response(conn, _false) do
redirect(conn, external: conn.assigns.referrer)
end
def ajax?(conn) do
case get_req_header(conn, "x-requested-with") do
[value] -> String.downcase(value) == "xmlhttprequest"
_ -> false
end
end
def captcha_enabled? do
Application.get_env(:philomena, :captcha) != false
end
2019-11-24 19:36:21 +01:00
end