mirror of
https://github.com/processone/ejabberd.git
synced 2024-12-20 17:27:00 +01:00
* src/mod_privacy.erl: Privacy List: deny presence-out all + send
presence to: presence is sent (EJAB-255) * src/ejabberd_c2s.erl: Likewise SVN Revision: 1881
This commit is contained in:
parent
22d87353be
commit
b0cc0cdcf9
@ -1,5 +1,9 @@
|
||||
2009-02-16 Badlop <badlop@process-one.net>
|
||||
|
||||
* src/mod_privacy.erl: Privacy List: deny presence-out all + send
|
||||
presence to: presence is sent (EJAB-255)
|
||||
* src/ejabberd_c2s.erl: Likewise
|
||||
|
||||
* src/mod_muc/mod_muc_room.erl: Owner of a password protected room
|
||||
must provide the password, like other participants (EJAB-867)
|
||||
|
||||
|
@ -973,7 +973,8 @@ session_established2(El, StateData) ->
|
||||
ejabberd_hooks:run(user_send_packet,
|
||||
Server,
|
||||
[FromJID, ToJID, NewEl]),
|
||||
ejabberd_router:route(FromJID, ToJID, NewEl),
|
||||
check_privacy_route(FromJID, StateData, FromJID,
|
||||
ToJID, NewEl),
|
||||
StateData;
|
||||
_ ->
|
||||
StateData
|
||||
@ -1571,13 +1572,13 @@ presence_track(From, To, Packet, StateData) ->
|
||||
Server = StateData#state.server,
|
||||
case xml:get_attr_s("type", Attrs) of
|
||||
"unavailable" ->
|
||||
ejabberd_router:route(From, To, Packet),
|
||||
check_privacy_route(From, StateData, From, To, Packet),
|
||||
I = remove_element(LTo, StateData#state.pres_i),
|
||||
A = remove_element(LTo, StateData#state.pres_a),
|
||||
StateData#state{pres_i = I,
|
||||
pres_a = A};
|
||||
"invisible" ->
|
||||
ejabberd_router:route(From, To, Packet),
|
||||
check_privacy_route(From, StateData, From, To, Packet),
|
||||
I = ?SETS:add_element(LTo, StateData#state.pres_i),
|
||||
A = remove_element(LTo, StateData#state.pres_a),
|
||||
StateData#state{pres_i = I,
|
||||
@ -1586,52 +1587,59 @@ presence_track(From, To, Packet, StateData) ->
|
||||
ejabberd_hooks:run(roster_out_subscription,
|
||||
Server,
|
||||
[User, Server, To, subscribe]),
|
||||
ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
|
||||
check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
|
||||
To, Packet),
|
||||
StateData;
|
||||
"subscribed" ->
|
||||
ejabberd_hooks:run(roster_out_subscription,
|
||||
Server,
|
||||
[User, Server, To, subscribed]),
|
||||
ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
|
||||
check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
|
||||
To, Packet),
|
||||
StateData;
|
||||
"unsubscribe" ->
|
||||
ejabberd_hooks:run(roster_out_subscription,
|
||||
Server,
|
||||
[User, Server, To, unsubscribe]),
|
||||
ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
|
||||
check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
|
||||
To, Packet),
|
||||
StateData;
|
||||
"unsubscribed" ->
|
||||
ejabberd_hooks:run(roster_out_subscription,
|
||||
Server,
|
||||
[User, Server, To, unsubscribed]),
|
||||
ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
|
||||
check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
|
||||
To, Packet),
|
||||
StateData;
|
||||
"error" ->
|
||||
ejabberd_router:route(From, To, Packet),
|
||||
check_privacy_route(From, StateData, From, To, Packet),
|
||||
StateData;
|
||||
"probe" ->
|
||||
ejabberd_router:route(From, To, Packet),
|
||||
check_privacy_route(From, StateData, From, To, Packet),
|
||||
StateData;
|
||||
_ ->
|
||||
case ejabberd_hooks:run_fold(
|
||||
privacy_check_packet, StateData#state.server,
|
||||
allow,
|
||||
[StateData#state.user,
|
||||
StateData#state.server,
|
||||
StateData#state.privacy_list,
|
||||
{From, To, Packet},
|
||||
out]) of
|
||||
deny ->
|
||||
ok;
|
||||
allow ->
|
||||
ejabberd_router:route(From, To, Packet)
|
||||
end,
|
||||
check_privacy_route(From, StateData, From, To, Packet),
|
||||
I = remove_element(LTo, StateData#state.pres_i),
|
||||
A = ?SETS:add_element(LTo, StateData#state.pres_a),
|
||||
StateData#state{pres_i = I,
|
||||
pres_a = A}
|
||||
end.
|
||||
|
||||
check_privacy_route(From, StateData, FromRoute, To, Packet) ->
|
||||
case ejabberd_hooks:run_fold(
|
||||
privacy_check_packet, StateData#state.server,
|
||||
allow,
|
||||
[StateData#state.user,
|
||||
StateData#state.server,
|
||||
StateData#state.privacy_list,
|
||||
{From, To, Packet},
|
||||
out]) of
|
||||
deny ->
|
||||
ok;
|
||||
allow ->
|
||||
ejabberd_router:route(FromRoute, To, Packet)
|
||||
end.
|
||||
|
||||
presence_broadcast(StateData, From, JIDSet, Packet) ->
|
||||
lists:foreach(fun(JID) ->
|
||||
FJID = jlib:make_jid(JID),
|
||||
|
@ -555,9 +555,12 @@ get_user_list(_, User, Server) ->
|
||||
end.
|
||||
|
||||
|
||||
%% From is the sender, To is the destination.
|
||||
%% If Dir = out, User@Server is the sender account (From).
|
||||
%% If Dir = in, User@Server is the destination account (To).
|
||||
check_packet(_, User, Server,
|
||||
#userlist{list = List, needdb = NeedDb},
|
||||
{From, To, {xmlelement, PName, _, _}},
|
||||
{From, To, {xmlelement, PName, Attrs, _}},
|
||||
Dir) ->
|
||||
case List of
|
||||
[] ->
|
||||
@ -566,50 +569,39 @@ check_packet(_, User, Server,
|
||||
PType = case PName of
|
||||
"message" -> message;
|
||||
"iq" -> iq;
|
||||
"presence" -> presence
|
||||
"presence" ->
|
||||
case xml:get_attr_s("type", Attrs) of
|
||||
%% notification
|
||||
"" -> presence;
|
||||
"unavailable" -> presence;
|
||||
%% subscribe, subscribed, unsubscribe,
|
||||
%% unsubscribed, error, probe, or other
|
||||
_ -> other
|
||||
end
|
||||
end,
|
||||
case {PType, Dir} of
|
||||
{message, in} ->
|
||||
LJID = jlib:jid_tolower(From),
|
||||
{Subscription, Groups} =
|
||||
case NeedDb of
|
||||
true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
|
||||
false -> {[], []}
|
||||
end,
|
||||
check_packet_aux(List, message,
|
||||
LJID, Subscription, Groups);
|
||||
{iq, in} ->
|
||||
LJID = jlib:jid_tolower(From),
|
||||
{Subscription, Groups} =
|
||||
case NeedDb of
|
||||
true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
|
||||
false -> {[], []}
|
||||
end,
|
||||
check_packet_aux(List, iq,
|
||||
LJID, Subscription, Groups);
|
||||
{presence, in} ->
|
||||
LJID = jlib:jid_tolower(From),
|
||||
{Subscription, Groups} =
|
||||
case NeedDb of
|
||||
true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
|
||||
false -> {[], []}
|
||||
end,
|
||||
check_packet_aux(List, presence_in,
|
||||
LJID, Subscription, Groups);
|
||||
{presence, out} ->
|
||||
LJID = jlib:jid_tolower(To),
|
||||
{Subscription, Groups} =
|
||||
case NeedDb of
|
||||
true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
|
||||
false -> {[], []}
|
||||
end,
|
||||
check_packet_aux(List, presence_out,
|
||||
LJID, Subscription, Groups);
|
||||
_ ->
|
||||
allow
|
||||
end
|
||||
PType2 = case {PType, Dir} of
|
||||
{message, in} -> message;
|
||||
{iq, in} -> iq;
|
||||
{presence, in} -> presence_in;
|
||||
{presence, out} -> presence_out;
|
||||
{_, _} -> other
|
||||
end,
|
||||
LJID = case Dir of
|
||||
in -> jlib:jid_tolower(From);
|
||||
out -> jlib:jid_tolower(To)
|
||||
end,
|
||||
{Subscription, Groups} =
|
||||
case NeedDb of
|
||||
true -> ejabberd_hooks:run_fold(roster_get_jid_info,
|
||||
jlib:nameprep(Server),
|
||||
{none, []},
|
||||
[User, Server, LJID]);
|
||||
false -> {[], []}
|
||||
end,
|
||||
check_packet_aux(List, PType2, LJID, Subscription, Groups)
|
||||
end.
|
||||
|
||||
%% Ptype = mesage | iq | presence_in | presence_out | other
|
||||
check_packet_aux([], _PType, _JID, _Subscription, _Groups) ->
|
||||
allow;
|
||||
check_packet_aux([Item | List], PType, JID, Subscription, Groups) ->
|
||||
@ -647,7 +639,9 @@ is_ptype_match(Item, PType) ->
|
||||
presence_in ->
|
||||
Item#listitem.match_presence_in;
|
||||
presence_out ->
|
||||
Item#listitem.match_presence_out
|
||||
Item#listitem.match_presence_out;
|
||||
other ->
|
||||
false
|
||||
end
|
||||
end.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user