Comparison

mod_invites_adhoc/mod_invites_adhoc.lua @ 4410:d1230d32d709

mod_invites_adhoc: Add support for specifying roles that may invite users, admins may always invite
author Matthew Wild <mwild1@gmail.com>
date Thu, 28 Jan 2021 08:56:29 +0000
parent 4409:44f6537f6427
child 4766:abac64f71698
comparison
equal deleted inserted replaced
4409:44f6537f6427 4410:d1230d32d709
1 -- XEP-0401: Easy User Onboarding 1 -- XEP-0401: Easy User Onboarding
2 local dataforms = require "util.dataforms"; 2 local dataforms = require "util.dataforms";
3 local datetime = require "util.datetime"; 3 local datetime = require "util.datetime";
4 local split_jid = require "util.jid".split; 4 local split_jid = require "util.jid".split;
5 local usermanager = require "core.usermanager";
5 6
6 local new_adhoc = module:require("adhoc").new; 7 local new_adhoc = module:require("adhoc").new;
7 8
8 -- Whether local users can invite other users to create an account on this server 9 -- Whether local users can invite other users to create an account on this server
9 local allow_user_invites = module:get_option_boolean("allow_user_invites", false); 10 local allow_user_invites = module:get_option_boolean("allow_user_invites", false);
10 -- Who can see and use the contact invite command. It is strongly recommended to 11 -- Who can see and use the contact invite command. It is strongly recommended to
11 -- keep this available to all local users. To allow/disallow invite-registration 12 -- keep this available to all local users. To allow/disallow invite-registration
12 -- on the server, use the option above instead. 13 -- on the server, use the option above instead.
13 local allow_contact_invites = module:get_option_boolean("allow_contact_invites", true); 14 local allow_contact_invites = module:get_option_boolean("allow_contact_invites", true);
15
16 local allow_user_invite_roles = module:get_option_set("allow_user_invites_by_roles");
14 17
15 local invites; 18 local invites;
16 if prosody.shutdown then -- COMPAT hack to detect prosodyctl 19 if prosody.shutdown then -- COMPAT hack to detect prosodyctl
17 invites = module:depends("invites"); 20 invites = module:depends("invites");
18 end 21 end
34 name = "expire"; 37 name = "expire";
35 label = "Invite valid until"; 38 label = "Invite valid until";
36 }, 39 },
37 }); 40 });
38 41
42 -- This is for checking if username (on the current host)
43 -- may create invites that allow people to register accounts
44 -- on this host.
45 local function may_invite_new_users(jid)
46 if allow_user_invites then
47 return true;
48 end
49 if usermanager.get_roles then
50 local user_roles = usermanager.get_roles(jid, module.host);
51 if not user_roles then return; end
52 if user_roles["prosody:admin"] then
53 return true;
54 elseif allow_user_invite_roles then
55 for allowed_role in allow_user_invite_roles do
56 if user_roles[allowed_role] then
57 return true;
58 end
59 end
60 end
61 elseif usermanager.is_admin(jid, module.host) then
62 return true;
63 end
64 return false;
65 end
66
39 module:depends("adhoc"); 67 module:depends("adhoc");
40 68
41 -- This command is available to all local users, even if allow_user_invites = false 69 -- This command is available to all local users, even if allow_user_invites = false
42 -- If allow_user_invites is false, creating an invite still works, but the invite will 70 -- If allow_user_invites is false, creating an invite still works, but the invite will
43 -- not be valid for registration on the current server, only for establishing a roster 71 -- not be valid for registration on the current server, only for establishing a roster
51 error = { 79 error = {
52 message = "This command is only available to users of "..module.host; 80 message = "This command is only available to users of "..module.host;
53 }; 81 };
54 }; 82 };
55 end 83 end
56 local invite = invites.create_contact(username, allow_user_invites, { 84 local invite = invites.create_contact(username, may_invite_new_users(data.from), {
57 source = data.from 85 source = data.from
58 }); 86 });
59 --TODO: check errors 87 --TODO: check errors
60 return { 88 return {
61 status = "completed"; 89 status = "completed";