Mercurial > prosody-modules
view mod_adhoc_groups/mod_adhoc_groups.lua @ 4931:13070c6a7ce8
mod_http_muc_log: Fix exception on lack of trailing slash in room path
A request to /room leads to the match call returning nil which in turn
calls nodeprep(nil). In Prosody 0.11.x this does nothing and simply
returns the nil, while in 0.12 it is an error.
Now it redirects to the calendar view at /room/ - even for non-existant
rooms.
Discovered at a deployment with http_paths = { muc_log = "/" } and
requests to /robots.txt and similar, which now result in a uses redirect
before returning 404.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 22 Apr 2022 14:29:32 +0200 |
parents | b2a6e163a6b4 |
children |
line wrap: on
line source
local rostermanager = require"core.rostermanager"; local jid_join = require"util.jid".join; local jid_split = require"util.jid".split; local host = module.host; local st = require "util.stanza"; local groups = module:open_store("groups"); local memberships = module:open_store("groups", "map"); module:depends("adhoc"); local adhoclib = module:require "adhoc"; local dataform = require"util.dataforms"; local adhoc_inital_data = require "util.adhoc".new_initial_data_form; -- Make a *one-way* subscription. User will see when contact is online, -- contact will not see when user is online. local function subscribe(user, contact) local user_jid, contact_jid = jid_join(user, host), jid_join(contact, host); -- Update user's roster to say subscription request is pending... rostermanager.set_contact_pending_out(user, host, contact_jid); -- Update contact's roster to say subscription request is pending... rostermanager.set_contact_pending_in(contact, host, user_jid); -- Update contact's roster to say subscription request approved... rostermanager.subscribed(contact, host, user_jid); -- Update user's roster to say subscription request approved... rostermanager.process_inbound_subscription_approval(user, host, contact_jid); -- Push updates to both rosters rostermanager.roster_push(user, host, contact_jid); rostermanager.roster_push(contact, host, user_jid); module:send(st.presence({ type = "probe", from = user_jid, to = contact_jid })); end local create_form = dataform.new { title = "Create a new group"; { type = "hidden"; name = "FORM_TYPE"; value = "xmpp:zash.se/adhoc_groups#new"; }; { type = "text-single"; name = "group"; label = "Name of group"; required = true; }; }; local join_form = dataform.new { title = "Pick the group to join"; { type = "hidden"; name = "FORM_TYPE"; value = "xmpp:zash.se/adhoc_groups#join"; }; { type = "list-single"; name = "group"; label = "Available groups"; required = true; }; }; local function _(f) return function (fields, form_err, data) local ok, message = f(fields, form_err, data); if ok then return { status = "completed", info = message }; else return { status = "completed", error = { message = message} }; end end end module:add_item("adhoc", adhoclib.new("Create group", "xmpp:zash.se/adhoc_groups#new", adhoc_inital_data(create_form, function () return {}; end, _(function (fields, form_err, data) local user = jid_split(data.from); if form_err then return false, "Problem in submitted form"; end local group, err = groups:get(fields.group); if group then return false, "That group already exists"; elseif err then return false, "An error occurred on the server. Please try again later."; end if not groups:set(fields.group, { [user] = true }) then return false, "An error occurred while creating the group"; end return true, ("The %s group has been created"):format(fields.group); end)), "local_user")); -- Maybe admins only? module:add_item("adhoc", adhoclib.new("Join group", "xmpp:zash.se/adhoc_groups#join", adhoc_inital_data(join_form, function () local group_list = {}; for group in groups:users() do table.insert(group_list, group); module:log("debug", "Group: %q", group); end table.sort(group_list); return { group = group_list }; end, _(function (fields, form_err, data) local user = jid_split(data.from); if form_err then return false, "Problem in submitted form"; end local group, err = groups:get(fields.group); if not group then if err then return false, "An error occurred on the server. Please try again later."; else return false, "No such group"; end end if group[user] then return false, "You are already in this group."; end if not memberships:set(fields.group, user, true) then return false, "An error occurred while adding you to the group"; end for member in pairs(group) do if member ~= user then subscribe(user, member); subscribe(member, user); end end return true, ("Welcome to the %s group"):format(fields.group); end)), "local_user"));