Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_multicast.erl')
-rw-r--r--src/mod_multicast.erl89
1 files changed, 45 insertions, 44 deletions
diff --git a/src/mod_multicast.erl b/src/mod_multicast.erl
index 8948131fd..81fe50c9d 100644
--- a/src/mod_multicast.erl
+++ b/src/mod_multicast.erl
@@ -159,8 +159,8 @@ handle_cast(_Msg, State) -> {noreply, State}.
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
-handle_info({route, From, To, #iq{} = Packet}, State) ->
- case catch handle_iq(From, To, Packet, State) of
+handle_info({route, #iq{} = Packet}, State) ->
+ case catch handle_iq(Packet, State) of
{'EXIT', Reason} ->
?ERROR_MSG("Error when processing IQ stanza: ~p",
[Reason]);
@@ -168,17 +168,17 @@ handle_info({route, From, To, #iq{} = Packet}, State) ->
end,
{noreply, State};
%% XEP33 allows only 'message' and 'presence' stanza type
-handle_info({route, From, To, Packet},
+handle_info({route, Packet},
#state{lservice = LServiceS, lserver = LServerS,
access = Access, service_limits = SLimits} =
State) when ?is_stanza(Packet) ->
- route_untrusted(LServiceS, LServerS, Access, SLimits,
- From, To, Packet),
+ route_untrusted(LServiceS, LServerS, Access, SLimits, Packet),
{noreply, State};
%% Handle multicast packets sent by trusted local services
-handle_info({route_trusted, From, Destinations, Packet},
+handle_info({route_trusted, Destinations, Packet},
#state{lservice = LServiceS, lserver = LServerS} =
State) ->
+ From = xmpp:get_from(Packet),
case catch route_trusted(LServiceS, LServerS, From, Destinations,
Packet) of
{'EXIT', Reason} ->
@@ -206,41 +206,42 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}.
%%% IQ Request Processing
%%%------------------------
-handle_iq(From, To, Packet, State) ->
+handle_iq(Packet, State) ->
try
IQ = xmpp:decode_els(Packet),
- case process_iq(From, IQ, State) of
+ case process_iq(IQ, State) of
{result, SubEl} ->
- ejabberd_router:route(To, From, xmpp:make_iq_result(Packet, SubEl));
+ ejabberd_router:route(xmpp:make_iq_result(Packet, SubEl));
{error, Error} ->
- ejabberd_router:route_error(To, From, Packet, Error);
+ ejabberd_router:route_error(Packet, Error);
reply ->
+ To = xmpp:get_to(IQ),
LServiceS = jid:to_string(To),
case Packet#iq.type of
result ->
- process_iqreply_result(From, LServiceS, IQ);
+ process_iqreply_result(LServiceS, IQ);
error ->
- process_iqreply_error(From, LServiceS, IQ)
+ process_iqreply_error(LServiceS, IQ)
end
end
catch _:{xmpp_codec, Why} ->
Lang = xmpp:get_lang(Packet),
Err = xmpp:err_bad_request(xmpp:format_error(Why), Lang),
- ejabberd_router:route_error(To, From, Packet, Err)
+ ejabberd_router:route_error(Packet, Err)
end.
--spec process_iq(jid(), iq(), state()) -> {result, xmpp_element()} |
- {error, stanza_error()} | reply.
-process_iq(From, #iq{type = get, lang = Lang,
- sub_els = [#disco_info{}]}, State) ->
+-spec process_iq(iq(), state()) -> {result, xmpp_element()} |
+ {error, stanza_error()} | reply.
+process_iq(#iq{type = get, lang = Lang, from = From,
+ sub_els = [#disco_info{}]}, State) ->
{result, iq_disco_info(From, Lang, State)};
-process_iq(_, #iq{type = get, sub_els = [#disco_items{}]}, _) ->
+process_iq(#iq{type = get, sub_els = [#disco_items{}]}, _) ->
{result, #disco_items{}};
-process_iq(_, #iq{type = get, lang = Lang, sub_els = [#vcard_temp{}]}, _) ->
+process_iq(#iq{type = get, lang = Lang, sub_els = [#vcard_temp{}]}, _) ->
{result, iq_vcard(Lang)};
-process_iq(_, #iq{type = T}, _) when T == set; T == get ->
+process_iq(#iq{type = T}, _) when T == set; T == get ->
{error, xmpp:err_service_unavailable()};
-process_iq(_, _, _) ->
+process_iq(_, _) ->
reply.
-define(FEATURE(Feat), Feat).
@@ -278,38 +279,37 @@ route_trusted(LServiceS, LServerS, FromJID,
route_common(LServerS, LServiceS, FromJID, Groups,
Delivereds, Packet_stripped, AAttrs).
-route_untrusted(LServiceS, LServerS, Access, SLimits,
- From, To, Packet) ->
+route_untrusted(LServiceS, LServerS, Access, SLimits, Packet) ->
try route_untrusted2(LServiceS, LServerS, Access,
- SLimits, From, Packet)
+ SLimits, Packet)
catch
adenied ->
- route_error(To, From, Packet, forbidden,
+ route_error(Packet, forbidden,
<<"Access denied by service policy">>);
eadsele ->
- route_error(To, From, Packet, bad_request,
+ route_error(Packet, bad_request,
<<"No addresses element found">>);
eadeles ->
- route_error(To, From, Packet, bad_request,
+ route_error(Packet, bad_request,
<<"No address elements found">>);
ewxmlns ->
- route_error(To, From, Packet, bad_request,
+ route_error(Packet, bad_request,
<<"Wrong xmlns">>);
etoorec ->
- route_error(To, From, Packet, not_acceptable,
+ route_error(Packet, not_acceptable,
<<"Too many receiver fields were specified">>);
edrelay ->
- route_error(To, From, Packet, forbidden,
+ route_error(Packet, forbidden,
<<"Packet relay is denied by service policy">>);
EType:EReason ->
?ERROR_MSG("Multicast unknown error: Type: ~p~nReason: ~p",
[EType, EReason]),
- route_error(To, From, Packet, internal_server_error,
+ route_error(Packet, internal_server_error,
<<"Unknown problem">>)
end.
-route_untrusted2(LServiceS, LServerS, Access, SLimits,
- FromJID, Packet) ->
+route_untrusted2(LServiceS, LServerS, Access, SLimits, Packet) ->
+ FromJID = xmpp:get_from(Packet),
ok = check_access(LServerS, Access, FromJID),
{ok, Packet_stripped, Addresses} = strip_addresses_element(Packet),
{To_deliver, Delivereds} = split_addresses_todeliver(Addresses),
@@ -460,7 +460,7 @@ split_dests_jid(Dests) ->
report_not_jid(From, Packet, Dests) ->
Dests2 = [fxml:element_to_binary(xmpp:encode(Dest#dest.full_xml))
|| Dest <- Dests],
- [route_error(From, From, Packet, jid_malformed,
+ [route_error(xmpp:set_from_to(Packet, From, From), jid_malformed,
<<"This service can not process the address: ",
D/binary>>)
|| D <- Dests2].
@@ -596,7 +596,7 @@ route_packet2(From, ToS, Dests, Packet, _AAttrs,
end,
Packet2 = xmpp:set_els(Packet, Els),
ToJID = stj(ToS),
- ejabberd_router:route(From, ToJID, Packet2).
+ ejabberd_router:route(xmpp:set_from_to(Packet2, From, ToJID)).
-spec append_dests([#dest{}], {[address()], [address()]} | [address()]) -> [address()].
append_dests(_Dests, {Others, Addresses}) ->
@@ -645,17 +645,18 @@ send_query_items(RServerS, LServiceS) ->
-spec send_query(binary(), binary(), [disco_info()|disco_items()]) -> ok.
send_query(RServerS, LServiceS, SubEl) ->
- Packet = #iq{id = randoms:get_string(),
+ Packet = #iq{from = stj(LServiceS),
+ to = stj(RServerS),
+ id = randoms:get_string(),
type = get, sub_els = [SubEl]},
- ejabberd_router:route(stj(LServiceS), stj(RServerS),
- Packet).
+ ejabberd_router:route(Packet).
%%%-------------------------
%%% Check protocol support: Receive response: Error
%%%-------------------------
-process_iqreply_error(From, LServiceS, _Packet) ->
- FromS = jts(From),
+process_iqreply_error(LServiceS, Packet) ->
+ FromS = jts(xmpp:get_from(Packet)),
case search_waiter(FromS, LServiceS, info) of
{found_waiter, Waiter} ->
received_awaiter(FromS, Waiter, LServiceS);
@@ -666,8 +667,8 @@ process_iqreply_error(From, LServiceS, _Packet) ->
%%% Check protocol support: Receive response: Disco
%%%-------------------------
--spec process_iqreply_result(jid(), binary(), iq()) -> any().
-process_iqreply_result(From, LServiceS, #iq{sub_els = [SubEl]}) ->
+-spec process_iqreply_result(binary(), iq()) -> any().
+process_iqreply_result(LServiceS, #iq{from = From, sub_els = [SubEl]}) ->
case SubEl of
#disco_info{} ->
process_discoinfo_result(From, LServiceS, SubEl);
@@ -1077,10 +1078,10 @@ to_binary(A) -> list_to_binary(hd(io_lib:format("~p", [A]))).
%%% Error report
%%%-------------------------
-route_error(From, To, Packet, ErrType, ErrText) ->
+route_error(Packet, ErrType, ErrText) ->
Lang = xmpp:get_lang(Packet),
Err = make_reply(ErrType, Lang, ErrText),
- ejabberd_router:route_error(From, To, Packet, Err).
+ ejabberd_router:route_error(Packet, Err).
make_reply(bad_request, Lang, ErrText) ->
xmpp:err_bad_request(ErrText, Lang);