summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mod_pubsub/mod_pubsub.erl41
-rw-r--r--src/mod_pubsub/node_default.erl33
2 files changed, 52 insertions, 22 deletions
diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl
index cdfa9b5e..bec830f8 100644
--- a/src/mod_pubsub/mod_pubsub.erl
+++ b/src/mod_pubsub/mod_pubsub.erl
@@ -1899,19 +1899,34 @@ set_affiliations(Host, Node, From, EntitiesEls) ->
error ->
{error, ?ERR_BAD_REQUEST};
_ ->
- Action = fun(#pubsub_node{type = Type, owners = Owners}) ->
- case lists:member(Owner, Owners) of
- true ->
- lists:foreach(
- fun({JID, Affiliation}) ->
- node_call(
- Type, set_affiliation,
- [Host, Node, JID, Affiliation])
- end, Entities),
- {result, []};
- _ ->
- {error, ?ERR_FORBIDDEN}
- end
+ Action = fun(#pubsub_node{type = Type, owners = Owners}=N) ->
+ case lists:member(Owner, Owners) of
+ true ->
+ lists:foreach(
+ fun({JID, Affiliation}) ->
+ node_call(Type, set_affiliation, [Host, Node, JID, Affiliation]),
+ case Affiliation of
+ owner ->
+ NewOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
+ NewOwners = [NewOwner|Owners],
+ tree_call(Host, set_node, [N#pubsub_node{owners = NewOwners}]);
+ none ->
+ OldOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
+ case lists:member(OldOwner, Owners) of
+ true ->
+ NewOwners = Owners--[OldOwner],
+ tree_call(Host, set_node, [N#pubsub_node{owners = NewOwners}]);
+ _ ->
+ ok
+ end;
+ _ ->
+ ok
+ end
+ end, Entities),
+ {result, []};
+ _ ->
+ {error, ?ERR_FORBIDDEN}
+ end
end,
transaction(Host, Node, Action, sync_dirty)
end.
diff --git a/src/mod_pubsub/node_default.erl b/src/mod_pubsub/node_default.erl
index 9583b34a..3300b578 100644
--- a/src/mod_pubsub/node_default.erl
+++ b/src/mod_pubsub/node_default.erl
@@ -350,14 +350,19 @@ subscribe_node(Host, Node, Sender, Subscriber, AccessModel,
unsubscribe_node(Host, Node, Sender, Subscriber, _SubId) ->
SubKey = jlib:jid_tolower(Subscriber),
GenKey = jlib:jid_remove_resource(SubKey),
- Authorized = (jlib:jid_tolower(jlib:jid_remove_resource(Sender)) == GenKey),
+ SenderKey = jlib:jid_tolower(jlib:jid_remove_resource(Sender)),
GenState = get_state(Host, Node, GenKey),
SubState = case SubKey of
GenKey -> GenState;
_ -> get_state(Host, Node, SubKey)
end,
- Affiliation = GenState#pubsub_state.affiliation,
- Subscription = SubState#pubsub_state.subscription,
+ Authorized = case SenderKey of
+ GenKey ->
+ true;
+ _ ->
+ SenderState = get_state(Host, Node, SenderKey),
+ SenderState#pubsub_state.affiliation == owner
+ end,
if
%% Entity did not specify SubID
%%SubID == "", ?? ->
@@ -366,10 +371,10 @@ unsubscribe_node(Host, Node, Sender, Subscriber, _SubId) ->
%%InvalidSubID ->
%% {error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")};
%% Requesting entity is not a subscriber
- Subscription == none ->
+ SubState#pubsub_state.subscription == none ->
{error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST, "not-subscribed")};
%% Requesting entity is prohibited from unsubscribing entity
- (not Authorized) and (Affiliation =/= owner) ->
+ not Authorized ->
{error, ?ERR_FORBIDDEN};
%% Was just subscriber, remove the record
SubState#pubsub_state.affiliation == none ->
@@ -580,7 +585,12 @@ set_affiliation(Host, Node, Owner, Affiliation) ->
SubKey = jlib:jid_tolower(Owner),
GenKey = jlib:jid_remove_resource(SubKey),
GenState = get_state(Host, Node, GenKey),
- set_state(GenState#pubsub_state{affiliation = Affiliation}),
+ case {Affiliation, GenState#pubsub_state.subscription} of
+ {none, none} ->
+ del_state(GenState#pubsub_state.stateid);
+ _ ->
+ set_state(GenState#pubsub_state{affiliation = Affiliation})
+ end,
ok.
%% @spec (Host, Owner) -> [{Node,Subscription}]
@@ -624,7 +634,12 @@ get_subscription(Host, Node, Owner) ->
set_subscription(Host, Node, Owner, Subscription) ->
SubKey = jlib:jid_tolower(Owner),
SubState = get_state(Host, Node, SubKey),
- set_state(SubState#pubsub_state{subscription = Subscription}),
+ case {Subscription, SubState#pubsub_state.affiliation} of
+ {none, none} ->
+ del_state(SubState#pubsub_state.stateid);
+ _ ->
+ set_state(SubState#pubsub_state{subscription = Subscription})
+ end,
ok.
%% @spec (Host, Node) -> [States] | []
@@ -704,7 +719,7 @@ get_items(Host, Node, JID, AccessModel, PresenceSubscription, RosterGroup, _SubI
%%InvalidSubID ->
%% Entity is subscribed but specifies an invalid subscription ID
%{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")};
- Affiliation == outcast ->
+ GenState#pubsub_state.affiliation == outcast ->
%% Requesting entity is blocked
{error, ?ERR_FORBIDDEN};
(AccessModel == presence) and (not PresenceSubscription) ->
@@ -752,7 +767,7 @@ get_item(Host, Node, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup
%%InvalidSubID ->
%% Entity is subscribed but specifies an invalid subscription ID
%{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")};
- Affiliation == outcast ->
+ GenState#pubsub_state.affiliation == outcast ->
%% Requesting entity is blocked
{error, ?ERR_FORBIDDEN};
(AccessModel == presence) and (not PresenceSubscription) ->