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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 });