Software / code / prosody-modules
Annotate
mod_invites_webgen/mod_invites_webgen.lua @ 6279:b92aea4e7ff4
mod_invites_page: check query from URL first to avoid 500 ERROR
| author | Trần H. Trung <xmpp:trần.h.trung@trung.fun> |
|---|---|
| date | Sun, 01 Jun 2025 21:32:49 +0700 |
| parent | 6274:6cf1f47f24b4 |
| rev | line source |
|---|---|
|
5943
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
1 local http_formdecode = require "net.http".formdecode; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
2 local usermanager = require "core.usermanager"; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
3 local nodeprep = require "util.encodings".stringprep.nodeprep; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
4 local st = require "util.stanza"; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
5 local url_escape = require "util.http".urlencode; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
6 local render_html_template = require "util.interpolation".new("%b{}", st.xml_escape, { |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
7 urlescape = url_escape; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
8 }); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
9 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
10 local site_name = module:get_option_string("site_name", module.host); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
11 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
12 local invites = module:depends("invites"); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
13 |
|
6274
6cf1f47f24b4
mod_invites_webgen: rename variables to keep consistant style
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
5944
diff
changeset
|
14 local template_path = module:get_option_string("invites_webgen_template_path", "html"); |
|
5943
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
15 function template_get(filename, lang) |
|
6274
6cf1f47f24b4
mod_invites_webgen: rename variables to keep consistant style
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
5944
diff
changeset
|
16 local template = lang and template_path.."/"..filename.."."..lang..".html" |
|
6cf1f47f24b4
mod_invites_webgen: rename variables to keep consistant style
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
5944
diff
changeset
|
17 or template_path.."/"..filename..".html"; |
|
5943
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
18 return assert(module:load_resource(template):read("*a")); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
19 end |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
20 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
21 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
22 module:depends("http"); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
23 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
24 local default_path, lang; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
25 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
26 local function serve_webgen(event) |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
27 local query_params = event.request.url.query and http_formdecode(event.request.url.query); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
28 lang = query_params and query_params.l; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
29 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
30 local webgen_template = template_get("webgen", lang); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
31 event.response.headers["Content-Type"] = "text/html; charset=utf-8"; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
32 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
33 local webgen = render_html_template(webgen_template, { |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
34 site_name = site_name; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
35 }); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
36 return webgen; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
37 end |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
38 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
39 module:depends("invites_register_web"); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
40 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
41 local function handle_webgen(event) |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
42 local request, response = event.request, event.response; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
43 local form_data = http_formdecode(request.body); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
44 local username, password = form_data["username"], form_data["password"]; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
45 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
46 event.response.headers["Content-Type"] = "text/html; charset=utf-8"; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
47 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
48 local webgen_template = template_get("webgen", lang); |
|
5944
d073ada49a86
mod_invites_webgen: fix variable name for http path
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
5943
diff
changeset
|
49 local http_path = module:http_url("webgen", "/webgen"); |
|
5943
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
50 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
51 if not username or #username == 0 or not password or #password == 0 then |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
52 return render_html_template(webgen_template, { |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
53 site_name = site_name; |
|
5944
d073ada49a86
mod_invites_webgen: fix variable name for http path
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
5943
diff
changeset
|
54 path = http_path; |
|
5943
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
55 msg_class = "alert-warning"; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
56 message = "Please fill in all fields."; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
57 }); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
58 end |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
59 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
60 local prepped_username = nodeprep(username); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
61 local exists = usermanager.user_exists(prepped_username, module.host); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
62 local pass = usermanager.test_password(prepped_username, module.host, password); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
63 local allow_user = module:get_option_boolean("allow_user_invites", false); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
64 local allow_contact = module:get_option_boolean("allow_contact_invites", false); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
65 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
66 local invite; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
67 if exists and pass and allow_user and allow_contact then |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
68 invite = invites.create_contact(username, true, { source = "webgen" }); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
69 else |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
70 return render_html_template(webgen_template, { |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
71 site_name = site_name; |
|
5944
d073ada49a86
mod_invites_webgen: fix variable name for http path
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
5943
diff
changeset
|
72 path = http_path; |
|
5943
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
73 username = username; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
74 msg_class = "alert-warning"; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
75 message = "Invalid input!"; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
76 }); |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
77 end |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
78 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
79 if not invite then |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
80 return 500; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
81 else |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
82 event.response.headers.Location = invite.landing_page or invite.uri; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
83 return 303; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
84 end |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
85 end |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
86 |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
87 module:provides("http", { |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
88 default_path = "webgen"; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
89 route = { |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
90 ["GET"] = serve_webgen; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
91 ["POST"] = handle_webgen; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
92 }; |
|
05125c29fd67
mod_invites_webgen: initial release
Trần H. Trung <xmpp:trần.h.trung@trung.fun>
parents:
diff
changeset
|
93 }); |