Software /
code /
prosody
Annotate
plugins/muc/members_only.lib.lua @ 11305:cd8516a77255
util.startup: Make installer_plugin_path relative to data directory
Having it relative to current working directory is problematic since
this depends on how Prosody was started and changes to the data
directory during startup (but after this point).
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 24 Jan 2021 16:12:53 +0100 |
parent | 10449:2e36a54906e4 |
child | 11560:3bbb1af92514 |
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) |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
64 event.reply:tag("feature", {var = get_members_only(event.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
|
65 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
|
66 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
|
67 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
|
68 type = "boolean"; |
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
|
69 value = not not get_allow_member_invites(event.room); |
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 }); |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
71 end); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
72 |
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
|
73 |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
74 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
|
75 table.insert(event.form, { |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
76 name = "muc#roomconfig_membersonly"; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
77 type = "boolean"; |
9034
1c709e3d2e5e
MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents:
8987
diff
changeset
|
78 label = "Only allow members to join"; |
1c709e3d2e5e
MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents:
8987
diff
changeset
|
79 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
|
80 value = get_members_only(event.room); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
81 }); |
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
|
82 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
|
83 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
|
84 type = "boolean"; |
9034
1c709e3d2e5e
MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents:
8987
diff
changeset
|
85 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
|
86 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
|
87 }); |
9035
173c0e16e704
MUC: Add sections in room config form
Matthew Wild <mwild1@gmail.com>
parents:
9034
diff
changeset
|
88 end, 90-3); |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
89 |
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
|
90 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
|
91 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
|
92 event.status_codes["104"] = true; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
93 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
94 end); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
95 |
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
|
96 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
|
97 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
|
98 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
|
99 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
|
100 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
|
101 |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
102 -- No affiliation => role of "none" |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
103 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
|
104 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
|
105 return false; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
106 end |
9716
5281a795d6df
MUC: Adjust priorities of muc-get-default-role handlers (fixes #1272)
Matthew Wild <mwild1@gmail.com>
parents:
9035
diff
changeset
|
107 end, 2); |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
108 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
109 -- 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
|
110 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
|
111 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
|
112 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
|
113 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
|
114 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
|
115 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
|
116 local reply = st.error_reply(stanza, "auth", "registration-required", nil, room.jid):up(); |
6230
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
117 reply.tags[1].attr.code = "407"; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
118 event.origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
119 return true; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
120 end |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
121 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
122 end, -5); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
123 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
124 -- 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
|
125 -- 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
|
126 -- 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
|
127 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
|
128 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
|
129 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
|
130 local stanza = event.stanza; |
8987
596c8c7d98b1
MUC: Clarify logic of invitations in members-only rooms
Matthew Wild <mwild1@gmail.com>
parents:
8985
diff
changeset
|
131 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
|
132 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
|
133 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
|
134 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
|
135 return true; |
97d53caef325
plugins/muc/members_only.lib: Compare affiliations via rank; wrap some long lines
daurnimator <quae@daurnimator.com>
parents:
6221
diff
changeset
|
136 end |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
137 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
138 end); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
139 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
140 -- 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
|
141 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
|
142 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
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 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
|
149 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
|
150 :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
|
151 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
|
152 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
|
153 -- 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
|
154 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
|
155 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
|
156 end |
6221
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
157 end |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
158 end); |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
159 |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
160 return { |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
161 get = get_members_only; |
f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
162 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
|
163 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
|
164 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
|
165 }; |