diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-01-23 13:51:05 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-01-23 13:51:05 +0300 |
commit | 435e5e62634b542c2a42673bea7f81e9cc2a5c04 (patch) | |
tree | b927d972c426ca5ea4ce20343e4eb981848934e8 /src | |
parent | Make a message is not bounced if it's archived (diff) |
Make test suite working again
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_auth_anonymous.erl | 2 | ||||
-rw-r--r-- | src/ejabberd_c2s.erl | 10 | ||||
-rw-r--r-- | src/ejabberd_local.erl | 12 | ||||
-rw-r--r-- | src/ejabberd_router_mnesia.erl | 2 | ||||
-rw-r--r-- | src/ejabberd_s2s.erl | 3 | ||||
-rw-r--r-- | src/ejabberd_service.erl | 25 | ||||
-rw-r--r-- | src/mod_blocking.erl | 6 | ||||
-rw-r--r-- | src/mod_disco.erl | 9 | ||||
-rw-r--r-- | src/mod_muc.erl | 6 | ||||
-rw-r--r-- | src/mod_offline.erl | 2 | ||||
-rw-r--r-- | src/mod_register.erl | 9 | ||||
-rw-r--r-- | src/mod_roster.erl | 5 | ||||
-rw-r--r-- | src/mod_s2s_dialback.erl | 11 | ||||
-rw-r--r-- | src/mod_shared_roster.erl | 9 | ||||
-rw-r--r-- | src/mod_shared_roster_ldap.erl | 9 | ||||
-rw-r--r-- | src/xmpp_stream_in.erl | 4 |
16 files changed, 75 insertions, 49 deletions
diff --git a/src/ejabberd_auth_anonymous.erl b/src/ejabberd_auth_anonymous.erl index 59d4c99e7..51eab74b7 100644 --- a/src/ejabberd_auth_anonymous.erl +++ b/src/ejabberd_auth_anonymous.erl @@ -122,7 +122,7 @@ register_connection(_SID, case proplists:get_value(auth_module, Info) of ?MODULE -> ejabberd_hooks:run(register_user, LServer, [LUser, LServer]); - false -> + _ -> ok end. diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 6350e41fa..fd2655632 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -368,11 +368,15 @@ bind(R, #{user := U, server := S, access := Access, lang := Lang, allow -> State1 = open_session(State#{resource => Resource, sid => ejabberd_sm:make_sid()}), - State2 = ejabberd_hooks:run_fold( - c2s_session_opened, LServer, State1, []), + LBJID = jid:remove_resource(jid:tolower(JID)), + 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", [SockMod:pp(Socket), jid:to_string(JID)]), - {ok, State2}; + {ok, State3}; deny -> ejabberd_hooks:run(forbidden_session_hook, LServer, [JID]), ?INFO_MSG("(~s) Forbidden c2s session for ~s", diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl index b5e1d8abc..f1317f187 100644 --- a/src/ejabberd_local.erl +++ b/src/ejabberd_local.erl @@ -33,7 +33,7 @@ -export([start/0, start_link/0]). -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_response_handler/5, unregister_iq_handler/2, unregister_iq_response_handler/2, bounce_resource_packet/3]). @@ -44,7 +44,7 @@ -include("ejabberd.hrl"). -include("logger.hrl"). - +-include_lib("stdlib/include/ms_transform.hrl"). -include("xmpp.hrl"). -record(state, {}). @@ -193,6 +193,14 @@ bounce_resource_packet(From, To, Packet) -> ejabberd_router:route_error(To, From, Packet, Err), 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 %%==================================================================== diff --git a/src/ejabberd_router_mnesia.erl b/src/ejabberd_router_mnesia.erl index b3eb222ae..e147fffdf 100644 --- a/src/ejabberd_router_mnesia.erl +++ b/src/ejabberd_router_mnesia.erl @@ -176,6 +176,8 @@ handle_info({mnesia_table_event, {write, #route{pid = Pid}, _ActivityId}}, State) -> erlang:monitor(process, Pid), {noreply, State}; +handle_info({mnesia_table_event, _}, State) -> + {noreply, State}; handle_info({'DOWN', _Ref, _Type, Pid, _Info}, State) -> F = fun () -> Es = mnesia:select(route, diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 86cf1a1f5..946ac60c8 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -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_ciphers) -> 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) -> fun (Options) -> str:join(Options, <<"|">>) end; opt_type(s2s_tls_compression) -> @@ -717,5 +718,5 @@ opt_type(s2s_timeout) -> end; opt_type(_) -> [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]. diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl index dd949f2f9..d4360b34c 100644 --- a/src/ejabberd_service.erl +++ b/src/ejabberd_service.erl @@ -93,6 +93,7 @@ init([State, Opts]) -> lang => ?MYLANG, server => ?MYNAME, host_opts => HostOpts, + stream_version => undefined, check_from => CheckFrom}, ejabberd_hooks:run_fold(component_init, {ok, State1}, [Opts]). @@ -128,10 +129,10 @@ get_password_fun(#{remote_server := RemoteServer, {ok, Password} -> {Password, undefined}; error -> - ?ERROR_MSG("(~s) Domain ~s is unconfigured for " - "external component from ~s", - [SockMod:pp(Socket), RemoteServer, - ejabberd_config:may_hide_data(jlib:ip_to_list(IP))]), + ?INFO_MSG("(~s) Domain ~s is unconfigured for " + "external component from ~s", + [SockMod:pp(Socket), RemoteServer, + ejabberd_config:may_hide_data(jlib:ip_to_list(IP))]), {false, undefined} end end. @@ -155,14 +156,14 @@ handle_auth_failure(_, Mech, Reason, #{remote_server := RemoteServer, sockmod := SockMod, socket := Socket, ip := IP} = State) -> - ?ERROR_MSG("(~s) Failed external component ~s authentication " - "for ~s from ~s: ~s", - [SockMod:pp(Socket), Mech, RemoteServer, - ejabberd_config:may_hide_data(jlib:ip_to_list(IP)), - Reason]), + ?INFO_MSG("(~s) Failed external component ~s authentication " + "for ~s from ~s: ~s", + [SockMod:pp(Socket), Mech, RemoteServer, + ejabberd_config:may_hide_data(jlib:ip_to_list(IP)), + Reason]), State. -handle_authenticated_packet(Pkt, #{lang := Lang} = State) -> +handle_authenticated_packet(Pkt, #{lang := Lang} = State) when ?is_stanza(Pkt) -> From = xmpp:get_from(Pkt), case check_from(From, State) of true -> @@ -173,7 +174,9 @@ handle_authenticated_packet(Pkt, #{lang := Lang} = State) -> Txt = <<"Improper domain part of 'from' attribute">>, Err = xmpp:serr_invalid_from(Txt, Lang), xmpp_stream_in:send(State, Err) - end. + end; +handle_authenticated_packet(_Pkt, State) -> + State. handle_info({route, From, To, Packet}, #{access := Access} = State) -> case acl:match_rule(global, Access, From) of diff --git a/src/mod_blocking.erl b/src/mod_blocking.erl index 3f9e90256..94db96131 100644 --- a/src/mod_blocking.erl +++ b/src/mod_blocking.erl @@ -160,7 +160,7 @@ process_block(#iq{from = #jid{luser = LUser, lserver = LServer}, broadcast_list_update(LUser, LServer, UserList, Default), broadcast_event(LUser, LServer, #block{items = [jid:make(J) || J <- JIDs]}), - xmpp:make_iq_result(IQ); + xmpp:make_iq_result(xmpp:put_meta(IQ, privacy_list, UserList)); _Err -> ?ERROR_MSG("Error processing ~p: ~p", [{LUser, LServer, JIDs}, _Err]), 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), broadcast_list_update(LUser, LServer, UserList, Default), broadcast_event(LUser, LServer, #unblock{}), - xmpp:make_iq_result(IQ); + xmpp:make_iq_result(xmpp:put_meta(IQ, privacy_list, UserList)); _Err -> ?ERROR_MSG("Error processing ~p: ~p", [{LUser, LServer}, _Err]), 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_event(LUser, LServer, #unblock{items = [jid:make(J) || J <- JIDs]}), - xmpp:make_iq_result(IQ); + xmpp:make_iq_result(xmpp:put_meta(IQ, privacy_list, UserList)); _Err -> ?ERROR_MSG("Error processing ~p: ~p", [{LUser, LServer, JIDs}, _Err]), Err = xmpp:err_internal_server_error(<<"Database failure">>, Lang), diff --git a/src/mod_disco.erl b/src/mod_disco.erl index 73f691dc6..2de8679ee 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -175,13 +175,16 @@ get_local_identity(Acc, _From, _To, _Node, _Lang) -> get_local_features({error, _Error} = Acc, _From, _To, _Node, _Lang) -> Acc; -get_local_features(Acc, _From, _To, <<"">>, _Lang) -> +get_local_features(Acc, _From, To, <<"">>, _Lang) -> Feats = case Acc of {result, Features} -> Features; empty -> [] end, - {result, [<<"iq">>, <<"presence">>, - ?NS_DISCO_INFO, ?NS_DISCO_ITEMS |Feats]}; + {result, lists:usort( + 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) -> case Acc of {result, _Features} -> Acc; diff --git a/src/mod_muc.erl b/src/mod_muc.erl index a91fcc810..1fe68ebd8 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -135,12 +135,12 @@ shutdown_rooms(Host) -> MyHost = gen_mod:get_module_opt_host(Host, mod_muc, <<"conference.@HOST@">>), Rooms = RMod:get_online_rooms(MyHost, undefined), - lists:filter( + lists:flatmap( fun({_, _, Pid}) when node(Pid) == node() -> Pid ! shutdown, - true; + [Pid]; (_) -> - false + [] end, Rooms). %% This function is called by a room in three situations: diff --git a/src/mod_offline.erl b/src/mod_offline.erl index 12c828743..43f13a629 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -561,6 +561,8 @@ resend_offline_messages(User, Server) -> _ -> ok end. +c2s_self_presence({_Pres, #{resend_offline := false}} = Acc) -> + Acc; c2s_self_presence({#presence{type = available} = NewPres, State} = Acc) -> NewPrio = get_priority_from_presence(NewPres), LastPrio = try maps:get(pres_last, State) of diff --git a/src/mod_register.erl b/src/mod_register.erl index 7bb60753b..875640e9f 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -79,7 +79,7 @@ stream_feature_register(Acc, Host) -> AF = gen_mod:get_module_opt(Host, ?MODULE, access_from, fun(A) -> A end, all), - case (AF /= none) and lists:keymember(sasl_mechanisms, 1, Acc) of + case (AF /= none) of true -> [#feature_register{}|Acc]; false -> @@ -90,10 +90,11 @@ c2s_unauthenticated_packet(#{ip := IP, server := Server} = State, #iq{type = T, sub_els = [_]} = IQ) when T == set; T == get -> case xmpp:get_subtag(IQ, #register{}) of - #register{} -> + #register{} = Register -> {Address, _} = IP, - IQ1 = xmpp:set_from_to(IQ, jid:make(<<>>), jid:make(Server)), - ResIQ = process_iq(IQ1, Address), + IQ1 = xmpp:set_els(IQ, [Register]), + 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), {stop, ejabberd_c2s:send(State, ResIQ1)}; false -> diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 44649631a..7798850db 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -521,13 +521,12 @@ roster_change(#{user := U, server := S, resource := R, end. -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) -> Mod = gen_mod:db_mod(LServer, ?MODULE), Items = Mod:get_only_items(LUser, LServer), {F, T} = fill_subscription_lists(Items, PresF, PresT), - LJID = jid:tolower(jid:remove_resource(JID)), - State#{pres_f => ?SETS:add(LJID, F), pres_t => ?SETS:add(LJID, T)}. + State#{pres_f => F, pres_t => T}. fill_subscription_lists([I | Is], F, T) -> J = element(3, I#roster.usj), diff --git a/src/mod_s2s_dialback.erl b/src/mod_s2s_dialback.erl index d2dd8c31e..7c7a0e8d5 100644 --- a/src/mod_s2s_dialback.erl +++ b/src/mod_s2s_dialback.erl @@ -175,11 +175,12 @@ s2s_in_packet(#{stream_id := StreamID} = State, {ok, Pid} = ejabberd_s2s_out:start( To, From, [{db_verify, {StreamID, Key, self()}}]), ejabberd_s2s_out:connect(Pid), - State + {stop, State} catch _:{badmatch, {error, Reason}} -> - send_db_result(State, - #db_verify{from = From, to = To, type = error, - sub_els = [mk_error(Reason)]}) + {stop, + send_db_result(State, + #db_verify{from = From, to = To, type = error, + sub_els = [mk_error(Reason)]})} end; s2s_in_packet(State, #db_verify{to = To, from = From, key = Key, id = StreamID, type = undefined}) -> @@ -189,7 +190,7 @@ s2s_in_packet(State, #db_verify{to = To, from = From, key = Key, _ -> invalid end, 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); is_record(Pkt, db_verify) -> ?WARNING_MSG("Got stray dialback packet:~n~s", [xmpp:pp(Pkt)]), diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 077f9bfab..8d8d1b8b6 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -292,7 +292,7 @@ set_item(User, Server, Resource, Item) -> jid:make(Server), 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) -> US = {LUser, LServer}, 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) end, DisplayedGroups), - BareLJID = jid:tolower(jid:remove_resource(JID)), 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) - end, ?SETS:new(), [BareLJID|SRUsers]), + end, ?SETS:new(), SRUsers), State#{pres_f => ?SETS:union(PresBoth, PresF), pres_t => ?SETS:union(PresBoth, PresT)}. diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index e79bcc5c0..49a61a374 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -161,7 +161,7 @@ process_item(RosterItem, _Host) -> _ -> RosterItem#roster{subscription = both, ask = none} 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) -> US = {LUser, LServer}, 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) end, DisplayedGroups), - BareLJID = jid:tolower(jid:remove_resource(JID)), 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) - end, ?SETS:new(), [BareLJID|SRUsers]), + end, ?SETS:new(), SRUsers), State#{pres_f => ?SETS:union(PresBoth, PresF), pres_t => ?SETS:union(PresBoth, PresT)}. diff --git a/src/xmpp_stream_in.erl b/src/xmpp_stream_in.erl index cb3dbcb66..b30439723 100644 --- a/src/xmpp_stream_in.erl +++ b/src/xmpp_stream_in.erl @@ -559,8 +559,8 @@ process_element(Pkt, #{stream_state := StateName, lang := Lang} = State) -> process_unauthenticated_packet(Pkt, State); _ when StateName == wait_for_starttls -> Txt = <<"Use of STARTTLS required">>, - Err = xmpp:err_policy_violation(Txt, Lang), - send_error(State, Pkt, Err); + Err = xmpp:serr_policy_violation(Txt, Lang), + send_pkt(State, Err); _ when StateName == wait_for_bind -> process_bind(Pkt, State); _ when StateName == established -> |