From e2c3925b7df6e52ee431d4224269c3ed17916f32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20K=C3=B6hler?= Date: Fri, 17 Sep 2010 16:42:35 +0200 Subject: [PATCH 1/7] Discard unmatched INFO messages in ejabberd services. This patch will stop services terminating with function clause messages, but doesn't affect the message queue at all. --- src/ejabberd_service.erl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl index bd07bfea8..942f0fa4d 100644 --- a/src/ejabberd_service.erl +++ b/src/ejabberd_service.erl @@ -353,6 +353,9 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> Err = jlib:make_error_reply(Packet, ?ERR_NOT_ALLOWED), ejabberd_router:route_error(To, From, Err, Packet) end, + {next_state, StateName, StateData}; +handle_info(Info, StateName, StateData) -> + ?ERROR_MSG("Unexpected info: ~p", [Info]), {next_state, StateName, StateData}. From 3278f019cb91057b8981f133f7b707cb2246e26b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20K=C3=B6hler?= Date: Fri, 17 Sep 2010 16:44:48 +0200 Subject: [PATCH 2/7] Add missing needdb check in mod_privacy, to enable blocking by group and subscription again. --- src/mod_privacy.erl | 3 ++- src/mod_privacy_odbc.erl | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index 0c9d089e0..d25bc9b7b 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -392,12 +392,13 @@ process_list_set(LUser, LServer, {value, Name}, Els) -> {atomic, {error, _} = Error} -> Error; {atomic, {result, _} = Res} -> + NeedDb = is_list_needdb(List), ejabberd_router:route( jlib:make_jid(LUser, LServer, ""), jlib:make_jid(LUser, LServer, ""), {xmlelement, "broadcast", [], [{privacy_list, - #userlist{name = Name, list = List}, + #userlist{name = Name, list = List, needdb = NeedDb}, Name}]}), Res; _ -> diff --git a/src/mod_privacy_odbc.erl b/src/mod_privacy_odbc.erl index 5ad2fb958..593e99140 100644 --- a/src/mod_privacy_odbc.erl +++ b/src/mod_privacy_odbc.erl @@ -392,12 +392,13 @@ process_list_set(LUser, LServer, {value, Name}, Els) -> {atomic, {error, _} = Error} -> Error; {atomic, {result, _} = Res} -> + NeedDb = is_list_needdb(List), ejabberd_router:route( jlib:make_jid(LUser, LServer, ""), jlib:make_jid(LUser, LServer, ""), {xmlelement, "broadcast", [], [{privacy_list, - #userlist{name = Name, list = List}, + #userlist{name = Name, list = List, needdb = NeedDb}, Name}]}), Res; _ -> From 8e5297f4c3c372876270bd616c5ab03689bae456 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Tue, 21 Sep 2010 04:31:18 +1000 Subject: [PATCH 3/7] fixes default value for cache_life_time --- src/mod_caps.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_caps.erl b/src/mod_caps.erl index 01056fbe5..319e37e6c 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -212,7 +212,7 @@ init([Host, Opts]) -> {attributes, record_info(fields, caps_features)}]), mnesia:add_table_copy(caps_features, node(), disc_only_copies), MaxSize = gen_mod:get_opt(cache_size, Opts, 1000), - LifeTime = gen_mod:get_opt(cache_life_time, Opts, timer:hours(24)), + LifeTime = gen_mod:get_opt(cache_life_time, Opts, timer:hours(24) div 1000), cache_tab:new(caps_features, [{max_size, MaxSize}, {life_time, LifeTime}]), ejabberd_hooks:add(user_send_packet, Host, ?MODULE, user_send_packet, 75), From 1f2c9b7971a046925013efe1ca1343a8669157a4 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Tue, 28 Sep 2010 14:20:02 +1000 Subject: [PATCH 4/7] fixes typo in stop_connection/1 --- src/ejabberd_s2s_out.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index a1c641280..7cfb68d7a 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -136,7 +136,7 @@ start_connection(Pid) -> p1_fsm:send_event(Pid, init). stop_connection(Pid) -> - p1_fsm:send_event(Pid, stop). + p1_fsm:send_event(Pid, closed). %%%---------------------------------------------------------------------- %%% Callback functions from p1_fsm From 50b747041fe5505be8f0beddea1f56e35e901e3e Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Tue, 5 Oct 2010 21:28:45 +1000 Subject: [PATCH 5/7] use one_queue IQ discipline by default --- src/mod_vcard_ldap.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl index ed52a0593..53f8b58dc 100644 --- a/src/mod_vcard_ldap.erl +++ b/src/mod_vcard_ldap.erl @@ -169,7 +169,7 @@ start_link(Host, Opts) -> init([Host, Opts]) -> State = parse_options(Host, Opts), - IQDisc = gen_mod:get_opt(iqdisc, Opts, parallel), + IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD, ?MODULE, process_local_iq, IQDisc), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_VCARD, From ac87749d557a3230481f44841678164f1e32ce1a Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Mon, 11 Oct 2010 18:40:57 +1000 Subject: [PATCH 6/7] add find_s2s_bridge hook --- src/ejabberd_s2s_out.erl | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index 7cfb68d7a..907bdd65a 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -44,6 +44,7 @@ wait_for_features/2, wait_for_auth_result/2, wait_for_starttls_proceed/2, + relay_to_bridge/2, reopen_socket/2, wait_before_retry/2, stream_established/2, @@ -72,6 +73,7 @@ myname, server, queue, delay_to_retry = undefined_delay, new = false, verify = false, + bridge, timer}). %%-define(DBGFSM, true). @@ -228,8 +230,19 @@ open_socket(init, StateData) -> {error, _Reason} -> ?INFO_MSG("s2s connection: ~s -> ~s (remote server not found)", [StateData#state.myname, StateData#state.server]), - wait_before_reconnect(StateData) - %%{stop, normal, StateData} + case ejabberd_hooks:run_fold(find_s2s_bridge, + undefined, + [StateData#state.myname, + StateData#state.server]) of + {Mod, Fun, Type} -> + ?INFO_MSG("found a bridge to ~s for: ~s -> ~s", + [Type, StateData#state.myname, + StateData#state.server]), + NewStateData = StateData#state{bridge={Mod, Fun}}, + {next_state, relay_to_bridge, NewStateData}; + _ -> + wait_before_reconnect(StateData) + end end; open_socket(stop, StateData) -> ?INFO_MSG("s2s connection: ~s -> ~s (stopped in open socket)", @@ -677,6 +690,15 @@ reopen_socket(closed, StateData) -> wait_before_retry(_Event, StateData) -> {next_state, wait_before_retry, StateData, ?FSMTIMEOUT}. +relay_to_bridge(stop, StateData) -> + wait_before_reconnect(StateData); +relay_to_bridge(closed, StateData) -> + ?INFO_MSG("relay to bridge: ~s -> ~s (closed)", + [StateData#state.myname, StateData#state.server]), + {stop, normal, StateData}; +relay_to_bridge(_Event, StateData) -> + {next_state, relay_to_bridge, StateData}. + stream_established({xmlstreamelement, El}, StateData) -> ?DEBUG("s2S stream established", []), case is_verify_res(El) of @@ -827,6 +849,19 @@ handle_info({send_element, El}, StateName, StateData) -> wait_before_retry -> bounce_element(El, ?ERR_REMOTE_SERVER_NOT_FOUND), {next_state, StateName, StateData}; + relay_to_bridge -> + %% In this state we relay all outbound messages + %% to a foreign protocol bridge such as SMTP, SIP, etc. + {Mod, Fun} = StateData#state.bridge, + ?DEBUG("relaying stanza via ~p:~p/1", [Mod, Fun]), + case catch Mod:Fun(El) of + {'EXIT', Reason} -> + ?ERROR_MSG("Error while relaying to bridge: ~p", [Reason]), + bounce_element(El, ?ERR_INTERNAL_SERVER_ERROR), + wait_before_reconnect(StateData); + _ -> + {next_state, StateName, StateData} + end; _ -> Q = queue:in(El, StateData#state.queue), {next_state, StateName, StateData#state{queue = Q}, From a93f4f77505e78f88bbee46e215197460e358b55 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Wed, 13 Oct 2010 10:54:12 +0200 Subject: [PATCH 7/7] =?UTF-8?q?make=20http-bind=20restartable=20(thanks=20?= =?UTF-8?q?to=20Andreas=20K=C3=B6hler)(EJAB-1318)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/web/mod_http_bind.erl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/web/mod_http_bind.erl b/src/web/mod_http_bind.erl index 25e964f93..8e750acfd 100644 --- a/src/web/mod_http_bind.erl +++ b/src/web/mod_http_bind.erl @@ -117,7 +117,7 @@ start(_Host, _Opts) -> % mod_http_bind is already started so it will not be started again ok; {error, Error} -> - {'EXIT', {start_child_error, Error}} + exit({start_child_error, Error}) end. stop(_Host) -> @@ -125,7 +125,13 @@ stop(_Host) -> ok -> ok; {error, Error} -> - {'EXIT', {terminate_child_error, Error}} + exit({terminate_child_error, Error}) + end, + case supervisor:delete_child(ejabberd_sup, ejabberd_http_bind_sup) of + ok -> + ok; + {error, Error2} -> + exit({delete_child_error, Error2}) end. setup_database() ->