diff options
Diffstat (limited to 'src/mod_pubsub/node_default.erl')
-rw-r--r-- | src/mod_pubsub/node_default.erl | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/mod_pubsub/node_default.erl b/src/mod_pubsub/node_default.erl index 9583b34a0..3300b5780 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) -> |