aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_config.erl2
-rw-r--r--src/ejabberd_s2s_in.erl6
-rw-r--r--src/mod_offline.erl125
-rw-r--r--src/mod_roster.erl2
-rw-r--r--src/odbc_queries.erl16
5 files changed, 104 insertions, 47 deletions
diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl
index 612cd84ce..dd1db765d 100644
--- a/src/ejabberd_config.erl
+++ b/src/ejabberd_config.erl
@@ -989,7 +989,7 @@ report_and_stop(Tab, Err) ->
halt(string:substr(ErrTxt, 1, 199)).
emit_deprecation_warning(Module, NewModule, DBType) ->
- ?WARNING_MSG("Module ~s is deprecated, use {~s, [{db_type, ~s}, ...]}"
+ ?WARNING_MSG("Module ~s is deprecated, use ~s with 'db_type: ~s'"
" instead", [Module, NewModule, DBType]).
emit_deprecation_warning(Module, NewModule) ->
diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl
index 4fde814fe..6c594185a 100644
--- a/src/ejabberd_s2s_in.erl
+++ b/src/ejabberd_s2s_in.erl
@@ -374,8 +374,8 @@ wait_for_feature_request({xmlstreamelement, El},
#xmlel{name = <<"success">>,
attrs = [{<<"xmlns">>, ?NS_SASL}],
children = []}),
- ?DEBUG("(~w) Accepted s2s authentication for ~s",
- [StateData#state.socket, AuthDomain]),
+ ?INFO_MSG("Accepted s2s EXTERNAL authentication for ~s (TLS=~p)",
+ [AuthDomain, StateData#state.tls_enabled]),
change_shaper(StateData, <<"">>,
jlib:make_jid(<<"">>, AuthDomain, <<"">>)),
{next_state, wait_for_stream,
@@ -515,6 +515,8 @@ stream_established({valid, From, To}, StateData) ->
[{<<"from">>, To}, {<<"to">>, From},
{<<"type">>, <<"valid">>}],
children = []}),
+ ?INFO_MSG("Accepted s2s dialback authentication for ~s (TLS=~p)",
+ [From, StateData#state.tls_enabled]),
LFrom = jlib:nameprep(From),
LTo = jlib:nameprep(To),
NSD = StateData#state{connections =
diff --git a/src/mod_offline.erl b/src/mod_offline.erl
index f6870adc0..95c5881df 100644
--- a/src/mod_offline.erl
+++ b/src/mod_offline.erl
@@ -26,13 +26,15 @@
-module(mod_offline).
-author('alexey@process-one.net').
+-define(GEN_SERVER, p1_server).
+-behaviour(?GEN_SERVER).
-behaviour(gen_mod).
-export([count_offline_messages/2]).
-export([start/2,
- loop/2,
+ start_link/2,
stop/1,
store_packet/3,
resend_offline_messages/2,
@@ -50,6 +52,10 @@
webadmin_user/4,
webadmin_user_parse_query/5]).
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2,
+ handle_info/2, terminate/2, code_change/3]).
+
-include("ejabberd.hrl").
-include("logger.hrl").
@@ -67,6 +73,10 @@
to = #jid{} :: jid() | '_',
packet = #xmlel{} :: xmlel() | '_'}).
+-record(state,
+ {host = <<"">> :: binary(),
+ access_max_offline_messages}).
+
-define(PROCNAME, ejabberd_offline).
-define(OFFLINE_TABLE_LOCK_THRESHOLD, 1000).
@@ -74,7 +84,29 @@
%% default value for the maximum number of user messages
-define(MAX_USER_MESSAGES, infinity).
+start_link(Host, Opts) ->
+ Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
+ ?GEN_SERVER:start_link({local, Proc}, ?MODULE,
+ [Host, Opts], []).
+
start(Host, Opts) ->
+ Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
+ ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]},
+ temporary, 1000, worker, [?MODULE]},
+ supervisor:start_child(ejabberd_sup, ChildSpec).
+
+stop(Host) ->
+ Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
+ ?GEN_SERVER:call(Proc, stop),
+ supervisor:delete_child(ejabberd_sup, Proc),
+ ok.
+
+
+%%====================================================================
+%% gen_server callbacks
+%%====================================================================
+
+init([Host, Opts]) ->
case gen_mod:db_type(Opts) of
mnesia ->
mnesia:create_table(offline_msg,
@@ -102,22 +134,57 @@ start(Host, Opts) ->
ejabberd_hooks:add(webadmin_user_parse_query, Host,
?MODULE, webadmin_user_parse_query, 50),
AccessMaxOfflineMsgs = gen_mod:get_opt(access_max_user_messages, Opts, fun(A) -> A end, max_user_offline_messages),
- register(gen_mod:get_module_proc(Host, ?PROCNAME),
- spawn(?MODULE, loop, [Host, AccessMaxOfflineMsgs])).
+ {ok,
+ #state{host = Host,
+ access_max_offline_messages = AccessMaxOfflineMsgs}}.
+
+
+handle_call(stop, _From, State) ->
+ {stop, normal, ok, State}.
+
+
+handle_cast(_Msg, State) -> {noreply, State}.
+
+
+handle_info(#offline_msg{us = UserServer} = Msg, State) ->
+ #state{host = Host,
+ access_max_offline_messages = AccessMaxOfflineMsgs} = State,
+ DBType = gen_mod:db_type(Host, ?MODULE),
+ Msgs = receive_all(UserServer, [Msg], DBType),
+ Len = length(Msgs),
+ MaxOfflineMsgs = get_max_user_messages(AccessMaxOfflineMsgs,
+ UserServer, Host),
+ store_offline_msg(Host, UserServer, Msgs, Len, MaxOfflineMsgs, DBType),
+ {noreply, State};
+
+handle_info(_Info, State) ->
+ ?ERROR_MSG("got unexpected info: ~p", [_Info]),
+ {noreply, State}.
+
+
+terminate(_Reason, State) ->
+ Host = State#state.host,
+ ejabberd_hooks:delete(offline_message_hook, Host,
+ ?MODULE, store_packet, 50),
+ ejabberd_hooks:delete(resend_offline_messages_hook,
+ Host, ?MODULE, pop_offline_messages, 50),
+ ejabberd_hooks:delete(remove_user, Host, ?MODULE,
+ remove_user, 50),
+ ejabberd_hooks:delete(anonymous_purge_hook, Host,
+ ?MODULE, remove_user, 50),
+ ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:delete(webadmin_page_host, Host,
+ ?MODULE, webadmin_page, 50),
+ ejabberd_hooks:delete(webadmin_user, Host,
+ ?MODULE, webadmin_user, 50),
+ ejabberd_hooks:delete(webadmin_user_parse_query, Host,
+ ?MODULE, webadmin_user_parse_query, 50),
+ ok.
+
+
+code_change(_OldVsn, State, _Extra) -> {ok, State}.
-loop(Host, AccessMaxOfflineMsgs) ->
- receive
- #offline_msg{us = UserServer} = Msg ->
- DBType = gen_mod:db_type(Host, ?MODULE),
- Msgs = receive_all(UserServer, [Msg], DBType),
- Len = length(Msgs),
- MaxOfflineMsgs = get_max_user_messages(AccessMaxOfflineMsgs,
- UserServer, Host),
- store_offline_msg(Host, UserServer, Msgs, Len, MaxOfflineMsgs, DBType),
- loop(Host, AccessMaxOfflineMsgs);
- _ ->
- loop(Host, AccessMaxOfflineMsgs)
- end.
store_offline_msg(_Host, US, Msgs, Len, MaxOfflineMsgs,
mnesia) ->
@@ -212,28 +279,7 @@ receive_all(US, Msgs, DBType) ->
end
end.
-stop(Host) ->
- ejabberd_hooks:delete(offline_message_hook, Host,
- ?MODULE, store_packet, 50),
- ejabberd_hooks:delete(resend_offline_messages_hook,
- Host, ?MODULE, pop_offline_messages, 50),
- ejabberd_hooks:delete(remove_user, Host, ?MODULE,
- remove_user, 50),
- ejabberd_hooks:delete(anonymous_purge_hook, Host,
- ?MODULE, remove_user, 50),
- ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
- ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, get_sm_features, 50),
- ejabberd_hooks:delete(webadmin_page_host, Host,
- ?MODULE, webadmin_page, 50),
- ejabberd_hooks:delete(webadmin_user, Host,
- ?MODULE, webadmin_user, 50),
- ejabberd_hooks:delete(webadmin_user_parse_query, Host,
- ?MODULE, webadmin_user_parse_query, 50),
- Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
- exit(whereis(Proc), stop),
- {wait, Proc}.
-
-get_sm_features(Acc, _From, _To, "", _Lang) ->
+get_sm_features(Acc, _From, _To, <<"">>, _Lang) ->
Feats = case Acc of
{result, I} -> I;
_ -> []
@@ -250,8 +296,9 @@ get_sm_features(Acc, _From, _To, _Node, _Lang) ->
store_packet(From, To, Packet) ->
Type = xml:get_tag_attr_s(<<"type">>, Packet),
+ BodyElem = xml:get_path_s(Packet,[{elem, <<"body">>}]),
if (Type /= <<"error">>) and (Type /= <<"groupchat">>)
- and (Type /= <<"headline">>) ->
+ and (Type /= <<"headline">>) and (<<>> /= BodyElem) ->
case has_no_storage_hint(Packet) of
false ->
case check_event(From, To, Packet) of
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
index 6ca02dc78..7bd171ffb 100644
--- a/src/mod_roster.erl
+++ b/src/mod_roster.erl
@@ -1238,7 +1238,7 @@ read_subscription_and_groups(LUser, LServer, LJID,
case catch odbc_queries:get_subscription(LServer,
Username, SJID)
of
- {selected, [<<"subscription">>], [{SSubscription}]} ->
+ {selected, [<<"subscription">>], [[SSubscription]]} ->
Subscription = case SSubscription of
<<"B">> -> both;
<<"T">> -> to;
diff --git a/src/odbc_queries.erl b/src/odbc_queries.erl
index e0637f840..09549c0a2 100644
--- a/src/odbc_queries.erl
+++ b/src/odbc_queries.erl
@@ -97,10 +97,14 @@ update_t(Table, Fields, Vals, Where) ->
of
{updated, 1} -> ok;
_ ->
- ejabberd_odbc:sql_query_t([<<"insert into ">>, Table,
+ Res = ejabberd_odbc:sql_query_t([<<"insert into ">>, Table,
<<"(">>, join(Fields, <<", ">>),
<<") values ('">>, join(Vals, <<"', '">>),
- <<"');">>])
+ <<"');">>]),
+ case Res of
+ {updated,1} -> ok;
+ _ -> Res
+ end
end.
update(LServer, Table, Fields, Vals, Where) ->
@@ -115,10 +119,14 @@ update(LServer, Table, Fields, Vals, Where) ->
of
{updated, 1} -> ok;
_ ->
- ejabberd_odbc:sql_query(LServer,
+ Res = ejabberd_odbc:sql_query(LServer,
[<<"insert into ">>, Table, <<"(">>,
join(Fields, <<", ">>), <<") values ('">>,
- join(Vals, <<"', '">>), <<"');">>])
+ join(Vals, <<"', '">>), <<"');">>]),
+ case Res of
+ {updated,1} -> ok;
+ _ -> Res
+ end
end.
%% F can be either a fun or a list of queries