plugins/muc/mod_muc.lua
author Kim Alvefur <zash@zash.se>
Fri, 20 Jan 2023 19:47:00 +0100
changeset 12858 73db76cc6472
parent 12735 a314f5bff9f0
child 12981 74b9e05af71e
permissions -rw-r--r--
MUC: Add note about non-existant room method
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2033
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2033
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5692
diff changeset
     4
--
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
-- COPYING file in the source package for more information.
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
--
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
8575
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8390
diff changeset
     9
-- Exposed functions:
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8390
diff changeset
    10
--
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8390
diff changeset
    11
-- create_room(jid) -> room
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8390
diff changeset
    12
-- track_room(room)
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8390
diff changeset
    13
-- delete_room(room)
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8390
diff changeset
    14
-- forget_room(room)
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8390
diff changeset
    15
-- get_room_from_jid(jid) -> room
9053
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
    16
-- each_room(live_only) -> () -> room [DEPRECATED]
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
    17
-- all_rooms() -> room
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
    18
-- live_rooms() -> room
8575
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8390
diff changeset
    19
-- shutdown_component()
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    20
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    21
if module:get_host_type() ~= "component" then
7362
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7353
diff changeset
    22
	error("MUC should be loaded as a component, please see https://prosody.im/doc/components", 0);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    23
end
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
5064
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
    25
local muclib = module:require "muc";
6234
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
    26
room_mt = muclib.room_mt; -- Yes, global.
8882
4dee8c439afc MUC: Expose method for creating a bare room object
Kim Alvefur <zash@zash.se>
parents: 8880
diff changeset
    27
