Diff

mod_invites_webgen/mod_invites_webgen.lua @ 5943:05125c29fd67

mod_invites_webgen: initial release
author Trần H. Trung <xmpp:trần.h.trung@trung.fun>
date Wed, 26 Feb 2025 17:36:14 +0700
child 5944:d073ada49a86
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_invites_webgen/mod_invites_webgen.lua	Wed Feb 26 17:36:14 2025 +0700
@@ -0,0 +1,94 @@
+local http_formdecode = require "net.http".formdecode;
+local usermanager = require "core.usermanager";
+local nodeprep = require "util.encodings".stringprep.nodeprep;
+local st = require "util.stanza";
+local url_escape = require "util.http".urlencode;
+local render_html_template = require "util.interpolation".new("%b{}", st.xml_escape, {
+	urlescape = url_escape;
+});
+
+local site_name = module:get_option_string("site_name", module.host);
+
+local invites = module:depends("invites");
+--local template_get = module:depends("invites_page").template_get;
+
+local templatePath = module:get_option_string("invites_template_html", "html");
+function template_get(filename, lang)
+	local template = lang and templatePath.."/"..filename.."."..lang..".html" 
+		or templatePath.."/"..filename..".html";
+	return assert(module:load_resource(template):read("*a"));
+end
+
+
+module:depends("http");
+
+local default_path, lang;
+
+local function serve_webgen(event)
+	local query_params = event.request.url.query and http_formdecode(event.request.url.query);
+	lang = query_params and query_params.l;
+
+	local webgen_template = template_get("webgen", lang);
+	event.response.headers["Content-Type"] = "text/html; charset=utf-8";
+
+	local webgen = render_html_template(webgen_template, {
+		site_name = site_name;
+	});
+	return webgen;
+end
+
+module:depends("invites_register_web");
+
+local function handle_webgen(event)
+	local request, response = event.request, event.response;
+	local form_data = http_formdecode(request.body);
+	local username, password = form_data["username"], form_data["password"];
+
+	event.response.headers["Content-Type"] = "text/html; charset=utf-8";
+
+	local webgen_template = template_get("webgen", lang);
+	local htmlPath = module:http_url("webgen", "/webgen");
+
+	if not username or #username == 0 or not password or #password == 0 then
+		return render_html_template(webgen_template, {
+			site_name = site_name;
+			path = htmlPath;
+			msg_class = "alert-warning";
+			message = "Please fill in all fields.";
+		});
+	end
+
+	local prepped_username = nodeprep(username);
+	local exists = usermanager.user_exists(prepped_username, module.host);
+	local pass = usermanager.test_password(prepped_username, module.host, password);
+	local allow_user = module:get_option_boolean("allow_user_invites", false);
+	local allow_contact = module:get_option_boolean("allow_contact_invites", false);
+
+	local invite;
+	if exists and pass and allow_user and allow_contact then
+		invite = invites.create_contact(username, true, { source = "webgen" });
+	else
+		return render_html_template(webgen_template, {
+			site_name = site_name;
+			path = htmlPath;
+			username = username;
+			msg_class = "alert-warning";
+			message = "Invalid input!";
+		});
+	end
+
+	if not invite then
+		return 500;
+	else
+		event.response.headers.Location = invite.landing_page or invite.uri;
+		return 303;
+	end
+end
+
+module:provides("http", {
+	default_path = "webgen";
+	route = {
+		["GET"] = serve_webgen;
+		["POST"] = handle_webgen;
+	};
+});