25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-26 16:26:24 +01:00

purge_offline and get/set affiliation bugfix

This commit is contained in:
Christophe Romain 2010-03-22 20:27:13 +01:00
parent d11a715eda
commit 2f899ba76f

View File

@ -1231,7 +1231,8 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang) ->
iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
case exmpp_xml:remove_cdata_from_list(SubEl#xmlel.children) of
[#xmlel{name = Name, attrs = Attrs, children = Els} | Rest] ->
Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, 'node', false)),
%% Fix bug when owner retrieves his affiliations
Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, 'node', "")),
case {IQType, Name} of
{set, 'create'} ->
Config = case Rest of
@ -2443,8 +2444,9 @@ get_affiliations(Host, Node, JID) ->
end
end,
case transaction(Host, Node, Action, sync_dirty) of
{result, {_, []}} ->
{error, 'item-not-found'};
%% Fix bug when user retrieves his affiliations
%{result, {_, []}} ->
% {error, 'item-not-found'};
{result, {_, Affiliations}} ->
Entities = lists:flatmap(
fun({_, none}) -> [];
@ -2478,7 +2480,7 @@ set_affiliations(Host, Node, From, EntitiesEls) ->
_:_ -> error
end,
Affiliation = string_to_affiliation(
exmpp_xml:get_attribute_from_list_as_list(Attrs, 'affiliation', false)),
exmpp_xml:get_attribute_from_list_as_list(Attrs, 'affiliation', "")),
if
(JID == error) or
(Affiliation == false) ->
@ -2733,8 +2735,9 @@ get_subscriptions(Host, Node, JID) ->
end
end,
case transaction(Host, Node, Action, sync_dirty) of
{result, {_, []}} ->
{error, 'item-not-found'};
%% Fix bug when node owner retrieve an empty subscriptions list
% {result, {_, []}} ->
% {error, 'item-not-found'};
{result, {_, Subscriptions}} ->
Entities = lists:flatmap(
fun({_, none}) -> [];
@ -3201,7 +3204,7 @@ broadcast_stanza({LUser, LServer, LResource}, Publisher, Node, NodeId, Type, Nod
ejabberd_router:route(Sender, exmpp_jid:make(U, S, R), StanzaToSend)
end, user_resources(U, S));
false ->
ejabberd_router:route(Sender, jlib:make_jid(U, S, ""), StanzaToSend)
ejabberd_router:route(Sender, exmpp_jid:make(U, S), StanzaToSend)
end
end)
end, Contacts);
@ -3862,38 +3865,31 @@ extended_headers(Jids) ->
|| Jid <- Jids].
feature_check_packet(allow, _User, Server, Pres, {From, _To, El}, in) ->
Host = host(Server),
case exmpp_jid:prep_domain_as_list(From) of
%% If the sender Server equals Host, the message comes from the Pubsub server
Host ->
allow;
Host = list_to_binary(host(Server)),
case exmpp_jid:prep_domain(From) of
%% If the sender Server equals Host, the message comes from the Pubsub server
Host -> allow;
%% Else, the message comes from PEP
_ ->
case xml:get_subtag(El, "event") of
{xmlelement, _, Attrs, _} = EventEl ->
case xml:get_attr_s("xmlns", Attrs) of
?NS_PUBSUB_EVENT ->
Feature = xml:get_path_s(EventEl, [{elem, "items"}, {attr, "node"}]),
case is_feature_supported(Pres, Feature) of
true ->
allow;
false ->
deny
end;
_ ->
allow
end;
_ ->
allow
_ ->
case exmpp_xml:get_element(El, 'event') of
#xmlel{name = 'event', ns = ?NS_PUBSUB_EVENT} = Event ->
Items = exmpp_xml:get_element(Event, ?NS_PUBSUB_EVENT, 'items'),
Feature = exmpp_xml:get_attribute_as_list(Items, "node", ""),
case is_feature_supported(Pres, Feature) of
true -> allow;
false -> deny
end;
_ ->
allow
end
end;
feature_check_packet(Acc, _User, _Server, _Pres, _Packet, _Direction) ->
Acc.
is_feature_supported({xmlelement, "presence", _, Els}, Feature) ->
is_feature_supported(#xmlel{name = 'presence', children = Els}, Feature) ->
case mod_caps:read_caps(Els) of
nothing -> false;
Caps -> lists:member(Feature ++ "+notify", mod_caps:get_features(Caps))
nothing -> false;
Caps -> lists:member(Feature ++ "+notify", mod_caps:get_features(Caps))
end.
on_user_offline(_, JID, _) ->
@ -3904,6 +3900,7 @@ on_user_offline(_, JID, _) ->
end.
purge_offline({User, Server, _} = LJID) ->
JID = exmpp_jid:make(User, Server),
Host = host(Server),
Plugins = plugins(Host),
Result = lists:foldl(
@ -3912,7 +3909,7 @@ purge_offline({User, Server, _} = LJID) ->
false ->
{{error, extended_error('feature-not-implemented', unsupported, "retrieve-affiliations")}, Acc};
true ->
{result, Affiliations} = node_action(Host, Type, get_entity_affiliations, [Host, LJID]),
{result, Affiliations} = node_action(Host, Type, get_entity_affiliations, [Host, JID]),
{Status, [Affiliations|Acc]}
end
end, {ok, []}, Plugins),