mod_rest: Remove manual reference expansion in schema
This hack was originally added to reduce the number of definitions of
common attributes (type, to, from etc) and payloads (e.g. delay). This
predated pointers and references, and until now was needed because
parsing picked out the correct stanza kind from the schema, which broke
internal references.
Removing this hack paves the way for allowing the schema to be
configured or customized more easily.
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 template_path = module:get_option_string("welcome_page_template_path", module:get_directory().."/html");
local user_vars = module:get_option("welcome_page_variables", {});
local site_name = module:get_option("site_name", module.host);
local invite_only = module:get_option_boolean("registration_invite_only", true);
local open_registration = module:get_option_boolean("welcome_page_open_registration", not invite_only);
module:depends("http");
module:depends("http_libjs");
local invites = module:depends("invites");
local function load_template(path)
local template_file, err = io.open(path);
if not template_file then
error("Unable to load template file: "..tostring(err));
end
local template = template_file:read("*a");
template_file:close();
return template;
end
local template = load_template(template_path.."/index.html");
local function serve_page(event)
event.response.headers["Content-Type"] = "text/html; charset=utf-8";
return render_html_template(template, {
site_name = site_name;
request = event.request;
var = user_vars;
});
end
local function handle_submit(event)
local submission = { allowed = open_registration, request = event.request };
module:fire_event("mod_welcome_page/submission", submission);
if not submission.allowed then
event.response.headers["Content-Type"] = "text/html; charset=utf-8";
return render_html_template(template, {
site_name = site_name;
request = event.request;
var = user_vars;
message = {
class = "alert-danger";
text = submission.reason or "Account creation is not possible at this time";
};
});
end
local invite = invites.create_account(nil, { source = module.name });
if not invite then
return 500;
end
event.response.headers.Location = invite.landing_page or invite.uri;
return 303;
end
local http_files
if prosody.process_type == "prosody" then
-- Prosody >= 0.12
http_files = require "net.http.files";
else
-- Prosody <= 0.11
http_files = module:depends "http_files";
end
module:provides("http", {
default_path = "/";
route = {
["GET"] = serve_page;
["GET /*"] = http_files.serve({ path = template_path });
["POST"] = handle_submit;
};
});