diff options
author | Badlop <badlop@process-one.net> | 2008-06-13 18:55:26 +0000 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2008-06-13 18:55:26 +0000 |
commit | cbf63d06a8b77c15b783e7d90f9580e8601c86c2 (patch) | |
tree | e9295c0e0c7e3660e0aa6bcce69153585b8e58e7 /src/mod_muc/mod_muc_room.erl | |
parent | * src/ejabberd.cfg.example: Add registration_timeout (EJAB-653) (diff) |
* src/mod_muc/mod_muc_room.erl: Allow admins to send messages to
rooms even if not joined (EJAB-645)
* doc/guide.tex: Likewise
* doc/guide.html: Likewise
SVN Revision: 1356
Diffstat (limited to '')
-rw-r--r-- | src/mod_muc/mod_muc_room.erl | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 91da61e2..e858d680 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -204,7 +204,8 @@ normal_state({route, From, "", {xmlelement, "message", Attrs, Els} = Packet}, StateData) -> Lang = xml:get_attr_s("xml:lang", Attrs), - case is_user_online(From, StateData) of + case is_user_online(From, StateData) orelse + is_user_allowed_message_nonparticipant(From, StateData) of true -> case xml:get_attr_s("type", Attrs) of "groupchat" -> @@ -784,11 +785,10 @@ route(Pid, From, ToNick, Packet) -> process_groupchat_message(From, {xmlelement, "message", Attrs, _Els} = Packet, StateData) -> Lang = xml:get_attr_s("xml:lang", Attrs), - case is_user_online(From, StateData) of + case is_user_online(From, StateData) orelse + is_user_allowed_message_nonparticipant(From, StateData) of true -> - {ok, #user{nick = FromNick, role = Role}} = - ?DICT:find(jlib:jid_tolower(From), - StateData#state.users), + {FromNick, Role} = get_participant_data(From, StateData), if (Role == moderator) or (Role == participant) or ((StateData#state.config)#config.moderated == false) -> @@ -873,6 +873,36 @@ process_groupchat_message(From, {xmlelement, "message", Attrs, _Els} = Packet, {next_state, normal_state, StateData} end. + +%% @doc Check if this non participant can send message to room. +%% +%% XEP-0045 v1.23: +%% 7.9 Sending a Message to All Occupants +%% an implementation MAY allow users with certain privileges +%% (e.g., a room owner, room admin, or service-level admin) +%% to send messages to the room even if those users are not occupants. +%% +%% Check the mod_muc option access_message_nonparticipant and wether this JID +%% is allowed or denied +is_user_allowed_message_nonparticipant(JID, StateData) -> + {_AccessRoute, _AccessCreate, AccessAdmin, _AccessPersistent} = StateData#state.access, + case acl:match_rule(StateData#state.server_host, AccessAdmin, JID) of + allow -> + true; + _ -> false + end. + +%% @doc Get information of this participant, or default values. +%% If the JID is not a participant, return values for a service message. +get_participant_data(From, StateData) -> + case ?DICT:find(jlib:jid_tolower(From), StateData#state.users) of + {ok, #user{nick = FromNick, role = Role}} -> + {FromNick, Role}; + error -> + {"", moderator} + end. + + process_presence(From, Nick, {xmlelement, "presence", Attrs, _Els} = Packet, StateData) -> Type = xml:get_attr_s("type", Attrs), |