mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-27 13:47:58 +01:00
d247e01347
* handle form posts and xhr posts differently on captcha failure * formatting
49 lines
1 KiB
Elixir
49 lines
1 KiB
Elixir
defmodule PhilomenaWeb.CaptchaPlug do
|
|
alias Philomena.Captcha
|
|
import Plug.Conn
|
|
import Phoenix.Controller
|
|
|
|
def init([]), do: false
|
|
|
|
def call(conn, _opts) do
|
|
user = conn |> Pow.Plug.current_user()
|
|
|
|
conn
|
|
|> maybe_check_captcha(user)
|
|
end
|
|
|
|
defp maybe_check_captcha(conn, nil) do
|
|
case Captcha.valid_solution?(conn.params) do
|
|
true ->
|
|
conn
|
|
|
|
false ->
|
|
conn
|
|
|> put_flash(
|
|
:error,
|
|
"There was an error verifying you're not a robot. Please try again."
|
|
)
|
|
|> do_failure_response(ajax?(conn))
|
|
|> halt()
|
|
end
|
|
end
|
|
|
|
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
|
|
end
|