diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 75a64e1a6..a8b7b0ecb 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -3069,6 +3069,7 @@ get_roster_info(OwnerUser, OwnerServer, JID, AllowedGroups) -> string_to_affiliation(<<"owner">>) -> owner; string_to_affiliation(<<"publisher">>) -> publisher; +string_to_affiliation(<<"publish-only">>) -> publish_only; string_to_affiliation(<<"member">>) -> member; string_to_affiliation(<<"outcast">>) -> outcast; string_to_affiliation(<<"none">>) -> none; @@ -3082,6 +3083,7 @@ string_to_subscription(_) -> false. affiliation_to_string(owner) -> <<"owner">>; affiliation_to_string(publisher) -> <<"publisher">>; +affiliation_to_string(publish_only) -> <<"publish-only">>; affiliation_to_string(member) -> <<"member">>; affiliation_to_string(outcast) -> <<"outcast">>; affiliation_to_string(_) -> <<"none">>. @@ -4023,6 +4025,7 @@ features() -> <<"presence-notifications">>, % OPTIONAL <<"presence-subscribe">>, % RECOMMENDED <<"publisher-affiliation">>, % RECOMMENDED + <<"publish-only-affiliation">>, % OPTIONAL <<"retrieve-default">>, <<"shim">>]. % RECOMMENDED diff --git a/src/node_hometree.erl b/src/node_hometree.erl index f2e592aaa..296fbdde7 100644 --- a/src/node_hometree.erl +++ b/src/node_hometree.erl @@ -114,6 +114,7 @@ features() -> <<"outcast-affiliation">>, <<"persistent-items">>, <<"publish">>, + <<"publish-only-affiliation">>, <<"purge-nodes">>, <<"retract-items">>, <<"retrieve-affiliations">>, @@ -221,7 +222,7 @@ subscribe_node(Nidx, Sender, Subscriber, AccessModel, if not Authorized -> {error, ?ERR_EXTENDED((?ERR_BAD_REQUEST), <<"invalid-jid">>)}; - Affiliation == outcast -> + (Affiliation == outcast) or (Affiliation == publish_only) -> {error, ?ERR_FORBIDDEN}; PendingSubscription -> {error, @@ -377,7 +378,9 @@ publish_item(Nidx, Publisher, PublishModel, MaxItems, ItemId, Payload) -> end, if not ((PublishModel == open) or (PublishModel == publishers) and - ((Affiliation == owner) or (Affiliation == publisher)) + ((Affiliation == owner) + or (Affiliation == publisher) + or (Affiliation == publish_only)) or (Subscribed == true)) -> {error, ?ERR_FORBIDDEN}; true -> @@ -743,7 +746,7 @@ get_items(Nidx, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId, _RS %%InvalidSubId -> %% Entity is subscribed but specifies an invalid subscription ID %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; - Affiliation == outcast -> + (Affiliation == outcast) or (Affiliation == publish_only) -> {error, ?ERR_FORBIDDEN}; (AccessModel == presence) and not PresenceSubscription -> {error, @@ -784,7 +787,7 @@ get_item(Nidx, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, _Sub %%InvalidSubId -> %% Entity is subscribed but specifies an invalid subscription ID %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; - Affiliation == outcast -> + (Affiliation == outcast) or (Affiliation == publish_only) -> {error, ?ERR_FORBIDDEN}; (AccessModel == presence) and not PresenceSubscription -> {error, @@ -832,6 +835,7 @@ path_to_node(Path) -> iolist_to_binary(str:join([<<"">> | Path], <<"/">>)). can_fetch_item(owner, _) -> true; can_fetch_item(member, _) -> true; can_fetch_item(publisher, _) -> true; +can_fetch_item(publish_only, _) -> false; can_fetch_item(outcast, _) -> false; can_fetch_item(none, Subscriptions) -> is_subscribed(Subscriptions). %can_fetch_item(_Affiliation, _Subscription) -> false. diff --git a/src/node_hometree_odbc.erl b/src/node_hometree_odbc.erl index 6207e0fbc..b9abac203 100644 --- a/src/node_hometree_odbc.erl +++ b/src/node_hometree_odbc.erl @@ -162,7 +162,7 @@ subscribe_node(Nidx, Sender, Subscriber, AccessModel, if not Authorized -> {error, ?ERR_EXTENDED((?ERR_BAD_REQUEST), <<"invalid-jid">>)}; - Affiliation == outcast -> + (Affiliation == outcast) or (Affiliation == publish_only) -> {error, ?ERR_FORBIDDEN}; PendingSubscription -> {error, @@ -299,7 +299,9 @@ publish_item(Nidx, Publisher, PublishModel, MaxItems, ItemId, Payload) -> end, if not ((PublishModel == open) or (PublishModel == publishers) and - ((Affiliation == owner) or (Affiliation == publisher)) + ((Affiliation == owner) + or (Affiliation == publisher) + or (Affiliation == publish_only)) or (Subscribed == true)) -> {error, ?ERR_FORBIDDEN}; true -> @@ -868,7 +870,7 @@ get_items(Nidx, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId, RSM %%InvalidSubId -> %% Entity is subscribed but specifies an invalid subscription ID %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; - Affiliation == outcast -> + (Affiliation == outcast) or (Affiliation == publish_only) -> {error, ?ERR_FORBIDDEN}; (AccessModel == presence) and not PresenceSubscription -> {error, @@ -927,7 +929,7 @@ get_item(Nidx, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, _Sub %%InvalidSubId -> %% Entity is subscribed but specifies an invalid subscription ID %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; - Affiliation == outcast -> + (Affiliation == outcast) or (Affiliation == publish_only) -> {error, ?ERR_FORBIDDEN}; (AccessModel == presence) and not PresenceSubscription -> {error, @@ -1005,6 +1007,7 @@ path_to_node(Path) -> can_fetch_item(owner, _) -> true; can_fetch_item(member, _) -> true; can_fetch_item(publisher, _) -> true; +can_fetch_item(publish_only, _) -> false; can_fetch_item(outcast, _) -> false; can_fetch_item(none, Subscriptions) -> is_subscribed(Subscriptions). %can_fetch_item(_Affiliation, _Subscription) -> false.