Software /
code /
prosody
Annotate
plugins/muc/members_only.lib.lua @ 12642:9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
We began moving away from simple "is this user an admin?" permission checks
before 0.12, with the introduction of mod_authz_internal and the ability to
dynamically change the roles of individual users.
The approach in 0.12 still had various limitations however, and apart from
the introduction of roles other than "admin" and the ability to pull that info
from storage, not much actually changed.
This new framework shakes things up a lot, though aims to maintain the same
functionality and behaviour on the surface for a default Prosody
configuration. That is, if you don't take advantage of any of the new
features, you shouldn't notice any change.
The biggest change visible to developers is that usermanager.is_admin() (and
the auth provider is_admin() method) have been removed. Gone. Completely.
Permission checks should now be performed using a new module API method:
module:may(action_name, context)
This method accepts an action name, followed by either a JID (string) or
(preferably) a table containing 'origin'/'session' and 'stanza' fields (e.g.
the standard object passed to most events). It will return true if the action
should be permitted, or false/nil otherwise.
Modules should no longer perform permission checks based on the role name.
E.g. a lot of code previously checked if the user's role was prosody:admin
before permitting some action. Since many roles might now exist with similar
permissions, and the permissions of prosody:admin may be redefined
dynamically, it is no longer suitable to use this method for permission
checks. Use module:may().
If you start an action name with ':' (recommended) then the current module's
name will automatically be used as a prefix.
To define a new permission, use the new module API:
module:default_permission(role_name, action_name)
module:default_permissions(role_name, { action_name[, action_name...] })
This grants the specified role permission to execute the named action(s) by
default. This may be overridden via other mechanisms external to your module.
The built-in roles that developers should use are:
- prosody:user (normal user)
- prosody:admin (host admin)
- prosody:operator (global admin)
The new prosody:operator role is intended for server-wide actions (such as
shutting down Prosody).
Finally, all usage of is_admin() in modules has been fixed by this commit.
Some of these changes were trickier than others, but no change is expected to
break existing deployments.
EXCEPT: mod_auth_ldap no longer supports the ldap_admin_filter option. It's
very possible nobody is using this, but if someone is then we can later update
it to pull roles from LDAP somehow.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 15 Jun 2022 12:15:01 +0100 |
parent | 12029:631b2afa7bc1 |
child | 12977:74b9e05af71e |
rev | line source |
---|---|
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
1 -- Prosody IM |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
4 -- Copyright (C) 2014 Daurnimator |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
5 -- |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
6 -- This project is MIT/X11 licensed. Please see the |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
7 -- COPYING file in the source package for more information. |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
8 -- |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
9 |
6329
6b3eb1611587
mod_muc: Import util.stanza into the config handler modules that need it. Fixes #432.
Matthew Wild <mwild1@gmail.com>
parents:
6230
diff
changeset
|
10 local st = require "util.stanza"; |
6b3eb1611587
mod_muc: Import util.stanza into the config handler modules that need it. Fixes #432.
Matthew Wild <mwild1@gmail.com>
parents:
6230
diff
changeset
|
11 |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
12 local muc_util = module:require "muc/util"; |
7086
6cc7c9da29ed
MUC: Rename variables to please luacheck
Kim Alvefur <zash@zash.se>
parents:
6991
diff
changeset
|
13 local valid_affiliations = muc_util.valid_affiliations; |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
14 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
15 local function get_members_only(room) |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
16 return room._data.members_only; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
17 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
18 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
19 local function set_members_only(room, members_only) |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
20 members_only = members_only and true or nil; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
21 if room._data.members_only == members_only then return false; end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
22 room._data.members_only = members_only; |
6477
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
23 if members_only then |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
24 --[[ |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
25 If as a result of a change in the room configuration the room type is |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
26 changed to members-only but there are non-members in the room, |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
27 the service MUST remove any non-members from the room and include a |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
28 status code of 322 in the presence unavailable stanzas sent to those users |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
29 as well as any remaining occupants. |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
30 ]] |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
31 local occupants_changed = {}; |
7086
6cc7c9da29ed
MUC: Rename variables to please luacheck
Kim Alvefur <zash@zash.se>
parents:
6991
diff
changeset
|
32 for _, occupant in room:each_occupant() do |
6477
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
33 local affiliation = room:get_affiliation(occupant.bare_jid); |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
34 if valid_affiliations[affiliation or "none"] <= valid_affiliations.none then |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
35 occupant.role = nil; |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
36 room:save_occupant(occupant); |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
37 occupants_changed[occupant] = true; |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
38 end |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
39 end |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
40 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}) |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
41 :tag("status", {code="322"}):up(); |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
42 for occupant in pairs(occupants_changed) do |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
43 room:publicise_occupant_status(occupant, x); |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
44 module:fire_event("muc-occupant-left", {room = room; nick = occupant.nick; occupant = occupant;}); |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
45 end |
29f979f554d3
plugins/muc/members_only: Kick non-members when members-only is turned on
daurnimator <quae@daurnimator.com>
parents:
6329
diff
changeset
|
46 end |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
47 return true; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
48 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
49 |
8976
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
50 local function get_allow_member_invites(room) |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
51 return room._data.allow_member_invites; |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
52 end |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
53 |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
54 -- Allows members to invite new members into a members-only room, |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
55 -- effectively creating an invite-only room |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
56 local function set_allow_member_invites(room, allow_member_invites) |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
57 allow_member_invites = allow_member_invites and true or nil; |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
58 if room._data.allow_member_invites == allow_member_invites then return false; end |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
59 room._data.allow_member_invites = allow_member_invites; |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
60 return true; |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
61 end |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
62 |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
63 module:hook("muc-disco#info", function(event) |
11545
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
64 local members_only_room = not not get_members_only(event.room); |
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
65 local members_can_invite = not not get_allow_member_invites(event.room); |
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
66 event.reply:tag("feature", {var = members_only_room and "muc_membersonly" or "muc_open"}):up(); |
8985
4101bcf9639a
MUC: Add allowmemberinvites to disco#info so clients know whether to allow users to invite others in a members-only room
Matthew Wild <mwild1@gmail.com>
parents:
8976
diff
changeset
|
67 table.insert(event.form, { |
4101bcf9639a
MUC: Add allowmemberinvites to disco#info so clients know whether to allow users to invite others in a members-only room
Matthew Wild <mwild1@gmail.com>
parents:
8976
diff
changeset
|
68 name = "{http://prosody.im/protocol/muc}roomconfig_allowmemberinvites"; |
9034
1c709e3d2e5e
MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents:
8987
diff
changeset
|
69 label = "Allow members to invite new members"; |
8985
4101bcf9639a
MUC: Add allowmemberinvites to disco#info so clients know whether to allow users to invite others in a members-only room
Matthew Wild <mwild1@gmail.com>
parents:
8976
diff
changeset
|
70 type = "boolean"; |
11545
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
71 value = members_can_invite; |
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
72 }); |
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
73 table.insert(event.form, { |
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
74 name = "muc#roomconfig_allowinvites"; |
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
75 label = "Allow users to invite other users"; |
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
76 type = "boolean"; |
7b8a482f4efd
MUC: Add support for advertising muc#roomconfig_allowinvites in room disco#info
Matthew Wild <mwild1@gmail.com>
parents:
9716
diff
changeset
|
77 value = not members_only_room or members_can_invite; |
8985
4101bcf9639a
MUC: Add allowmemberinvites to disco#info so clients know whether to allow users to invite others in a members-only room
Matthew Wild <mwild1@gmail.com>
parents:
8976
diff
changeset
|
78 }); |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
79 end); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
80 |
8985
4101bcf9639a
MUC: Add allowmemberinvites to disco#info so clients know whether to allow users to invite others in a members-only room
Matthew Wild <mwild1@gmail.com>
parents:
8976
diff
changeset
|
81 |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
82 module:hook("muc-config-form", function(event) |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
83 table.insert(event.form, { |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
84 name = "muc#roomconfig_membersonly"; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
85 type = "boolean"; |
9034
1c709e3d2e5e
MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents:
8987
diff
changeset
|
86 label = "Only allow members to join"; |
1c709e3d2e5e
MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents:
8987
diff
changeset
|
87 desc = "Enable this to only allow access for room owners, admins and members"; |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
88 value = get_members_only(event.room); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
89 }); |
8976
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
90 table.insert(event.form, { |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
91 name = "{http://prosody.im/protocol/muc}roomconfig_allowmemberinvites"; |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
92 type = "boolean"; |
9034
1c709e3d2e5e
MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents:
8987
diff
changeset
|
93 label = "Allow members to invite new members"; |
8976
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
94 value = get_allow_member_invites(event.room); |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
95 }); |
9035
173c0e16e704
MUC: Add sections in room config form
Matthew Wild <mwild1@gmail.com>
parents:
9034
diff
changeset
|
96 end, 90-3); |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
97 |
6991
84e01dbb739e
MUC: Update all config form handlers to take advantage of the new per-option events
Matthew Wild <mwild1@gmail.com>
parents:
6477
diff
changeset
|
98 module:hook("muc-config-submitted/muc#roomconfig_membersonly", function(event) |
84e01dbb739e
MUC: Update all config form handlers to take advantage of the new per-option events
Matthew Wild <mwild1@gmail.com>
parents:
6477
diff
changeset
|
99 if set_members_only(event.room, event.value) then |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
100 event.status_codes["104"] = true; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
101 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
102 end); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
103 |
8976
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
104 module:hook("muc-config-submitted/{http://prosody.im/protocol/muc}roomconfig_allowmemberinvites", function(event) |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
105 if set_allow_member_invites(event.room, event.value) then |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
106 event.status_codes["104"] = true; |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
107 end |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
108 end); |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
109 |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
110 -- No affiliation => role of "none" |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
111 module:hook("muc-get-default-role", function(event) |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
112 if not event.affiliation and get_members_only(event.room) then |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
113 return false; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
114 end |
9716
5281a795d6df
MUC: Adjust priorities of muc-get-default-role handlers (fixes #1272)
Matthew Wild <mwild1@gmail.com>
parents:
9035
diff
changeset
|
115 end, 2); |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
116 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
117 -- registration required for entering members-only room |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
118 module:hook("muc-occupant-pre-join", function(event) |
6230
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
119 local room = event.room; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
120 if get_members_only(room) then |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
121 local stanza = event.stanza; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
122 local affiliation = room:get_affiliation(stanza.attr.from); |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
123 if valid_affiliations[affiliation or "none"] <= valid_affiliations.none then |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
9716
diff
changeset
|
124 local reply = st.error_reply(stanza, "auth", "registration-required", nil, room.jid):up(); |
12029
631b2afa7bc1
MUC: Remove <{muc}x> tags in some errors
Kim Alvefur <zash@zash.se>
parents:
12027
diff
changeset
|
125 event.origin.send(reply); |
6230
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
126 return true; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
127 end |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
128 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
129 end, -5); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
130 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
131 -- Invitation privileges in members-only rooms SHOULD be restricted to room admins; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
132 -- if a member without privileges to edit the member list attempts to invite another user |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
133 -- the service SHOULD return a <forbidden/> error to the occupant |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
134 module:hook("muc-pre-invite", function(event) |
6230
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
135 local room = event.room; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
136 if get_members_only(room) then |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
137 local stanza = event.stanza; |
8987
596c8c7d98b1
MUC: Clarify logic of invitations in members-only rooms
Matthew Wild <mwild1@gmail.com>
parents:
8985
diff
changeset
|
138 local inviter_affiliation = room:get_affiliation(stanza.attr.from) or "none"; |
596c8c7d98b1
MUC: Clarify logic of invitations in members-only rooms
Matthew Wild <mwild1@gmail.com>
parents:
8985
diff
changeset
|
139 local required_affiliation = room._data.allow_member_invites and "member" or "admin"; |
596c8c7d98b1
MUC: Clarify logic of invitations in members-only rooms
Matthew Wild <mwild1@gmail.com>
parents:
8985
diff
changeset
|
140 if valid_affiliations[inviter_affiliation] < valid_affiliations[required_affiliation] then |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
9716
diff
changeset
|
141 event.origin.send(st.error_reply(stanza, "auth", "forbidden", nil, room.jid)); |
6230
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
142 return true; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
143 end |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
144 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
145 end); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
146 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
147 -- When an invite is sent; add an affiliation for the invitee |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
148 module:hook("muc-invite", function(event) |
6230
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
149 local room = event.room; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
150 if get_members_only(room) then |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
151 local stanza = event.stanza; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
152 local invitee = stanza.attr.to; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
153 local affiliation = room:get_affiliation(invitee); |
8987
596c8c7d98b1
MUC: Clarify logic of invitations in members-only rooms
Matthew Wild <mwild1@gmail.com>
parents:
8985
diff
changeset
|
154 local invited_unaffiliated = valid_affiliations[affiliation or "none"] <= valid_affiliations.none; |
596c8c7d98b1
MUC: Clarify logic of invitations in members-only rooms
Matthew Wild <mwild1@gmail.com>
parents:
8985
diff
changeset
|
155 if invited_unaffiliated then |
6230
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
156 local from = stanza:get_child("x", "http://jabber.org/protocol/muc#user") |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
157 :get_child("invite").attr.from; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
158 module:log("debug", "%s invited %s into members only room %s, granting membership", |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
159 from, invitee, room.jid); |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
160 -- This might fail; ignore for now |
8976
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
161 room:set_affiliation(true, invitee, "member", "Invited by " .. from); |
7353
ca31d3271cf8
MUC: Save room to storage once after form processing, not in each individual setter
Kim Alvefur <zash@zash.se>
parents:
7352
diff
changeset
|
162 room:save(); |
6230
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
163 end |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
164 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
165 end); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
166 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
167 return { |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
168 get = get_members_only; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
169 set = set_members_only; |
8976
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
170 get_allow_member_invites = get_allow_member_invites; |
92f0876b9230
MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents:
7401
diff
changeset
|
171 set_allow_member_invites = set_allow_member_invites; |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
172 }; |