aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_c2s.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r--src/ejabberd_c2s.erl143
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())].