comparison mod_register_web/mod_register_web.lua @ 4440:95262bd1bcb2

mod_register_web: Add hCaptcha provider
author Michel Le Bihan <michel@lebihan.pl>
date Mon, 15 Feb 2021 21:04:19 +0100
parents cf3247ec5e01
children
comparison
equal deleted inserted replaced
4439:6ae1c7b9c58b 4440:95262bd1bcb2
40 local success_tpl = get_template "success"; 40 local success_tpl = get_template "success";
41 41
42 -- COMPAT `or request.conn:ip()` 42 -- COMPAT `or request.conn:ip()`
43 43
44 if next(captcha_options) ~= nil then 44 if next(captcha_options) ~= nil then
45 local recaptcha_tpl = get_template "recaptcha"; 45 local provider = captcha_options.provider;
46 46 if provider == nil or provider == "recaptcha" then
47 function generate_captcha(display_options) 47 local recaptcha_tpl = get_template "recaptcha";
48 return recaptcha_tpl.apply(setmetatable({ 48
49 recaptcha_display_error = display_options and display_options.recaptcha_error 49 function generate_captcha(display_options)
50 and ("&error="..display_options.recaptcha_error) or ""; 50 return recaptcha_tpl.apply(setmetatable({
51 }, { 51 recaptcha_display_error = display_options and display_options.recaptcha_error
52 __index = function (_, k) 52 and ("&error="..display_options.recaptcha_error) or "";
53 if captcha_options[k] then return captcha_options[k]; end 53 }, {
54 module:log("error", "Missing parameter from captcha_options: %s", k); 54 __index = function (_, k)
55 end 55 if captcha_options[k] then return captcha_options[k]; end
56 })); 56 module:log("error", "Missing parameter from captcha_options: %s", k);
57 end 57 end
58 function verify_captcha(request, form, callback) 58 }));
59 http.request("https://www.google.com/recaptcha/api/siteverify", { 59 end
60 body = http.formencode { 60 function verify_captcha(request, form, callback)
61 secret = captcha_options.recaptcha_private_key; 61 http.request("https://www.google.com/recaptcha/api/siteverify", {
62 remoteip = request.ip or request.conn:ip(); 62 body = http.formencode {
63 response = form["g-recaptcha-response"]; 63 secret = captcha_options.recaptcha_private_key;
64 }; 64 remoteip = request.ip or request.conn:ip();
65 }, function (verify_result, code) 65 response = form["g-recaptcha-response"];
66 local result = json(verify_result); 66 };
67 if not result then 67 }, function (verify_result, code)
68 module:log("warn", "Unable to decode response from recaptcha: [%d] %s", code, verify_result); 68 local result = json(verify_result);
69 callback(false, "Captcha API error"); 69 if not result then
70 elseif result.success == true then 70 module:log("warn", "Unable to decode response from recaptcha: [%d] %s", code, verify_result);
71 callback(true); 71 callback(false, "Captcha API error");
72 else 72 elseif result.success == true then
73 callback(false, t_concat(result["error-codes"])); 73 callback(true);
74 end 74 else
75 end); 75 callback(false, t_concat(result["error-codes"]));
76 end
77 end);
78 end
79 elseif provider == "hcaptcha" then
80 local captcha_tpl = get_template "hcaptcha";
81
82 function generate_captcha(display_options)
83 return captcha_tpl.apply(setmetatable({
84 captcha_display_error = display_options and display_options.captcha_error
85 and ("&error="..display_options.captcha_error) or "";
86 }, {
87 __index = function (_, k)
88 if captcha_options[k] then return captcha_options[k]; end
89 module:log("error", "Missing parameter from captcha_options: %s", k);
90 end
91 }));
92 end
93 function verify_captcha(request, form, callback)
94 http.request("https://hcaptcha.com/siteverify", {
95 body = http.formencode {
96 secret = captcha_options.captcha_private_key;
97 remoteip = request.ip or request.conn:ip();
98 response = form["h-captcha-response"];
99 };
100 }, function (verify_result, code)
101 local result = json(verify_result);
102 if not result then
103 module:log("warn", "Unable to decode response from hcaptcha: [%d] %s", code, verify_result);
104 callback(false, "Captcha API error");
105 elseif result.success == true then
106 callback(true);
107 else
108 callback(false, t_concat(result["error-codes"]));
109 end
110 end);
111 end
76 end 112 end
77 else 113 else
78 module:log("debug", "No Recaptcha options set, using fallback captcha") 114 module:log("debug", "No captcha options set, using fallback captcha")
79 local random = math.random; 115 local random = math.random;
80 local hmac_sha1 = require "util.hashes".hmac_sha1; 116 local hmac_sha1 = require "util.hashes".hmac_sha1;
81 local secret = require "util.uuid".generate() 117 local secret = require "util.uuid".generate()
82 local ops = { '+', '-' }; 118 local ops = { '+', '-' };
83 local captcha_tpl = get_template "simplecaptcha"; 119 local captcha_tpl = get_template "simplecaptcha";