diff options
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r-- | src/ejabberd_c2s.erl | 143 |
1 files changed, 68 insertions, 75 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 76166db9e..ba5b04af8 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -22,14 +22,14 @@ -module(ejabberd_c2s). -behaviour(xmpp_stream_in). -behaviour(ejabberd_config). --behaviour(xmpp_socket). +-behaviour(ejabberd_listener). -protocol({rfc, 6121}). -%% xmpp_socket callbacks --export([start/2, start_link/2, socket_type/0]). +%% ejabberd_listener callbacks +-export([start/2, start_link/2, accept/1, listen_opt_type/1, listen_options/0]). %% ejabberd_config callbacks --export([opt_type/1, listen_opt_type/1, transform_listen_option/2]). +-export([opt_type/1, transform_listen_option/2]). %% xmpp_stream_in callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). @@ -49,7 +49,7 @@ -export([get_presence/1, set_presence/2, resend_presence/1, resend_presence/2, open_session/1, call/3, cast/2, send/2, close/1, close/2, stop/1, reply/2, copy_state/2, set_timeout/2, route/2, - host_up/1, host_down/1]). + host_up/1, host_down/1, send_ws_ping/1]). -include("xmpp.hrl"). -include("logger.hrl"). @@ -61,26 +61,18 @@ -export_type([state/0]). %%%=================================================================== -%%% xmpp_socket API +%%% ejabberd_listener API %%%=================================================================== start(SockData, Opts) -> - case proplists:get_value(supervisor, Opts, true) of - true -> - case supervisor:start_child(ejabberd_c2s_sup, [SockData, Opts]) of - {ok, undefined} -> ignore; - Res -> Res - end; - _ -> - xmpp_stream_in:start(?MODULE, [SockData, Opts], - ejabberd_config:fsm_limit_opts(Opts)) - end. + xmpp_stream_in:start(?MODULE, [SockData, Opts], + ejabberd_config:fsm_limit_opts(Opts)). start_link(SockData, Opts) -> xmpp_stream_in:start_link(?MODULE, [SockData, Opts], ejabberd_config:fsm_limit_opts(Opts)). -socket_type() -> - xml_stream. +accept(Ref) -> + xmpp_stream_in:accept(Ref). %%%=================================================================== %%% Common API @@ -145,6 +137,11 @@ send_error(#{lserver := LServer} = State, Pkt, Err) -> {Pkt1, State1} -> xmpp_stream_in:send_error(State1, Pkt1, Err) end. +-spec send_ws_ping(pid()) -> ok; + (state()) -> state(). +send_ws_ping(Ref) -> + xmpp_stream_in:send_ws_ping(Ref). + -spec route(pid(), term()) -> boolean(). route(Pid, Term) -> ejabberd_cluster:send(Pid, Term). @@ -416,8 +413,8 @@ bind(R, #{user := U, server := S, access := Access, lang := Lang, {ok, State2}; deny -> ejabberd_hooks:run(forbidden_session_hook, LServer, [JID]), - ?INFO_MSG("(~s) Forbidden c2s session for ~s", - [xmpp_socket:pp(Socket), jid:encode(JID)]), + ?WARNING_MSG("(~s) Forbidden c2s session for ~s", + [xmpp_socket:pp(Socket), jid:encode(JID)]), Txt = <<"Access denied by service policy">>, {error, xmpp:err_not_allowed(Txt, Lang), State} end @@ -452,12 +449,12 @@ handle_auth_success(User, Mech, AuthModule, handle_auth_failure(User, Mech, Reason, #{socket := Socket, ip := IP, lserver := LServer} = State) -> - ?INFO_MSG("(~s) Failed c2s ~s authentication ~sfrom ~s: ~s", - [xmpp_socket:pp(Socket), Mech, - if User /= <<"">> -> ["for ", User, "@", LServer, " "]; - true -> "" - end, - ejabberd_config:may_hide_data(misc:ip_to_list(IP)), Reason]), + ?WARNING_MSG("(~s) Failed c2s ~s authentication ~sfrom ~s: ~s", + [xmpp_socket:pp(Socket), Mech, + if User /= <<"">> -> ["for ", User, "@", LServer, " "]; + true -> "" + end, + ejabberd_config:may_hide_data(misc:ip_to_list(IP)), Reason]), ejabberd_hooks:run_fold(c2s_auth_result, LServer, State, [false, User]). handle_unbinded_packet(Pkt, #{lserver := LServer} = State) -> @@ -641,7 +638,7 @@ route_probe_reply(From, #{jid := To, Subscription = get_subscription(To, From), if IsAnotherResource orelse Subscription == both orelse Subscription == from -> - Packet = xmpp_util:add_delay_info(LastPres, To, TS), + Packet = misc:add_delay_info(LastPres, To, TS), case privacy_check_packet(State, Packet, out) of deny -> ok; @@ -711,13 +708,11 @@ process_presence_out(#{lserver := LServer, jid := JID, end. -spec process_self_presence(state(), presence()) -> state(). -process_self_presence(#{ip := IP, conn := Conn, lserver := LServer, - auth_module := AuthMod, sid := SID, +process_self_presence(#{lserver := LServer, sid := SID, user := U, server := S, resource := R} = State, #presence{type = unavailable} = Pres) -> Status = xmpp:get_text(Pres#presence.status), - Info = [{ip, IP}, {conn, Conn}, {auth_module, AuthMod}], - ejabberd_sm:unset_presence(SID, U, S, R, Status, Info), + ejabberd_sm:unset_presence(SID, U, S, R, Status), {Pres1, State1} = ejabberd_hooks:run_fold( c2s_self_presence, LServer, {Pres, State}, []), State2 = broadcast_presence_unavailable(State1, Pres1), @@ -735,13 +730,11 @@ process_self_presence(#{lserver := LServer} = State, process_self_presence(State, _Pres) -> State. --spec update_priority(state(), presence()) -> ok. -update_priority(#{ip := IP, conn := Conn, auth_module := AuthMod, - sid := SID, user := U, server := S, resource := R}, +-spec update_priority(state(), presence()) -> ok | {error, notfound}. +update_priority(#{sid := SID, user := U, server := S, resource := R}, Pres) -> Priority = get_priority_from_presence(Pres), - Info = [{ip, IP}, {conn, Conn}, {auth_module, AuthMod}], - ejabberd_sm:set_presence(SID, U, S, R, Priority, Pres, Info). + ejabberd_sm:set_presence(SID, U, S, R, Priority, Pres). -spec broadcast_presence_unavailable(state(), presence()) -> state(). broadcast_presence_unavailable(#{jid := JID, pres_a := PresA} = State, Pres) -> @@ -986,54 +979,54 @@ opt_type(_) -> c2s_protocol_options, c2s_tls_compression, resource_conflict, disable_sasl_mechanisms]. --spec listen_opt_type(atom()) -> fun((any()) -> any()) | [atom()]. -listen_opt_type(access) -> fun acl:access_rules_validator/1; -listen_opt_type(shaper) -> fun acl:shaper_rules_validator/1; listen_opt_type(certfile = Opt) -> fun(S) -> ?WARNING_MSG("Listening option '~s' for ~s is deprecated, use " "'certfiles' global option instead", [Opt, ?MODULE]), - ejabberd_pkix:add_certfile(S), - iolist_to_binary(S) + {ok, File} = ejabberd_pkix:add_certfile(S), + File end; -listen_opt_type(ciphers) -> opt_type(c2s_ciphers); -listen_opt_type(dhfile) -> opt_type(c2s_dhfile); -listen_opt_type(cafile) -> opt_type(c2s_cafile); -listen_opt_type(protocol_options) -> opt_type(c2s_protocol_options); -listen_opt_type(tls_compression) -> opt_type(c2s_tls_compression); -listen_opt_type(tls) -> fun(B) when is_boolean(B) -> B end; listen_opt_type(starttls) -> fun(B) when is_boolean(B) -> B end; listen_opt_type(starttls_required) -> fun(B) when is_boolean(B) -> B end; listen_opt_type(tls_verify) -> fun(B) when is_boolean(B) -> B end; -listen_opt_type(zlib) -> fun(B) when is_boolean(B) -> B end; -listen_opt_type(supervisor) -> fun(B) when is_boolean(B) -> B end; -listen_opt_type(max_stanza_size) -> - fun(I) when is_integer(I), I>0 -> I; - (unlimited) -> infinity; - (infinity) -> infinity +listen_opt_type(zlib) -> + fun(true) -> + ejabberd:start_app(ezlib), + true; + (false) -> + false end; -listen_opt_type(max_fsm_queue) -> - fun(I) when is_integer(I), I>0 -> I end; listen_opt_type(stream_management) -> - ?ERROR_MSG("listening option 'stream_management' is ignored: " - "use mod_stream_mgmt module", []), - fun(B) when is_boolean(B) -> B end; -listen_opt_type(inet) -> fun(B) when is_boolean(B) -> B end; -listen_opt_type(inet6) -> fun(B) when is_boolean(B) -> B end; -listen_opt_type(backlog) -> - fun(I) when is_integer(I), I>0 -> I end; -listen_opt_type(accept_interval) -> - fun(I) when is_integer(I), I>=0 -> I end; + fun(B) when is_boolean(B) -> + ?ERROR_MSG("Listening option 'stream_management' is ignored: " + "use mod_stream_mgmt module", []), + B + end; listen_opt_type(O) -> - StreamOpts = mod_stream_mgmt:mod_options(ejabberd_config:get_myname()), - case lists:keyfind(O, 1, StreamOpts) of - false -> - [access, shaper, certfile, ciphers, dhfile, cafile, - protocol_options, tls, tls_compression, starttls, - starttls_required, tls_verify, zlib, max_fsm_queue, - backlog, inet, inet6, accept_interval]; - _ -> - ?ERROR_MSG("Listening option '~s' is ignored: use '~s' " - "option from mod_stream_mgmt module", [O, O]), - mod_stream_mgmt:mod_opt_type(O) + MgmtOpts = mod_stream_mgmt:mod_options(ejabberd_config:get_myname()), + case lists:keymember(O, 1, MgmtOpts) of + true -> + fun(V) -> + ?ERROR_MSG("Listening option '~s' is ignored: use '~s' " + "option from mod_stream_mgmt module", [O, O]), + (mod_stream_mgmt:mod_opt_type(O))(V) + end end. + +listen_options() -> + [{access, all}, + {shaper, none}, + {certfile, undefined}, + {ciphers, undefined}, + {dhfile, undefined}, + {cafile, undefined}, + {protocol_options, undefined}, + {tls, false}, + {tls_compression, false}, + {starttls, false}, + {starttls_required, false}, + {tls_verify, false}, + {zlib, false}, + {max_stanza_size, infinity}, + {max_fsm_queue, 5000}| + mod_stream_mgmt:mod_options(ejabberd_config:get_myname())]. |