summaryrefslogtreecommitdiff
path: root/src/mod_muc/mod_muc.erl
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-05-18 16:41:15 +0000
committerAlexey Shchepin <alexey@process-one.net>2003-05-18 16:41:15 +0000
commitd719a93fa1258f68ee97ccb6c72c98171e5a800a (patch)
tree49de042ef90434d98d7afb7c8922ee029f4de18a /src/mod_muc/mod_muc.erl
parent* src/ejabberd_s2s.erl: Added error catching for do_route/3 (diff)
* src/mod_muc/mod_muc.erl: Now body of message from admin to MUC
service is broadcasted to all conferences * src/mod_muc/mod_muc_room.erl: Likewise SVN Revision: 110
Diffstat (limited to 'src/mod_muc/mod_muc.erl')
-rw-r--r--src/mod_muc/mod_muc.erl137
1 files changed, 92 insertions, 45 deletions
diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl
index dfb64f52..d3ec2739 100644
--- a/src/mod_muc/mod_muc.erl
+++ b/src/mod_muc/mod_muc.erl
@@ -75,68 +75,107 @@ loop(Host) ->
do_route(Host, From, To, Packet) ->
{Room, _, Nick} = To,
+ {xmlelement, Name, Attrs, Els} = Packet,
case Room of
"" ->
case Nick of
"" ->
- case jlib:iq_query_info(Packet) of
- {iq, ID, get, ?NS_DISCO_INFO = XMLNS, SubEl} ->
- Res = {iq, ID, result, XMLNS,
- [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- iq_disco_info()}]},
- ejabberd_router:route(To,
- From,
- jlib:iq_to_xml(Res));
- {iq, ID, get, ?NS_DISCO_ITEMS = XMLNS, SubEl} ->
- spawn(?MODULE,
- process_iq_disco_items,
- [Host, From, To, ID, SubEl]);
- {iq, ID, get, ?NS_REGISTER = XMLNS, SubEl} ->
- Lang = xml:get_tag_attr_s("xml:lang", SubEl),
- Res = {iq, ID, result, XMLNS,
- [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- iq_get_register_info(From, Lang)}]},
- ejabberd_router:route(To,
- From,
- jlib:iq_to_xml(Res));
- {iq, ID, set, ?NS_REGISTER = XMLNS, SubEl} ->
- case process_iq_register_set(From, SubEl) of
- {result, IQRes} ->
+ case Name of
+ "iq" ->
+ case jlib:iq_query_info(Packet) of
+ {iq, ID, get, ?NS_DISCO_INFO = XMLNS, SubEl} ->
Res = {iq, ID, result, XMLNS,
[{xmlelement, "query",
[{"xmlns", XMLNS}],
- IQRes}]},
- ejabberd_router:route(
- To, From, jlib:iq_to_xml(Res));
- {error, Error} ->
+ iq_disco_info()}]},
+ ejabberd_router:route(To,
+ From,
+ jlib:iq_to_xml(Res));
+ {iq, ID, get, ?NS_DISCO_ITEMS = XMLNS, SubEl} ->
+ spawn(?MODULE,
+ process_iq_disco_items,
+ [Host, From, To, ID, SubEl]);
+ {iq, ID, get, ?NS_REGISTER = XMLNS, SubEl} ->
+ Lang = xml:get_tag_attr_s(
+ "xml:lang", SubEl),
+ Res = {iq, ID, result, XMLNS,
+ [{xmlelement, "query",
+ [{"xmlns", XMLNS}],
+ iq_get_register_info(
+ From, Lang)}]},
+ ejabberd_router:route(To,
+ From,
+ jlib:iq_to_xml(Res));
+ {iq, ID, set, ?NS_REGISTER = XMLNS, SubEl} ->
+ case process_iq_register_set(From, SubEl) of
+ {result, IQRes} ->
+ Res = {iq, ID, result, XMLNS,
+ [{xmlelement, "query",
+ [{"xmlns", XMLNS}],
+ IQRes}]},
+ ejabberd_router:route(
+ To, From, jlib:iq_to_xml(Res));
+ {error, Error} ->
+ Err = jlib:make_error_reply(
+ Packet, Error),
+ ejabberd_router:route(
+ To, From, Err)
+ end;
+ {iq, ID, get, ?NS_VCARD = XMLNS, SubEl} ->
+ Lang = xml:get_tag_attr_s(
+ "xml:lang", SubEl),
+ Res = {iq, ID, result, XMLNS,
+ [{xmlelement, "query",
+ [{"xmlns", XMLNS}],
+ iq_get_vcard(Lang)}]},
+ ejabberd_router:route(To,
+ From,
+ jlib:iq_to_xml(Res));
+ reply ->
+ ok;
+ _ ->
Err = jlib:make_error_reply(
- Packet, Error),
+ Packet,
+ ?ERR_FEATURE_NOT_IMPLEMENTED),
ejabberd_router:route(To, From, Err)
end;
- {iq, ID, get, ?NS_VCARD = XMLNS, SubEl} ->
- Lang = xml:get_tag_attr_s("xml:lang", SubEl),
- Res = {iq, ID, result, XMLNS,
- [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- iq_get_vcard(Lang)}]},
- ejabberd_router:route(To,
- From,
- jlib:iq_to_xml(Res));
+ "message" ->
+ case xml:get_attr_s("type", Attrs) of
+ "error" ->
+ ok;
+ _ ->
+ case acl:match_rule(muc_admin, From) of
+ allow ->
+ Msg = xml:get_path_s(
+ Packet,
+ [{elem, "body"}, cdata]),
+ broadcast_service_message(Msg);
+ _ ->
+ Err = jlib:make_error_reply(
+ Packet,
+ ?ERR_NOT_ALLOWED),
+ ejabberd_router:route(
+ To, From, Err)
+ end
+ end;
+ "presence" ->
+ ok
+ end;
+ _ ->
+ case xml:get_attr_s("type", Attrs) of
+ "error" ->
+ ok;
+ "result" ->
+ ok;
_ ->
Err = jlib:make_error_reply(
- Packet, ?ERR_FEATURE_NOT_IMPLEMENTED),
+ Packet, ?ERR_JID_NOT_FOUND),
ejabberd_router:route(To, From, Err)
- end;
- _ ->
- Err = jlib:make_error_reply(Packet, ?ERR_JID_NOT_FOUND),
- ejabberd_router:route(To, From, Err)
+ end
end;
_ ->
case ets:lookup(muc_online_room, Room) of
[] ->
- {xmlelement, Name, Attrs, Els} = Packet,
Type = xml:get_attr_s("type", Attrs),
case {Name, Type} of
{"presence", ""} ->
@@ -358,6 +397,14 @@ iq_get_vcard(Lang) ->
"Copyright (c) 2003 Alexey Shchepin"}]}].
+broadcast_service_message(Msg) ->
+ lists:foreach(
+ fun(#muc_online_room{name = Name, pid = Pid}) ->
+ gen_fsm:send_all_state_event(
+ Pid, {service_message, Msg})
+ end, ets:tab2list(muc_online_room)).
+
+
can_use_nick(JID, "") ->
false;