mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-24 16:23:40 +01:00
Make test suite working again
This commit is contained in:
parent
e564f9ae31
commit
435e5e6263
@ -122,7 +122,7 @@ register_connection(_SID,
|
|||||||
case proplists:get_value(auth_module, Info) of
|
case proplists:get_value(auth_module, Info) of
|
||||||
?MODULE ->
|
?MODULE ->
|
||||||
ejabberd_hooks:run(register_user, LServer, [LUser, LServer]);
|
ejabberd_hooks:run(register_user, LServer, [LUser, LServer]);
|
||||||
false ->
|
_ ->
|
||||||
ok
|
ok
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -368,11 +368,15 @@ bind(R, #{user := U, server := S, access := Access, lang := Lang,
|
|||||||
allow ->
|
allow ->
|
||||||
State1 = open_session(State#{resource => Resource,
|
State1 = open_session(State#{resource => Resource,
|
||||||
sid => ejabberd_sm:make_sid()}),
|
sid => ejabberd_sm:make_sid()}),
|
||||||
State2 = ejabberd_hooks:run_fold(
|
LBJID = jid:remove_resource(jid:tolower(JID)),
|
||||||
c2s_session_opened, LServer, State1, []),
|
PresF = ?SETS:add_element(LBJID, maps:get(pres_f, State1)),
|
||||||
|
PresT = ?SETS:add_element(LBJID, maps:get(pres_t, State1)),
|
||||||
|
State2 = State1#{pres_f => PresF, pres_t => PresT},
|
||||||
|
State3 = ejabberd_hooks:run_fold(
|
||||||
|
c2s_session_opened, LServer, State2, []),
|
||||||
?INFO_MSG("(~s) Opened c2s session for ~s",
|
?INFO_MSG("(~s) Opened c2s session for ~s",
|
||||||
[SockMod:pp(Socket), jid:to_string(JID)]),
|
[SockMod:pp(Socket), jid:to_string(JID)]),
|
||||||
{ok, State2};
|
{ok, State3};
|
||||||
deny ->
|
deny ->
|
||||||
ejabberd_hooks:run(forbidden_session_hook, LServer, [JID]),
|
ejabberd_hooks:run(forbidden_session_hook, LServer, [JID]),
|
||||||
?INFO_MSG("(~s) Forbidden c2s session for ~s",
|
?INFO_MSG("(~s) Forbidden c2s session for ~s",
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
-export([start/0, start_link/0]).
|
-export([start/0, start_link/0]).
|
||||||
|
|
||||||
-export([route/3, route_iq/4, route_iq/5, process_iq/3,
|
-export([route/3, route_iq/4, route_iq/5, process_iq/3,
|
||||||
process_iq_reply/3, register_iq_handler/4,
|
process_iq_reply/3, register_iq_handler/4, get_features/1,
|
||||||
register_iq_handler/5, register_iq_response_handler/4,
|
register_iq_handler/5, register_iq_response_handler/4,
|
||||||
register_iq_response_handler/5, unregister_iq_handler/2,
|
register_iq_response_handler/5, unregister_iq_handler/2,
|
||||||
unregister_iq_response_handler/2, bounce_resource_packet/3]).
|
unregister_iq_response_handler/2, bounce_resource_packet/3]).
|
||||||
@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
-include("logger.hrl").
|
-include("logger.hrl").
|
||||||
|
-include_lib("stdlib/include/ms_transform.hrl").
|
||||||
-include("xmpp.hrl").
|
-include("xmpp.hrl").
|
||||||
|
|
||||||
-record(state, {}).
|
-record(state, {}).
|
||||||
@ -193,6 +193,14 @@ bounce_resource_packet(From, To, Packet) ->
|
|||||||
ejabberd_router:route_error(To, From, Packet, Err),
|
ejabberd_router:route_error(To, From, Packet, Err),
|
||||||
stop.
|
stop.
|
||||||
|
|
||||||
|
-spec get_features(binary()) -> [binary()].
|
||||||
|
get_features(Host) ->
|
||||||
|
ets:select(
|
||||||
|
?IQTABLE,
|
||||||
|
ets:fun2ms(fun({{XMLNS, H}, _, _, _}) when H == Host ->
|
||||||
|
XMLNS
|
||||||
|
end)).
|
||||||
|
|
||||||
%%====================================================================
|
%%====================================================================
|
||||||
%% gen_server callbacks
|
%% gen_server callbacks
|
||||||
%%====================================================================
|
%%====================================================================
|
||||||
|
@ -176,6 +176,8 @@ handle_info({mnesia_table_event,
|
|||||||
{write, #route{pid = Pid}, _ActivityId}}, State) ->
|
{write, #route{pid = Pid}, _ActivityId}}, State) ->
|
||||||
erlang:monitor(process, Pid),
|
erlang:monitor(process, Pid),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
|
handle_info({mnesia_table_event, _}, State) ->
|
||||||
|
{noreply, State};
|
||||||
handle_info({'DOWN', _Ref, _Type, Pid, _Info}, State) ->
|
handle_info({'DOWN', _Ref, _Type, Pid, _Info}, State) ->
|
||||||
F = fun () ->
|
F = fun () ->
|
||||||
Es = mnesia:select(route,
|
Es = mnesia:select(route,
|
||||||
|
@ -698,6 +698,7 @@ opt_type(domain_certfile) -> fun iolist_to_binary/1;
|
|||||||
opt_type(s2s_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_ciphers) -> fun iolist_to_binary/1;
|
||||||
opt_type(s2s_dhfile) -> fun iolist_to_binary/1;
|
opt_type(s2s_dhfile) -> fun iolist_to_binary/1;
|
||||||
|
opt_type(s2s_cafile) -> fun iolist_to_binary/1;
|
||||||
opt_type(s2s_protocol_options) ->
|
opt_type(s2s_protocol_options) ->
|
||||||
fun (Options) -> str:join(Options, <<"|">>) end;
|
fun (Options) -> str:join(Options, <<"|">>) end;
|
||||||
opt_type(s2s_tls_compression) ->
|
opt_type(s2s_tls_compression) ->
|
||||||
@ -717,5 +718,5 @@ opt_type(s2s_timeout) ->
|
|||||||
end;
|
end;
|
||||||
opt_type(_) ->
|
opt_type(_) ->
|
||||||
[route_subdomains, s2s_access, s2s_certfile,
|
[route_subdomains, s2s_access, s2s_certfile,
|
||||||
s2s_ciphers, s2s_dhfile, s2s_protocol_options,
|
s2s_ciphers, s2s_dhfile, s2s_cafile, s2s_protocol_options,
|
||||||
s2s_tls_compression, s2s_use_starttls, s2s_timeout].
|
s2s_tls_compression, s2s_use_starttls, s2s_timeout].
|
||||||
|
@ -93,6 +93,7 @@ init([State, Opts]) ->
|
|||||||
lang => ?MYLANG,
|
lang => ?MYLANG,
|
||||||
server => ?MYNAME,
|
server => ?MYNAME,
|
||||||
host_opts => HostOpts,
|
host_opts => HostOpts,
|
||||||
|
stream_version => undefined,
|
||||||
check_from => CheckFrom},
|
check_from => CheckFrom},
|
||||||
ejabberd_hooks:run_fold(component_init, {ok, State1}, [Opts]).
|
ejabberd_hooks:run_fold(component_init, {ok, State1}, [Opts]).
|
||||||
|
|
||||||
@ -128,10 +129,10 @@ get_password_fun(#{remote_server := RemoteServer,
|
|||||||
{ok, Password} ->
|
{ok, Password} ->
|
||||||
{Password, undefined};
|
{Password, undefined};
|
||||||
error ->
|
error ->
|
||||||
?ERROR_MSG("(~s) Domain ~s is unconfigured for "
|
?INFO_MSG("(~s) Domain ~s is unconfigured for "
|
||||||
"external component from ~s",
|
"external component from ~s",
|
||||||
[SockMod:pp(Socket), RemoteServer,
|
[SockMod:pp(Socket), RemoteServer,
|
||||||
ejabberd_config:may_hide_data(jlib:ip_to_list(IP))]),
|
ejabberd_config:may_hide_data(jlib:ip_to_list(IP))]),
|
||||||
{false, undefined}
|
{false, undefined}
|
||||||
end
|
end
|
||||||
end.
|
end.
|
||||||
@ -155,14 +156,14 @@ handle_auth_failure(_, Mech, Reason,
|
|||||||
#{remote_server := RemoteServer,
|
#{remote_server := RemoteServer,
|
||||||
sockmod := SockMod,
|
sockmod := SockMod,
|
||||||
socket := Socket, ip := IP} = State) ->
|
socket := Socket, ip := IP} = State) ->
|
||||||
?ERROR_MSG("(~s) Failed external component ~s authentication "
|
?INFO_MSG("(~s) Failed external component ~s authentication "
|
||||||
"for ~s from ~s: ~s",
|
"for ~s from ~s: ~s",
|
||||||
[SockMod:pp(Socket), Mech, RemoteServer,
|
[SockMod:pp(Socket), Mech, RemoteServer,
|
||||||
ejabberd_config:may_hide_data(jlib:ip_to_list(IP)),
|
ejabberd_config:may_hide_data(jlib:ip_to_list(IP)),
|
||||||
Reason]),
|
Reason]),
|
||||||
State.
|
State.
|
||||||
|
|
||||||
handle_authenticated_packet(Pkt, #{lang := Lang} = State) ->
|
handle_authenticated_packet(Pkt, #{lang := Lang} = State) when ?is_stanza(Pkt) ->
|
||||||
From = xmpp:get_from(Pkt),
|
From = xmpp:get_from(Pkt),
|
||||||
case check_from(From, State) of
|
case check_from(From, State) of
|
||||||
true ->
|
true ->
|
||||||
@ -173,7 +174,9 @@ handle_authenticated_packet(Pkt, #{lang := Lang} = State) ->
|
|||||||
Txt = <<"Improper domain part of 'from' attribute">>,
|
Txt = <<"Improper domain part of 'from' attribute">>,
|
||||||
Err = xmpp:serr_invalid_from(Txt, Lang),
|
Err = xmpp:serr_invalid_from(Txt, Lang),
|
||||||
xmpp_stream_in:send(State, Err)
|
xmpp_stream_in:send(State, Err)
|
||||||
end.
|
end;
|
||||||
|
handle_authenticated_packet(_Pkt, State) ->
|
||||||
|
State.
|
||||||
|
|
||||||
handle_info({route, From, To, Packet}, #{access := Access} = State) ->
|
handle_info({route, From, To, Packet}, #{access := Access} = State) ->
|
||||||
case acl:match_rule(global, Access, From) of
|
case acl:match_rule(global, Access, From) of
|
||||||
|
@ -160,7 +160,7 @@ process_block(#iq{from = #jid{luser = LUser, lserver = LServer},
|
|||||||
broadcast_list_update(LUser, LServer, UserList, Default),
|
broadcast_list_update(LUser, LServer, UserList, Default),
|
||||||
broadcast_event(LUser, LServer,
|
broadcast_event(LUser, LServer,
|
||||||
#block{items = [jid:make(J) || J <- JIDs]}),
|
#block{items = [jid:make(J) || J <- JIDs]}),
|
||||||
xmpp:make_iq_result(IQ);
|
xmpp:make_iq_result(xmpp:put_meta(IQ, privacy_list, UserList));
|
||||||
_Err ->
|
_Err ->
|
||||||
?ERROR_MSG("Error processing ~p: ~p", [{LUser, LServer, JIDs}, _Err]),
|
?ERROR_MSG("Error processing ~p: ~p", [{LUser, LServer, JIDs}, _Err]),
|
||||||
Err = xmpp:err_internal_server_error(<<"Database failure">>, Lang),
|
Err = xmpp:err_internal_server_error(<<"Database failure">>, Lang),
|
||||||
@ -183,7 +183,7 @@ process_unblock_all(#iq{from = #jid{luser = LUser, lserver = LServer},
|
|||||||
UserList = make_userlist(Default, List),
|
UserList = make_userlist(Default, List),
|
||||||
broadcast_list_update(LUser, LServer, UserList, Default),
|
broadcast_list_update(LUser, LServer, UserList, Default),
|
||||||
broadcast_event(LUser, LServer, #unblock{}),
|
broadcast_event(LUser, LServer, #unblock{}),
|
||||||
xmpp:make_iq_result(IQ);
|
xmpp:make_iq_result(xmpp:put_meta(IQ, privacy_list, UserList));
|
||||||
_Err ->
|
_Err ->
|
||||||
?ERROR_MSG("Error processing ~p: ~p", [{LUser, LServer}, _Err]),
|
?ERROR_MSG("Error processing ~p: ~p", [{LUser, LServer}, _Err]),
|
||||||
Err = xmpp:err_internal_server_error(<<"Database failure">>, Lang),
|
Err = xmpp:err_internal_server_error(<<"Database failure">>, Lang),
|
||||||
@ -210,7 +210,7 @@ process_unblock(#iq{from = #jid{luser = LUser, lserver = LServer},
|
|||||||
broadcast_list_update(LUser, LServer, UserList, Default),
|
broadcast_list_update(LUser, LServer, UserList, Default),
|
||||||
broadcast_event(LUser, LServer,
|
broadcast_event(LUser, LServer,
|
||||||
#unblock{items = [jid:make(J) || J <- JIDs]}),
|
#unblock{items = [jid:make(J) || J <- JIDs]}),
|
||||||
xmpp:make_iq_result(IQ);
|
xmpp:make_iq_result(xmpp:put_meta(IQ, privacy_list, UserList));
|
||||||
_Err ->
|
_Err ->
|
||||||
?ERROR_MSG("Error processing ~p: ~p", [{LUser, LServer, JIDs}, _Err]),
|
?ERROR_MSG("Error processing ~p: ~p", [{LUser, LServer, JIDs}, _Err]),
|
||||||
Err = xmpp:err_internal_server_error(<<"Database failure">>, Lang),
|
Err = xmpp:err_internal_server_error(<<"Database failure">>, Lang),
|
||||||
|
@ -175,13 +175,16 @@ get_local_identity(Acc, _From, _To, _Node, _Lang) ->
|
|||||||
get_local_features({error, _Error} = Acc, _From, _To,
|
get_local_features({error, _Error} = Acc, _From, _To,
|
||||||
_Node, _Lang) ->
|
_Node, _Lang) ->
|
||||||
Acc;
|
Acc;
|
||||||
get_local_features(Acc, _From, _To, <<"">>, _Lang) ->
|
get_local_features(Acc, _From, To, <<"">>, _Lang) ->
|
||||||
Feats = case Acc of
|
Feats = case Acc of
|
||||||
{result, Features} -> Features;
|
{result, Features} -> Features;
|
||||||
empty -> []
|
empty -> []
|
||||||
end,
|
end,
|
||||||
{result, [<<"iq">>, <<"presence">>,
|
{result, lists:usort(
|
||||||
?NS_DISCO_INFO, ?NS_DISCO_ITEMS |Feats]};
|
lists:flatten(
|
||||||
|
[<<"iq">>, <<"presence">>,
|
||||||
|
?NS_DISCO_INFO, ?NS_DISCO_ITEMS, Feats,
|
||||||
|
ejabberd_local:get_features(To#jid.lserver)]))};
|
||||||
get_local_features(Acc, _From, _To, _Node, Lang) ->
|
get_local_features(Acc, _From, _To, _Node, Lang) ->
|
||||||
case Acc of
|
case Acc of
|
||||||
{result, _Features} -> Acc;
|
{result, _Features} -> Acc;
|
||||||
|
@ -135,12 +135,12 @@ shutdown_rooms(Host) ->
|
|||||||
MyHost = gen_mod:get_module_opt_host(Host, mod_muc,
|
MyHost = gen_mod:get_module_opt_host(Host, mod_muc,
|
||||||
<<"conference.@HOST@">>),
|
<<"conference.@HOST@">>),
|
||||||
Rooms = RMod:get_online_rooms(MyHost, undefined),
|
Rooms = RMod:get_online_rooms(MyHost, undefined),
|
||||||
lists:filter(
|
lists:flatmap(
|
||||||
fun({_, _, Pid}) when node(Pid) == node() ->
|
fun({_, _, Pid}) when node(Pid) == node() ->
|
||||||
Pid ! shutdown,
|
Pid ! shutdown,
|
||||||
true;
|
[Pid];
|
||||||
(_) ->
|
(_) ->
|
||||||
false
|
[]
|
||||||
end, Rooms).
|
end, Rooms).
|
||||||
|
|
||||||
%% This function is called by a room in three situations:
|
%% This function is called by a room in three situations:
|
||||||
|
@ -561,6 +561,8 @@ resend_offline_messages(User, Server) ->
|
|||||||
_ -> ok
|
_ -> ok
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
c2s_self_presence({_Pres, #{resend_offline := false}} = Acc) ->
|
||||||
|
Acc;
|
||||||
c2s_self_presence({#presence{type = available} = NewPres, State} = Acc) ->
|
c2s_self_presence({#presence{type = available} = NewPres, State} = Acc) ->
|
||||||
NewPrio = get_priority_from_presence(NewPres),
|
NewPrio = get_priority_from_presence(NewPres),
|
||||||
LastPrio = try maps:get(pres_last, State) of
|
LastPrio = try maps:get(pres_last, State) of
|
||||||
|
@ -79,7 +79,7 @@ stream_feature_register(Acc, Host) ->
|
|||||||
AF = gen_mod:get_module_opt(Host, ?MODULE, access_from,
|
AF = gen_mod:get_module_opt(Host, ?MODULE, access_from,
|
||||||
fun(A) -> A end,
|
fun(A) -> A end,
|
||||||
all),
|
all),
|
||||||
case (AF /= none) and lists:keymember(sasl_mechanisms, 1, Acc) of
|
case (AF /= none) of
|
||||||
true ->
|
true ->
|
||||||
[#feature_register{}|Acc];
|
[#feature_register{}|Acc];
|
||||||
false ->
|
false ->
|
||||||
@ -90,10 +90,11 @@ c2s_unauthenticated_packet(#{ip := IP, server := Server} = State,
|
|||||||
#iq{type = T, sub_els = [_]} = IQ)
|
#iq{type = T, sub_els = [_]} = IQ)
|
||||||
when T == set; T == get ->
|
when T == set; T == get ->
|
||||||
case xmpp:get_subtag(IQ, #register{}) of
|
case xmpp:get_subtag(IQ, #register{}) of
|
||||||
#register{} ->
|
#register{} = Register ->
|
||||||
{Address, _} = IP,
|
{Address, _} = IP,
|
||||||
IQ1 = xmpp:set_from_to(IQ, jid:make(<<>>), jid:make(Server)),
|
IQ1 = xmpp:set_els(IQ, [Register]),
|
||||||
ResIQ = process_iq(IQ1, Address),
|
IQ2 = xmpp:set_from_to(IQ1, jid:make(<<>>), jid:make(Server)),
|
||||||
|
ResIQ = process_iq(IQ2, Address),
|
||||||
ResIQ1 = xmpp:set_from_to(ResIQ, jid:make(Server), undefined),
|
ResIQ1 = xmpp:set_from_to(ResIQ, jid:make(Server), undefined),
|
||||||
{stop, ejabberd_c2s:send(State, ResIQ1)};
|
{stop, ejabberd_c2s:send(State, ResIQ1)};
|
||||||
false ->
|
false ->
|
||||||
|
@ -521,13 +521,12 @@ roster_change(#{user := U, server := S, resource := R,
|
|||||||
end.
|
end.
|
||||||
|
|
||||||
-spec c2s_session_opened(ejabberd_c2s:state()) -> ejabberd_c2s:state().
|
-spec c2s_session_opened(ejabberd_c2s:state()) -> ejabberd_c2s:state().
|
||||||
c2s_session_opened(#{jid := #jid{luser = LUser, lserver = LServer} = JID,
|
c2s_session_opened(#{jid := #jid{luser = LUser, lserver = LServer},
|
||||||
pres_f := PresF, pres_t := PresT} = State) ->
|
pres_f := PresF, pres_t := PresT} = State) ->
|
||||||
Mod = gen_mod:db_mod(LServer, ?MODULE),
|
Mod = gen_mod:db_mod(LServer, ?MODULE),
|
||||||
Items = Mod:get_only_items(LUser, LServer),
|
Items = Mod:get_only_items(LUser, LServer),
|
||||||
{F, T} = fill_subscription_lists(Items, PresF, PresT),
|
{F, T} = fill_subscription_lists(Items, PresF, PresT),
|
||||||
LJID = jid:tolower(jid:remove_resource(JID)),
|
State#{pres_f => F, pres_t => T}.
|
||||||
State#{pres_f => ?SETS:add(LJID, F), pres_t => ?SETS:add(LJID, T)}.
|
|
||||||
|
|
||||||
fill_subscription_lists([I | Is], F, T) ->
|
fill_subscription_lists([I | Is], F, T) ->
|
||||||
J = element(3, I#roster.usj),
|
J = element(3, I#roster.usj),
|
||||||
|
@ -175,11 +175,12 @@ s2s_in_packet(#{stream_id := StreamID} = State,
|
|||||||
{ok, Pid} = ejabberd_s2s_out:start(
|
{ok, Pid} = ejabberd_s2s_out:start(
|
||||||
To, From, [{db_verify, {StreamID, Key, self()}}]),
|
To, From, [{db_verify, {StreamID, Key, self()}}]),
|
||||||
ejabberd_s2s_out:connect(Pid),
|
ejabberd_s2s_out:connect(Pid),
|
||||||
State
|
{stop, State}
|
||||||
catch _:{badmatch, {error, Reason}} ->
|
catch _:{badmatch, {error, Reason}} ->
|
||||||
send_db_result(State,
|
{stop,
|
||||||
#db_verify{from = From, to = To, type = error,
|
send_db_result(State,
|
||||||
sub_els = [mk_error(Reason)]})
|
#db_verify{from = From, to = To, type = error,
|
||||||
|
sub_els = [mk_error(Reason)]})}
|
||||||
end;
|
end;
|
||||||
s2s_in_packet(State, #db_verify{to = To, from = From, key = Key,
|
s2s_in_packet(State, #db_verify{to = To, from = From, key = Key,
|
||||||
id = StreamID, type = undefined}) ->
|
id = StreamID, type = undefined}) ->
|
||||||
@ -189,7 +190,7 @@ s2s_in_packet(State, #db_verify{to = To, from = From, key = Key,
|
|||||||
_ -> invalid
|
_ -> invalid
|
||||||
end,
|
end,
|
||||||
Response = #db_verify{from = To, to = From, id = StreamID, type = Type},
|
Response = #db_verify{from = To, to = From, id = StreamID, type = Type},
|
||||||
ejabberd_s2s_in:send(State, Response);
|
{stop, ejabberd_s2s_in:send(State, Response)};
|
||||||
s2s_in_packet(State, Pkt) when is_record(Pkt, db_result);
|
s2s_in_packet(State, Pkt) when is_record(Pkt, db_result);
|
||||||
is_record(Pkt, db_verify) ->
|
is_record(Pkt, db_verify) ->
|
||||||
?WARNING_MSG("Got stray dialback packet:~n~s", [xmpp:pp(Pkt)]),
|
?WARNING_MSG("Got stray dialback packet:~n~s", [xmpp:pp(Pkt)]),
|
||||||
|
@ -292,7 +292,7 @@ set_item(User, Server, Resource, Item) ->
|
|||||||
jid:make(Server),
|
jid:make(Server),
|
||||||
ResIQ).
|
ResIQ).
|
||||||
|
|
||||||
c2s_session_opened(#{jid := #jid{luser = LUser, lserver = LServer} = JID,
|
c2s_session_opened(#{jid := #jid{luser = LUser, lserver = LServer},
|
||||||
pres_f := PresF, pres_t := PresT} = State) ->
|
pres_f := PresF, pres_t := PresT} = State) ->
|
||||||
US = {LUser, LServer},
|
US = {LUser, LServer},
|
||||||
DisplayedGroups = get_user_displayed_groups(US),
|
DisplayedGroups = get_user_displayed_groups(US),
|
||||||
@ -300,11 +300,12 @@ c2s_session_opened(#{jid := #jid{luser = LUser, lserver = LServer} = JID,
|
|||||||
get_group_users(LServer, Group)
|
get_group_users(LServer, Group)
|
||||||
end,
|
end,
|
||||||
DisplayedGroups),
|
DisplayedGroups),
|
||||||
BareLJID = jid:tolower(jid:remove_resource(JID)),
|
|
||||||
PresBoth = lists:foldl(
|
PresBoth = lists:foldl(
|
||||||
fun({U, S}, Acc) ->
|
fun({U, S, _}, Acc) ->
|
||||||
|
?SETS:add_element({U, S, <<"">>}, Acc);
|
||||||
|
({U, S}, Acc) ->
|
||||||
?SETS:add_element({U, S, <<"">>}, Acc)
|
?SETS:add_element({U, S, <<"">>}, Acc)
|
||||||
end, ?SETS:new(), [BareLJID|SRUsers]),
|
end, ?SETS:new(), SRUsers),
|
||||||
State#{pres_f => ?SETS:union(PresBoth, PresF),
|
State#{pres_f => ?SETS:union(PresBoth, PresF),
|
||||||
pres_t => ?SETS:union(PresBoth, PresT)}.
|
pres_t => ?SETS:union(PresBoth, PresT)}.
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ process_item(RosterItem, _Host) ->
|
|||||||
_ -> RosterItem#roster{subscription = both, ask = none}
|
_ -> RosterItem#roster{subscription = both, ask = none}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
c2s_session_opened(#{jid := #jid{luser = LUser, lserver = LServer} = JID,
|
c2s_session_opened(#{jid := #jid{luser = LUser, lserver = LServer},
|
||||||
pres_f := PresF, pres_t := PresT} = State) ->
|
pres_f := PresF, pres_t := PresT} = State) ->
|
||||||
US = {LUser, LServer},
|
US = {LUser, LServer},
|
||||||
DisplayedGroups = get_user_displayed_groups(US),
|
DisplayedGroups = get_user_displayed_groups(US),
|
||||||
@ -169,11 +169,12 @@ c2s_session_opened(#{jid := #jid{luser = LUser, lserver = LServer} = JID,
|
|||||||
get_group_users(LServer, Group)
|
get_group_users(LServer, Group)
|
||||||
end,
|
end,
|
||||||
DisplayedGroups),
|
DisplayedGroups),
|
||||||
BareLJID = jid:tolower(jid:remove_resource(JID)),
|
|
||||||
PresBoth = lists:foldl(
|
PresBoth = lists:foldl(
|
||||||
fun({U, S}, Acc) ->
|
fun({U, S, _}, Acc) ->
|
||||||
|
?SETS:add_element({U, S, <<"">>}, Acc);
|
||||||
|
({U, S}, Acc) ->
|
||||||
?SETS:add_element({U, S, <<"">>}, Acc)
|
?SETS:add_element({U, S, <<"">>}, Acc)
|
||||||
end, ?SETS:new(), [BareLJID|SRUsers]),
|
end, ?SETS:new(), SRUsers),
|
||||||
State#{pres_f => ?SETS:union(PresBoth, PresF),
|
State#{pres_f => ?SETS:union(PresBoth, PresF),
|
||||||
pres_t => ?SETS:union(PresBoth, PresT)}.
|
pres_t => ?SETS:union(PresBoth, PresT)}.
|
||||||
|
|
||||||
|
@ -559,8 +559,8 @@ process_element(Pkt, #{stream_state := StateName, lang := Lang} = State) ->
|
|||||||
process_unauthenticated_packet(Pkt, State);
|
process_unauthenticated_packet(Pkt, State);
|
||||||
_ when StateName == wait_for_starttls ->
|
_ when StateName == wait_for_starttls ->
|
||||||
Txt = <<"Use of STARTTLS required">>,
|
Txt = <<"Use of STARTTLS required">>,
|
||||||
Err = xmpp:err_policy_violation(Txt, Lang),
|
Err = xmpp:serr_policy_violation(Txt, Lang),
|
||||||
send_error(State, Pkt, Err);
|
send_pkt(State, Err);
|
||||||
_ when StateName == wait_for_bind ->
|
_ when StateName == wait_for_bind ->
|
||||||
process_bind(Pkt, State);
|
process_bind(Pkt, State);
|
||||||
_ when StateName == established ->
|
_ when StateName == established ->
|
||||||
|
@ -285,6 +285,8 @@ init_per_testcase(TestCase, OrigConfig) ->
|
|||||||
case Test of
|
case Test of
|
||||||
"test_connect" ++ _ ->
|
"test_connect" ++ _ ->
|
||||||
Config;
|
Config;
|
||||||
|
"test_legacy_auth_feature" ->
|
||||||
|
connect(Config);
|
||||||
"test_legacy_auth" ++ _ ->
|
"test_legacy_auth" ++ _ ->
|
||||||
init_stream(set_opt(stream_version, undefined, Config));
|
init_stream(set_opt(stream_version, undefined, Config));
|
||||||
"test_auth" ++ _ ->
|
"test_auth" ++ _ ->
|
||||||
@ -326,7 +328,8 @@ end_per_testcase(_TestCase, _Config) ->
|
|||||||
|
|
||||||
legacy_auth_tests() ->
|
legacy_auth_tests() ->
|
||||||
{legacy_auth, [parallel],
|
{legacy_auth, [parallel],
|
||||||
[test_legacy_auth,
|
[test_legacy_auth_feature,
|
||||||
|
test_legacy_auth,
|
||||||
test_legacy_auth_digest,
|
test_legacy_auth_digest,
|
||||||
test_legacy_auth_no_resource,
|
test_legacy_auth_no_resource,
|
||||||
test_legacy_auth_bad_jid,
|
test_legacy_auth_bad_jid,
|
||||||
@ -344,7 +347,8 @@ no_db_tests() ->
|
|||||||
test_connect_missing_to,
|
test_connect_missing_to,
|
||||||
test_connect,
|
test_connect,
|
||||||
unauthenticated_iq,
|
unauthenticated_iq,
|
||||||
unauthenticated_stanza,
|
unauthenticated_message,
|
||||||
|
unauthenticated_presence,
|
||||||
test_starttls,
|
test_starttls,
|
||||||
test_zlib,
|
test_zlib,
|
||||||
test_auth,
|
test_auth,
|
||||||
@ -481,7 +485,8 @@ component_tests() ->
|
|||||||
test_auth,
|
test_auth,
|
||||||
test_auth_fail]},
|
test_auth_fail]},
|
||||||
{component_tests, [sequence],
|
{component_tests, [sequence],
|
||||||
[test_missing_address,
|
[test_missing_from,
|
||||||
|
test_missing_to,
|
||||||
test_invalid_from,
|
test_invalid_from,
|
||||||
test_component_send,
|
test_component_send,
|
||||||
bad_nonza,
|
bad_nonza,
|
||||||
@ -497,11 +502,11 @@ s2s_tests() ->
|
|||||||
test_connect,
|
test_connect,
|
||||||
test_connect_s2s_starttls_required,
|
test_connect_s2s_starttls_required,
|
||||||
test_starttls,
|
test_starttls,
|
||||||
test_connect_missing_from,
|
|
||||||
test_connect_s2s_unauthenticated_iq,
|
test_connect_s2s_unauthenticated_iq,
|
||||||
test_auth_starttls]},
|
test_auth_starttls]},
|
||||||
{s2s_tests, [sequence],
|
{s2s_tests, [sequence],
|
||||||
[test_missing_address,
|
[test_missing_from,
|
||||||
|
test_missing_to,
|
||||||
test_invalid_from,
|
test_invalid_from,
|
||||||
bad_nonza,
|
bad_nonza,
|
||||||
codec_failure]}].
|
codec_failure]}].
|
||||||
@ -598,20 +603,12 @@ test_connect_missing_to(Config) ->
|
|||||||
?recv1({xmlstreamend, <<"stream:stream">>}),
|
?recv1({xmlstreamend, <<"stream:stream">>}),
|
||||||
close_socket(Config0).
|
close_socket(Config0).
|
||||||
|
|
||||||
test_connect_missing_from(Config) ->
|
|
||||||
Config1 = starttls(connect(Config)),
|
|
||||||
Config2 = set_opt(stream_from, <<"">>, Config1),
|
|
||||||
Config3 = init_stream(Config2),
|
|
||||||
?recv1(#stream_error{reason = 'policy-violation'}),
|
|
||||||
?recv1({xmlstreamend, <<"stream:stream">>}),
|
|
||||||
close_socket(Config3).
|
|
||||||
|
|
||||||
test_connect(Config) ->
|
test_connect(Config) ->
|
||||||
disconnect(connect(Config)).
|
disconnect(connect(Config)).
|
||||||
|
|
||||||
test_connect_s2s_starttls_required(Config) ->
|
test_connect_s2s_starttls_required(Config) ->
|
||||||
Config1 = connect(Config),
|
Config1 = connect(Config),
|
||||||
send(Config1, #caps{}),
|
send(Config1, #presence{}),
|
||||||
?recv1(#stream_error{reason = 'policy-violation'}),
|
?recv1(#stream_error{reason = 'policy-violation'}),
|
||||||
?recv1({xmlstreamend, <<"stream:stream">>}),
|
?recv1({xmlstreamend, <<"stream:stream">>}),
|
||||||
close_socket(Config1).
|
close_socket(Config1).
|
||||||
@ -681,18 +678,23 @@ try_unregister(Config) ->
|
|||||||
?recv1(#stream_error{reason = conflict}),
|
?recv1(#stream_error{reason = conflict}),
|
||||||
Config.
|
Config.
|
||||||
|
|
||||||
unauthenticated_stanza(Config) ->
|
unauthenticated_presence(Config) ->
|
||||||
%% Unauthenticated stanza should be silently dropped.
|
unauthenticated_packet(Config, #presence{}).
|
||||||
send(Config, #message{to = server_jid(Config)}),
|
|
||||||
disconnect(Config).
|
unauthenticated_message(Config) ->
|
||||||
|
unauthenticated_packet(Config, #message{}).
|
||||||
|
|
||||||
unauthenticated_iq(Config) ->
|
unauthenticated_iq(Config) ->
|
||||||
|
IQ = #iq{type = get, sub_els = [#disco_info{}]},
|
||||||
|
unauthenticated_packet(Config, IQ).
|
||||||
|
|
||||||
|
unauthenticated_packet(Config, Pkt) ->
|
||||||
From = my_jid(Config),
|
From = my_jid(Config),
|
||||||
To = server_jid(Config),
|
To = server_jid(Config),
|
||||||
#iq{type = error} =
|
send(Config, xmpp:set_from_to(Pkt, From, To)),
|
||||||
send_recv(Config, #iq{type = get, from = From, to = To,
|
#stream_error{reason = 'not-authorized'} = recv(Config),
|
||||||
sub_els = [#disco_info{}]}),
|
{xmlstreamend, <<"stream:stream">>} = recv(Config),
|
||||||
disconnect(Config).
|
close_socket(Config).
|
||||||
|
|
||||||
bad_nonza(Config) ->
|
bad_nonza(Config) ->
|
||||||
%% Unsupported and invalid nonza should be silently dropped.
|
%% Unsupported and invalid nonza should be silently dropped.
|
||||||
@ -706,18 +708,27 @@ invalid_from(Config) ->
|
|||||||
?recv1({xmlstreamend, <<"stream:stream">>}),
|
?recv1({xmlstreamend, <<"stream:stream">>}),
|
||||||
close_socket(Config).
|
close_socket(Config).
|
||||||
|
|
||||||
test_missing_address(Config) ->
|
test_missing_from(Config) ->
|
||||||
Server = server_jid(Config),
|
Server = server_jid(Config),
|
||||||
#iq{type = error} = send_recv(Config, #iq{type = get, from = Server}),
|
send(Config, #message{to = Server}),
|
||||||
#iq{type = error} = send_recv(Config, #iq{type = get, to = Server}),
|
?recv1(#stream_error{reason = 'improper-addressing'}),
|
||||||
disconnect(Config).
|
?recv1({xmlstreamend, <<"stream:stream">>}),
|
||||||
|
close_socket(Config).
|
||||||
|
|
||||||
|
test_missing_to(Config) ->
|
||||||
|
Server = server_jid(Config),
|
||||||
|
send(Config, #message{from = Server}),
|
||||||
|
?recv1(#stream_error{reason = 'improper-addressing'}),
|
||||||
|
?recv1({xmlstreamend, <<"stream:stream">>}),
|
||||||
|
close_socket(Config).
|
||||||
|
|
||||||
test_invalid_from(Config) ->
|
test_invalid_from(Config) ->
|
||||||
From = jid:make(randoms:get_string()),
|
From = jid:make(randoms:get_string()),
|
||||||
To = jid:make(randoms:get_string()),
|
To = jid:make(randoms:get_string()),
|
||||||
#iq{type = error} =
|
send(Config, #message{from = From, to = To}),
|
||||||
send_recv(Config, #iq{type = get, from = From, to = To}),
|
?recv1(#stream_error{reason = 'invalid-from'}),
|
||||||
disconnect(Config).
|
?recv1({xmlstreamend, <<"stream:stream">>}),
|
||||||
|
close_socket(Config).
|
||||||
|
|
||||||
test_component_send(Config) ->
|
test_component_send(Config) ->
|
||||||
To = jid:make(?COMMON_VHOST),
|
To = jid:make(?COMMON_VHOST),
|
||||||
@ -779,6 +790,10 @@ auth_plain(Config) ->
|
|||||||
{skipped, 'PLAIN_not_available'}
|
{skipped, 'PLAIN_not_available'}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
test_legacy_auth_feature(Config) ->
|
||||||
|
true = ?config(legacy_auth, Config),
|
||||||
|
disconnect(Config).
|
||||||
|
|
||||||
test_legacy_auth(Config) ->
|
test_legacy_auth(Config) ->
|
||||||
disconnect(auth_legacy(Config, _Digest = false)).
|
disconnect(auth_legacy(Config, _Digest = false)).
|
||||||
|
|
||||||
|
@ -51,6 +51,8 @@ host_config:
|
|||||||
mod_disco: []
|
mod_disco: []
|
||||||
mod_ping: []
|
mod_ping: []
|
||||||
mod_proxy65: []
|
mod_proxy65: []
|
||||||
|
mod_s2s_dialback: []
|
||||||
|
mod_legacy_auth: []
|
||||||
mod_register:
|
mod_register:
|
||||||
welcome_message:
|
welcome_message:
|
||||||
subject: "Welcome!"
|
subject: "Welcome!"
|
||||||
@ -106,6 +108,8 @@ Welcome to this XMPP server."
|
|||||||
mod_disco: []
|
mod_disco: []
|
||||||
mod_ping: []
|
mod_ping: []
|
||||||
mod_proxy65: []
|
mod_proxy65: []
|
||||||
|
mod_s2s_dialback: []
|
||||||
|
mod_legacy_auth: []
|
||||||
mod_register:
|
mod_register:
|
||||||
welcome_message:
|
welcome_message:
|
||||||
subject: "Welcome!"
|
subject: "Welcome!"
|
||||||
@ -166,6 +170,8 @@ Welcome to this XMPP server."
|
|||||||
mod_disco: []
|
mod_disco: []
|
||||||
mod_ping: []
|
mod_ping: []
|
||||||
mod_proxy65: []
|
mod_proxy65: []
|
||||||
|
mod_s2s_dialback: []
|
||||||
|
mod_legacy_auth: []
|
||||||
mod_register:
|
mod_register:
|
||||||
welcome_message:
|
welcome_message:
|
||||||
subject: "Welcome!"
|
subject: "Welcome!"
|
||||||
@ -222,6 +228,8 @@ Welcome to this XMPP server."
|
|||||||
mod_disco: []
|
mod_disco: []
|
||||||
mod_ping: []
|
mod_ping: []
|
||||||
mod_proxy65: []
|
mod_proxy65: []
|
||||||
|
mod_s2s_dialback: []
|
||||||
|
mod_legacy_auth: []
|
||||||
mod_register:
|
mod_register:
|
||||||
welcome_message:
|
welcome_message:
|
||||||
subject: "Welcome!"
|
subject: "Welcome!"
|
||||||
@ -279,6 +287,8 @@ Welcome to this XMPP server."
|
|||||||
mod_disco: []
|
mod_disco: []
|
||||||
mod_ping: []
|
mod_ping: []
|
||||||
mod_proxy65: []
|
mod_proxy65: []
|
||||||
|
mod_s2s_dialback: []
|
||||||
|
mod_legacy_auth: []
|
||||||
mod_register:
|
mod_register:
|
||||||
welcome_message:
|
welcome_message:
|
||||||
subject: "Welcome!"
|
subject: "Welcome!"
|
||||||
@ -319,6 +329,8 @@ Welcome to this XMPP server."
|
|||||||
mod_disco: []
|
mod_disco: []
|
||||||
mod_ping: []
|
mod_ping: []
|
||||||
mod_proxy65: []
|
mod_proxy65: []
|
||||||
|
mod_s2s_dialback: []
|
||||||
|
mod_legacy_auth: []
|
||||||
mod_register:
|
mod_register:
|
||||||
welcome_message:
|
welcome_message:
|
||||||
subject: "Welcome!"
|
subject: "Welcome!"
|
||||||
@ -450,6 +462,9 @@ modules:
|
|||||||
body: "Hi.
|
body: "Hi.
|
||||||
Welcome to this XMPP server."
|
Welcome to this XMPP server."
|
||||||
mod_stats: []
|
mod_stats: []
|
||||||
|
mod_s2s_dialback: []
|
||||||
|
mod_legacy_auth: []
|
||||||
|
mod_sm: []
|
||||||
mod_time: []
|
mod_time: []
|
||||||
mod_version: []
|
mod_version: []
|
||||||
registration_timeout: infinity
|
registration_timeout: infinity
|
||||||
|
@ -235,6 +235,8 @@ process_stream_features(Config) ->
|
|||||||
set_opt(register, true, Acc);
|
set_opt(register, true, Acc);
|
||||||
(#starttls{}, Acc) ->
|
(#starttls{}, Acc) ->
|
||||||
set_opt(starttls, true, Acc);
|
set_opt(starttls, true, Acc);
|
||||||
|
(#legacy_auth_feature{}, Acc) ->
|
||||||
|
set_opt(legacy_auth, true, Acc);
|
||||||
(#compression{methods = Ms}, Acc) ->
|
(#compression{methods = Ms}, Acc) ->
|
||||||
set_opt(compression, Ms, Acc);
|
set_opt(compression, Ms, Acc);
|
||||||
(_, Acc) ->
|
(_, Acc) ->
|
||||||
@ -246,7 +248,7 @@ disconnect(Config) ->
|
|||||||
ct:comment("Disconnecting"),
|
ct:comment("Disconnecting"),
|
||||||
Socket = ?config(socket, Config),
|
Socket = ?config(socket, Config),
|
||||||
try
|
try
|
||||||
ok = send_text(Config, ?STREAM_TRAILER)
|
send_text(Config, ?STREAM_TRAILER)
|
||||||
catch exit:normal ->
|
catch exit:normal ->
|
||||||
ok
|
ok
|
||||||
end,
|
end,
|
||||||
@ -274,17 +276,17 @@ starttls(Config, ShouldFail) ->
|
|||||||
#starttls_failure{} ->
|
#starttls_failure{} ->
|
||||||
ct:fail(starttls_failed);
|
ct:fail(starttls_failed);
|
||||||
#starttls_proceed{} ->
|
#starttls_proceed{} ->
|
||||||
TLSSocket = ejabberd_socket:starttls(
|
{ok, TLSSocket} = ejabberd_socket:starttls(
|
||||||
?config(socket, Config),
|
?config(socket, Config),
|
||||||
[{certfile, ?config(certfile, Config)},
|
[{certfile, ?config(certfile, Config)},
|
||||||
connect]),
|
connect]),
|
||||||
set_opt(socket, TLSSocket, Config)
|
set_opt(socket, TLSSocket, Config)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
zlib(Config) ->
|
zlib(Config) ->
|
||||||
send(Config, #compress{methods = [<<"zlib">>]}),
|
send(Config, #compress{methods = [<<"zlib">>]}),
|
||||||
receive #compressed{} -> ok end,
|
receive #compressed{} -> ok end,
|
||||||
ZlibSocket = ejabberd_socket:compress(?config(socket, Config)),
|
{ok, ZlibSocket} = ejabberd_socket:compress(?config(socket, Config)),
|
||||||
process_stream_features(init_stream(set_opt(socket, ZlibSocket, Config))).
|
process_stream_features(init_stream(set_opt(socket, ZlibSocket, Config))).
|
||||||
|
|
||||||
auth(Config) ->
|
auth(Config) ->
|
||||||
|
Loading…
Reference in New Issue
Block a user