]> granicus.if.org Git - ejabberd/commitdiff
Add support for publish-only (#30)
authorChristophe Romain <christophe.romain@process-one.net>
Tue, 21 Apr 2015 15:23:59 +0000 (17:23 +0200)
committerChristophe Romain <christophe.romain@process-one.net>
Tue, 21 Apr 2015 15:23:59 +0000 (17:23 +0200)
src/mod_pubsub.erl
src/node_hometree.erl
src/node_hometree_odbc.erl

index 75a64e1a6f2a228f12a717865d00753aa58291b4..a8b7b0ecb0db77580c766d82a688c446f094ef71 100644 (file)
@@ -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
 
index f2e592aaaed1abb33c06a4a572f8a0a1b98f8bee..296fbdde7a820b147b948e32b2723fca89705c0c 100644 (file)
@@ -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.
index 6207e0fbc5bf92bd2ff9f6a748ab39c83f7b795d..b9abac20336798fb383112ead2c1a1657bf8f84c 100644 (file)
@@ -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.