new_room = muclib.new_room;
6772
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    28
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    29
local name = module:require "muc/name";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    30
room_mt.get_name = name.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    31
room_mt.set_name = name.set;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    32
6772
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    33
local description = module:require "muc/description";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    34
room_mt.get_description = description.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    35
room_mt.set_description = description.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    36
8836
9c90cd2fc4c3 MUC: Add support for setting a room language (closes #1149)
Kim Alvefur <zash@zash.se>
parents: 8821
diff changeset
    37
local language = module:require "muc/language";
9c90cd2fc4c3 MUC: Add support for setting a room language (closes #1149)
Kim Alvefur <zash@zash.se>
parents: 8821
diff changeset
    38
room_mt.get_language = language.get;
9c90cd2fc4c3 MUC: Add support for setting a room language (closes #1149)
Kim Alvefur <zash@zash.se>
parents: 8821
diff changeset
    39
room_mt.set_language = language.set;
9c90cd2fc4c3 MUC: Add support for setting a room language (closes #1149)
Kim Alvefur <zash@zash.se>
parents: 8821
diff changeset
    40
6772
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    41
local hidden = module:require "muc/hidden";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    42
room_mt.get_hidden = hidden.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    43
room_mt.set_hidden = hidden.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    44
function room_mt:get_public()
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    45
	return not self:get_hidden();
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    46
end
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    47
function room_mt:set_public(public)
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    48
	return self:set_hidden(not public);
3575
bc3dfc00da5d MUC: Allow restricting room creation to local JIDs (thanks thomas.mangin).
Waqas Hussain <waqas20@gmail.com>
parents: 3560
diff changeset
    49
end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    50
6772
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    51
local password = module:require "muc/password";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    52
room_mt.get_password = password.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    53
room_mt.set_password = password.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    54
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    55
local members_only = module:require "muc/members_only";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    56
room_mt.get_members_only = members_only.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    57
room_mt.set_members_only = members_only.set;
8979
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: 8947
diff changeset
    58
room_mt.get_allow_member_invites = members_only.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: 8947
diff changeset
    59
room_mt.set_allow_member_invites = members_only.set_allow_member_invites;
6772
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    60
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    61
local moderated = module:require "muc/moderated";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    62
room_mt.get_moderated = moderated.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    63
room_mt.set_moderated = moderated.set;
5808
026367992a0f mod_muc: Support for locking newly-created rooms until they are configured (enabled with muc_room_locking = true)
Matthew Wild <mwild1@gmail.com>
parents: 5807
diff changeset
    64
8868
2a8bbfcb6868 MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents: 8846
diff changeset
    65
local request = module:require "muc/request";
2a8bbfcb6868 MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents: 8846
diff changeset
    66
room_mt.handle_role_request = request.handle_request;
2a8bbfcb6868 MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents: 8846
diff changeset
    67
6772
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    68
local persistent = module:require "muc/persistent";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    69
room_mt.get_persistent = persistent.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    70
room_mt.set_persistent = persistent.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    71
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    72
local subject = module:require "muc/subject";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    73
room_mt.get_changesubject = subject.get_changesubject;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    74
room_mt.set_changesubject = subject.set_changesubject;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    75
room_mt.get_subject = subject.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    76
room_mt.set_subject = subject.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    77
room_mt.send_subject = subject.send;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    78
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    79
local history = module:require "muc/history";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    80
room_mt.send_history = history.send;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    81
room_mt.get_historylength = history.get_length;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    82
room_mt.set_historylength = history.set_length;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6748
diff changeset
    83
9243
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
    84
local register = module:require "muc/register";
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
    85
room_mt.get_registered_nick = register.get_registered_nick;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
    86
room_mt.get_registered_jid = register.get_registered_jid;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
    87
room_mt.handle_register_iq = register.handle_register_iq;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
    88
10357
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents: 9651
diff changeset
    89
local presence_broadcast = module:require "muc/presence_broadcast";
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents: 9651
diff changeset
    90
room_mt.get_presence_broadcast = presence_broadcast.get;
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents: 9651
diff changeset
    91
room_mt.set_presence_broadcast = presence_broadcast.set;
12858
73db76cc6472 MUC: Add note about non-existant room method
Kim Alvefur <zash@zash.se>
parents: 12735
diff changeset
    92
room_mt.get_valid_broadcast_roles = presence_broadcast.get_valid_broadcast_roles; -- FIXME doesn't exist in the library
10357
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents: 9651
diff changeset
    93
11219
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents: 11061
diff changeset
    94
local occupant_id = module:require "muc/occupant_id";
12112
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 12014
diff changeset
    95
room_mt.get_salt = occupant_id.get_room_salt;
11219
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents: 11061
diff changeset
    96
room_mt.get_occupant_id = occupant_id.get_occupant_id;
10357
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents: 9651
diff changeset
    97
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    98
local jid_split = require "util.jid".split;
10370
5611c939743a MUC: Strictly validate room JID on creation
Kim Alvefur <zash@zash.se>
parents: 10357
diff changeset
    99
local jid_prep = require "util.jid".prep;
2033
38d32c154cec MUC: Added config option 'restrict_room_creation' to allow restricting room creation to admins.
Waqas Hussain <waqas20@gmail.com>
parents: 2028
diff changeset
   100
local jid_bare = require "util.jid".bare;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   101
local st = require "util.stanza";
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   102
local cache = require "util.cache";
3330
bdc325ce9fbc MUC: Make number of stored history messages configurable with option max_history_messages (thanks michal and others who requested)
Matthew Wild <mwild1@gmail.com>
parents: 3262
diff changeset
   103
9038
173c0e16e704 MUC: Add sections in room config form
Matthew Wild <mwild1@gmail.com>
parents: 9022
diff changeset
   104
module:require "muc/config_form_sections";
173c0e16e704 MUC: Add sections in room config form
Matthew Wild <mwild1@gmail.com>
parents: 9022
diff changeset
   105
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
   106
module:depends("disco");
6235
d433db49e353 plugins/muc/mod_muc: Use get_option_string instead of get_option and checking
daurnimator <quae@daurnimator.com>
parents: 6234
diff changeset
   107
module:add_identity("conference", "text", module:get_option_string("name", "Prosody Chatrooms"));
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
   108
module:add_feature("http://jabber.org/protocol/muc");
6091
3a1c39b31497 plugins/muc/mod_muc: Move Xep-0307 MUC unique to seperate file
daurnimator <quae@daurnimator.com>
parents: 6000
diff changeset
   109
module:depends "muc_unique"
10697
76bb806cdd4b MUC: Add initial hats support (broadcast only)
Matthew Wild <mwild1@gmail.com>
parents: 10651
diff changeset
   110
module:require "muc/hats";
6206
f937bb5c83c3 plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents: 6205
diff changeset
   111
module:require "muc/lock";
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
   112
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12112
diff changeset
   113
module:default_permissions("prosody:admin", {
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12112
diff changeset
   114
	":automatic-ownership";
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12112
diff changeset
   115
	":create-room";
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12112
diff changeset
   116
	":recreate-destroyed-room";
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12112
diff changeset
   117
});
2033
38d32c154cec MUC: Added config option 'restrict_room_creation' to allow restricting room creation to admins.
Waqas Hussain <waqas20@gmail.com>
parents: 2028
diff changeset
   118
10650
85585910d468 mod_muc: Allow control over the server-admins-are-room-owners feature (see #1174)
Matthew Wild <mwild1@gmail.com>
parents: 9630
diff changeset
   119
if module:get_option_boolean("component_admins_as_room_owners", true) then
85585910d468 mod_muc: Allow control over the server-admins-are-room-owners feature (see #1174)
Matthew Wild <mwild1@gmail.com>
parents: 9630
diff changeset
   120
	-- Monkey patch to make server admins room owners
6234
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
   121
	local _get_affiliation = room_mt.get_affiliation;
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
   122
	function room_mt:get_affiliation(jid)
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12112
diff changeset
   123
		if module:may(":automatic-ownership", jid) then return "owner"; end
6234
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
   124
		return _get_affiliation(self, jid);
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
   125
	end
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
   126
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
   127
	local _set_affiliation = room_mt.set_affiliation;
9240
b86c2e135797 MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents: 9224
diff changeset
   128
	function room_mt:set_affiliation(actor, jid, affiliation, reason, data)
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12112
diff changeset
   129
		if affiliation ~= "owner" and module:may(":automatic-ownership", jid) then return nil, "modify", "not-acceptable"; end
9240
b86c2e135797 MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents: 9224
diff changeset
   130
		return _set_affiliation(self, actor, jid, affiliation, reason, data);
6234
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
   131
	end
5064
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
   132
end
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
   133
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   134
local persistent_rooms_storage = module:open_store("persistent");
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   135
local persistent_rooms = module:open_store("persistent", "map");
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   136
local room_configs = module:open_store("config");
7418
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7417
diff changeset
   137
local room_state = module:open_store("state");
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   138
7374
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   139
local room_items_cache = {};
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   140
7417
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
   141
local function room_save(room, forced, savestate)
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   142
	local node = jid_split(room.jid);
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   143
	local is_persistent = persistent.get(room);
11061
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   144
	if room:get_public() then
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   145
		room_items_cache[room.jid] = room:get_name() or "";
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   146
	else
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   147
		room_items_cache[room.jid] = nil;
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   148
	end
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   149
7417
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
   150
	if is_persistent or savestate then
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   151
		persistent_rooms:set(nil, room.jid, true);
7418
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7417
diff changeset
   152
		local data, state = room:freeze(savestate);
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7417
diff changeset
   153
		room_state:set(node, state);
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   154
		return room_configs:set(node, data);
7417
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
   155
	elseif forced then
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   156
		persistent_rooms:set(nil, room.jid, nil);
7418
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7417
diff changeset
   157
		room_state:set(node, nil);
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   158
		return room_configs:set(node, nil);
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   159
	end
6745
6efeb801d62f Backed out changeset bea3862b6bde in favor of a different approach
Kim Alvefur <zash@zash.se>
parents: 6744
diff changeset
   160
end
5064
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
   161
8821
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8710
diff changeset
   162
local max_rooms = module:get_option_number("muc_max_rooms");
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8710
diff changeset
   163
local max_live_rooms = module:get_option_number("muc_room_cache_size", 100);
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8710
diff changeset
   164
8929
89f6b2a2bec3 MUC: Measure cache hits and misses
Kim Alvefur <zash@zash.se>
parents: 8928
diff changeset
   165
local room_hit = module:measure("room_hit", "rate");
89f6b2a2bec3 MUC: Measure cache hits and misses
Kim Alvefur <zash@zash.se>
parents: 8928
diff changeset
   166
local room_miss = module:measure("room_miss", "rate")
8928
d367aeb9c50f MUC: Rename eviction hit rate measure
Kim Alvefur <zash@zash.se>
parents: 8882
diff changeset
   167
local room_eviction = module:measure("room_eviction", "rate");
8821
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8710
diff changeset
   168
local rooms = cache.new(max_rooms or max_live_rooms, function (jid, room)
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8710
diff changeset
   169
	if max_rooms then
9194
5192adc5c47f MUC: Pass missing argument to log message
Kim Alvefur <zash@zash.se>
parents: 9096
diff changeset
   170
		module:log("info", "Room limit of %d reached, no new rooms allowed", max_rooms);
8821
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8710
diff changeset
   171
		return false;
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8710
diff changeset
   172
	end
8388
43d50a957463 MUC: Tweak debug log message
Kim Alvefur <zash@zash.se>
parents: 8183
diff changeset
   173
	module:log("debug", "Evicting room %s", jid);
8928
d367aeb9c50f MUC: Rename eviction hit rate measure
Kim Alvefur <zash@zash.se>
parents: 8882
diff changeset
   174
	room_eviction();
11061
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   175
	if room:get_public() then
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   176
		room_items_cache[room.jid] = room:get_name() or "";
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   177
	else
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   178
		room_items_cache[room.jid] = nil;
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   179
	end
8660
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   180
	local ok, err = room_save(room, nil, true); -- Force to disk
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   181
	if not ok then
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   182
		module:log("error", "Failed to swap inactive room %s to disk: %s", jid, err);
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   183
		return false;
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   184
	end
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   185
end);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   186
11496
6da8d9cb355d MUC: Report number of live rooms to statsmanager
Kim Alvefur <zash@zash.se>
parents: 11219
diff changeset
   187
local measure_rooms_size = module:measure("live_room", "amount");
6da8d9cb355d MUC: Report number of live rooms to statsmanager
Kim Alvefur <zash@zash.se>
parents: 11219
diff changeset
   188
module:hook_global("stats-update", function ()
6da8d9cb355d MUC: Report number of live rooms to statsmanager
Kim Alvefur <zash@zash.se>
parents: 11219
diff changeset
   189
	measure_rooms_size(rooms:count());
6da8d9cb355d MUC: Report number of live rooms to statsmanager
Kim Alvefur <zash@zash.se>
parents: 11219
diff changeset
   190
end);
6da8d9cb355d MUC: Report number of live rooms to statsmanager
Kim Alvefur <zash@zash.se>
parents: 11219
diff changeset
   191
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   192
-- Automatically destroy empty non-persistent rooms
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   193
module:hook("muc-occupant-left",function(event)
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   194
	local room = event.room
9010
695904638cfa MUC: Flag rooms being destroyed (fixes #887)
Kim Alvefur <zash@zash.se>
parents: 8980
diff changeset
   195
	if room.destroying then return end
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   196
	if not room:has_occupant() and not persistent.get(room) then -- empty, non-persistent room
9013
3c5ddd53fe50 MUC: Log a debug message when a non-persistent room becomes empty and is destroyed
Kim Alvefur <zash@zash.se>
parents: 9010
diff changeset
   197
		module:log("debug", "%q empty, destroying", room.jid);
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   198
		module:fire_event("muc-room-destroyed", { room = room });
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   199
	end
7420
4c8ee8175f5e MUC: Lower priority of hook so plugins hooks run before
Kim Alvefur <zash@zash.se>
parents: 7418
diff changeset
   200
end, -1);
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   201
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
   202
function track_room(room)
8660
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   203
	if rooms:set(room.jid, room) then
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   204
		-- When room is created, over-ride 'save' method
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   205
		room.save = room_save;
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   206
		return room;
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   207
	end
9081
9e339197c724 mod_muc: Add comment
Matthew Wild <mwild1@gmail.com>
parents: 9054
diff changeset
   208
	-- Resource limit reached
8660
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   209
	return false;
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
   210
end
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
   211
8664
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8663
diff changeset
   212
local function handle_broken_room(room, origin, stanza)
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8663
diff changeset
   213
	module:log("debug", "Returning error from broken room %s", room.jid);
10453
2e36a54906e4 MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents: 10370
diff changeset
   214
	origin.send(st.error_reply(stanza, "wait", "internal-server-error", nil, room.jid));
8664
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8663
diff changeset
   215
	return true;
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   216
end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   217
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   218
local function restore_room(jid)
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   219
	local node = jid_split(jid);
8659
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8575
diff changeset
   220
	local data, err = room_configs:get(node);
4924
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
   221
	if data then
8181
9f2a5fc9e4a5 MUC: Log debug message when restoring a room from storage
Kim Alvefur <zash@zash.se>
parents: 8029
diff changeset
   222
		module:log("debug", "Restoring room %s from storage", jid);
9082
c040c358d6c0 mod_muc: Fire event when room is (and about to be) restored
Matthew Wild <mwild1@gmail.com>
parents: 9081
diff changeset
   223
		if module:fire_event("muc-room-pre-restore", { jid = jid, data = data }) == false then
c040c358d6c0 mod_muc: Fire event when room is (and about to be) restored
Matthew Wild <mwild1@gmail.com>
parents: 9081
diff changeset
   224
			return false;
c040c358d6c0 mod_muc: Fire event when room is (and about to be) restored
Matthew Wild <mwild1@gmail.com>
parents: 9081
diff changeset
   225
		end
8662
4006755c1097 MUC: Log failure to load room state
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
   226
		local state, s_err = room_state:get(node);
4006755c1097 MUC: Log failure to load room state
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
   227
		if not state and s_err then
4006755c1097 MUC: Log failure to load room state
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
   228
			module:log("debug", "Could not restore state of room %s: %s", jid, s_err);
5808
026367992a0f mod_muc: Support for locking newly-created rooms until they are configured (enabled with muc_room_locking = true)
Matthew Wild <mwild1@gmail.com>
parents: 5807
diff changeset
   229
		end
7418
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7417
diff changeset
   230
		local room = muclib.restore_room(data, state);
9016
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9015
diff changeset
   231
		if track_room(room) then
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9015
diff changeset
   232
			room_state:set(node, nil);
9082
c040c358d6c0 mod_muc: Fire event when room is (and about to be) restored
Matthew Wild <mwild1@gmail.com>
parents: 9081
diff changeset
   233
			module:fire_event("muc-room-restored", { jid = jid, room = room });
9016
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9015
diff changeset
   234
			return room;
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9015
diff changeset
   235
		else
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9015
diff changeset
   236
			return false;
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9015
diff changeset
   237
		end
8659
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8575
diff changeset
   238
	elseif err then
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8575
diff changeset
   239
		module:log("error", "Error restoring room %s from storage: %s", jid, err);
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8575
diff changeset
   240
		local room = muclib.new_room(jid, { locked = math.huge });
8664
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8663
diff changeset
   241
		room.handle_normal_presence = handle_broken_room;
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8663
diff changeset
   242
		room.handle_first_presence = handle_broken_room;
8659
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8575
diff changeset
   243
		return room;
5808
026367992a0f mod_muc: Support for locking newly-created rooms until they are configured (enabled with muc_room_locking = true)
Matthew Wild <mwild1@gmail.com>
parents: 5807
diff changeset
   244
	end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   245
end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   246
9054
68386f7b9fc9 MUC: Add some comments clarifying methods
Matthew Wild <mwild1@gmail.com>
parents: 9053
diff changeset
   247
-- Removes a room from memory, without saving it (save first if required)
6348
bffc885dc378 mod_muc: Fix tracebacks (thanks nick1)
Kim Alvefur <zash@zash.se>
parents: 6334
diff changeset
   248
function forget_room(room)
7539
3f8520b59677 MUC: Pass room JID instead of room itself to logger, fixes traceback (thanks damencho)
Kim Alvefur <zash@zash.se>
parents: 7420
diff changeset
   249
	module:log("debug", "Forgetting %s", room.jid);
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   250
	rooms.save = nil;
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   251
	rooms:set(room.jid, nil);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   252
end
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   253
9054
68386f7b9fc9 MUC: Add some comments clarifying methods
Matthew Wild <mwild1@gmail.com>
parents: 9053
diff changeset
   254
-- Removes a room from the database (may remain in memory)
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   255
function delete_room(room)
7653
4c2407422f71 Logging error if MUC room cache is full
Sam Whited <sam@samwhited.com>
parents: 7644
diff changeset
   256
	module:log("debug", "Deleting %s", room.jid);
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   257
	room_configs:set(jid_split(room.jid), nil);
9015
295faf1522f9 MUC: Purge saved room state when deleting a room
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
   258
	room_state:set(jid_split(room.jid), nil);
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   259
	persistent_rooms:set(nil, room.jid, nil);
7374
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   260
	room_items_cache[room.jid] = nil;
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   261
end
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   262
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   263
function module.unload()
9053
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   264
	for room in live_rooms() do
7417
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
   265
		room:save(nil, true);
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   266
		forget_room(room);
5808
026367992a0f mod_muc: Support for locking newly-created rooms until they are configured (enabled with muc_room_locking = true)
Matthew Wild <mwild1@gmail.com>
parents: 5807
diff changeset
   267
	end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   268
end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   269
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   270
function get_room_from_jid(room_jid)
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   271
	local room = rooms:get(room_jid);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   272
	if room then
8929
89f6b2a2bec3 MUC: Measure cache hits and misses
Kim Alvefur <zash@zash.se>
parents: 8928
diff changeset
   273
		room_hit();
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   274
		rooms:set(room_jid, room); -- bump to top;
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   275
		return room;
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
   276
	end
8929
89f6b2a2bec3 MUC: Measure cache hits and misses
Kim Alvefur <zash@zash.se>
parents: 8928
diff changeset
   277
	room_miss();
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   278
	return restore_room(room_jid);
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   279
end
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   280
9630
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   281
local function set_room_defaults(room, lang)
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   282
	room:set_public(module:get_option_boolean("muc_room_default_public", false));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   283
	room:set_persistent(module:get_option_boolean("muc_room_default_persistent", room:get_persistent()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   284
	room:set_members_only(module:get_option_boolean("muc_room_default_members_only", room:get_members_only()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   285
	room:set_allow_member_invites(module:get_option_boolean("muc_room_default_allow_member_invites",
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   286
		room:get_allow_member_invites()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   287
	room:set_moderated(module:get_option_boolean("muc_room_default_moderated", room:get_moderated()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   288
	room:set_whois(module:get_option_boolean("muc_room_default_public_jids",
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   289
		room:get_whois() == "anyone") and "anyone" or "moderators");
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   290
	room:set_changesubject(module:get_option_boolean("muc_room_default_change_subject", room:get_changesubject()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   291
	room:set_historylength(module:get_option_number("muc_room_default_history_length", room:get_historylength()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   292
	room:set_language(lang or module:get_option_string("muc_room_default_language"));
10357
7b602e13c3b6 MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents: 9651
diff changeset
   293
	room:set_presence_broadcast(module:get_option("muc_room_default_presence_broadcast", room:get_presence_broadcast()));
9630
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   294
end
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   295
8878
be3230b42f12 MUC: Allow passing config to public create_room API
Kim Alvefur <zash@zash.se>
parents: 8873
diff changeset
   296
function create_room(room_jid, config)
10370
5611c939743a MUC: Strictly validate room JID on creation
Kim Alvefur <zash@zash.se>
parents: 10357
diff changeset
   297
	if jid_bare(room_jid) ~= room_jid or not jid_prep(room_jid, true) then
5611c939743a MUC: Strictly validate room JID on creation
Kim Alvefur <zash@zash.se>
parents: 10357
diff changeset
   298
		return nil, "invalid-jid";
5611c939743a MUC: Strictly validate room JID on creation
Kim Alvefur <zash@zash.se>
parents: 10357
diff changeset
   299
	end
7644
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7539
diff changeset
   300
	local exists = get_room_from_jid(room_jid);
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7539
diff changeset
   301
	if exists then
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7539
diff changeset
   302
		return nil, "room-exists";
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7539
diff changeset
   303
	end
8878
be3230b42f12 MUC: Allow passing config to public create_room API
Kim Alvefur <zash@zash.se>
parents: 8873
diff changeset
   304
	local room = muclib.new_room(room_jid, config);
9630
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   305
	if not config then
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   306
		set_room_defaults(room);
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   307
	end
7644
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7539
diff changeset
   308
	module:fire_event("muc-room-created", {
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7539
diff changeset
   309
		room = room;
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7539
diff changeset
   310
	});
8880
9182398c64b9 MUC: Track rooms created via internal public API
Kim Alvefur <zash@zash.se>
parents: 8878
diff changeset
   311
	return track_room(room);
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
   312
end
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
   313
9053
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   314
function all_rooms()
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   315
	return coroutine.wrap(function ()
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   316
		local seen = {}; -- Don't iterate over persistent rooms twice
9053
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   317
		for room in live_rooms() do
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   318
			coroutine.yield(room);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   319
			seen[room.jid] = true;
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   320
		end
8665
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8664
diff changeset
   321
		local all_persistent_rooms, err = persistent_rooms_storage:get(nil);
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8664
diff changeset
   322
		if not all_persistent_rooms then
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8664
diff changeset
   323
			if err then
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8664
diff changeset
   324
				module:log("error", "Error loading list of persistent rooms, only rooms live in memory were iterated over");
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8664
diff changeset
   325
				module:log("debug", "%s", debug.traceback(err));
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8664
diff changeset
   326
			end
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8664
diff changeset
   327
			return nil;
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8664
diff changeset
   328
		end
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8664
diff changeset
   329
		for room_jid in pairs(all_persistent_rooms) do
7406
d6e6e21057f0 MUC: Correctly iterate over suspended rooms while excluding live rooms
Kim Alvefur <zash@zash.se>
parents: 7375
diff changeset
   330
			if not seen[room_jid] then
6482
d016437e01bf plugins/muc/mod_muc: Add 'local_only' flag to mod_muc, so rooms don't get restored on shutdown
daurnimator <quae@daurnimator.com>
parents: 6372
diff changeset
   331
				local room = restore_room(room_jid);
8660
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   332
				if room then
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   333
					coroutine.yield(room);
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
   334
				else
6482
d016437e01bf plugins/muc/mod_muc: Add 'local_only' flag to mod_muc, so rooms don't get restored on shutdown
daurnimator <quae@daurnimator.com>
parents: 6372
diff changeset
   335
					module:log("error", "Missing data for room '%s', omitting from iteration", room_jid);
d016437e01bf plugins/muc/mod_muc: Add 'local_only' flag to mod_muc, so rooms don't get restored on shutdown
daurnimator <quae@daurnimator.com>
parents: 6372
diff changeset
   336
				end
6238
b2b523d21891 plugins/muc/mod_muc: Move room persistence to own block
daurnimator <quae@daurnimator.com>
parents: 6237
diff changeset
   337
			end
b2b523d21891 plugins/muc/mod_muc: Move room persistence to own block
daurnimator <quae@daurnimator.com>
parents: 6237
diff changeset
   338
		end
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   339
	end);
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   340
end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   341
9053
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   342
function live_rooms()
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   343
	return rooms:values();
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   344
end
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   345
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   346
function each_room(live_only)
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   347
	if live_only then
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   348
		return live_rooms();
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   349
	end
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   350
	return all_rooms();
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   351
end
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   352
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
   353
module:hook("host-disco-items", function(event)
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
   354
	local reply = event.reply;
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
   355
	module:log("debug", "host-disco-items called");
7374
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   356
	if next(room_items_cache) ~= nil then
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   357
		for jid, room_name in pairs(room_items_cache) do
11061
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   358
			if room_name == "" then room_name = nil; end
7374
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   359
			reply:tag("item", { jid = jid, name = room_name }):up();
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   360
		end
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   361
	else
9053
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   362
		for room in all_rooms() do
7374
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   363
			if not room:get_hidden() then
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   364
				local jid, room_name = room.jid, room:get_name();
11061
13eee48071c8 MUC: Don't default room name to JID localpart (API breaking change)
Kim Alvefur <zash@zash.se>
parents: 10702
diff changeset
   365
				room_items_cache[jid] = room_name or "";
7374
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   366
				reply:tag("item", { jid = jid, name = room_name }):up();
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7373
diff changeset
   367
			end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
   368
		end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   369
	end
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
   370
end);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   371
8870
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8868
diff changeset
   372
module:hook("muc-room-pre-create", function (event)
9630
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9243
diff changeset
   373
	set_room_defaults(event.room, event.stanza.attr["xml:lang"]);
8870
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8868
diff changeset
   374
end, 1);
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8868
diff changeset
   375
8663
3b54f8472b51 MUC: Return error if unable to keep track of room due to storage failure
Kim Alvefur <zash@zash.se>
parents: 8662
diff changeset
   376
module:hook("muc-room-pre-create", function(event)
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
   377
	local origin, stanza = event.origin, event.stanza;
8663
3b54f8472b51 MUC: Return error if unable to keep track of room due to storage failure
Kim Alvefur <zash@zash.se>
parents: 8662
diff changeset
   378
	if not track_room(event.room) then
10454
c1edeb9fe337 MUC: Indicate the component as origin of various errors where there's no room
Kim Alvefur <zash@zash.se>
parents: 10453
diff changeset
   379
		origin.send(st.error_reply(stanza, "wait", "resource-constraint", nil, module.host));
8663
3b54f8472b51 MUC: Return error if unable to keep track of room due to storage failure
Kim Alvefur <zash@zash.se>
parents: 8662
diff changeset
   380
		return true;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   381
	end
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
   382
end, -1000);
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
   383
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   384
module:hook("muc-room-destroyed",function(event)
7373
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   385
	local room = event.room;
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   386
	forget_room(room);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   387
	delete_room(room);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
   388
end);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   389
9018
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   390
if module:get_option_boolean("muc_tombstones", true) then
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   391
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   392
	local ttl = module:get_option_number("muc_tombstone_expiry", 86400 * 31);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   393
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   394
	module:hook("muc-room-destroyed",function(event)
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   395
		local room = event.room;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   396
		if not room:get_persistent() then return end
9096
04a284c5b88b MUC: Allow destruction of tombstones (eg via telnet or adhoc command)
Kim Alvefur <zash@zash.se>
parents: 9084
diff changeset
   397
		if room._data.destroyed then
04a284c5b88b MUC: Allow destruction of tombstones (eg via telnet or adhoc command)
Kim Alvefur <zash@zash.se>
parents: 9084
diff changeset
   398
			return -- Allow destruction of tombstone
04a284c5b88b MUC: Allow destruction of tombstones (eg via telnet or adhoc command)
Kim Alvefur <zash@zash.se>
parents: 9084
diff changeset
   399
		end
9018
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   400
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   401
		local tombstone = new_room(room.jid, {
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   402
			locked = os.time() + ttl;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   403
			destroyed = true;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   404
			reason = event.reason;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   405
			newjid = event.newjid;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   406
			-- password?
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   407
		});
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   408
		tombstone.save = room_save;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   409
		tombstone:set_persistent(true);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   410
		tombstone:set_hidden(true);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   411
		tombstone:save(true);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   412
		return true;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   413
	end, -10);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   414
end
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   415
12735
a314f5bff9f0 mod_muc: Better map restrict_room_creation to role permissions (behaviour change)
Matthew Wild <mwild1@gmail.com>
parents: 12646
diff changeset
   416
local restrict_room_creation = module:get_option("restrict_room_creation");
a314f5bff9f0 mod_muc: Better map restrict_room_creation to role permissions (behaviour change)
Matthew Wild <mwild1@gmail.com>
parents: 12646
diff changeset
   417
module:default_permission(restrict_room_creation == true and "prosody:admin" or "prosody:user", ":create-room");
a314f5bff9f0 mod_muc: Better map restrict_room_creation to role permissions (behaviour change)
Matthew Wild <mwild1@gmail.com>
parents: 12646
diff changeset
   418
module:hook("muc-room-pre-create", function(event)
a314f5bff9f0 mod_muc: Better map restrict_room_creation to role permissions (behaviour change)
Matthew Wild <mwild1@gmail.com>
parents: 12646
diff changeset
   419
	local origin, stanza = event.origin, event.stanza;
a314f5bff9f0 mod_muc: Better map restrict_room_creation to role permissions (behaviour change)
Matthew Wild <mwild1@gmail.com>
parents: 12646
diff changeset
   420
	if restrict_room_creation ~= false and not module:may(":create-room", event) then
a314f5bff9f0 mod_muc: Better map restrict_room_creation to role permissions (behaviour change)
Matthew Wild <mwild1@gmail.com>
parents: 12646
diff changeset
   421
		origin.send(st.error_reply(stanza, "cancel", "not-allowed", "Room creation is restricted", module.host));
a314f5bff9f0 mod_muc: Better map restrict_room_creation to role permissions (behaviour change)
Matthew Wild <mwild1@gmail.com>
parents: 12646
diff changeset
   422
		return true;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   423
	end
12735
a314f5bff9f0 mod_muc: Better map restrict_room_creation to role permissions (behaviour change)
Matthew Wild <mwild1@gmail.com>
parents: 12646
diff changeset
   424
end);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   425
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   426
for event_name, method in pairs {
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   427
	-- Normal room interactions
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   428
	["iq-get/bare/http://jabber.org/protocol/disco#info:query"] = "handle_disco_info_get_query" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   429
	["iq-get/bare/http://jabber.org/protocol/disco#items:query"] = "handle_disco_items_get_query" ;
6141
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6129
diff changeset
   430
	["iq-set/bare/http://jabber.org/protocol/muc#admin:query"] = "handle_admin_query_set_command" ;
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6129
diff changeset
   431
	["iq-get/bare/http://jabber.org/protocol/muc#admin:query"] = "handle_admin_query_get_command" ;
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   432
	["iq-set/bare/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_set_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   433
	["iq-get/bare/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_get_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   434
	["message/bare"] = "handle_message_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   435
	["presence/bare"] = "handle_presence_to_room" ;
9243
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
   436
	["iq/bare/jabber:iq:register:query"] = "handle_register_iq";
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   437
	-- Host room
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   438
	["iq-get/host/http://jabber.org/protocol/disco#info:query"] = "handle_disco_info_get_query" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   439
	["iq-get/host/http://jabber.org/protocol/disco#items:query"] = "handle_disco_items_get_query" ;
6141
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6129
diff changeset
   440
	["iq-set/host/http://jabber.org/protocol/muc#admin:query"] = "handle_admin_query_set_command" ;
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6129
diff changeset
   441
	["iq-get/host/http://jabber.org/protocol/muc#admin:query"] = "handle_admin_query_get_command" ;
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   442
	["iq-set/host/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_set_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   443
	["iq-get/host/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_get_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   444
	["message/host"] = "handle_message_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   445
	["presence/host"] = "handle_presence_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   446
	-- Direct to occupant (normal rooms and host room)
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   447
	["presence/full"] = "handle_presence_to_occupant" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   448
	["iq/full"] = "handle_iq_to_occupant" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   449
	["message/full"] = "handle_message_to_occupant" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   450
} do
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   451
	module:hook(event_name, function (event)
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   452
		local origin, stanza = event.origin, event.stanza;
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
   453
		local room_jid = jid_bare(stanza.attr.to);
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
   454
		local room = get_room_from_jid(room_jid);
9018
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   455
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   456
		if room and room._data.destroyed then
9084
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9082
diff changeset
   457
			if room._data.locked < os.time()
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12112
diff changeset
   458
			or (module:may(":recreate-destroyed-room", event) and stanza.name == "presence" and stanza.attr.type == nil) then
9051
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9038
diff changeset
   459
				-- Allow the room to be recreated by admin or after time has passed
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9038
diff changeset
   460
				delete_room(room);
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9038
diff changeset
   461
				room = nil;
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9038
diff changeset
   462
			else
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9038
diff changeset
   463
				if stanza.attr.type ~= "error" then
10454
c1edeb9fe337 MUC: Indicate the component as origin of various errors where there's no room
Kim Alvefur <zash@zash.se>
parents: 10453
diff changeset
   464
					local reply = st.error_reply(stanza, "cancel", "gone", room._data.reason, module.host)
9022
d780c10709c1 MUC: Include redirect in 'gone' error for destroyed rooms
Kim Alvefur <zash@zash.se>
parents: 9021
diff changeset
   465
					if room._data.newjid then
d780c10709c1 MUC: Include redirect in 'gone' error for destroyed rooms
Kim Alvefur <zash@zash.se>
parents: 9021
diff changeset
   466
						local uri = "xmpp:"..room._data.newjid.."?join";
d780c10709c1 MUC: Include redirect in 'gone' error for destroyed rooms
Kim Alvefur <zash@zash.se>
parents: 9021
diff changeset
   467
						reply:get_child("error"):child_with_name("gone"):text(uri);
d780c10709c1 MUC: Include redirect in 'gone' error for destroyed rooms
Kim Alvefur <zash@zash.se>
parents: 9021
diff changeset
   468
					end
9018
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   469
					event.origin.send(reply);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   470
				end
9051
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9038
diff changeset
   471
				return true;
9018
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   472
			end
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   473
		end
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
   474
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   475
		if room == nil then
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
   476
			-- Watch presence to create rooms
10370
5611c939743a MUC: Strictly validate room JID on creation
Kim Alvefur <zash@zash.se>
parents: 10357
diff changeset
   477
			if not jid_prep(room_jid, true) then
10454
c1edeb9fe337 MUC: Indicate the component as origin of various errors where there's no room
Kim Alvefur <zash@zash.se>
parents: 10453
diff changeset
   478
				origin.send(st.error_reply(stanza, "modify", "jid-malformed", nil, module.host));
10370
5611c939743a MUC: Strictly validate room JID on creation
Kim Alvefur <zash@zash.se>
parents: 10357
diff changeset
   479
				return true;
5611c939743a MUC: Strictly validate room JID on creation
Kim Alvefur <zash@zash.se>
parents: 10357
diff changeset
   480
			end
9651
0f43b901c854 MUC: Move check for explicit room join earlier in room creation flow
Kim Alvefur <zash@zash.se>
parents: 9630
diff changeset
   481
			if stanza.attr.type == nil and stanza.name == "presence" and stanza:get_child("x", "http://jabber.org/protocol/muc") then
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
   482
				room = muclib.new_room(room_jid);
7413
45f543c82893 MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7407
diff changeset
   483
				return room:handle_first_presence(origin, stanza);
7249
80923a1a8fe1 MUC: Don't reply to error stanzas with more error stanzas (thanks woffs)
Kim Alvefur <zash@zash.se>
parents: 7089
diff changeset
   484
			elseif stanza.attr.type ~= "error" then
10454
c1edeb9fe337 MUC: Indicate the component as origin of various errors where there's no room
Kim Alvefur <zash@zash.se>
parents: 10453
diff changeset
   485
				origin.send(st.error_reply(stanza, "cancel", "item-not-found", nil, module.host));
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
   486
				return true;
7249
80923a1a8fe1 MUC: Don't reply to error stanzas with more error stanzas (thanks woffs)
Kim Alvefur <zash@zash.se>
parents: 7089
diff changeset
   487
			else
80923a1a8fe1 MUC: Don't reply to error stanzas with more error stanzas (thanks woffs)
Kim Alvefur <zash@zash.se>
parents: 7089
diff changeset
   488
				return;
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
   489
			end
9224
6dc1aeefa876 MUC: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9195
diff changeset
   490
		elseif room == false then -- Error loading room
10454
c1edeb9fe337 MUC: Indicate the component as origin of various errors where there's no room
Kim Alvefur <zash@zash.se>
parents: 10453
diff changeset
   491
			origin.send(st.error_reply(stanza, "wait", "resource-constraint", nil, module.host));
9224
6dc1aeefa876 MUC: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9195
diff changeset
   492
			return true;
5058
433cc9a4c7e9 MUC: Return <item-not-found/> on message and iq to non-existent rooms (thanks Maranda).
Waqas Hussain <waqas20@gmail.com>
parents: 5016
diff changeset
   493
		end
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   494
		return room[method](room, origin, stanza);
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
   495
	end, -2)
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   496
end
5062
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
   497
6241
6b4ff34dc8ea plugins/muc/mod_muc: Use module:shared instead of save/restore
daurnimator <quae@daurnimator.com>
parents: 6240
diff changeset
   498
function shutdown_component()
9053
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   499
	for room in live_rooms() do
7417
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
   500
		room:save(nil, true);
5062
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
   501
	end
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
   502
end
7697
bffbea1187ca MUC: Run component shutdown after mod_c2s has closed its sessions (prevents ghosts)
Kim Alvefur <zash@zash.se>
parents: 7653
diff changeset
   503
module:hook_global("server-stopping", shutdown_component, -300);
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
   504
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   505
do -- Ad-hoc commands
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   506
	module:depends "adhoc";
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   507
	local t_concat = table.concat;
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   508
	local adhoc_new = module:require "adhoc".new;
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   509
	local adhoc_initial = require "util.adhoc".new_initial_data_form;
10702
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   510
	local adhoc_simple = require "util.adhoc".new_simple_form;
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   511
	local array = require "util.array";
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   512
	local dataforms_new = require "util.dataforms".new;
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
   513
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   514
	local destroy_rooms_layout = dataforms_new {
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   515
		title = "Destroy rooms";
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   516
		instructions = "Select the rooms to destroy";
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
   517
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   518
		{ name = "FORM_TYPE", type = "hidden", value = "http://prosody.im/protocol/muc#destroy" };
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   519
		{ name = "rooms", type = "list-multi", required = true, label = "Rooms to destroy:"};
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   520
	};
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
   521
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   522
	local destroy_rooms_handler = adhoc_initial(destroy_rooms_layout, function()
9053
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9052
diff changeset
   523
		return { rooms = array.collect(all_rooms()):pluck("jid"):sort(); };
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   524
	end, function(fields, errors)
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   525
		if errors then
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   526
			local errmsg = {};
7089
6cc7c9da29ed MUC: Rename variables to please luacheck
Kim Alvefur <zash@zash.se>
parents: 6803
diff changeset
   527
			for field, err in pairs(errors) do
6cc7c9da29ed MUC: Rename variables to please luacheck
Kim Alvefur <zash@zash.se>
parents: 6803
diff changeset
   528
				errmsg[#errmsg + 1] = field .. ": " .. err;
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   529
			end
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   530
			return { status = "completed", error = { message = t_concat(errmsg, "\n") } };
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
   531
		end
12014
f995d62044fa MUC: Allow modules a chance to act prior to room destruction
Kim Alvefur <zash@zash.se>
parents: 11496
diff changeset
   532
		local destroyed = array();
f995d62044fa MUC: Allow modules a chance to act prior to room destruction
Kim Alvefur <zash@zash.se>
parents: 11496
diff changeset
   533
		for _, room_jid in ipairs(fields.rooms) do
f995d62044fa MUC: Allow modules a chance to act prior to room destruction
Kim Alvefur <zash@zash.se>
parents: 11496
diff changeset
   534
			local room = get_room_from_jid(room_jid);
f995d62044fa MUC: Allow modules a chance to act prior to room destruction
Kim Alvefur <zash@zash.se>
parents: 11496
diff changeset
   535
			if room and room:destroy() then
f995d62044fa MUC: Allow modules a chance to act prior to room destruction
Kim Alvefur <zash@zash.se>
parents: 11496
diff changeset
   536
				destroyed:push(room.jid);
f995d62044fa MUC: Allow modules a chance to act prior to room destruction
Kim Alvefur <zash@zash.se>
parents: 11496
diff changeset
   537
			end
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   538
		end
12014
f995d62044fa MUC: Allow modules a chance to act prior to room destruction
Kim Alvefur <zash@zash.se>
parents: 11496
diff changeset
   539
		return { status = "completed", info = "The following rooms were destroyed:\n"..t_concat(destroyed, "\n") };
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   540
	end);
9084
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9082
diff changeset
   541
	local destroy_rooms_desc = adhoc_new("Destroy Rooms",
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9082
diff changeset
   542
		"http://prosody.im/protocol/muc#destroy", destroy_rooms_handler, "admin");
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
   543
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   544
	module:provides("adhoc", destroy_rooms_desc);
10702
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   545
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   546
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   547
	local set_affiliation_layout = dataforms_new {
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   548
		-- FIXME wordsmith title, instructions, labels etc
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   549
		title = "Set affiliation";
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   550
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   551
		{ name = "FORM_TYPE", type = "hidden", value = "http://prosody.im/protocol/muc#set-affiliation" };
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   552
		{ name = "room", type = "jid-single", required = true, label = "Room"};
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   553
		{ name = "jid", type = "jid-single", required = true, label = "JID"};
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   554
		{ name = "affiliation", type = "list-single", required = true, label = "Affiliation",
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   555
			options = { "owner"; "admin"; "member"; "none"; "outcast"; },
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   556
		};
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   557
		{ name = "reason", type = "text-single", "Reason", }
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   558
	};
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   559
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   560
	local set_affiliation_handler = adhoc_simple(set_affiliation_layout, function (fields, errors)
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   561
		if errors then
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   562
			local errmsg = {};
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   563
			for field, err in pairs(errors) do
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   564
				errmsg[#errmsg + 1] = field .. ": " .. err;
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   565
			end
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   566
			return { status = "completed", error = { message = t_concat(errmsg, "\n") } };
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   567
		end
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   568
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   569
		local room = get_room_from_jid(fields.room);
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   570
		if not room then
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   571
			return { status = "canceled", error = { message =  "No such room"; }; };
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   572
		end
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   573
		local ok, err, condition = room:set_affiliation(true, fields.jid, fields.affiliation, fields.reason);
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   574
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   575
		if not ok then
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   576
			return { status = "canceled", error = { message =  "Affiliation change failed: "..err..":"..condition; }; };
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   577
		end
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   578
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   579
		return { status = "completed", info = "Affiliation updated",
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   580
		};
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   581
	end);
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   582
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   583
	local set_affiliation_desc = adhoc_new("Set affiliation in room",
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   584
		"http://prosody.im/protocol/muc#set-affiliation", set_affiliation_handler, "admin");
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   585
e4034f6668a5 MUC: Add ad-hoc command setting affiliation in a room (fixes #1174)
Kim Alvefur <zash@zash.se>
parents: 10697
diff changeset
   586
	module:provides("adhoc", set_affiliation_desc);
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
   587
end