Software / code / prosody
Comparison
plugins/mod_pubsub/pubsub.lib.lua @ 9200:249d90ff992e
pubsub.lib, util.pubsub: Move precondition checks to util.pubsub
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sat, 18 Aug 2018 14:06:56 +0100 |
| parent | 9199:596d0d82a113 |
| child | 9206:33ee40dc3e25 |
comparison
equal
deleted
inserted
replaced
| 9199:596d0d82a113 | 9200:249d90ff992e |
|---|---|
| 216 end | 216 end |
| 217 end | 217 end |
| 218 return ret; | 218 return ret; |
| 219 end | 219 end |
| 220 | 220 |
| 221 -- Used to check that the config of a node is as expected (i.e. 'publish-options') | |
| 222 local function check_preconditions(node_config, required_config) | |
| 223 if not (node_config and required_config) then | |
| 224 return false; | |
| 225 end | |
| 226 for config_field, value in pairs(required_config) do | |
| 227 if node_config[config_field] ~= value then | |
| 228 return false; | |
| 229 end | |
| 230 end | |
| 231 return true; | |
| 232 end | |
| 233 | |
| 234 local service_method_feature_map = { | 221 local service_method_feature_map = { |
| 235 add_subscription = { "subscribe", "subscription-options" }; | 222 add_subscription = { "subscribe", "subscription-options" }; |
| 236 create = { "create-nodes", "instant-nodes", "item-ids", "create-and-configure" }; | 223 create = { "create-nodes", "instant-nodes", "item-ids", "create-and-configure" }; |
| 237 delete = { "delete-nodes" }; | 224 delete = { "delete-nodes" }; |
| 238 get_items = { "retrieve-items" }; | 225 get_items = { "retrieve-items" }; |
| 601 local node = publish.attr.node; | 588 local node = publish.attr.node; |
| 602 if not node then | 589 if not node then |
| 603 origin.send(pubsub_error_reply(stanza, "nodeid-required")); | 590 origin.send(pubsub_error_reply(stanza, "nodeid-required")); |
| 604 return true; | 591 return true; |
| 605 end | 592 end |
| 593 local required_config = nil; | |
| 606 local publish_options = stanza.tags[1]:get_child("publish-options"); | 594 local publish_options = stanza.tags[1]:get_child("publish-options"); |
| 607 if publish_options then | 595 if publish_options then |
| 608 -- Ensure that the node configuration matches the values in publish-options | 596 -- Ensure that the node configuration matches the values in publish-options |
| 609 local publish_options_form = publish_options:get_child("x", "jabber:x:data"); | 597 local publish_options_form = publish_options:get_child("x", "jabber:x:data"); |
| 610 local required_config = config_from_xep0060(node_config_form:data(publish_options_form), true); | 598 required_config = config_from_xep0060(node_config_form:data(publish_options_form), true); |
| 611 local node_accessible, node_config = service:get_node_config(node, stanza.attr.from); | |
| 612 if node_accessible == false and service.config.autocreate_on_publish then | |
| 613 module:log("debug", "creating node %s with publish-options", node) | |
| 614 -- we need to create the node here so that it is configured | |
| 615 -- correctly | |
| 616 local created, err = service:create(node, stanza.attr.from, required_config) | |
| 617 if not created then | |
| 618 local reply = pubsub_error_reply(stanza, err); | |
| 619 origin.send(reply); | |
| 620 return true; | |
| 621 end | |
| 622 elseif not check_preconditions(node_config, required_config) then | |
| 623 local reply = pubsub_error_reply(stanza, "precondition-not-met"); | |
| 624 origin.send(reply); | |
| 625 return true; | |
| 626 end | |
| 627 end | 599 end |
| 628 local item = publish:get_child("item"); | 600 local item = publish:get_child("item"); |
| 629 local id = (item and item.attr.id); | 601 local id = (item and item.attr.id); |
| 630 if not id then | 602 if not id then |
| 631 id = uuid_generate(); | 603 id = uuid_generate(); |
| 632 if item then | 604 if item then |
| 633 item.attr.id = id; | 605 item.attr.id = id; |
| 634 end | 606 end |
| 635 end | 607 end |
| 636 local ok, ret = service:publish(node, stanza.attr.from, id, item); | 608 local ok, ret = service:publish(node, stanza.attr.from, id, item, required_config); |
| 637 local reply; | 609 local reply; |
| 638 if ok then | 610 if ok then |
| 639 if type(ok) == "string" then | 611 if type(ok) == "string" then |
| 640 id = ok; | 612 id = ok; |
| 641 end | 613 end |