Mercurial > prosody-modules
comparison mod_register_web/mod_register_web.lua @ 1227:6015434f0e05
mod_register_web: Move HTML into separate template files
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 30 Nov 2013 18:57:54 +0100 |
parents | 0667624637da |
children | db85ff22ae97 |
comparison
equal
deleted
inserted
replaced
1226:0667624637da | 1227:6015434f0e05 |
---|---|
1 local captcha_options = module:get_option("captcha_options", {}); | 1 local captcha_options = module:get_option("captcha_options", {}); |
2 local nodeprep = require "util.encodings".stringprep.nodeprep; | 2 local nodeprep = require "util.encodings".stringprep.nodeprep; |
3 local usermanager = require "core.usermanager"; | 3 local usermanager = require "core.usermanager"; |
4 local http = require "util.http"; | 4 local http = require "util.http"; |
5 | 5 |
6 function template(data) | |
7 -- Like util.template, but deals with plain text | |
8 return { apply = function(values) return (data:gsub("{([^}]+)}", values)); end } | |
9 end | |
10 | |
11 local function get_template(name) | |
12 local fh = assert(module:load_resource("templates/"..name..".html")); | |
13 local data = assert(fh:read("*a")); | |
14 fh:close(); | |
15 return template(data); | |
16 end | |
17 | |
18 local function render(template, data) | |
19 return tostring(template.apply(data)); | |
20 end | |
21 | |
22 local register_tpl = get_template "register"; | |
23 local success_tpl = get_template "success"; | |
24 local recaptcha_tpl = get_template "recaptcha"; | |
25 | |
6 function generate_captcha(display_options) | 26 function generate_captcha(display_options) |
7 return (([[ | 27 return recaptcha_tpl.apply(setmetatable({ |
8 <script type="text/javascript" | |
9 src="https://www.google.com/recaptcha/api/challenge?k=$$recaptcha_public_key$$"> | |
10 </script> | |
11 <noscript> | |
12 <iframe src="https://www.google.com/recaptcha/api/noscript?k=$$recaptcha_public_key$$$$recaptcha_display_error$$" | |
13 height="300" width="500" frameborder="0"></iframe><br> | |
14 <textarea name="recaptcha_challenge_field" rows="3" cols="40"> | |
15 </textarea> | |
16 <input type="hidden" name="recaptcha_response_field" | |
17 value="manual_challenge"> | |
18 </noscript> | |
19 ]]):gsub("$$([^$]+)$%$", setmetatable({ | |
20 recaptcha_display_error = display_options and display_options.recaptcha_error | 28 recaptcha_display_error = display_options and display_options.recaptcha_error |
21 and ("&error="..display_options.recaptcha_error) or ""; | 29 and ("&error="..display_options.recaptcha_error) or ""; |
22 }, { | 30 }, { |
23 __index = function (t, k) | 31 __index = function (t, k) |
24 if captcha_options[k] then return captcha_options[k]; end | 32 if captcha_options[k] then return captcha_options[k]; end |
25 module:log("error", "Missing parameter from captcha_options: %s", k); | 33 module:log("error", "Missing parameter from captcha_options: %s", k); |
26 end }) | 34 end |
27 )); | 35 })); |
28 end | 36 end |
29 function verify_captcha(form, callback) | 37 function verify_captcha(form, callback) |
30 http.request("https://www.google.com/recaptcha/api/verify", { | 38 http.request("https://www.google.com/recaptcha/api/verify", { |
31 body = http.formencode { | 39 body = http.formencode { |
32 privatekey = captcha_options.recaptcha_private_key; | 40 privatekey = captcha_options.recaptcha_private_key; |
44 end); | 52 end); |
45 end | 53 end |
46 | 54 |
47 function generate_page(event, display_options) | 55 function generate_page(event, display_options) |
48 local request = event.request; | 56 local request = event.request; |
49 return [[<!DOCTYPE html> | 57 |
50 <html><body> | 58 return render(register_tpl, { |
51 <h1>XMPP Account Registration</h1> | 59 path = request.path; hostname = module.host; |
52 <form action="]]..request.path..[[" method="POST">]] | 60 notice = display_options and display_options.register_error or ""; |
53 ..("<p>%s</p>\n"):format((display_options or {}).register_error or "").. | 61 captcha = generate_captcha(display_options); |
54 [[ <table> | 62 }) |
55 <tr> | |
56 <td>Username:</td> | |
57 <td><input type="text" name="username">@]]..module.host..[[</td> | |
58 </tr> | |
59 <tr> | |
60 <td>Password:</td> | |
61 <td><input type="password" name="password"></td> | |
62 </tr> | |
63 <tr> | |
64 <td colspan='2'>]]..generate_captcha(display_options)..[[</td> | |
65 </tr> | |
66 </table> | |
67 <input type="submit" value="Register!"> | |
68 </form> | |
69 </body></html>]]; | |
70 end | 63 end |
71 | 64 |
72 function register_user(form) | 65 function register_user(form) |
73 local prepped_username = nodeprep(form.username); | 66 local prepped_username = nodeprep(form.username); |
74 if usermanager.user_exists(prepped_username, module.host) then | 67 if usermanager.user_exists(prepped_username, module.host) then |
76 end | 69 end |
77 return usermanager.create_user(prepped_username, form.password, module.host); | 70 return usermanager.create_user(prepped_username, form.password, module.host); |
78 end | 71 end |
79 | 72 |
80 function generate_success(event, form) | 73 function generate_success(event, form) |
81 return [[<!DOCTYPE html> | 74 return render(success_tpl, { jid = nodeprep(form.username).."@"..module.host }); |
82 <html><body><p>Registration succeeded! Your account is <pre>]] | |
83 ..form.username.."@"..module.host.. | |
84 [[</pre> - happy chatting!</p></body></html>]]; | |
85 end | 75 end |
86 | 76 |
87 function generate_register_response(event, form, ok, err) | 77 function generate_register_response(event, form, ok, err) |
88 local message; | 78 local message; |
89 if ok then | 79 if ok then |