summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2017-12-12 01:04:14 +0100
committerHolger Weiss <holger@zedat.fu-berlin.de>2017-12-12 01:04:14 +0100
commitb661bee4b161119d8d52174d0f97e7b3581d3ab9 (patch)
tree60f3218b5835e4aa75224eadcf2e70d8d6b28327 /src
parentRevert removal of certfile option on http listener (diff)
Support pubsub#publish-options PRECONDITIONs
Support PubSub publishing options that are specified as PRECONDITIONs as per XEP-0060 v1.14.
Diffstat (limited to 'src')
-rw-r--r--src/mod_pubsub.erl21
-rw-r--r--src/node_flat.erl1
-rw-r--r--src/node_mb.erl1
-rw-r--r--src/node_pep.erl1
4 files changed, 21 insertions, 3 deletions
diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl
index bc816b51..d3f82c99 100644
--- a/src/mod_pubsub.erl
+++ b/src/mod_pubsub.erl
@@ -82,8 +82,9 @@
err_jid_required/0, err_max_items_exceeded/0, err_max_nodes_exceeded/0,
err_nodeid_required/0, err_not_in_roster_group/0, err_not_subscribed/0,
err_payload_too_big/0, err_payload_required/0,
- err_pending_subscription/0, err_presence_subscription_required/0,
- err_subid_required/0, err_too_many_subscriptions/0, err_unsupported/1,
+ err_pending_subscription/0, err_precondition_not_met/0,
+ err_presence_subscription_required/0, err_subid_required/0,
+ err_too_many_subscriptions/0, err_unsupported/1,
err_unsupported_access_model/0]).
%% API and gen_server callbacks
@@ -1773,9 +1774,13 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload, PubOpts, Access
PayloadCount = payload_xmlelements(Payload),
PayloadSize = byte_size(term_to_binary(Payload)) - 2,
PayloadMaxSize = get_option(Options, max_payload_size),
+ PreconditionsMet = preconditions_met(PubOpts, Options),
if not PublishFeature ->
{error, extended_error(xmpp:err_feature_not_implemented(),
err_unsupported(publish))};
+ not PreconditionsMet ->
+ {error, extended_error(xmpp:err_conflict(),
+ err_precondition_not_met())};
PayloadSize > PayloadMaxSize ->
{error, extended_error(xmpp:err_not_acceptable(),
err_payload_too_big())};
@@ -1844,7 +1849,7 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload, PubOpts, Access
Type = select_type(ServerHost, Host, Node),
case lists:member(<<"auto-create">>, plugin_features(Host, Type)) of
true ->
- case create_node(Host, ServerHost, Node, Publisher, Type, Access, []) of
+ case create_node(Host, ServerHost, Node, Publisher, Type, Access, PubOpts) of
{result, #pubsub{create = NewNode}} ->
publish_item(Host, ServerHost, NewNode, Publisher, ItemId,
Payload, PubOpts, Access);
@@ -2513,6 +2518,11 @@ get_roster_info(OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, _}, A
get_roster_info(OwnerUser, OwnerServer, JID, AllowedGroups) ->
get_roster_info(OwnerUser, OwnerServer, jid:tolower(JID), AllowedGroups).
+-spec preconditions_met(pubsub_publish_options:result(),
+ pubsub_node_config:result()) -> boolean().
+preconditions_met(PubOpts, NodeOpts) ->
+ lists:all(fun(Opt) -> lists:member(Opt, NodeOpts) end, PubOpts).
+
-spec service_jid(jid() | ljid() | binary()) -> jid().
service_jid(#jid{} = Jid) -> Jid;
service_jid({U, S, R}) -> jid:make(U, S, R);
@@ -3459,6 +3469,7 @@ features() ->
<<"presence-subscribe">>, % RECOMMENDED
<<"publisher-affiliation">>, % RECOMMENDED
<<"publish-only-affiliation">>, % OPTIONAL
+ <<"publish-options">>, % OPTIONAL
<<"retrieve-default">>,
<<"shim">>]. % RECOMMENDED
@@ -3690,6 +3701,10 @@ err_payload_required() ->
err_pending_subscription() ->
#ps_error{type = 'pending-subscription'}.
+-spec err_precondition_not_met() -> ps_error().
+err_precondition_not_met() ->
+ #ps_error{type = 'precondition-not-met'}.
+
-spec err_presence_subscription_required() -> ps_error().
err_presence_subscription_required() ->
#ps_error{type = 'presence-subscription-required'}.
diff --git a/src/node_flat.erl b/src/node_flat.erl
index bc529e14..c23a1ebe 100644
--- a/src/node_flat.erl
+++ b/src/node_flat.erl
@@ -105,6 +105,7 @@ features() ->
<<"persistent-items">>,
<<"publish">>,
<<"publish-only-affiliation">>,
+ <<"publish-options">>,
<<"purge-nodes">>,
<<"retract-items">>,
<<"retrieve-affiliations">>,
diff --git a/src/node_mb.erl b/src/node_mb.erl
index 13206031..7e0b2459 100644
--- a/src/node_mb.erl
+++ b/src/node_mb.erl
@@ -93,6 +93,7 @@ features() ->
<<"outcast-affiliation">>,
<<"persistent-items">>,
<<"publish">>,
+ <<"publish-options">>,
<<"purge-nodes">>,
<<"retract-items">>,
<<"retrieve-affiliations">>,
diff --git a/src/node_pep.erl b/src/node_pep.erl
index 08c84ce9..3bea659d 100644
--- a/src/node_pep.erl
+++ b/src/node_pep.erl
@@ -87,6 +87,7 @@ features() ->
<<"outcast-affiliation">>,
<<"persistent-items">>,
<<"publish">>,
+ <<"publish-options">>,
<<"purge-nodes">>,
<<"retract-items">>,
<<"retrieve-affiliations">>,