diff options
Diffstat (limited to 'src/ejabberd_router.erl')
-rw-r--r-- | src/ejabberd_router.erl | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index 1e38dba29..8aa337c4c 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -38,7 +38,8 @@ unregister_route/1, unregister_routes/1, dirty_get_all_routes/0, - dirty_get_all_domains/0 + dirty_get_all_domains/0, + make_id/0 ]). -export([start_link/0]). @@ -53,6 +54,9 @@ -record(route, {domain, pid, local_hint}). -record(state, {}). +%% "rr" stands for Record-Route. +-define(ROUTE_PREFIX, "rr-"). + %%==================================================================== %% API %%==================================================================== @@ -65,7 +69,7 @@ start_link() -> route(From, To, Packet) -> - case catch do_route(From, To, Packet) of + case catch route_check_id(From, To, Packet) of {'EXIT', Reason} -> ?ERROR_MSG("~p~nwhen processing: ~p", [Reason, {From, To, Packet}]); @@ -192,6 +196,8 @@ dirty_get_all_routes() -> dirty_get_all_domains() -> lists:usort(mnesia:dirty_all_keys(route)). +make_id() -> + ?ROUTE_PREFIX ++ randoms:get_string() ++ "-" ++ ejabberd_cluster:node_id(). %%==================================================================== %% gen_server callbacks @@ -309,6 +315,32 @@ code_change(_OldVsn, State, _Extra) -> %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- +route_check_id(From, To, {xmlelement, "iq", Attrs, _} = Packet) -> + case xml:get_attr_s("id", Attrs) of + ?ROUTE_PREFIX ++ Rest -> + Type = xml:get_attr_s("type", Attrs), + if Type == "error"; Type == "result" -> + case string:tokens(Rest, "-") of + [_, NodeID] -> + case ejabberd_cluster:get_node_by_id(NodeID) of + Node when Node == node() -> + do_route(From, To, Packet); + Node -> + {ejabberd_router, Node} ! + {route, From, To, Packet} + end; + _ -> + do_route(From, To, Packet) + end; + true -> + do_route(From, To, Packet) + end; + _ -> + do_route(From, To, Packet) + end; +route_check_id(From, To, Packet) -> + do_route(From, To, Packet). + do_route(OrigFrom, OrigTo, OrigPacket) -> ?DEBUG("route~n\tfrom ~p~n\tto ~p~n\tpacket ~p~n", [OrigFrom, OrigTo, OrigPacket]), @@ -346,9 +378,21 @@ do_route(OrigFrom, OrigTo, OrigPacket) -> jlib:jid_tolower(From)); bare_destination -> jlib:jid_remove_resource( - jlib:jid_tolower(To)) + jlib:jid_tolower(To)); + broadcast -> + broadcast end, case get_component_number(LDstDomain) of + _ when Value == broadcast -> + lists:foreach( + fun(R) -> + Pid = R#route.pid, + if is_pid(Pid) -> + Pid ! {route, From, To, Packet}; + true -> + drop + end + end, Rs); undefined -> case [R || R <- Rs, node(R#route.pid) == node()] of [] -> @@ -383,6 +427,7 @@ do_route(OrigFrom, OrigTo, OrigPacket) -> end end; drop -> + ?DEBUG("packet dropped~n", []), ok end. @@ -413,4 +458,3 @@ update_tables() -> false -> ok end. - |