Hash :
4d8f6ed5
Author :
Thomas de Grivel
Date :
2022-11-02T18:24:08
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
## kmxgit
## Copyright 2022 kmx.io <contact@kmx.io>
##
## Permission is hereby granted to use this software granted
## the above copyright notice and this permission paragraph
## are included in all copies and substantial portions of this
## software.
##
## THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
## PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
## AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
## THIS SOFTWARE.
defmodule PlugRecaptcha2 do
import Plug.Conn
def init(default), do: default
def call(conn, [recaptcha_secret: secret,
redirect: redirect]) do
case conn do
%Plug.Conn{params: %{"recaptcha" => signature}} ->
case verify_signature(signature, secret) do
{:ok} -> conn
_ -> halt_connection(conn, redirect)
end
_ ->
# IO.puts "no recaptcha param"
halt_connection(conn, redirect)
end
end
def call(conn, [recaptcha_secret: secret]) do
call(conn, [recaptcha_secret: secret,
redirect: nil])
end
def call(_conn, _opts), do: raise "Recaptcha Secret is missing"
defp verify_signature(signature, secret) do
post_url = "https://www.google.com/recaptcha/api/siteverify?secret=#{secret}&response=#{signature}"
resp = HTTPoison.post(post_url, "", [{"Content-Type", "application/json"}])
IO.inspect(recaptcha: resp)
case resp do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
Poison.decode(body)
|> verify_response
_ -> {:fail}
end
end
defp verify_response({:ok, %{"success" => true}}), do: {:ok}
defp verify_response(_), do: {:fail}
defp halt_connection(conn, redirect) do
url = hd(get_req_header(conn, "referer")) || redirect || "/"
conn
|> Phoenix.Controller.redirect(external: url)
end
end