Mercurial > prosody-modules
comparison mod_register_web/mod_register_web.lua @ 1226:0667624637da
mod_register_web: Split out recaptcha verification to a separate function
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 30 Nov 2013 18:25:32 +0100 |
| parents | a3766d3baacb |
| children | 6015434f0e05 |
comparison
equal
deleted
inserted
replaced
| 1225:a3766d3baacb | 1226:0667624637da |
|---|---|
| 23 __index = function (t, k) | 23 __index = function (t, k) |
| 24 if captcha_options[k] then return captcha_options[k]; end | 24 if captcha_options[k] then return captcha_options[k]; end |
| 25 module:log("error", "Missing parameter from captcha_options: %s", k); | 25 module:log("error", "Missing parameter from captcha_options: %s", k); |
| 26 end }) | 26 end }) |
| 27 )); | 27 )); |
| 28 end | |
| 29 function verify_captcha(form, callback) | |
| 30 http.request("https://www.google.com/recaptcha/api/verify", { | |
| 31 body = http.formencode { | |
| 32 privatekey = captcha_options.recaptcha_private_key; | |
| 33 remoteip = request.conn:ip(); | |
| 34 challenge = form.recaptcha_challenge_field; | |
| 35 response = form.recaptcha_response_field; | |
| 36 }; | |
| 37 }, function (verify_result, code) | |
| 38 local verify_ok, verify_err = verify_result:match("^([^\n]+)\n([^\n]+)"); | |
| 39 if verify_ok == "true" then | |
| 40 callback(true); | |
| 41 else | |
| 42 callback(false, verify_err) | |
| 43 end | |
| 44 end); | |
| 28 end | 45 end |
| 29 | 46 |
| 30 function generate_page(event, display_options) | 47 function generate_page(event, display_options) |
| 31 local request = event.request; | 48 local request = event.request; |
| 32 return [[<!DOCTYPE html> | 49 return [[<!DOCTYPE html> |
| 77 end | 94 end |
| 78 | 95 |
| 79 function handle_form(event) | 96 function handle_form(event) |
| 80 local request, response = event.request, event.response; | 97 local request, response = event.request, event.response; |
| 81 local form = http.formdecode(request.body); | 98 local form = http.formdecode(request.body); |
| 82 http.request("https://www.google.com/recaptcha/api/verify", { | 99 verify_captcha(form, function (ok, err) |
| 83 body = http.formencode { | 100 if ok then |
| 84 privatekey = captcha_options.recaptcha_private_key; | |
| 85 remoteip = request.conn:ip(); | |
| 86 challenge = form.recaptcha_challenge_field; | |
| 87 response = form.recaptcha_response_field; | |
| 88 }; | |
| 89 }, function (verify_result, code) | |
| 90 local verify_ok, verify_err = verify_result:match("^([^\n]+)\n([^\n]+)"); | |
| 91 if verify_ok == "true" then | |
| 92 local register_ok, register_err = register_user(form); | 101 local register_ok, register_err = register_user(form); |
| 93 response:send(generate_register_response(event, form, register_ok, register_err)); | 102 response:send(generate_register_response(event, form, register_ok, register_err)); |
| 94 else | 103 else |
| 95 response:send(generate_page(event, { register_error = verify_err })); | 104 response:send(generate_page(event, { register_error = err })); |
| 96 end | 105 end |
| 97 end); | 106 end); |
| 98 return true; -- Leave connection open until we respond above | 107 return true; -- Leave connection open until we respond above |
| 99 end | 108 end |
| 100 | 109 |
