From 7129aebe7632468de075d9fc3686d6d692e2347f Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Fri, 28 Apr 2017 13:23:32 +0300 Subject: [PATCH 1/2] Don't re-define validation functions in multiple places --- src/ejabberd_auth.erl | 13 ++++++++-- src/ejabberd_auth_ldap.erl | 24 +++-------------- src/ejabberd_auth_mnesia.erl | 13 ++-------- src/ejabberd_auth_riak.erl | 14 ++-------- src/ejabberd_auth_sql.erl | 14 ++-------- src/ejabberd_c2s.erl | 3 +-- src/ejabberd_c2s_config.erl | 22 ++++++---------- src/ejabberd_captcha.erl | 6 ++--- src/ejabberd_config.erl | 26 ++++++++++++++++--- src/ejabberd_piefxis.erl | 13 +++------- src/ejabberd_receiver.erl | 47 +++++++++++++++++++++------------- src/ejabberd_redis_sup.erl | 1 + src/ejabberd_riak_sup.erl | 3 +-- src/ejabberd_s2s.erl | 5 ++-- src/ejabberd_sm_redis.erl | 20 +-------------- src/ejabberd_sql.erl | 9 +------ src/ejabberd_sql_sup.erl | 9 +------ src/ejabberd_web_admin.erl | 3 +-- src/eldap_utils.erl | 22 +++++++++++++--- src/mod_last.erl | 24 ++--------------- src/mod_muc_log.erl | 12 ++------- src/mod_shared_roster_ldap.erl | 30 +++++++++------------- src/mod_sip_proxy.erl | 8 +----- src/mod_vcard_ldap.erl | 20 +++------------ src/sql_queries.erl | 9 +------ 25 files changed, 136 insertions(+), 234 deletions(-) diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl index 10acb8157..8839cf89a 100644 --- a/src/ejabberd_auth.erl +++ b/src/ejabberd_auth.erl @@ -44,7 +44,7 @@ get_password_s/2, get_password_with_authmodule/2, is_user_exists/2, is_user_exists_in_other_modules/3, remove_user/2, remove_user/3, plain_password_required/1, - store_type/1, entropy/1, backend_type/1]). + store_type/1, entropy/1, backend_type/1, password_format/1]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). @@ -497,6 +497,11 @@ backend_type(Mod) -> _ -> Mod end. +password_format(LServer) -> + ejabberd_config:get_option({auth_password_format, LServer}, + opt_type(auth_password_format), + plain). + %%%---------------------------------------------------------------------- %%% Internal functions %%%---------------------------------------------------------------------- @@ -537,4 +542,8 @@ opt_type(auth_method) -> lists:map(fun(M) -> ejabberd_config:v_db(?MODULE, M) end, V); (V) -> [ejabberd_config:v_db(?MODULE, V)] end; -opt_type(_) -> [auth_method]. +opt_type(auth_password_format) -> + fun (plain) -> plain; + (scram) -> scram + end; +opt_type(_) -> [auth_method, auth_password_format]. diff --git a/src/ejabberd_auth_ldap.erl b/src/ejabberd_auth_ldap.erl index 7d4626a9f..81c2ab9dd 100644 --- a/src/ejabberd_auth_ldap.erl +++ b/src/ejabberd_auth_ldap.erl @@ -381,7 +381,7 @@ parse_options(Host) -> SubFilter = eldap_utils:generate_subfilter(UIDs), UserFilter = case gen_mod:get_opt( {ldap_filter, Host}, [], - fun check_filter/1, <<"">>) of + fun eldap_utils:check_filter/1, <<"">>) of <<"">> -> SubFilter; F -> @@ -399,7 +399,7 @@ parse_options(Host) -> [iolist_to_binary(A) || A <- DNFA] end, - NewDNF = check_filter(DNF), + NewDNF = eldap_utils:check_filter(DNF), {NewDNF, NewDNFA} end, {undefined, []}), LocalFilter = gen_mod:get_opt( @@ -418,31 +418,15 @@ parse_options(Host) -> sfilter = SearchFilter, lfilter = LocalFilter, dn_filter = DNFilter, dn_filter_attrs = DNFilterAttrs}. -check_filter(F) -> - NewF = iolist_to_binary(F), - {ok, _} = eldap_filter:parse(NewF), - NewF. - opt_type(ldap_dn_filter) -> fun ([{DNF, DNFA}]) -> NewDNFA = case DNFA of undefined -> []; _ -> [iolist_to_binary(A) || A <- DNFA] end, - NewDNF = check_filter(DNF), + NewDNF = eldap_utils:check_filter(DNF), {NewDNF, NewDNFA} end; -opt_type(ldap_filter) -> fun check_filter/1; opt_type(ldap_local_filter) -> fun (V) -> V end; -opt_type(ldap_uids) -> - fun (Us) -> - lists:map(fun ({U, P}) -> - {iolist_to_binary(U), iolist_to_binary(P)}; - ({U}) -> {iolist_to_binary(U)}; - (U) -> {iolist_to_binary(U)} - end, - lists:flatten(Us)) - end; opt_type(_) -> - [ldap_dn_filter, ldap_filter, ldap_local_filter, - ldap_uids]. + [ldap_dn_filter, ldap_local_filter]. diff --git a/src/ejabberd_auth_mnesia.erl b/src/ejabberd_auth_mnesia.erl index f856c8a9c..592b9c566 100644 --- a/src/ejabberd_auth_mnesia.erl +++ b/src/ejabberd_auth_mnesia.erl @@ -27,8 +27,6 @@ -compile([{parse_transform, ejabberd_sql_pt}]). --behaviour(ejabberd_config). - -author('alexey@process-one.net'). -behaviour(ejabberd_auth). @@ -41,7 +39,7 @@ get_vh_registered_users_number/2, get_password/2, get_password_s/2, is_user_exists/2, remove_user/2, remove_user/3, store_type/0, export/1, import/2, - plain_password_required/0, opt_type/1]). + plain_password_required/0]). -export([need_transform/1, transform/1]). -include("ejabberd.hrl"). @@ -89,8 +87,7 @@ plain_password_required() -> is_scrammed(). store_type() -> - ejabberd_config:get_option({auth_password_format, ?MYNAME}, - opt_type(auth_password_format), plain). + ejabberd_auth:password_format(?MYNAME). check_password(User, AuthzId, Server, Password) -> if AuthzId /= <<>> andalso AuthzId /= User -> @@ -494,9 +491,3 @@ export(_Server) -> import(LServer, [LUser, Password, _TimeStamp]) -> mnesia:dirty_write( #passwd{us = {LUser, LServer}, password = Password}). - -opt_type(auth_password_format) -> - fun (plain) -> plain; - (scram) -> scram - end; -opt_type(_) -> [auth_password_format]. diff --git a/src/ejabberd_auth_riak.erl b/src/ejabberd_auth_riak.erl index 9555fcad8..74f0f73ca 100644 --- a/src/ejabberd_auth_riak.erl +++ b/src/ejabberd_auth_riak.erl @@ -27,8 +27,6 @@ -compile([{parse_transform, ejabberd_sql_pt}]). --behaviour(ejabberd_config). - -author('alexey@process-one.net'). -behaviour(ejabberd_auth). @@ -42,7 +40,7 @@ get_vh_registered_users_number/2, get_password/2, get_password_s/2, is_user_exists/2, remove_user/2, remove_user/3, store_type/0, export/1, import/2, - plain_password_required/0, opt_type/1]). + plain_password_required/0]). -export([passwd_schema/0]). -include("ejabberd.hrl"). @@ -272,9 +270,7 @@ remove_user(User, Server, Password) -> %%% is_scrammed() -> - scram == - ejabberd_config:get_option({auth_password_format, ?MYNAME}, - opt_type(auth_password_format), plain). + scram == ejabberd_auth:password_format(?MYNAME). password_to_scram(Password) -> password_to_scram(Password, @@ -320,9 +316,3 @@ export(_Server) -> import(LServer, [LUser, Password, _TimeStamp]) -> Passwd = #passwd{us = {LUser, LServer}, password = Password}, ejabberd_riak:put(Passwd, passwd_schema(), [{'2i', [{<<"host">>, LServer}]}]). - -opt_type(auth_password_format) -> - fun (plain) -> plain; - (scram) -> scram - end; -opt_type(_) -> [auth_password_format]. diff --git a/src/ejabberd_auth_sql.erl b/src/ejabberd_auth_sql.erl index 0d9665afc..8514b9cf1 100644 --- a/src/ejabberd_auth_sql.erl +++ b/src/ejabberd_auth_sql.erl @@ -27,8 +27,6 @@ -compile([{parse_transform, ejabberd_sql_pt}]). --behaviour(ejabberd_config). - -author('alexey@process-one.net'). -behaviour(ejabberd_auth). @@ -41,7 +39,7 @@ get_vh_registered_users_number/2, get_password/2, get_password_s/2, is_user_exists/2, remove_user/2, remove_user/3, store_type/0, plain_password_required/0, - convert_to_scram/1, opt_type/1]). + convert_to_scram/1]). -include("ejabberd.hrl"). -include("logger.hrl"). @@ -408,9 +406,7 @@ remove_user(User, Server, Password) -> %%% is_scrammed() -> - scram == - ejabberd_config:get_option({auth_password_format, ?MYNAME}, - opt_type(auth_password_format), plain). + scram == ejabberd_auth:password_format(?MYNAME). password_to_scram(Password) -> password_to_scram(Password, @@ -509,9 +505,3 @@ convert_to_scram(Server) -> Error -> Error end end. - -opt_type(auth_password_format) -> - fun (plain) -> plain; - (scram) -> scram - end; -opt_type(_) -> [auth_password_format]. diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index b6bd1c59f..6dee111ff 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -922,7 +922,6 @@ format_reason(_, _) -> transform_listen_option(Opt, Opts) -> [Opt|Opts]. -opt_type(domain_certfile) -> fun iolist_to_binary/1; opt_type(c2s_certfile) -> fun iolist_to_binary/1; opt_type(c2s_ciphers) -> fun iolist_to_binary/1; opt_type(c2s_dhfile) -> fun iolist_to_binary/1; @@ -945,6 +944,6 @@ opt_type(disable_sasl_mechanisms) -> (V) -> [str:to_upper(V)] end; opt_type(_) -> - [domain_certfile, c2s_certfile, c2s_ciphers, c2s_cafile, + [c2s_certfile, c2s_ciphers, c2s_cafile, c2s_protocol_options, c2s_tls_compression, resource_conflict, disable_sasl_mechanisms]. diff --git a/src/ejabberd_c2s_config.erl b/src/ejabberd_c2s_config.erl index 5db740777..0f0a2a875 100644 --- a/src/ejabberd_c2s_config.erl +++ b/src/ejabberd_c2s_config.erl @@ -26,24 +26,21 @@ -module(ejabberd_c2s_config). --behaviour(ejabberd_config). - -author('mremond@process-one.net'). --export([get_c2s_limits/0, opt_type/1]). +-export([get_c2s_limits/0]). %% Get first c2s configuration limitations to apply it to other c2s %% connectors. get_c2s_limits() -> - case ejabberd_config:get_option(listen, fun(V) -> V end) of - undefined -> []; - C2SFirstListen -> - case lists:keysearch(ejabberd_c2s, 2, C2SFirstListen) of - false -> []; - {value, {_Port, ejabberd_c2s, Opts}} -> - select_opts_values(Opts) - end + C2SFirstListen = ejabberd_config:get_option( + listen, fun ejabberd_listener:validate_cfg/1, []), + case lists:keysearch(ejabberd_c2s, 2, C2SFirstListen) of + false -> []; + {value, {_Port, ejabberd_c2s, Opts}} -> + select_opts_values(Opts) end. + %% Only get access, shaper and max_stanza_size values select_opts_values(Opts) -> @@ -65,6 +62,3 @@ select_opts_values([{max_stanza_size, Value} | Opts], [{max_stanza_size, Value} | SelectedValues]); select_opts_values([_Opt | Opts], SelectedValues) -> select_opts_values(Opts, SelectedValues). - -opt_type(listen) -> fun (V) -> V end; -opt_type(_) -> [listen]. diff --git a/src/ejabberd_captcha.erl b/src/ejabberd_captcha.erl index 0a1e1a9eb..3c42fa094 100644 --- a/src/ejabberd_captcha.erl +++ b/src/ejabberd_captcha.erl @@ -395,7 +395,8 @@ get_transfer_protocol(PortString) -> get_captcha_transfer_protocol(PortListeners). get_port_listeners(PortNumber) -> - AllListeners = ejabberd_config:get_option(listen, fun(V) -> V end), + AllListeners = ejabberd_config:get_option( + listen, fun ejabberd_listener:validate_cfg/1, []), lists:filter(fun (Listener) when is_list(Listener) -> case proplists:get_value(port, Listener) of PortNumber -> true; @@ -545,6 +546,5 @@ opt_type(captcha_cmd) -> opt_type(captcha_host) -> fun iolist_to_binary/1; opt_type(captcha_limit) -> fun (I) when is_integer(I), I > 0 -> I end; -opt_type(listen) -> fun (V) -> V end; opt_type(_) -> - [captcha_cmd, captcha_host, captcha_limit, listen]. + [captcha_cmd, captcha_host, captcha_limit]. diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index 041b5b6a1..5aa9a1d2b 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -29,7 +29,7 @@ -export([start/0, load_file/1, reload_file/0, read_file/1, get_option/2, get_option/3, add_option/2, has_option/1, get_vh_by_auth_method/1, is_file_readable/1, - get_version/0, get_myhosts/0, get_mylang/0, + get_version/0, get_myhosts/0, get_mylang/0, get_lang/1, get_ejabberd_config_path/0, is_using_elixir_config/0, prepare_opt_val/4, transform_options/1, collect_options/1, convert_to_yaml/1, convert_to_yaml/2, v_db/2, @@ -1067,8 +1067,12 @@ get_myhosts() -> -spec get_mylang() -> binary(). get_mylang() -> + get_lang(global). + +-spec get_lang(global | binary()) -> binary(). +get_lang(Host) -> get_option( - language, + {language, Host}, fun iolist_to_binary/1, <<"en">>). @@ -1206,7 +1210,6 @@ transform_terms(Terms) -> %% We could check all ejabberd beams, but this %% slows down start-up procedure :( Mods = [mod_register, - mod_last, ejabberd_s2s, ejabberd_listener, ejabberd_sql_sup, @@ -1315,6 +1318,10 @@ transform_options(Opt, Opts) when Opt == override_global; Opt == override_acls -> ?WARNING_MSG("Ignoring '~s' option which has no effect anymore", [Opt]), Opts; +transform_options({node_start, {_, _, _} = Now}, Opts) -> + ?WARNING_MSG("Old 'node_start' format detected. This is still supported " + "but it is better to fix your config.", []), + [{node_start, now_to_seconds(Now)}|Opts]; transform_options({host_config, Host, HOpts}, Opts) -> {AddOpts, HOpts1} = lists:mapfoldl( @@ -1351,6 +1358,10 @@ emit_deprecation_warning(Module, NewModule) -> [Module, NewModule]) end. +-spec now_to_seconds(erlang:timestamp()) -> non_neg_integer(). +now_to_seconds({MegaSecs, Secs, _MicroSecs}) -> + MegaSecs * 1000000 + Secs. + opt_type(hide_sensitive_log_data) -> fun (H) when is_boolean(H) -> H end; opt_type(hosts) -> @@ -1388,10 +1399,17 @@ opt_type(cache_life_time) -> (infinity) -> infinity; (unlimited) -> infinity end; +opt_type(domain_certfile) -> + fun iolist_to_binary/1; +opt_type(shared_key) -> + fun iolist_to_binary/1; +opt_type(node_start) -> + fun(I) when is_integer(I), I>0 -> I end; opt_type(_) -> [hide_sensitive_log_data, hosts, language, max_fsm_queue, default_db, default_ram_db, queue_type, queue_dir, loglevel, - use_cache, cache_size, cache_missed, cache_life_time]. + use_cache, cache_size, cache_missed, cache_life_time, + domain_certfile, shared_key, node_start]. -spec may_hide_data(any()) -> any(). may_hide_data(Data) -> diff --git a/src/ejabberd_piefxis.erl b/src/ejabberd_piefxis.erl index d16f826c7..aea280591 100644 --- a/src/ejabberd_piefxis.erl +++ b/src/ejabberd_piefxis.erl @@ -34,12 +34,9 @@ -module(ejabberd_piefxis). --behaviour(ejabberd_config). - -protocol({xep, 227, '1.0'}). --export([import_file/1, export_server/1, export_host/2, - opt_type/1]). +-export([import_file/1, export_server/1, export_host/2]). -define(CHUNK_SIZE, 1024*20). %20k @@ -169,7 +166,7 @@ export_users([], _Server, _Fd) -> export_user(User, Server, Fd) -> Password = ejabberd_auth:get_password_s(User, Server), LServer = jid:nameprep(Server), - PasswordFormat = ejabberd_config:get_option({auth_password_format, LServer}, fun(X) -> X end, plain), + PasswordFormat = ejabberd_auth:password_format(LServer), Pass = case Password of {_,_,_,_} -> case PasswordFormat of @@ -389,7 +386,7 @@ process_user(#xmlel{name = <<"user">>, attrs = Attrs, children = Els}, #state{server = LServer} = State) -> Name = fxml:get_attr_s(<<"name">>, Attrs), Password = fxml:get_attr_s(<<"password">>, Attrs), - PasswordFormat = ejabberd_config:get_option({auth_password_format, LServer}, fun(X) -> X end, plain), + PasswordFormat = ejabberd_auth:password_format(LServer), Pass = case PasswordFormat of scram -> case Password of @@ -596,7 +593,3 @@ make_xinclude(Fn) -> print(Fd, String) -> file:write(Fd, String). - -opt_type(auth_password_format) -> fun (X) -> X end; -opt_type(_) -> [auth_password_format]. - diff --git a/src/ejabberd_receiver.erl b/src/ejabberd_receiver.erl index 5ec26171d..6152f7eb2 100644 --- a/src/ejabberd_receiver.erl +++ b/src/ejabberd_receiver.erl @@ -31,6 +31,7 @@ -define(GEN_SERVER, gen_server). -endif. -behaviour(?GEN_SERVER). +-behaviour(ejabberd_config). %% API -export([start_link/4, @@ -41,7 +42,8 @@ starttls/2, compress/2, become_controller/2, - close/1]). + close/1, + opt_type/1]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, @@ -59,9 +61,6 @@ xml_stream_state :: fxml_stream:xml_stream_state() | undefined, timeout = infinity:: timeout()}). --define(HIBERNATE_TIMEOUT, ejabberd_config:get_option(receiver_hibernate, fun(X) when is_integer(X); X == hibernate-> X end, 90000)). - - -spec start_link(inet:socket(), atom(), shaper:shaper(), non_neg_integer() | infinity) -> ignore | {error, any()} | @@ -137,7 +136,7 @@ handle_call({starttls, TLSSocket}, _From, State) -> case fast_tls:recv_data(TLSSocket, <<"">>) of {ok, TLSData} -> {reply, ok, - process_data(TLSData, NewState), ?HIBERNATE_TIMEOUT}; + process_data(TLSData, NewState), hibernate_timeout()}; {error, _} = Err -> {stop, normal, Err, NewState} end; @@ -156,31 +155,31 @@ handle_call({compress, Data}, _From, case ezlib:recv_data(ZlibSocket, <<"">>) of {ok, ZlibData} -> {reply, {ok, ZlibSocket}, - process_data(ZlibData, NewState), ?HIBERNATE_TIMEOUT}; + process_data(ZlibData, NewState), hibernate_timeout()}; {error, _} = Err -> {stop, normal, Err, NewState} end; handle_call(reset_stream, _From, State) -> NewState = reset_parser(State), Reply = ok, - {reply, Reply, NewState, ?HIBERNATE_TIMEOUT}; + {reply, Reply, NewState, hibernate_timeout()}; handle_call({become_controller, C2SPid}, _From, State) -> XMLStreamState = fxml_stream:new(C2SPid, State#state.max_stanza_size), NewState = State#state{c2s_pid = C2SPid, xml_stream_state = XMLStreamState}, activate_socket(NewState), Reply = ok, - {reply, Reply, NewState, ?HIBERNATE_TIMEOUT}; + {reply, Reply, NewState, hibernate_timeout()}; handle_call(_Request, _From, State) -> - Reply = ok, {reply, Reply, State, ?HIBERNATE_TIMEOUT}. + Reply = ok, {reply, Reply, State, hibernate_timeout()}. handle_cast({change_shaper, Shaper}, State) -> NewShaperState = shaper:new(Shaper), {noreply, State#state{shaper_state = NewShaperState}, - ?HIBERNATE_TIMEOUT}; + hibernate_timeout()}; handle_cast(close, State) -> {stop, normal, State}; handle_cast(_Msg, State) -> - {noreply, State, ?HIBERNATE_TIMEOUT}. + {noreply, State, hibernate_timeout()}. handle_info({Tag, _TCPSocket, Data}, #state{socket = Socket, sock_mod = SockMod} = State) @@ -191,7 +190,7 @@ handle_info({Tag, _TCPSocket, Data}, case fast_tls:recv_data(Socket, Data) of {ok, TLSData} -> {noreply, process_data(TLSData, State), - ?HIBERNATE_TIMEOUT}; + hibernate_timeout()}; {error, Reason} -> if is_binary(Reason) -> ?DEBUG("TLS error = ~s", [Reason]); @@ -204,11 +203,11 @@ handle_info({Tag, _TCPSocket, Data}, case ezlib:recv_data(Socket, Data) of {ok, ZlibData} -> {noreply, process_data(ZlibData, State), - ?HIBERNATE_TIMEOUT}; + hibernate_timeout()}; {error, _Reason} -> {stop, normal, State} end; _ -> - {noreply, process_data(Data, State), ?HIBERNATE_TIMEOUT} + {noreply, process_data(Data, State), hibernate_timeout()} end; handle_info({Tag, _TCPSocket}, State) when (Tag == tcp_closed) or (Tag == ssl_closed) -> @@ -216,18 +215,18 @@ handle_info({Tag, _TCPSocket}, State) handle_info({Tag, _TCPSocket, Reason}, State) when (Tag == tcp_error) or (Tag == ssl_error) -> case Reason of - timeout -> {noreply, State, ?HIBERNATE_TIMEOUT}; + timeout -> {noreply, State, hibernate_timeout()}; _ -> {stop, normal, State} end; handle_info({timeout, _Ref, activate}, State) -> activate_socket(State), - {noreply, State, ?HIBERNATE_TIMEOUT}; + {noreply, State, hibernate_timeout()}; handle_info(timeout, State) -> proc_lib:hibernate(?GEN_SERVER, enter_loop, [?MODULE, [], State]), - {noreply, State, ?HIBERNATE_TIMEOUT}; + {noreply, State, hibernate_timeout()}; handle_info(_Info, State) -> - {noreply, State, ?HIBERNATE_TIMEOUT}. + {noreply, State, hibernate_timeout()}. terminate(_Reason, #state{xml_stream_state = XMLStreamState, @@ -345,3 +344,15 @@ do_call(Pid, Msg) -> _:_ -> {error, einval} end. + +hibernate_timeout() -> + ejabberd_config:get_option(receiver_hibernate, + opt_type(receiver_hibernate), + timer:seconds(90)). + +opt_type(receiver_hibernate) -> + fun(I) when is_integer(I), I>0 -> I; + (hibernate) -> hibernate + end; +opt_type(_) -> + [receiver_hibernate]. diff --git a/src/ejabberd_redis_sup.erl b/src/ejabberd_redis_sup.erl index 7e2953c11..da9fe37cf 100644 --- a/src/ejabberd_redis_sup.erl +++ b/src/ejabberd_redis_sup.erl @@ -23,6 +23,7 @@ -module(ejabberd_redis_sup). -behaviour(supervisor). +-behaviour(ejabberd_config). %% API -export([start_link/0, get_pool_size/0, diff --git a/src/ejabberd_riak_sup.erl b/src/ejabberd_riak_sup.erl index a01f3538a..ad7c8619c 100644 --- a/src/ejabberd_riak_sup.erl +++ b/src/ejabberd_riak_sup.erl @@ -210,7 +210,6 @@ transform_options({riak_server, {S, P}}, Opts) -> transform_options(Opt, Opts) -> [Opt|Opts]. -opt_type(modules) -> fun (L) when is_list(L) -> L end; opt_type(riak_pool_size) -> fun (N) when is_integer(N), N >= 1 -> N end; opt_type(riak_port) -> fun (_) -> true end; @@ -221,5 +220,5 @@ opt_type(riak_cacertfile) -> fun iolist_to_binary/1; opt_type(riak_username) -> fun iolist_to_binary/1; opt_type(riak_password) -> fun iolist_to_binary/1; opt_type(_) -> - [modules, riak_pool_size, riak_port, riak_server, + [riak_pool_size, riak_port, riak_server, riak_start_interval, riak_cacertfile, riak_username, riak_password]. diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 61d3b021b..674fd7c50 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -724,7 +724,6 @@ opt_type(route_subdomains) -> end; opt_type(s2s_access) -> fun acl:access_rules_validator/1; -opt_type(domain_certfile) -> fun iolist_to_binary/1; opt_type(s2s_certfile) -> fun iolist_to_binary/1; opt_type(s2s_ciphers) -> fun iolist_to_binary/1; opt_type(s2s_dhfile) -> fun iolist_to_binary/1; @@ -742,6 +741,8 @@ opt_type(s2s_use_starttls) -> (required) -> required; (required_trusted) -> required_trusted end; +opt_type(s2s_zlib) -> + fun(B) when is_boolean(B) -> B end; opt_type(s2s_timeout) -> fun(I) when is_integer(I), I>=0 -> I; (infinity) -> infinity @@ -749,6 +750,6 @@ opt_type(s2s_timeout) -> opt_type(s2s_queue_type) -> fun(ram) -> ram; (file) -> file end; opt_type(_) -> - [route_subdomains, s2s_access, s2s_certfile, + [route_subdomains, s2s_access, s2s_certfile, s2s_zlib, s2s_ciphers, s2s_dhfile, s2s_cafile, s2s_protocol_options, s2s_tls_compression, s2s_use_starttls, s2s_timeout, s2s_queue_type]. diff --git a/src/ejabberd_sm_redis.erl b/src/ejabberd_sm_redis.erl index cf1836c56..288ec77b6 100644 --- a/src/ejabberd_sm_redis.erl +++ b/src/ejabberd_sm_redis.erl @@ -27,13 +27,12 @@ -define(GEN_SERVER, p1_server). -endif. -behaviour(?GEN_SERVER). --behaviour(ejabberd_config). -behaviour(ejabberd_sm). -export([init/0, set_session/1, delete_session/1, get_sessions/0, get_sessions/1, get_sessions/2, - cache_nodes/1, opt_type/1]). + cache_nodes/1]). %% gen_server callbacks -export([init/1, handle_cast/2, handle_call/3, handle_info/2, terminate/2, code_change/3, start_link/0]). @@ -169,9 +168,6 @@ code_change(_OldVsn, State, _Extra) -> %%%=================================================================== %%% Internal functions %%%=================================================================== -iolist_to_list(IOList) -> - binary_to_list(iolist_to_binary(IOList)). - us_to_key({LUser, LServer}) -> <<"ejabberd:sm:", LUser/binary, "@", LServer/binary>>. @@ -214,17 +210,3 @@ clean_table() -> catch _:{badmatch, {error, _}} -> ?ERROR_MSG("failed to clean redis c2s sessions", []) end. - -opt_type(redis_connect_timeout) -> - fun (I) when is_integer(I), I > 0 -> I end; -opt_type(redis_db) -> - fun (I) when is_integer(I), I >= 0 -> I end; -opt_type(redis_password) -> fun iolist_to_list/1; -opt_type(redis_port) -> - fun (P) when is_integer(P), P > 0, P < 65536 -> P end; -opt_type(redis_reconnect_timeout) -> - fun (I) when is_integer(I), I > 0 -> I end; -opt_type(redis_server) -> fun iolist_to_list/1; -opt_type(_) -> - [redis_connect_timeout, redis_db, redis_password, - redis_port, redis_reconnect_timeout, redis_server]. diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index 8b9f81233..93cfa0288 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -1109,13 +1109,6 @@ opt_type(sql_password) -> fun iolist_to_binary/1; opt_type(sql_port) -> fun (P) when is_integer(P), P > 0, P < 65536 -> P end; opt_type(sql_server) -> fun iolist_to_binary/1; -opt_type(sql_type) -> - fun (mysql) -> mysql; - (pgsql) -> pgsql; - (sqlite) -> sqlite; - (mssql) -> mssql; - (odbc) -> odbc - end; opt_type(sql_username) -> fun iolist_to_binary/1; opt_type(sql_ssl) -> fun(B) when is_boolean(B) -> B end; opt_type(sql_ssl_verify) -> fun(B) when is_boolean(B) -> B end; @@ -1125,6 +1118,6 @@ opt_type(sql_queue_type) -> fun(ram) -> ram; (file) -> file end; opt_type(_) -> [sql_database, sql_keepalive_interval, - sql_password, sql_port, sql_server, sql_type, + sql_password, sql_port, sql_server, sql_username, sql_ssl, sql_ssl_verify, sql_ssl_cerfile, sql_ssl_cafile, sql_queue_type]. diff --git a/src/ejabberd_sql_sup.erl b/src/ejabberd_sql_sup.erl index d778e32b7..59360a9f9 100644 --- a/src/ejabberd_sql_sup.erl +++ b/src/ejabberd_sql_sup.erl @@ -230,12 +230,5 @@ opt_type(sql_pool_size) -> fun (I) when is_integer(I), I > 0 -> I end; opt_type(sql_start_interval) -> fun (I) when is_integer(I), I > 0 -> I end; -opt_type(sql_type) -> - fun (mysql) -> mysql; - (pgsql) -> pgsql; - (sqlite) -> sqlite; - (mssql) -> mssql; - (odbc) -> odbc - end; opt_type(_) -> - [sql_pool_size, sql_start_interval, sql_type]. + [sql_pool_size, sql_start_interval]. diff --git a/src/ejabberd_web_admin.erl b/src/ejabberd_web_admin.erl index 1ef5c510f..5547ab783 100644 --- a/src/ejabberd_web_admin.erl +++ b/src/ejabberd_web_admin.erl @@ -2980,8 +2980,7 @@ make_menu_item(item, 3, URI, Name, Lang) -> %%%================================== -opt_type(access) -> fun acl:access_rules_validator/1; opt_type(access_readonly) -> fun acl:access_rules_validator/1; -opt_type(_) -> [access, access_readonly]. +opt_type(_) -> [access_readonly]. %%% vim: set foldmethod=marker foldmarker=%%%%,%%%=: diff --git a/src/eldap_utils.erl b/src/eldap_utils.erl index 8c071c6dd..4306def0c 100644 --- a/src/eldap_utils.erl +++ b/src/eldap_utils.erl @@ -28,7 +28,7 @@ -behaviour(ejabberd_config). -author('mremond@process-one.net'). --export([generate_subfilter/1, find_ldap_attrs/2, +-export([generate_subfilter/1, find_ldap_attrs/2, check_filter/1, get_ldap_attr/2, get_user_part/2, make_filter/2, get_state/2, case_insensitive_match/2, get_config/2, decode_octet_string/3, uids_domain_subst/2, opt_type/1]). @@ -137,6 +137,11 @@ make_filter(Data, UIDs) -> eldap:'and'(Filter) end. +check_filter(F) -> + NewF = iolist_to_binary(F), + {ok, _} = eldap_filter:parse(NewF), + NewF. + -spec case_insensitive_match(binary(), binary()) -> boolean(). case_insensitive_match(X, Y) -> @@ -380,8 +385,19 @@ opt_type(ldap_tls_verify) -> (soft) -> soft; (false) -> false end; +opt_type(ldap_filter) -> + fun check_filter/1; +opt_type(ldap_uids) -> + fun (Us) -> + lists:map(fun ({U, P}) -> + {iolist_to_binary(U), iolist_to_binary(P)}; + ({U}) -> {iolist_to_binary(U)}; + (U) -> {iolist_to_binary(U)} + end, + lists:flatten(Us)) + end; opt_type(_) -> - [deref_aliases, ldap_backups, ldap_base, + [deref_aliases, ldap_backups, ldap_base, ldap_uids, ldap_deref_aliases, ldap_encrypt, ldap_password, - ldap_port, ldap_rootdn, ldap_servers, + ldap_port, ldap_rootdn, ldap_servers, ldap_filter, ldap_tls_cacertfile, ldap_tls_depth, ldap_tls_verify]. diff --git a/src/mod_last.erl b/src/mod_last.erl index e20c1524d..fd216f936 100644 --- a/src/mod_last.erl +++ b/src/mod_last.erl @@ -25,8 +25,6 @@ -module(mod_last). --behaviour(ejabberd_config). - -author('alexey@process-one.net'). -protocol({xep, 12, '2.0'}). @@ -36,8 +34,8 @@ -export([start/2, stop/1, reload/3, process_local_iq/1, export/1, process_sm_iq/1, on_presence_update/4, import_info/0, import/5, import_start/2, store_last_info/4, get_last_info/2, - remove_user/2, transform_options/1, mod_opt_type/1, - opt_type/1, register_user/2, depends/2, privacy_check_packet/4]). + remove_user/2, mod_opt_type/1, + register_user/2, depends/2, privacy_check_packet/4]). -include("ejabberd.hrl"). -include("logger.hrl"). @@ -130,10 +128,6 @@ get_node_uptime() -> p1_time_compat:system_time(seconds) - Now end. --spec now_to_seconds(erlang:timestamp()) -> non_neg_integer(). -now_to_seconds({MegaSecs, Secs, _MicroSecs}) -> - MegaSecs * 1000000 + Secs. - %%% %%% Serve queries about user last online %%% @@ -273,23 +267,9 @@ export(LServer) -> Mod = gen_mod:db_mod(LServer, ?MODULE), Mod:export(LServer). -transform_options(Opts) -> - lists:foldl(fun transform_options/2, [], Opts). - -transform_options({node_start, {_, _, _} = Now}, Opts) -> - ?WARNING_MSG("Old 'node_start' format detected. This is still supported " - "but it is better to fix your config.", []), - [{node_start, now_to_seconds(Now)}|Opts]; -transform_options(Opt, Opts) -> - [Opt|Opts]. - depends(_Host, _Opts) -> []. mod_opt_type(db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end; mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1; mod_opt_type(_) -> [db_type, iqdisc]. - -opt_type(node_start) -> - fun (S) when is_integer(S), S >= 0 -> S end; -opt_type(_) -> [node_start]. diff --git a/src/mod_muc_log.erl b/src/mod_muc_log.erl index 73c1998a6..a8cf145e9 100644 --- a/src/mod_muc_log.erl +++ b/src/mod_muc_log.erl @@ -27,8 +27,6 @@ -protocol({xep, 334, '0.2'}). --behaviour(ejabberd_config). - -author('badlop@process-one.net'). -behaviour(gen_server). @@ -41,7 +39,7 @@ -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3, - mod_opt_type/1, opt_type/1, depends/2]). + mod_opt_type/1, depends/2]). -include("ejabberd.hrl"). -include("logger.hrl"). @@ -182,10 +180,7 @@ init_state(Host, Opts) -> NoFollow = gen_mod:get_opt(spam_prevention, Opts, fun(B) when is_boolean(B) -> B end, true), - Lang = ejabberd_config:get_option( - {language, Host}, - fun iolist_to_binary/1, - ?MYLANG), + Lang = ejabberd_config:get_lang(Host), #logstate{host = Host, out_dir = OutDir, dir_type = DirType, dir_name = DirName, file_format = FileFormat, css_file = CSSFile, @@ -1242,6 +1237,3 @@ mod_opt_type(_) -> [access_log, cssfile, dirname, dirtype, file_format, file_permissions, outdir, spam_prevention, timezone, top_link]. - -opt_type(language) -> fun iolist_to_binary/1; -opt_type(_) -> [language]. diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index 951ff0739..8a2daf9df 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -499,13 +499,13 @@ parse_options(Host, Opts) -> (true) -> true end, true), ConfigFilter = gen_mod:get_opt({ldap_filter, Host}, Opts, - fun check_filter/1, <<"">>), + fun eldap_utils:check_filter/1, <<"">>), ConfigUserFilter = gen_mod:get_opt({ldap_ufilter, Host}, Opts, - fun check_filter/1, <<"">>), + fun eldap_utils:check_filter/1, <<"">>), ConfigGroupFilter = gen_mod:get_opt({ldap_gfilter, Host}, Opts, - fun check_filter/1, <<"">>), + fun eldap_utils:check_filter/1, <<"">>), RosterFilter = gen_mod:get_opt({ldap_rfilter, Host}, Opts, - fun check_filter/1, <<"">>), + fun eldap_utils:check_filter/1, <<"">>), SubFilter = <<"(&(", UIDAttr/binary, "=", UIDAttrFormat/binary, ")(", GroupAttr/binary, "=%g))">>, UserSubFilter = case ConfigUserFilter of @@ -552,11 +552,6 @@ parse_options(Host, Opts) -> ufilter = UserFilter, rfilter = RosterFilter, gfilter = GroupFilter, auth_check = AuthCheck}. -check_filter(F) -> - NewF = iolist_to_binary(F), - {ok, _} = eldap_filter:parse(NewF), - NewF. - init_cache(Host, Opts) -> UseCache = use_cache(Host, Opts), case UseCache of @@ -654,8 +649,8 @@ mod_opt_type(ldap_auth_check) -> (false) -> false; (true) -> true end; -mod_opt_type(ldap_filter) -> fun check_filter/1; -mod_opt_type(ldap_gfilter) -> fun check_filter/1; +mod_opt_type(ldap_filter) -> fun eldap_utils:check_filter/1; +mod_opt_type(ldap_gfilter) -> fun eldap_utils:check_filter/1; mod_opt_type(O) when O == cache_size; O == cache_life_time -> fun (I) when is_integer(I), I > 0 -> I; @@ -672,8 +667,8 @@ mod_opt_type(ldap_memberattr_format_re) -> fun (S) -> Re = iolist_to_binary(S), {ok, MP} = re:compile(Re), MP end; -mod_opt_type(ldap_rfilter) -> fun check_filter/1; -mod_opt_type(ldap_ufilter) -> fun check_filter/1; +mod_opt_type(ldap_rfilter) -> fun eldap_utils:check_filter/1; +mod_opt_type(ldap_ufilter) -> fun eldap_utils:check_filter/1; mod_opt_type(ldap_userdesc) -> fun iolist_to_binary/1; mod_opt_type(ldap_useruid) -> fun iolist_to_binary/1; mod_opt_type(_) -> @@ -687,9 +682,8 @@ mod_opt_type(_) -> ldap_tls_cacertfile, ldap_tls_certfile, ldap_tls_depth, ldap_tls_verify, use_cache, cache_missed, cache_size, cache_life_time]. -opt_type(ldap_filter) -> fun check_filter/1; -opt_type(ldap_gfilter) -> fun check_filter/1; -opt_type(ldap_rfilter) -> fun check_filter/1; -opt_type(ldap_ufilter) -> fun check_filter/1; +opt_type(ldap_gfilter) -> fun eldap_utils:check_filter/1; +opt_type(ldap_rfilter) -> fun eldap_utils:check_filter/1; +opt_type(ldap_ufilter) -> fun eldap_utils:check_filter/1; opt_type(_) -> - [ldap_filter, ldap_gfilter, ldap_rfilter, ldap_ufilter]. + [ldap_gfilter, ldap_rfilter, ldap_ufilter]. diff --git a/src/mod_sip_proxy.erl b/src/mod_sip_proxy.erl index b57e431d6..b3ac82539 100644 --- a/src/mod_sip_proxy.erl +++ b/src/mod_sip_proxy.erl @@ -24,8 +24,6 @@ %%%------------------------------------------------------------------- -module(mod_sip_proxy). --behaviour(ejabberd_config). - -define(GEN_FSM, p1_fsm). -behaviour(?GEN_FSM). @@ -35,7 +33,7 @@ -export([init/1, wait_for_request/2, wait_for_response/2, handle_event/3, handle_sync_event/4, handle_info/3, terminate/3, - code_change/4, opt_type/1]). + code_change/4]). -include("ejabberd.hrl"). -include("logger.hrl"). @@ -455,7 +453,3 @@ safe_nameprep(S) -> error -> S; S1 -> S1 end. - -opt_type(domain_certfile) -> fun iolist_to_binary/1; -opt_type(shared_key) -> fun (V) -> V end; -opt_type(_) -> [domain_certfile, shared_key]. diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl index 5bb439f8b..8d46a324b 100644 --- a/src/mod_vcard_ldap.erl +++ b/src/mod_vcard_ldap.erl @@ -379,7 +379,7 @@ parse_options(Host, Opts) -> SubFilter = eldap_utils:generate_subfilter(UIDs), UserFilter = case gen_mod:get_opt( {ldap_filter, Host}, Opts, - fun check_filter/1, <<"">>) of + fun eldap_utils:check_filter/1, <<"">>) of <<"">> -> SubFilter; F -> @@ -447,12 +447,7 @@ parse_options(Host, Opts) -> search_reported_attrs = SearchReportedAttrs, matches = Matches}. -check_filter(F) -> - NewF = iolist_to_binary(F), - {ok, _} = eldap_filter:parse(NewF), - NewF. - -mod_opt_type(ldap_filter) -> fun check_filter/1; +mod_opt_type(ldap_filter) -> fun eldap_utils:check_filter/1; mod_opt_type(ldap_search_fields) -> fun (Ls) -> [{iolist_to_binary(S), iolist_to_binary(P)} @@ -525,17 +520,8 @@ mod_opt_type(_) -> ldap_tls_cacertfile, ldap_tls_certfile, ldap_tls_depth, ldap_tls_verify]. -opt_type(ldap_filter) -> fun check_filter/1; -opt_type(ldap_uids) -> - fun (Us) -> - lists:map(fun ({U, P}) -> - {iolist_to_binary(U), iolist_to_binary(P)}; - ({U}) -> {iolist_to_binary(U)} - end, - Us) - end; opt_type(_) -> - [ldap_filter, ldap_uids, deref_aliases, ldap_backups, ldap_base, + [deref_aliases, ldap_backups, ldap_base, ldap_deref_aliases, ldap_encrypt, ldap_password, ldap_port, ldap_rootdn, ldap_servers, ldap_tls_cacertfile, ldap_tls_certfile, ldap_tls_depth, diff --git a/src/sql_queries.erl b/src/sql_queries.erl index da18c56f4..813f5d695 100644 --- a/src/sql_queries.erl +++ b/src/sql_queries.erl @@ -634,13 +634,6 @@ set_roster_version(LUser, Version) -> ["!username=%(LUser)s", "version=%(Version)s"]). -opt_type(sql_type) -> - fun (pgsql) -> pgsql; - (mysql) -> mysql; - (sqlite) -> sqlite; - (mssql) -> mssql; - (odbc) -> odbc - end; opt_type(pgsql_users_number_estimate) -> fun (V) when is_boolean(V) -> V end; -opt_type(_) -> [sql_type, pgsql_users_number_estimate]. +opt_type(_) -> [pgsql_users_number_estimate]. From b82b93f8f0c229e94a89469b0754bab0e28cd17c Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sat, 29 Apr 2017 11:39:40 +0300 Subject: [PATCH 2/2] Don't validate an option in ejabberd_config:get_option() functions The commit introduces the following changes: * Now there is no need to pass validating function in ejabberd_config:get_option() functions, because the configuration keeps already validated values. * New function ejabberd_config:get_option/1 is introduced * Function ejabberd_config:get_option/3 is deprecated. If the function is still called, the second argument (validating function) is simply ignored. * The second argument for ejabberd_config:get_option/2 is now a default value, not a validating function. --- src/acl.erl | 12 ++-- src/cyrsasl_digest.erl | 38 ++++------- src/ejabberd_access_permissions.erl | 7 +- src/ejabberd_app.erl | 12 +--- src/ejabberd_auth.erl | 7 +- src/ejabberd_auth_anonymous.erl | 21 +++--- src/ejabberd_auth_external.erl | 20 ++---- src/ejabberd_auth_pam.erl | 12 +--- src/ejabberd_c2s.erl | 41 +++-------- src/ejabberd_c2s_config.erl | 3 +- src/ejabberd_captcha.erl | 19 ++---- src/ejabberd_commands.erl | 15 ++-- src/ejabberd_config.erl | 102 ++++++++++++---------------- src/ejabberd_ctl.erl | 3 +- src/ejabberd_http.erl | 7 +- src/ejabberd_http_ws.erl | 2 - src/ejabberd_listener.erl | 39 +++++------ src/ejabberd_oauth.erl | 17 ++--- src/ejabberd_oauth_rest.erl | 6 +- src/ejabberd_rdbms.erl | 8 +-- src/ejabberd_receiver.erl | 4 +- src/ejabberd_redis.erl | 38 +++-------- src/ejabberd_redis_sup.erl | 17 ++--- src/ejabberd_riak_sup.erl | 66 ++++++------------ src/ejabberd_router.erl | 24 ++----- src/ejabberd_s2s.erl | 62 +++++------------ src/ejabberd_s2s_out.erl | 62 ++++++----------- src/ejabberd_sm.erl | 13 +--- src/ejabberd_sql.erl | 54 ++++----------- src/ejabberd_sql_sup.erl | 10 +-- src/ejabberd_system_monitor.erl | 13 +--- src/ejabberd_web_admin.erl | 7 +- src/ext_mod.erl | 6 +- src/extauth.erl | 6 +- src/gen_mod.erl | 14 +--- src/mod_last.erl | 4 +- src/mod_mam_sql.erl | 4 +- src/mod_register.erl | 20 +----- src/mod_s2s_dialback.erl | 2 +- src/mod_sip_proxy.erl | 5 +- src/rest.erl | 10 +-- src/shaper.erl | 3 +- src/sql_queries.erl | 4 +- 43 files changed, 243 insertions(+), 596 deletions(-) diff --git a/src/acl.erl b/src/acl.erl index 0cdd7daa6..3e0617f55 100644 --- a/src/acl.erl +++ b/src/acl.erl @@ -199,13 +199,13 @@ load_from_config() -> lists:foreach( fun(Host) -> ACLs = ejabberd_config:get_option( - {acl, Host}, fun(V) -> V end, []), + {acl, Host}, []), AccessRules = ejabberd_config:get_option( - {access, Host}, fun(V) -> V end, []), + {access, Host}, []), AccessRulesNew = ejabberd_config:get_option( - {access_rules, Host}, fun(V) -> V end, []), + {access_rules, Host}, []), ShaperRules = ejabberd_config:get_option( - {shaper_rules, Host}, fun(V) -> V end, []), + {shaper_rules, Host}, []), lists:foreach( fun({ACLName, SpecList}) -> lists:foreach( @@ -605,7 +605,7 @@ access_rules_validator(Rules0) -> (deny) -> true; (_) -> false end), - throw({replace_with, Rules}). + Rules. shaper_rules_validator(Name) when is_atom(Name) -> @@ -616,7 +616,7 @@ shaper_rules_validator(Rules0) -> (V2) when is_integer(V2) -> true; (_) -> false end), - throw({replace_with, Rules}). + Rules. access_shaper_rules_validator([{Type, Acls} = Rule | Rest], RuleTypeCheck) -> case RuleTypeCheck(Type) of diff --git a/src/cyrsasl_digest.erl b/src/cyrsasl_digest.erl index eedb5366c..9d23271d1 100644 --- a/src/cyrsasl_digest.erl +++ b/src/cyrsasl_digest.erl @@ -55,7 +55,7 @@ check_password :: check_password_fun(), auth_module :: atom(), host = <<"">> :: binary(), - hostfqdn = <<"">> :: binary() | [binary()]}). + hostfqdn = [] :: [binary()]}). start(_Opts) -> Fqdn = get_local_fqdn(), @@ -204,8 +204,6 @@ is_digesturi_valid(DigestURICase, JabberDomain, false end. -is_host_fqdn(Host, Fqdn) when is_binary(Fqdn) -> - Host == Fqdn; is_host_fqdn(_Host, []) -> false; is_host_fqdn(Host, [Fqdn | _FqdnTail]) when Host == Fqdn -> @@ -214,26 +212,13 @@ is_host_fqdn(Host, [Fqdn | FqdnTail]) when Host /= Fqdn -> is_host_fqdn(Host, FqdnTail). get_local_fqdn() -> - case catch get_local_fqdn2() of - Str when is_binary(Str) -> Str; - List when is_list(List) -> List; - _ -> - <<"unknown-fqdn, please configure fqdn " - "option in ejabberd.yml!">> - end. - -get_local_fqdn2() -> - case ejabberd_config:get_option( - fqdn, fun(X) -> X end) of - ConfiguredFqdn when is_binary(ConfiguredFqdn) -> - ConfiguredFqdn; - [A | _] = ConfiguredFqdns when is_binary(A) -> - ConfiguredFqdns; - undefined -> - {ok, Hostname} = inet:gethostname(), - {ok, {hostent, Fqdn, _, _, _, _}} = - inet:gethostbyname(Hostname), - list_to_binary(Fqdn) + case ejabberd_config:get_option(fqdn) of + undefined -> + {ok, Hostname} = inet:gethostname(), + {ok, {hostent, Fqdn, _, _, _, _}} = inet:gethostbyname(Hostname), + [list_to_binary(Fqdn)]; + Fqdn -> + Fqdn end. hex(S) -> @@ -275,5 +260,10 @@ response(KeyVals, User, Passwd, Nonce, AuthzId, ":", (hex((erlang:md5(A2))))/binary>>, hex((erlang:md5(T))). -opt_type(fqdn) -> fun iolist_to_binary/1; +opt_type(fqdn) -> + fun(FQDN) when is_binary(FQDN) -> + [FQDN]; + (FQDNs) when is_list(FQDNs) -> + [iolist_to_binary(FQDN) || FQDN <- FQDNs] + end; opt_type(_) -> [fqdn]. diff --git a/src/ejabberd_access_permissions.erl b/src/ejabberd_access_permissions.erl index 244b2c121..b27d17683 100644 --- a/src/ejabberd_access_permissions.erl +++ b/src/ejabberd_access_permissions.erl @@ -239,8 +239,7 @@ get_definitions(#state{definitions = none, fragments_generators = Gens} = State) [{acl,{acl,admin}}, {oauth,[<<"ejabberd:admin">>],[{acl,{acl,admin}}]}], {all, [start, stop]}}}], - ApiPerms = ejabberd_config:get_option(api_permissions, fun(A) -> A end, - DefaultOptions), + ApiPerms = ejabberd_config:get_option(api_permissions, DefaultOptions), AllCommands = ejabberd_commands:get_commands_definition(), Frags = lists:foldl( fun({_Name, Generator}, Acc) -> @@ -334,7 +333,7 @@ command_matches_patterns(C, [_ | Tail]) -> %%%=================================================================== parse_api_permissions(Data) when is_list(Data) -> - throw({replace_with, [parse_api_permission(Name, Args) || {Name, Args} <- Data]}). + [parse_api_permission(Name, Args) || {Name, Args} <- Data]. parse_api_permission(Name, Args0) -> Args = lists:flatten(Args0), @@ -374,8 +373,6 @@ parse_who(Name, Defs, ParseOauth) when is_list(Defs) -> throw:{invalid_syntax, Msg} -> report_error(<<"Invalid access rule: '~s' used inside 'who' section for api_permission '~s'">>, [Msg, Name]); - throw:{replace_with, NVal} -> - {access, NVal}; error:_ -> report_error(<<"Invalid access rule '~p' used inside 'who' section for api_permission '~s'">>, [Val, Name]) diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index c96cd95f6..b23249aa0 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -89,12 +89,7 @@ stop(_State) -> %%% connect_nodes() -> - Nodes = ejabberd_config:get_option( - cluster_nodes, - fun(Ns) -> - true = lists:all(fun is_atom/1, Ns), - Ns - end, []), + Nodes = ejabberd_config:get_option(cluster_nodes, []), lists:foreach(fun(Node) -> net_kernel:connect_node(Node) end, Nodes). @@ -142,10 +137,7 @@ delete_pid_file() -> end. set_settings_from_config() -> - Ticktime = ejabberd_config:get_option( - net_ticktime, - opt_type(net_ticktime), - 60), + Ticktime = ejabberd_config:get_option(net_ticktime, 60), net_kernel:set_net_ticktime(Ticktime). file_queue_init() -> diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl index 8839cf89a..756fafcf6 100644 --- a/src/ejabberd_auth.erl +++ b/src/ejabberd_auth.erl @@ -498,9 +498,7 @@ backend_type(Mod) -> end. password_format(LServer) -> - ejabberd_config:get_option({auth_password_format, LServer}, - opt_type(auth_password_format), - plain). + ejabberd_config:get_option({auth_password_format, LServer}, plain). %%%---------------------------------------------------------------------- %%% Internal functions @@ -513,8 +511,7 @@ auth_modules() -> auth_modules(Server) -> LServer = jid:nameprep(Server), Default = ejabberd_config:default_db(LServer, ?MODULE), - Methods = ejabberd_config:get_option( - {auth_method, LServer}, opt_type(auth_method), [Default]), + Methods = ejabberd_config:get_option({auth_method, LServer}, [Default]), [misc:binary_to_atom(<<"ejabberd_auth_", (misc:atom_to_binary(M))/binary>>) || M <- Methods]. diff --git a/src/ejabberd_auth_anonymous.erl b/src/ejabberd_auth_anonymous.erl index 51eab74b7..a75af709e 100644 --- a/src/ejabberd_auth_anonymous.erl +++ b/src/ejabberd_auth_anonymous.erl @@ -26,9 +26,11 @@ -module(ejabberd_auth_anonymous). -behaviour(ejabberd_config). +-behaviour(ejabberd_auth). -author('mickael.remond@process-one.net'). -export([start/1, + stop/1, allow_anonymous/1, is_sasl_anonymous_enabled/1, is_login_anonymous_enabled/1, @@ -59,6 +61,12 @@ start(Host) -> ?MODULE, unregister_connection, 100), ok. +stop(Host) -> + ejabberd_hooks:delete(sm_register_connection_hook, Host, + ?MODULE, register_connection, 100), + ejabberd_hooks:delete(sm_remove_connection_hook, Host, + ?MODULE, unregister_connection, 100). + %% Return true if anonymous is allowed for host or false otherwise allow_anonymous(Host) -> lists:member(?MODULE, ejabberd_auth:auth_modules(Host)). @@ -93,21 +101,12 @@ is_login_anonymous_enabled(Host) -> %% Return the anonymous protocol to use: sasl_anon|login_anon|both %% defaults to login_anon anonymous_protocol(Host) -> - ejabberd_config:get_option( - {anonymous_protocol, Host}, - fun(sasl_anon) -> sasl_anon; - (login_anon) -> login_anon; - (both) -> both - end, - sasl_anon). + ejabberd_config:get_option({anonymous_protocol, Host}, sasl_anon). %% Return true if multiple connections have been allowed in the config file %% defaults to false allow_multiple_connections(Host) -> - ejabberd_config:get_option( - {allow_multiple_connections, Host}, - fun(V) when is_boolean(V) -> V end, - false). + ejabberd_config:get_option({allow_multiple_connections, Host}, false). anonymous_user_exist(User, Server) -> lists:any( diff --git a/src/ejabberd_auth_external.erl b/src/ejabberd_auth_external.erl index 4ba76cd99..8ba2e2b22 100644 --- a/src/ejabberd_auth_external.erl +++ b/src/ejabberd_auth_external.erl @@ -48,12 +48,7 @@ %%% API %%%---------------------------------------------------------------------- start(Host) -> - Cmd = ejabberd_config:get_option( - {extauth_program, Host}, - fun(V) -> - binary_to_list(iolist_to_binary(V)) - end, - "extauth"), + Cmd = ejabberd_config:get_option({extauth_program, Host}, "extauth"), extauth:start(Host, Cmd), check_cache_last_options(Host), ejabberd_auth_mnesia:start(Host). @@ -179,12 +174,8 @@ remove_user(User, Server, Password) -> %% @spec (Host::string()) -> false | {true, CacheTime::integer()} get_cache_option(Host) -> - case ejabberd_config:get_option( - {extauth_cache, Host}, - fun(false) -> undefined; - (I) when is_integer(I), I >= 0 -> I - end) of - undefined -> false; + case ejabberd_config:get_option({extauth_cache, Host}, false) of + false -> false; CacheTime -> {true, CacheTime} end. @@ -319,12 +310,11 @@ get_mod_last_configured(Server) -> end. is_configured(Host, Module) -> - Os = ejabberd_config:get_option({modules, Host}, - fun(M) when is_list(M) -> M end), + Os = ejabberd_config:get_option({modules, Host}, []), lists:keymember(Module, 1, Os). opt_type(extauth_cache) -> - fun (false) -> undefined; + fun (false) -> false; (I) when is_integer(I), I >= 0 -> I end; opt_type(extauth_program) -> diff --git a/src/ejabberd_auth_pam.erl b/src/ejabberd_auth_pam.erl index 51ad3a881..974cc8e43 100644 --- a/src/ejabberd_auth_pam.erl +++ b/src/ejabberd_auth_pam.erl @@ -112,18 +112,10 @@ store_type() -> external. %% Internal functions %%==================================================================== get_pam_service(Host) -> - ejabberd_config:get_option( - {pam_service, Host}, - fun iolist_to_binary/1, - <<"ejabberd">>). + ejabberd_config:get_option({pam_service, Host}, <<"ejabberd">>). get_pam_userinfotype(Host) -> - ejabberd_config:get_option( - {pam_userinfotype, Host}, - fun(username) -> username; - (jid) -> jid - end, - username). + ejabberd_config:get_option({pam_userinfotype, Host}, username). opt_type(pam_service) -> fun iolist_to_binary/1; opt_type(pam_userinfotype) -> diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 6dee111ff..acbc659c7 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -293,45 +293,37 @@ process_terminated(State, _Reason) -> tls_options(#{lserver := LServer, tls_options := DefaultOpts}) -> TLSOpts1 = case ejabberd_config:get_option( {c2s_certfile, LServer}, - fun iolist_to_binary/1, ejabberd_config:get_option( - {domain_certfile, LServer}, - fun iolist_to_binary/1)) of + {domain_certfile, LServer})) of undefined -> DefaultOpts; CertFile -> lists:keystore(certfile, 1, DefaultOpts, {certfile, CertFile}) end, TLSOpts2 = case ejabberd_config:get_option( - {c2s_ciphers, LServer}, - fun iolist_to_binary/1) of + {c2s_ciphers, LServer}) of undefined -> TLSOpts1; Ciphers -> lists:keystore(ciphers, 1, TLSOpts1, {ciphers, Ciphers}) end, TLSOpts3 = case ejabberd_config:get_option( - {c2s_protocol_options, LServer}, - fun (Options) -> str:join(Options, <<$|>>) end) of + {c2s_protocol_options, LServer}) of undefined -> TLSOpts2; ProtoOpts -> lists:keystore(protocol_options, 1, TLSOpts2, {protocol_options, ProtoOpts}) end, TLSOpts4 = case ejabberd_config:get_option( - {c2s_dhfile, LServer}, - fun iolist_to_binary/1) of + {c2s_dhfile, LServer}) of undefined -> TLSOpts3; DHFile -> lists:keystore(dhfile, 1, TLSOpts3, {dhfile, DHFile}) end, TLSOpts5 = case ejabberd_config:get_option( - {c2s_cafile, LServer}, - fun iolist_to_binary/1) of + {c2s_cafile, LServer}) of undefined -> TLSOpts4; CAFile -> lists:keystore(cafile, 1, TLSOpts4, {cafile, CAFile}) end, - case ejabberd_config:get_option( - {c2s_tls_compression, LServer}, - fun(B) when is_boolean(B) -> B end) of + case ejabberd_config:get_option({c2s_tls_compression, LServer}) of undefined -> TLSOpts5; false -> [compression_none | TLSOpts5]; true -> lists:delete(compression_none, TLSOpts5) @@ -360,13 +352,7 @@ authenticated_stream_features(#{lserver := LServer}) -> ejabberd_hooks:run_fold(c2s_post_auth_features, LServer, [], [LServer]). sasl_mechanisms(Mechs, #{lserver := LServer}) -> - Mechs1 = ejabberd_config:get_option( - {disable_sasl_mechanisms, LServer}, - fun(V) when is_list(V) -> - lists:map(fun(M) -> str:to_upper(M) end, V); - (V) -> - [str:to_upper(V)] - end, []), + Mechs1 = ejabberd_config:get_option({disable_sasl_mechanisms, LServer}, []), Mechs2 = case ejabberd_auth_anonymous:is_sasl_anonymous_enabled(LServer) of true -> Mechs1; false -> [<<"ANONYMOUS">>|Mechs1] @@ -805,22 +791,15 @@ resource_conflict_action(U, S, R) -> OptionRaw = case ejabberd_sm:is_existing_resource(U, S, R) of true -> ejabberd_config:get_option( - {resource_conflict, S}, - fun(setresource) -> setresource; - (closeold) -> closeold; - (closenew) -> closenew; - (acceptnew) -> acceptnew - end); + {resource_conflict, S}, acceptnew); false -> acceptnew end, Option = case OptionRaw of setresource -> setresource; - closeold -> - acceptnew; %% ejabberd_sm will close old session + closeold -> acceptnew; %% ejabberd_sm will close old session closenew -> closenew; - acceptnew -> acceptnew; - _ -> acceptnew %% default ejabberd behavior + acceptnew -> acceptnew end, case Option of acceptnew -> {accept_resource, R}; diff --git a/src/ejabberd_c2s_config.erl b/src/ejabberd_c2s_config.erl index 0f0a2a875..b94bbdc52 100644 --- a/src/ejabberd_c2s_config.erl +++ b/src/ejabberd_c2s_config.erl @@ -33,8 +33,7 @@ %% Get first c2s configuration limitations to apply it to other c2s %% connectors. get_c2s_limits() -> - C2SFirstListen = ejabberd_config:get_option( - listen, fun ejabberd_listener:validate_cfg/1, []), + C2SFirstListen = ejabberd_config:get_option(listen, []), case lists:keysearch(ejabberd_c2s, 2, C2SFirstListen) of false -> []; {value, {_Port, ejabberd_c2s, Opts}} -> diff --git a/src/ejabberd_captcha.erl b/src/ejabberd_captcha.erl index 3c42fa094..0a8dc0261 100644 --- a/src/ejabberd_captcha.erl +++ b/src/ejabberd_captcha.erl @@ -350,12 +350,7 @@ do_create_image(Key) -> end. get_prog_name() -> - case ejabberd_config:get_option( - captcha_cmd, - fun(FileName) -> - F = iolist_to_binary(FileName), - if F /= <<"">> -> F end - end) of + case ejabberd_config:get_option(captcha_cmd) of undefined -> ?DEBUG("The option captcha_cmd is not configured, " "but some module wants to use the CAPTCHA " @@ -367,10 +362,7 @@ get_prog_name() -> end. get_url(Str) -> - CaptchaHost = ejabberd_config:get_option( - captcha_host, - fun iolist_to_binary/1, - <<"">>), + CaptchaHost = ejabberd_config:get_option(captcha_host, <<"">>), case str:tokens(CaptchaHost, <<":">>) of [Host] -> <<"http://", Host/binary, "/captcha/", Str/binary>>; @@ -395,8 +387,7 @@ get_transfer_protocol(PortString) -> get_captcha_transfer_protocol(PortListeners). get_port_listeners(PortNumber) -> - AllListeners = ejabberd_config:get_option( - listen, fun ejabberd_listener:validate_cfg/1, []), + AllListeners = ejabberd_config:get_option(listen, []), lists:filter(fun (Listener) when is_list(Listener) -> case proplists:get_value(port, Listener) of PortNumber -> true; @@ -426,9 +417,7 @@ get_captcha_transfer_protocol([_ | Listeners]) -> is_limited(undefined) -> false; is_limited(Limiter) -> - case ejabberd_config:get_option( - captcha_limit, - fun(I) when is_integer(I), I > 0 -> I end) of + case ejabberd_config:get_option(captcha_limit) of undefined -> false; Int -> case catch gen_server:call(?MODULE, diff --git a/src/ejabberd_commands.erl b/src/ejabberd_commands.erl index df0ce9123..3a6f6db1f 100644 --- a/src/ejabberd_commands.erl +++ b/src/ejabberd_commands.erl @@ -211,6 +211,7 @@ -author('badlop@process-one.net'). -behaviour(gen_server). +-behaviour(ejabberd_config). -define(DEFAULT_VERSION, 1000000). @@ -822,10 +823,7 @@ get_access_commands(AccessCommands, _Version) -> get_exposed_commands() -> get_exposed_commands(?DEFAULT_VERSION). get_exposed_commands(Version) -> - Opts0 = ejabberd_config:get_option( - commands, - fun(V) when is_list(V) -> V end, - []), + Opts0 = ejabberd_config:get_option(commands, []), Opts = lists:map(fun(V) when is_tuple(V) -> [V]; (V) -> V end, Opts0), CommandsList = list_commands_policy(Version), OpenCmds = [N || {N, _, _, open} <- CommandsList], @@ -876,10 +874,7 @@ is_admin(Name, Auth, Extra) -> _ -> {Extra, global} end, - AdminAccess = ejabberd_config:get_option( - commands_admin_access, - fun(V) -> V end, - none), + AdminAccess = ejabberd_config:get_option(commands_admin_access, none), case acl:access_matches(AdminAccess, ACLInfo, Server) of allow -> case catch check_auth(get_command_definition(Name), Auth) of @@ -893,9 +888,7 @@ is_admin(Name, Auth, Extra) -> permission_addon() -> [{<<"'commands' option compatibility shim">>, {[], - [{access, ejabberd_config:get_option(commands_admin_access, - fun(V) -> V end, - none)}], + [{access, ejabberd_config:get_option(commands_admin_access, none)}], {get_exposed_commands(), []}}}]. opt_type(commands_admin_access) -> fun acl:access_rules_validator/1; diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index 5aa9a1d2b..6cbaa4453 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -27,7 +27,7 @@ -author('alexey@process-one.net'). -export([start/0, load_file/1, reload_file/0, read_file/1, - get_option/2, get_option/3, add_option/2, has_option/1, + get_option/1, get_option/2, add_option/2, has_option/1, get_vh_by_auth_method/1, is_file_readable/1, get_version/0, get_myhosts/0, get_mylang/0, get_lang/1, get_ejabberd_config_path/0, is_using_elixir_config/0, @@ -44,11 +44,13 @@ %% The following functions are deprecated. -export([add_global_option/2, add_local_option/2, get_global_option/2, get_local_option/2, - get_global_option/3, get_local_option/3]). + get_global_option/3, get_local_option/3, + get_option/3]). -deprecated([{add_global_option, 2}, {add_local_option, 2}, {get_global_option, 2}, {get_local_option, 2}, - {get_global_option, 3}, {get_local_option, 3}]). + {get_global_option, 3}, {get_local_option, 3}, + {get_option, 3}]). -include("ejabberd.hrl"). -include("logger.hrl"). @@ -764,10 +766,7 @@ set_opts(State) -> set_log_level(). set_log_level() -> - Level = get_option( - loglevel, - fun(P) when P>=0, P=<5 -> P end, - 4), + Level = get_option(loglevel, 4), ejabberd_logger:set(Level). add_global_option(Opt, Val) -> @@ -817,34 +816,38 @@ prepare_opt_val(Opt, Val, F, Default) -> -spec get_global_option(any(), check_fun()) -> any(). -get_global_option(Opt, F) -> - get_option(Opt, F, undefined). +get_global_option(Opt, _) -> + get_option(Opt, undefined). -spec get_global_option(any(), check_fun(), any()) -> any(). -get_global_option(Opt, F, Default) -> - get_option(Opt, F, Default). +get_global_option(Opt, _, Default) -> + get_option(Opt, Default). -spec get_local_option(any(), check_fun()) -> any(). -get_local_option(Opt, F) -> - get_option(Opt, F, undefined). +get_local_option(Opt, _) -> + get_option(Opt, undefined). -spec get_local_option(any(), check_fun(), any()) -> any(). -get_local_option(Opt, F, Default) -> - get_option(Opt, F, Default). +get_local_option(Opt, _, Default) -> + get_option(Opt, Default). --spec get_option(any(), check_fun()) -> any(). - -get_option(Opt, F) -> - get_option(Opt, F, undefined). +-spec get_option(any()) -> any(). +get_option(Opt) -> + get_option(Opt, undefined). -spec get_option(any(), check_fun(), any()) -> any(). +get_option(Opt, _, Default) -> + get_option(Opt, Default). -get_option(Opt, F, Default) when is_atom(Opt) -> - get_option({Opt, global}, F, Default); -get_option(Opt, F, Default) -> +-spec get_option(any(), check_fun() | any()) -> any(). +get_option(Opt, F) when is_function(F) -> + get_option(Opt, undefined); +get_option(Opt, Default) when is_atom(Opt) -> + get_option({Opt, global}, Default); +get_option(Opt, Default) -> {Key, Host} = case Opt of {O, global} when is_atom(O) -> Opt; {O, H} when is_atom(O), is_binary(H) -> Opt; @@ -856,7 +859,7 @@ get_option(Opt, F, Default) -> case ejabberd_options:is_known(Key) of true -> case ejabberd_options:Key(Host) of - {ok, Val} -> prepare_opt_val(Opt, Val, F, Default); + {ok, Val} -> Val; undefined -> Default end; false -> @@ -865,7 +868,7 @@ get_option(Opt, F, Default) -> -spec has_option(atom() | {atom(), global | binary()}) -> any(). has_option(Opt) -> - get_option(Opt, fun(_) -> true end, false). + get_option(Opt) /= undefined. init_module_db_table(Modules) -> %% Dirty hack for mod_pubsub @@ -952,7 +955,7 @@ default_ram_db(Host, Module) -> -spec default_db(default_db | default_ram_db, binary() | global, module()) -> atom(). default_db(Opt, Host, Module) -> - case get_option({Opt, Host}, fun(T) when is_atom(T) -> T end) of + case get_option({Opt, Host}) of undefined -> mnesia; DBType -> @@ -997,11 +1000,9 @@ validate_opts(#state{opts = Opts} = State) -> {ok, [Mod|_]} -> VFun = Mod:opt_type(Opt), try VFun(Val) of - _ -> - true - catch {replace_with, NewVal} -> - {true, In#local_config{value = NewVal}}; - {invalid_syntax, Error} -> + NewVal -> + {true, In#local_config{value = NewVal}} + catch {invalid_syntax, Error} -> ?ERROR_MSG("ignoring option '~s' with " "invalid value: ~p: ~s", [Opt, Val, Error]), @@ -1028,7 +1029,7 @@ get_vh_by_auth_method(AuthMethod) -> get_vh_by_auth_method(AuthMethod, Hosts, []). get_vh_by_auth_method(Method, [Host|Hosts], Result) -> - Methods = get_option({auth_method, Host}, fun(Ms) -> Ms end, []), + Methods = get_option({auth_method, Host}, []), case lists:member(Method, Methods) of true when Host == global -> get_myhosts(); @@ -1062,7 +1063,7 @@ get_version() -> -spec get_myhosts() -> [binary()]. get_myhosts() -> - get_option(hosts, fun(V) -> V end). + get_option(hosts). -spec get_mylang() -> binary(). @@ -1071,10 +1072,7 @@ get_mylang() -> -spec get_lang(global | binary()) -> binary(). get_lang(Host) -> - get_option( - {language, Host}, - fun iolist_to_binary/1, - <<"en">>). + get_option({language, Host}, <<"en">>). replace_module(mod_announce_odbc) -> {mod_announce, sql}; replace_module(mod_blocking_odbc) -> {mod_blocking, sql}; @@ -1365,11 +1363,8 @@ now_to_seconds({MegaSecs, Secs, _MicroSecs}) -> opt_type(hide_sensitive_log_data) -> fun (H) when is_boolean(H) -> H end; opt_type(hosts) -> - fun(L) when is_list(L) -> - lists:map( - fun(H) -> - iolist_to_binary(H) - end, L) + fun(L) -> + [iolist_to_binary(H) || H <- L] end; opt_type(language) -> fun iolist_to_binary/1; @@ -1404,7 +1399,7 @@ opt_type(domain_certfile) -> opt_type(shared_key) -> fun iolist_to_binary/1; opt_type(node_start) -> - fun(I) when is_integer(I), I>0 -> I end; + fun(I) when is_integer(I), I>=0 -> I end; opt_type(_) -> [hide_sensitive_log_data, hosts, language, max_fsm_queue, default_db, default_ram_db, queue_type, queue_dir, loglevel, @@ -1413,12 +1408,7 @@ opt_type(_) -> -spec may_hide_data(any()) -> any(). may_hide_data(Data) -> - case get_option( - hide_sensitive_log_data, - fun(false) -> false; - (true) -> true - end, - false) of + case get_option(hide_sensitive_log_data, false) of false -> Data; true -> @@ -1431,9 +1421,7 @@ fsm_limit_opts(Opts) -> {_, I} when is_integer(I), I>0 -> [{max_queue, I}]; false -> - case get_option( - max_fsm_queue, - fun(I) when is_integer(I), I>0 -> I end) of + case get_option(max_fsm_queue) of undefined -> []; N -> [{max_queue, N}] end @@ -1441,25 +1429,25 @@ fsm_limit_opts(Opts) -> -spec queue_dir() -> binary() | undefined. queue_dir() -> - get_option(queue_dir, opt_type(queue_dir)). + get_option(queue_dir). -spec default_queue_type(binary()) -> ram | file. default_queue_type(Host) -> - get_option({queue_type, Host}, opt_type(queue_type), ram). + get_option({queue_type, Host}, ram). -spec use_cache(binary() | global) -> boolean(). use_cache(Host) -> - get_option({use_cache, Host}, opt_type(use_cache), true). + get_option({use_cache, Host}, true). -spec cache_size(binary() | global) -> pos_integer() | infinity. cache_size(Host) -> - get_option({cache_size, Host}, opt_type(cache_size), 1000). + get_option({cache_size, Host}, 1000). -spec cache_missed(binary() | global) -> boolean(). cache_missed(Host) -> - get_option({cache_missed, Host}, opt_type(cache_missed), true). + get_option({cache_missed, Host}, true). -spec cache_life_time(binary() | global) -> pos_integer() | infinity. %% NOTE: the integer value returned is in *seconds* cache_life_time(Host) -> - get_option({cache_life_time, Host}, opt_type(cache_life_time), 3600). + get_option({cache_life_time, Host}, 3600). diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index f006ad5c1..a9643386d 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -289,8 +289,7 @@ process2(Args, AccessCommands, Auth, Version) -> end. get_accesscommands() -> - ejabberd_config:get_option(ejabberdctl_access_commands, - fun(V) when is_list(V) -> V end, []). + ejabberd_config:get_option(ejabberdctl_access_commands, []). %%----------------------------- %% Command calling diff --git a/src/ejabberd_http.erl b/src/ejabberd_http.erl index 5c591386d..7072c49fd 100644 --- a/src/ejabberd_http.erl +++ b/src/ejabberd_http.erl @@ -521,12 +521,7 @@ analyze_ip_xff(IP, [], _Host) -> IP; analyze_ip_xff({IPLast, Port}, XFF, Host) -> [ClientIP | ProxiesIPs] = str:tokens(XFF, <<", ">>) ++ [misc:ip_to_list(IPLast)], - TrustedProxies = ejabberd_config:get_option( - {trusted_proxies, Host}, - fun(all) -> all; - (TPs) -> - [iolist_to_binary(TP) || TP <- TPs] - end, []), + TrustedProxies = ejabberd_config:get_option({trusted_proxies, Host}, []), IPClient = case is_ipchain_trusted(ProxiesIPs, TrustedProxies) of diff --git a/src/ejabberd_http_ws.erl b/src/ejabberd_http_ws.erl index 5231d7ab1..18ba071dd 100644 --- a/src/ejabberd_http_ws.erl +++ b/src/ejabberd_http_ws.erl @@ -123,11 +123,9 @@ init([{#ws{ip = IP, http_opts = HOpts}, _} = WS]) -> Opts = ejabberd_c2s_config:get_c2s_limits() ++ SOpts, PingInterval = ejabberd_config:get_option( {websocket_ping_interval, ?MYNAME}, - fun(I) when is_integer(I), I>=0 -> I end, ?PING_INTERVAL) * 1000, WSTimeout = ejabberd_config:get_option( {websocket_timeout, ?MYNAME}, - fun(I) when is_integer(I), I>0 -> I end, ?WEBSOCKET_TIMEOUT) * 1000, Socket = {http_ws, self(), IP}, ?DEBUG("Client connected through websocket ~p", diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 7d3c53574..64e7f83b0 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -49,24 +49,20 @@ init(_) -> {ok, {{one_for_one, 10, 1}, listeners_childspec()}}. listeners_childspec() -> - case ejabberd_config:get_option(listen, fun validate_cfg/1) of - undefined -> - []; - Ls -> - Specs = lists:map( - fun({Port, Module, Opts}) -> - maybe_start_sip(Module), - ets:insert(?MODULE, {Port, Module, Opts}), - {Port, - {?MODULE, start, [Port, Module, Opts]}, - transient, - brutal_kill, - worker, - [?MODULE]} - end, Ls), - report_duplicated_portips(Ls), - Specs - end. + Ls = ejabberd_config:get_option(listen, []), + Specs = lists:map( + fun({Port, Module, Opts}) -> + maybe_start_sip(Module), + ets:insert(?MODULE, {Port, Module, Opts}), + {Port, + {?MODULE, start, [Port, Module, Opts]}, + transient, + brutal_kill, + worker, + [?MODULE]} + end, Ls), + report_duplicated_portips(Ls), + Specs. start_listeners() -> lists:foreach( @@ -384,7 +380,7 @@ start_listener_sup(Port, Module, Opts) -> supervisor:start_child(?MODULE, ChildSpec). stop_listeners() -> - Ports = ejabberd_config:get_option(listen, fun validate_cfg/1), + Ports = ejabberd_config:get_option(listen, []), lists:foreach( fun({PortIpNetp, Module, _Opts}) -> delete_listener(PortIpNetp, Module) @@ -438,10 +434,7 @@ maybe_start_sip(_) -> ok. config_reloaded() -> - New = case ejabberd_config:get_option(listen, fun validate_cfg/1) of - undefined -> []; - Ls -> Ls - end, + New = ejabberd_config:get_option(listen, []), Old = ets:tab2list(?MODULE), lists:foreach( fun({PortIP, Module, _Opts}) -> diff --git a/src/ejabberd_oauth.erl b/src/ejabberd_oauth.erl index 8527c9271..455db85a5 100644 --- a/src/ejabberd_oauth.erl +++ b/src/ejabberd_oauth.erl @@ -27,6 +27,7 @@ -module(ejabberd_oauth). -behaviour(gen_server). +-behaviour(ejabberd_config). -compile(export_all). @@ -199,7 +200,6 @@ authenticate_user({User, Server}, Ctx) -> Access = ejabberd_config:get_option( {oauth_access, JID#jid.lserver}, - fun(A) -> A end, none), case acl:match_rule(JID#jid.lserver, Access, JID) of allow -> @@ -402,22 +402,19 @@ use_cache(DBMod) -> true -> DBMod:use_cache(); false -> ejabberd_config:get_option( - oauth_use_cache, opt_type(oauth_use_cache), + oauth_use_cache, ejabberd_config:use_cache(global)) end. cache_opts() -> MaxSize = ejabberd_config:get_option( oauth_cache_size, - opt_type(oauth_cache_size), ejabberd_config:cache_size(global)), CacheMissed = ejabberd_config:get_option( oauth_cache_missed, - opt_type(oauth_cache_missed), ejabberd_config:cache_missed(global)), LifeTime = case ejabberd_config:get_option( oauth_cache_life_time, - opt_type(oauth_cache_life_time), ejabberd_config:cache_life_time(global)) of infinity -> infinity; I -> timer:seconds(I) @@ -425,10 +422,7 @@ cache_opts() -> [{max_size, MaxSize}, {life_time, LifeTime}, {cache_missed, CacheMissed}]. expire() -> - ejabberd_config:get_option( - oauth_expire, - fun(I) when is_integer(I) -> I end, - ?EXPIRE). + ejabberd_config:get_option(oauth_expire, ?EXPIRE). -define(DIV(Class, Els), ?XAE(<<"div">>, [{<<"class">>, Class}], Els)). @@ -623,9 +617,8 @@ process(_Handlers, _Request) -> get_db_backend() -> DBType = ejabberd_config:get_option( - oauth_db_type, - fun(T) -> ejabberd_config:v_db(?MODULE, T) end, - mnesia), + oauth_db_type, + ejabberd_config:default_db(?MODULE)), list_to_atom("ejabberd_oauth_" ++ atom_to_list(DBType)). diff --git a/src/ejabberd_oauth_rest.erl b/src/ejabberd_oauth_rest.erl index 15e118a0b..6c5b30523 100644 --- a/src/ejabberd_oauth_rest.erl +++ b/src/ejabberd_oauth_rest.erl @@ -26,6 +26,8 @@ -module(ejabberd_oauth_rest). +-behaviour(ejabberd_config). + -export([init/0, store/1, lookup/1, @@ -87,9 +89,7 @@ clean(_TS) -> ok. path(Path) -> - Base = ejabberd_config:get_option(ext_api_path_oauth, - fun(X) -> iolist_to_binary(X) end, - <<"/oauth">>), + Base = ejabberd_config:get_option(ext_api_path_oauth, <<"/oauth">>), <>. diff --git a/src/ejabberd_rdbms.erl b/src/ejabberd_rdbms.erl index 0f89e333e..7021c10b7 100644 --- a/src/ejabberd_rdbms.erl +++ b/src/ejabberd_rdbms.erl @@ -100,13 +100,7 @@ stop_host(Host) -> %% Returns {true, App} if we have configured sql for the given host needs_sql(Host) -> LHost = jid:nameprep(Host), - case ejabberd_config:get_option({sql_type, LHost}, - fun(mysql) -> mysql; - (pgsql) -> pgsql; - (sqlite) -> sqlite; - (mssql) -> mssql; - (odbc) -> odbc - end, undefined) of + case ejabberd_config:get_option({sql_type, LHost}, undefined) of mysql -> {true, p1_mysql}; pgsql -> {true, p1_pgsql}; sqlite -> {true, sqlite3}; diff --git a/src/ejabberd_receiver.erl b/src/ejabberd_receiver.erl index 6152f7eb2..38ad70eb3 100644 --- a/src/ejabberd_receiver.erl +++ b/src/ejabberd_receiver.erl @@ -346,9 +346,7 @@ do_call(Pid, Msg) -> end. hibernate_timeout() -> - ejabberd_config:get_option(receiver_hibernate, - opt_type(receiver_hibernate), - timer:seconds(90)). + ejabberd_config:get_option(receiver_hibernate, timer:seconds(90)). opt_type(receiver_hibernate) -> fun(I) when is_integer(I), I>0 -> I; diff --git a/src/ejabberd_redis.erl b/src/ejabberd_redis.erl index 7757c6df3..56948ec83 100644 --- a/src/ejabberd_redis.erl +++ b/src/ejabberd_redis.erl @@ -421,26 +421,13 @@ code_change(_OldVsn, State, _Extra) -> %%%=================================================================== -spec connect(state()) -> {ok, pid()} | {error, any()}. connect(#state{num = Num}) -> - Server = ejabberd_config:get_option(redis_server, - fun iolist_to_list/1, - "localhost"), - Port = ejabberd_config:get_option(redis_port, - fun(P) when is_integer(P), - P>0, P<65536 -> - P - end, 6379), - DB = ejabberd_config:get_option(redis_db, - fun(I) when is_integer(I), I >= 0 -> - I - end, 0), - Pass = ejabberd_config:get_option(redis_password, - fun iolist_to_list/1, - ""), + Server = ejabberd_config:get_option(redis_server, "localhost"), + Port = ejabberd_config:get_option(redis_port, 6379), + DB = ejabberd_config:get_option(redis_db, 0), + Pass = ejabberd_config:get_option(redis_password, ""), ConnTimeout = timer:seconds( ejabberd_config:get_option( - redis_connect_timeout, - fun(I) when is_integer(I), I>0 -> I end, - 1)), + redis_connect_timeout, 1)), try case do_connect(Num, Server, Port, Pass, DB, ConnTimeout) of {ok, Client} -> ?DEBUG("Connection #~p established to Redis at ~s:~p", @@ -552,10 +539,6 @@ reply(Val) -> _ -> queued end. --spec iolist_to_list(iodata()) -> string(). -iolist_to_list(IOList) -> - binary_to_list(iolist_to_binary(IOList)). - -spec max_fsm_queue() -> pos_integer(). max_fsm_queue() -> proplists:get_value(max_queue, fsm_limit_opts(), ?DEFAULT_MAX_QUEUE). @@ -564,14 +547,9 @@ fsm_limit_opts() -> ejabberd_config:fsm_limit_opts([]). get_queue_type() -> - case ejabberd_config:get_option( - redis_queue_type, - ejabberd_redis_sup:opt_type(redis_queue_type)) of - undefined -> - ejabberd_config:default_queue_type(global); - Type -> - Type - end. + ejabberd_config:get_option( + redis_queue_type, + ejabberd_config:default_queue_type(global)). -spec flush_queue(p1_queue:queue()) -> p1_queue:queue(). flush_queue(Q) -> diff --git a/src/ejabberd_redis_sup.erl b/src/ejabberd_redis_sup.erl index da9fe37cf..85cfd7abb 100644 --- a/src/ejabberd_redis_sup.erl +++ b/src/ejabberd_redis_sup.erl @@ -108,15 +108,9 @@ is_redis_configured(Host) -> PoolSize = ejabberd_config:has_option({redis_pool_size, Host}), ConnTimeoutConfigured = ejabberd_config:has_option( {redis_connect_timeout, Host}), - Modules = ejabberd_config:get_option( - {modules, Host}, - fun(L) when is_list(L) -> L end, []), - SMConfigured = ejabberd_config:get_option( - {sm_db_type, Host}, - fun(V) -> V end) == redis, - RouterConfigured = ejabberd_config:get_option( - {router_db_type, Host}, - fun(V) -> V end) == redis, + Modules = ejabberd_config:get_option({modules, Host}, []), + SMConfigured = ejabberd_config:get_option({sm_db_type, Host}) == redis, + RouterConfigured = ejabberd_config:get_option({router_db_type, Host}) == redis, ModuleWithRedisDBConfigured = lists:any( fun({Module, Opts}) -> @@ -134,10 +128,7 @@ get_specs() -> end, lists:seq(1, get_pool_size())). get_pool_size() -> - ejabberd_config:get_option( - redis_pool_size, - fun(N) when is_integer(N), N >= 1 -> N end, - ?DEFAULT_POOL_SIZE) + 1. + ejabberd_config:get_option(redis_pool_size, ?DEFAULT_POOL_SIZE) + 1. iolist_to_list(IOList) -> binary_to_list(iolist_to_binary(IOList)). diff --git a/src/ejabberd_riak_sup.erl b/src/ejabberd_riak_sup.erl index ad7c8619c..3d754f6d6 100644 --- a/src/ejabberd_riak_sup.erl +++ b/src/ejabberd_riak_sup.erl @@ -87,15 +87,9 @@ is_riak_configured(Host) -> AuthConfigured = lists:member( ejabberd_auth_riak, ejabberd_auth:auth_modules(Host)), - SMConfigured = ejabberd_config:get_option( - {sm_db_type, Host}, - ejabberd_sm:opt_type(sm_db_type)) == riak, - RouterConfigured = ejabberd_config:get_option( - {router_db_type, Host}, - ejabberd_router:opt_type(router_db_type)) == riak, - Modules = ejabberd_config:get_option( - {modules, Host}, - fun(L) when is_list(L) -> L end, []), + SMConfigured = ejabberd_config:get_option({sm_db_type, Host}) == riak, + RouterConfigured = ejabberd_config:get_option({router_db_type, Host}) == riak, + Modules = ejabberd_config:get_option({modules, Host}, []), ModuleWithRiakDBConfigured = lists:any( fun({Module, Opts}) -> gen_mod:db_type(Host, Opts, Module) == riak @@ -150,50 +144,25 @@ get_specs() -> end, lists:seq(1, PoolSize)). get_start_interval() -> - ejabberd_config:get_option( - riak_start_interval, - fun(N) when is_integer(N), N >= 1 -> N end, - ?DEFAULT_RIAK_START_INTERVAL). + ejabberd_config:get_option(riak_start_interval, ?DEFAULT_RIAK_START_INTERVAL). get_pool_size() -> - ejabberd_config:get_option( - riak_pool_size, - fun(N) when is_integer(N), N >= 1 -> N end, - ?DEFAULT_POOL_SIZE). + ejabberd_config:get_option(riak_pool_size, ?DEFAULT_POOL_SIZE). get_riak_server() -> - ejabberd_config:get_option( - riak_server, - fun(S) -> - binary_to_list(iolist_to_binary(S)) - end, ?DEFAULT_RIAK_HOST). + ejabberd_config:get_option(riak_server, ?DEFAULT_RIAK_HOST). get_riak_cacertfile() -> - ejabberd_config:get_option( - riak_cacertfile, - fun(S) -> - binary_to_list(iolist_to_binary(S)) - end, nil). + ejabberd_config:get_option(riak_cacertfile, nil). get_riak_username() -> - ejabberd_config:get_option( - riak_username, - fun(S) -> - binary_to_list(iolist_to_binary(S)) - end, nil). + ejabberd_config:get_option(riak_username, nil). get_riak_password() -> - ejabberd_config:get_option( - riak_password, - fun(S) -> - binary_to_list(iolist_to_binary(S)) - end, nil). + ejabberd_config:get_option(riak_password, nil). get_riak_port() -> - ejabberd_config:get_option( - riak_port, - fun(P) when is_integer(P), P > 0, P < 65536 -> P end, - ?DEFAULT_RIAK_PORT). + ejabberd_config:get_option(riak_port, ?DEFAULT_RIAK_PORT). get_pids() -> [ejabberd_riak:get_proc(I) || I <- lists:seq(1, get_pool_size())]. @@ -212,13 +181,18 @@ transform_options(Opt, Opts) -> opt_type(riak_pool_size) -> fun (N) when is_integer(N), N >= 1 -> N end; -opt_type(riak_port) -> fun (_) -> true end; -opt_type(riak_server) -> fun (_) -> true end; +opt_type(riak_port) -> + fun(P) when is_integer(P), P > 0, P < 65536 -> P end; +opt_type(riak_server) -> + fun(S) -> binary_to_list(iolist_to_binary(S)) end; opt_type(riak_start_interval) -> fun (N) when is_integer(N), N >= 1 -> N end; -opt_type(riak_cacertfile) -> fun iolist_to_binary/1; -opt_type(riak_username) -> fun iolist_to_binary/1; -opt_type(riak_password) -> fun iolist_to_binary/1; +opt_type(riak_cacertfile) -> + fun(S) -> binary_to_list(iolist_to_binary(S)) end; +opt_type(riak_username) -> + fun(S) -> binary_to_list(iolist_to_binary(S)) end; +opt_type(riak_password) -> + fun(S) -> binary_to_list(iolist_to_binary(S)) end; opt_type(_) -> [riak_pool_size, riak_port, riak_server, riak_start_interval, riak_cacertfile, riak_username, riak_password]. diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index 5951cbeca..490133d79 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -385,15 +385,11 @@ balancing_route(From, To, Packet, Rs) -> -spec get_component_number(binary()) -> pos_integer() | undefined. get_component_number(LDomain) -> - ejabberd_config:get_option( - {domain_balancing_component_number, LDomain}, - fun(N) when is_integer(N), N > 1 -> N end, - undefined). + ejabberd_config:get_option({domain_balancing_component_number, LDomain}). -spec get_domain_balancing(jid(), jid(), binary()) -> any(). get_domain_balancing(From, To, LDomain) -> - case ejabberd_config:get_option( - {domain_balancing, LDomain}, fun(D) when is_atom(D) -> D end) of + case ejabberd_config:get_option({domain_balancing, LDomain}) of undefined -> p1_time_compat:system_time(); random -> p1_time_compat:system_time(); source -> jid:tolower(From); @@ -404,14 +400,9 @@ get_domain_balancing(From, To, LDomain) -> -spec get_backend() -> module(). get_backend() -> - DBType = case ejabberd_config:get_option( - router_db_type, - fun(T) -> ejabberd_config:v_db(?MODULE, T) end) of - undefined -> - ejabberd_config:default_ram_db(?MODULE); - T -> - T - end, + DBType = ejabberd_config:get_option( + router_db_type, + ejabberd_config:default_ram_db(?MODULE)), list_to_atom("ejabberd_router_" ++ atom_to_list(DBType)). -spec cache_nodes(module()) -> [node()]. @@ -427,7 +418,7 @@ use_cache(Mod) -> true -> Mod:use_cache(); false -> ejabberd_config:get_option( - router_use_cache, opt_type(router_use_cache), + router_use_cache, ejabberd_config:use_cache(global)) end. @@ -454,15 +445,12 @@ init_cache(Mod) -> cache_opts() -> MaxSize = ejabberd_config:get_option( router_cache_size, - opt_type(router_cache_size), ejabberd_config:cache_size(global)), CacheMissed = ejabberd_config:get_option( router_cache_missed, - opt_type(router_cache_missed), ejabberd_config:cache_missed(global)), LifeTime = case ejabberd_config:get_option( router_cache_life_time, - opt_type(router_cache_life_time), ejabberd_config:cache_life_time(global)) of infinity -> infinity; I -> timer:seconds(I) diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 674fd7c50..b6685c12e 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -200,45 +200,37 @@ dirty_get_connections() -> tls_options(LServer, DefaultOpts) -> TLSOpts1 = case ejabberd_config:get_option( {s2s_certfile, LServer}, - fun iolist_to_binary/1, ejabberd_config:get_option( - {domain_certfile, LServer}, - fun iolist_to_binary/1)) of + {domain_certfile, LServer})) of undefined -> DefaultOpts; CertFile -> lists:keystore(certfile, 1, DefaultOpts, {certfile, CertFile}) end, TLSOpts2 = case ejabberd_config:get_option( - {s2s_ciphers, LServer}, - fun iolist_to_binary/1) of + {s2s_ciphers, LServer}) of undefined -> TLSOpts1; Ciphers -> lists:keystore(ciphers, 1, TLSOpts1, {ciphers, Ciphers}) end, TLSOpts3 = case ejabberd_config:get_option( - {s2s_protocol_options, LServer}, - fun (Options) -> str:join(Options, <<$|>>) end) of + {s2s_protocol_options, LServer}) of undefined -> TLSOpts2; ProtoOpts -> lists:keystore(protocol_options, 1, TLSOpts2, {protocol_options, ProtoOpts}) end, TLSOpts4 = case ejabberd_config:get_option( - {s2s_dhfile, LServer}, - fun iolist_to_binary/1) of + {s2s_dhfile, LServer}) of undefined -> TLSOpts3; DHFile -> lists:keystore(dhfile, 1, TLSOpts3, {dhfile, DHFile}) end, TLSOpts5 = case ejabberd_config:get_option( - {s2s_cafile, LServer}, - fun iolist_to_binary/1) of + {s2s_cafile, LServer}) of undefined -> TLSOpts4; CAFile -> lists:keystore(cafile, 1, TLSOpts4, {cafile, CAFile}) end, - case ejabberd_config:get_option( - {s2s_tls_compression, LServer}, - fun(B) when is_boolean(B) -> B end) of + case ejabberd_config:get_option({s2s_tls_compression, LServer}) of undefined -> TLSOpts5; false -> [compression_none | TLSOpts5]; true -> lists:delete(compression_none, TLSOpts5) @@ -261,37 +253,21 @@ tls_enabled(LServer) -> -spec zlib_enabled(binary()) -> boolean(). zlib_enabled(LServer) -> - ejabberd_config:get_option( - {s2s_zlib, LServer}, - fun(B) when is_boolean(B) -> B end, - false). + ejabberd_config:get_option({s2s_zlib, LServer}, false). -spec use_starttls(binary()) -> boolean() | optional | required | required_trusted. use_starttls(LServer) -> - ejabberd_config:get_option( - {s2s_use_starttls, LServer}, - fun(true) -> true; - (false) -> false; - (optional) -> optional; - (required) -> required; - (required_trusted) -> required_trusted - end, false). + ejabberd_config:get_option({s2s_use_starttls, LServer}, false). -spec get_idle_timeout(binary()) -> non_neg_integer() | infinity. get_idle_timeout(LServer) -> - ejabberd_config:get_option( - {s2s_timeout, LServer}, - fun(I) when is_integer(I), I >= 0 -> timer:seconds(I); - (infinity) -> infinity - end, timer:minutes(10)). + ejabberd_config:get_option({s2s_timeout, LServer}, timer:minutes(10)). -spec queue_type(binary()) -> ram | file. queue_type(LServer) -> - case ejabberd_config:get_option( - {s2s_queue_type, LServer}, opt_type(s2s_queue_type)) of - undefined -> ejabberd_config:default_queue_type(LServer); - Type -> Type - end. + ejabberd_config:get_option( + {s2s_queue_type, LServer}, + ejabberd_config:default_queue_type(LServer)). %%==================================================================== %% gen_server callbacks @@ -543,9 +519,7 @@ needed_connections_number(Ls, MaxS2SConnectionsNumber, -spec is_service(jid(), jid()) -> boolean(). is_service(From, To) -> LFromDomain = From#jid.lserver, - case ejabberd_config:get_option( - {route_subdomains, LFromDomain}, - fun(s2s) -> s2s; (local) -> local end, local) of + case ejabberd_config:get_option({route_subdomains, LFromDomain}, local) of s2s -> % bypass RFC 3920 10.3 false; local -> @@ -645,10 +619,7 @@ allow_host(MyServer, S2SHost) -> not is_temporarly_blocked(S2SHost). allow_host1(MyHost, S2SHost) -> - Rule = ejabberd_config:get_option( - {s2s_access, MyHost}, - fun acl:access_rules_validator/1, - all), + Rule = ejabberd_config:get_option({s2s_access, MyHost}, all), JID = jid:make(S2SHost), case acl:match_rule(MyHost, Rule, JID) of deny -> false; @@ -744,8 +715,9 @@ opt_type(s2s_use_starttls) -> opt_type(s2s_zlib) -> fun(B) when is_boolean(B) -> B end; opt_type(s2s_timeout) -> - fun(I) when is_integer(I), I>=0 -> I; - (infinity) -> infinity + fun(I) when is_integer(I), I >= 0 -> timer:seconds(I); + (infinity) -> infinity; + (unlimited) -> infinity end; opt_type(s2s_queue_type) -> fun(ram) -> ram; (file) -> file end; diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index 3c9e1a1c9..deff3e5b5 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -191,42 +191,21 @@ tls_enabled(#{server := LServer}) -> connect_timeout(#{server := LServer}) -> ejabberd_config:get_option( {outgoing_s2s_timeout, LServer}, - fun(TimeOut) when is_integer(TimeOut), TimeOut > 0 -> - timer:seconds(TimeOut); - (infinity) -> - infinity - end, timer:seconds(10)). + timer:seconds(10)). default_port(#{server := LServer}) -> - ejabberd_config:get_option( - {outgoing_s2s_port, LServer}, - fun(I) when is_integer(I), I > 0, I =< 65536 -> I end, - 5269). + ejabberd_config:get_option({outgoing_s2s_port, LServer}, 5269). address_families(#{server := LServer}) -> ejabberd_config:get_option( {outgoing_s2s_families, LServer}, - fun(Families) -> - lists:map( - fun(ipv4) -> inet; - (ipv6) -> inet6 - end, Families) - end, [inet, inet6]). + [inet, inet6]). dns_retries(#{server := LServer}) -> - ejabberd_config:get_option( - {s2s_dns_retries, LServer}, - fun(I) when is_integer(I), I>=0 -> I end, - 2). + ejabberd_config:get_option({s2s_dns_retries, LServer}, 2). dns_timeout(#{server := LServer}) -> - ejabberd_config:get_option( - {s2s_dns_timeout, LServer}, - fun(I) when is_integer(I), I>=0 -> - timer:seconds(I); - (infinity) -> - infinity - end, timer:seconds(10)). + ejabberd_config:get_option({s2s_dns_timeout, LServer}, timer:seconds(10)). handle_auth_success(Mech, #{sockmod := SockMod, socket := Socket, ip := IP, @@ -391,10 +370,7 @@ mk_bounce_error(_Lang, _State) -> -spec get_delay() -> non_neg_integer(). get_delay() -> - MaxDelay = ejabberd_config:get_option( - s2s_max_retry_delay, - fun(I) when is_integer(I), I > 0 -> I end, - 300), + MaxDelay = ejabberd_config:get_option(s2s_max_retry_delay, 300), crypto:rand_uniform(1, MaxDelay). -spec set_idle_timeout(state()) -> state(). @@ -464,26 +440,28 @@ maybe_report_huge_timeout(_, _) -> ok. opt_type(outgoing_s2s_families) -> - fun (Families) -> - true = lists:all(fun (ipv4) -> true; - (ipv6) -> true - end, - Families), - Families + fun(Families) -> + lists:map( + fun(ipv4) -> inet; + (ipv6) -> inet6 + end, Families) end; opt_type(outgoing_s2s_port) -> fun (I) when is_integer(I), I > 0, I =< 65536 -> I end; opt_type(outgoing_s2s_timeout) -> - fun (TimeOut) when is_integer(TimeOut), TimeOut > 0 -> - TimeOut; - (infinity) -> infinity + fun(TimeOut) when is_integer(TimeOut), TimeOut > 0 -> + timer:seconds(TimeOut); + (unlimited) -> + infinity; + (infinity) -> + infinity end; opt_type(s2s_dns_retries) -> fun (I) when is_integer(I), I >= 0 -> I end; opt_type(s2s_dns_timeout) -> - fun (TimeOut) when is_integer(TimeOut), TimeOut > 0 -> - TimeOut; - (infinity) -> infinity + fun(I) when is_integer(I), I>=0 -> timer:seconds(I); + (infinity) -> infinity; + (unlimited) -> infinity end; opt_type(s2s_max_retry_delay) -> fun (I) when is_integer(I), I > 0 -> I end; diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 20614a58d..ce2abfff0 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -865,14 +865,9 @@ force_update_presence({LUser, LServer}) -> -spec get_sm_backend(binary()) -> module(). get_sm_backend(Host) -> - DBType = case ejabberd_config:get_option( + DBType = ejabberd_config:get_option( {sm_db_type, Host}, - fun(T) -> ejabberd_config:v_db(?MODULE, T) end) of - undefined -> - ejabberd_config:default_ram_db(Host, ?MODULE); - T -> - T - end, + ejabberd_config:default_ram_db(Host, ?MODULE)), list_to_atom("ejabberd_sm_" ++ atom_to_list(DBType)). -spec get_sm_backends() -> [module()]. @@ -904,15 +899,12 @@ init_cache() -> cache_opts() -> MaxSize = ejabberd_config:get_option( sm_cache_size, - opt_type(sm_cache_size), ejabberd_config:cache_size(global)), CacheMissed = ejabberd_config:get_option( sm_cache_missed, - opt_type(sm_cache_missed), ejabberd_config:cache_missed(global)), LifeTime = case ejabberd_config:get_option( sm_cache_life_time, - opt_type(sm_cache_life_time), ejabberd_config:cache_life_time(global)) of infinity -> infinity; I -> timer:seconds(I) @@ -943,7 +935,6 @@ use_cache(Mod, LServer) -> false -> ejabberd_config:get_option( {sm_use_cache, LServer}, - ejabberd_sm:opt_type(sm_use_cache), ejabberd_config:use_cache(LServer)) end. diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index 93cfa0288..0dddcb03e 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -252,8 +252,7 @@ sqlite_db(Host) -> -spec sqlite_file(binary()) -> string(). sqlite_file(Host) -> - case ejabberd_config:get_option({sql_database, Host}, - fun iolist_to_binary/1) of + case ejabberd_config:get_option({sql_database, Host}) of undefined -> {ok, Cwd} = file:get_cwd(), filename:join([Cwd, "sqlite", atom_to_list(node()), @@ -266,9 +265,7 @@ sqlite_file(Host) -> %%% Callback functions from gen_fsm %%%---------------------------------------------------------------------- init([Host, StartInterval]) -> - case ejabberd_config:get_option( - {sql_keepalive_interval, Host}, - fun(I) when is_integer(I), I>0 -> I end) of + case ejabberd_config:get_option({sql_keepalive_interval, Host}) of undefined -> ok; KeepaliveInterval -> @@ -278,8 +275,7 @@ init([Host, StartInterval]) -> [DBType | _] = db_opts(Host), (?GEN_FSM):send_event(self(), connect), ejabberd_sql_sup:add_pid(Host, self()), - QueueType = case ejabberd_config:get_option( - {sql_queue_type, Host}, opt_type(sql_queue_type)) of + QueueType = case ejabberd_config:get_option({sql_queue_type, Host}) of undefined -> ejabberd_config:default_queue_type(Host); Type -> @@ -927,20 +923,9 @@ log(Level, Format, Args) -> end. db_opts(Host) -> - Type = ejabberd_config:get_option({sql_type, Host}, - fun(mysql) -> mysql; - (pgsql) -> pgsql; - (sqlite) -> sqlite; - (mssql) -> mssql; - (odbc) -> odbc - end, odbc), - Server = ejabberd_config:get_option({sql_server, Host}, - fun iolist_to_binary/1, - <<"localhost">>), - Transport = case ejabberd_config:get_option( - {sql_ssl, Host}, - fun(B) when is_boolean(B) -> B end, - false) of + Type = ejabberd_config:get_option({sql_type, Host}, odbc), + Server = ejabberd_config:get_option({sql_server, Host}, <<"localhost">>), + Transport = case ejabberd_config:get_option({sql_ssl, Host}, false) of false -> tcp; true -> ssl end, @@ -953,20 +938,16 @@ db_opts(Host) -> _ -> Port = ejabberd_config:get_option( {sql_port, Host}, - fun(P) when is_integer(P), P > 0, P < 65536 -> P end, case Type of mssql -> ?MSSQL_PORT; mysql -> ?MYSQL_PORT; pgsql -> ?PGSQL_PORT end), DB = ejabberd_config:get_option({sql_database, Host}, - fun iolist_to_binary/1, <<"ejabberd">>), User = ejabberd_config:get_option({sql_username, Host}, - fun iolist_to_binary/1, <<"ejabberd">>), Pass = ejabberd_config:get_option({sql_password, Host}, - fun iolist_to_binary/1, <<"">>), SSLOpts = get_ssl_opts(Transport, Host), case Type of @@ -986,19 +967,15 @@ warn_if_ssl_unsupported(ssl, Type) -> ?WARNING_MSG("SSL connection is not supported for ~s", [Type]). get_ssl_opts(ssl, Host) -> - Opts1 = case ejabberd_config:get_option({sql_ssl_certfile, Host}, - fun iolist_to_binary/1) of + Opts1 = case ejabberd_config:get_option({sql_ssl_certfile, Host}) of undefined -> []; CertFile -> [{certfile, CertFile}] end, - Opts2 = case ejabberd_config:get_option({sql_ssl_cafile, Host}, - fun iolist_to_binary/1) of + Opts2 = case ejabberd_config:get_option({sql_ssl_cafile, Host}) of undefined -> Opts1; CAFile -> [{cacertfile, CAFile}|Opts1] end, - case ejabberd_config:get_option({sql_ssl_verify, Host}, - fun(B) when is_boolean(B) -> B end, - false) of + case ejabberd_config:get_option({sql_ssl_verify, Host}, false) of true -> case lists:keymember(cacertfile, 1, Opts2) of true -> @@ -1017,16 +994,9 @@ get_ssl_opts(tcp, _) -> []. init_mssql(Host) -> - Server = ejabberd_config:get_option({sql_server, Host}, - fun iolist_to_binary/1, - <<"localhost">>), - Port = ejabberd_config:get_option( - {sql_port, Host}, - fun(P) when is_integer(P), P > 0, P < 65536 -> P end, - ?MSSQL_PORT), - DB = ejabberd_config:get_option({sql_database, Host}, - fun iolist_to_binary/1, - <<"ejabberd">>), + Server = ejabberd_config:get_option({sql_server, Host}, <<"localhost">>), + Port = ejabberd_config:get_option({sql_port, Host}, ?MSSQL_PORT), + DB = ejabberd_config:get_option({sql_database, Host}, <<"ejabberd">>), FreeTDS = io_lib:fwrite("[~s]~n" "\thost = ~s~n" "\tport = ~p~n" diff --git a/src/ejabberd_sql_sup.erl b/src/ejabberd_sql_sup.erl index 59360a9f9..7526aedbe 100644 --- a/src/ejabberd_sql_sup.erl +++ b/src/ejabberd_sql_sup.erl @@ -62,15 +62,8 @@ start_link(Host) -> init([Host]) -> StartInterval = ejabberd_config:get_option( {sql_start_interval, Host}, - fun(I) when is_integer(I), I>0 -> I end, ?DEFAULT_SQL_START_INTERVAL), - Type = ejabberd_config:get_option({sql_type, Host}, - fun(mysql) -> mysql; - (pgsql) -> pgsql; - (sqlite) -> sqlite; - (mssql) -> mssql; - (odbc) -> odbc - end, odbc), + Type = ejabberd_config:get_option({sql_type, Host}, odbc), PoolSize = get_pool_size(Type, Host), case Type of sqlite -> @@ -119,7 +112,6 @@ remove_pid(Host, Pid) -> get_pool_size(SQLType, Host) -> PoolSize = ejabberd_config:get_option( {sql_pool_size, Host}, - fun(I) when is_integer(I), I>0 -> I end, case SQLType of sqlite -> 1; _ -> ?DEFAULT_POOL_SIZE diff --git a/src/ejabberd_system_monitor.erl b/src/ejabberd_system_monitor.erl index e5b924c1e..881bfa635 100644 --- a/src/ejabberd_system_monitor.erl +++ b/src/ejabberd_system_monitor.erl @@ -53,10 +53,7 @@ %% Description: Starts the server %%-------------------------------------------------------------------- start_link() -> - LH = ejabberd_config:get_option( - watchdog_large_heap, - fun(I) when is_integer(I), I > 0 -> I end, - 1000000), + LH = ejabberd_config:get_option(watchdog_large_heap, 1000000), Opts = [{large_heap, LH}], gen_server:start_link({local, ?MODULE}, ?MODULE, Opts, []). @@ -205,13 +202,7 @@ send_message(From, To, Body, ExtraEls) -> sub_els = ExtraEls}). get_admin_jids() -> - ejabberd_config:get_option( - watchdog_admins, - fun(JIDs) -> - [jid:tolower( - jid:decode( - iolist_to_binary(S))) || S <- JIDs] - end, []). + ejabberd_config:get_option(watchdog_admins, []). detailed_info(Pid) -> case process_info(Pid, dictionary) of diff --git a/src/ejabberd_web_admin.erl b/src/ejabberd_web_admin.erl index 5547ab783..57b679a2e 100644 --- a/src/ejabberd_web_admin.erl +++ b/src/ejabberd_web_admin.erl @@ -920,12 +920,7 @@ process_admin(Host, end; _ -> nothing end, - Rules = case ejabberd_config:get_option( - {access, Name, Host}, fun(V) -> V end) - of - undefined -> []; - Rs1 -> Rs1 - end, + Rules = ejabberd_config:get_option({access, Name, Host}, []), make_xhtml([?XC(<<"h1">>, (str:format( ?T(<<"~s access rule configuration">>), diff --git a/src/ext_mod.erl b/src/ext_mod.erl index 6ca218c2a..15fe8e17f 100644 --- a/src/ext_mod.erl +++ b/src/ext_mod.erl @@ -439,11 +439,7 @@ short_spec({Module, Attrs}) when is_atom(Module), is_list(Attrs) -> {Module, proplists:get_value(summary, Attrs, "")}. is_contrib_allowed() -> - ejabberd_config:get_option(allow_contrib_modules, - fun(false) -> false; - (no) -> false; - (_) -> true - end, true). + ejabberd_config:get_option(allow_contrib_modules, true). %% -- build functions diff --git a/src/extauth.erl b/src/extauth.erl index 6ec7e7760..c6f25102c 100644 --- a/src/extauth.erl +++ b/src/extauth.erl @@ -105,11 +105,7 @@ random_instance(MaxNum) -> randoms:uniform(MaxNum) - 1. get_instances(Server) -> - ejabberd_config:get_option( - {extauth_instances, Server}, - fun(V) when is_integer(V), V > 0 -> - V - end, 1). + ejabberd_config:get_option({extauth_instances, Server}, 1). loop(Port, Timeout, ProcessName, ExtPrg) -> receive diff --git a/src/gen_mod.erl b/src/gen_mod.erl index 4b845a386..c39b5153c 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -119,14 +119,7 @@ start_modules() -> end, ?MYHOSTS). get_modules_options(Host) -> - ejabberd_config:get_option( - {modules, Host}, - fun(Mods) -> - lists:map( - fun({M, A}) when is_atom(M), is_list(A) -> - {M, A} - end, Mods) - end, []). + ejabberd_config:get_option({modules, Host}, []). sort_modules(Host, ModOpts) -> G = digraph:new([acyclic]), @@ -211,8 +204,7 @@ start_module(Host, Module, Opts0) -> -spec reload_modules(binary()) -> ok. reload_modules(Host) -> - NewMods = ejabberd_config:get_option( - {modules, Host}, opt_type(modules), []), + NewMods = ejabberd_config:get_option({modules, Host}, []), OldMods = ets:select( ejabberd_modules, ets:fun2ms( @@ -369,7 +361,7 @@ get_opt(Opt, Opts, F) -> get_opt({Opt, Host}, Opts, F, Default) -> case lists:keysearch(Opt, 1, Opts) of false -> - ejabberd_config:get_option({Opt, Host}, F, Default); + ejabberd_config:get_option({Opt, Host}, Default); {value, {_, Val}} -> ejabberd_config:prepare_opt_val(Opt, Val, F, Default) end; diff --git a/src/mod_last.erl b/src/mod_last.erl index fd216f936..da16200ec 100644 --- a/src/mod_last.erl +++ b/src/mod_last.erl @@ -119,9 +119,7 @@ process_local_iq(#iq{type = get} = IQ) -> %% @doc Get the uptime of the ejabberd node, expressed in seconds. %% When ejabberd is starting, ejabberd_config:start/0 stores the datetime. get_node_uptime() -> - case ejabberd_config:get_option( - node_start, - fun(S) when is_integer(S), S >= 0 -> S end) of + case ejabberd_config:get_option(node_start) of undefined -> trunc(element(1, erlang:statistics(wall_clock)) / 1000); Now -> diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl index 93bf2f2f2..d2fd48a9f 100644 --- a/src/mod_mam_sql.erl +++ b/src/mod_mam_sql.erl @@ -200,9 +200,7 @@ make_sql_query(User, LServer, MAMQuery, RSM) -> With = proplists:get_value(with, MAMQuery), WithText = proplists:get_value(withtext, MAMQuery), {Max, Direction, ID} = get_max_direction_id(RSM), - ODBCType = ejabberd_config:get_option( - {sql_type, LServer}, - ejabberd_sql:opt_type(sql_type)), + ODBCType = ejabberd_config:get_option({sql_type, LServer}), Escape = case ODBCType of mssql -> fun ejabberd_sql:standard_escape/1; diff --git a/src/mod_register.erl b/src/mod_register.erl index e15165f77..63f7708b1 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -435,15 +435,7 @@ check_from(JID, Server) -> check_timeout(undefined) -> true; check_timeout(Source) -> - Timeout = ejabberd_config:get_option( - registration_timeout, - fun(TO) when is_integer(TO), TO > 0 -> - TO; - (infinity) -> - infinity; - (unlimited) -> - infinity - end, 600), + Timeout = ejabberd_config:get_option(registration_timeout, 600), if is_integer(Timeout) -> Priority = -p1_time_compat:system_time(seconds), CleanPriority = Priority + Timeout, @@ -488,15 +480,7 @@ clean_treap(Treap, CleanPriority) -> remove_timeout(undefined) -> true; remove_timeout(Source) -> - Timeout = ejabberd_config:get_option( - registration_timeout, - fun(TO) when is_integer(TO), TO > 0 -> - TO; - (infinity) -> - infinity; - (unlimited) -> - infinity - end, 600), + Timeout = ejabberd_config:get_option(registration_timeout, 600), if is_integer(Timeout) -> F = fun () -> Treap = case mnesia:read(mod_register_ip, treap, write) diff --git a/src/mod_s2s_dialback.erl b/src/mod_s2s_dialback.erl index 00730f327..ab33597a5 100644 --- a/src/mod_s2s_dialback.erl +++ b/src/mod_s2s_dialback.erl @@ -265,7 +265,7 @@ s2s_out_packet(State, _) -> %%%=================================================================== -spec make_key(binary(), binary(), binary()) -> binary(). make_key(From, To, StreamID) -> - Secret = ejabberd_config:get_option(shared_key, fun(V) -> V end), + Secret = ejabberd_config:get_option(shared_key), str:to_hexlist( crypto:hmac(sha256, str:to_hexlist(crypto:hash(sha256, Secret)), [To, " ", From, " ", StreamID])). diff --git a/src/mod_sip_proxy.erl b/src/mod_sip_proxy.erl index b3ac82539..3042099d5 100644 --- a/src/mod_sip_proxy.erl +++ b/src/mod_sip_proxy.erl @@ -267,8 +267,7 @@ cancel_pending_transactions(State) -> lists:foreach(fun esip:cancel/1, State#state.tr_ids). add_certfile(LServer, Opts) -> - case ejabberd_config:get_option({domain_certfile, LServer}, - fun iolist_to_binary/1) of + case ejabberd_config:get_option({domain_certfile, LServer}) of CertFile when is_binary(CertFile), CertFile /= <<"">> -> [{certfile, CertFile}|Opts]; _ -> @@ -329,7 +328,7 @@ make_sign(TS, Hdrs) -> LTServer = safe_nameprep(TServer), FromTag = esip:get_param(<<"tag">>, FParams), CallID = esip:get_hdr('call-id', Hdrs), - SharedKey = ejabberd_config:get_option(shared_key, fun(V) -> V end), + SharedKey = ejabberd_config:get_option(shared_key), str:sha([SharedKey, LFUser, LFServer, LTUser, LTServer, FromTag, CallID, TS]). diff --git a/src/rest.erl b/src/rest.erl index 34e72a674..a3fb0eef2 100644 --- a/src/rest.erl +++ b/src/rest.erl @@ -37,12 +37,7 @@ start(Host) -> p1_http:start(), - Pool_size = - ejabberd_config:get_option({ext_api_http_pool_size, Host}, - fun(X) when is_integer(X), X > 0-> - X - end, - 100), + Pool_size = ejabberd_config:get_option({ext_api_http_pool_size, Host}, 100), p1_http:set_pool_size(Pool_size). stop(_Host) -> @@ -167,9 +162,6 @@ base_url(Server, Path) -> <<"http", _Url/binary>> -> Tail; _ -> Base = ejabberd_config:get_option({ext_api_url, Server}, - fun(X) -> - iolist_to_binary(X) - end, <<"http://localhost/api">>), <> end. diff --git a/src/shaper.erl b/src/shaper.erl index b4db64586..ac1ecc36f 100644 --- a/src/shaper.erl +++ b/src/shaper.erl @@ -85,8 +85,7 @@ code_change(_OldVsn, State, _Extra) -> -spec load_from_config() -> ok | {error, any()}. load_from_config() -> - Shapers = ejabberd_config:get_option( - shaper, fun(V) -> V end, []), + Shapers = ejabberd_config:get_option(shaper, []), case mnesia:transaction( fun() -> lists:foreach( diff --git a/src/sql_queries.erl b/src/sql_queries.erl index 813f5d695..5d5729102 100644 --- a/src/sql_queries.erl +++ b/src/sql_queries.erl @@ -246,9 +246,7 @@ users_number(LServer) -> fun(pgsql, _) -> case ejabberd_config:get_option( - {pgsql_users_number_estimate, LServer}, - fun(V) when is_boolean(V) -> V end, - false) of + {pgsql_users_number_estimate, LServer}, false) of true -> ejabberd_sql:sql_query_t( ?SQL("select @(reltuples :: bigint)d from pg_class"