diff options
Diffstat (limited to 'plugins/mod_pubsub')
-rw-r--r-- | plugins/mod_pubsub/mod_pubsub.lua | 16 | ||||
-rw-r--r-- | plugins/mod_pubsub/pubsub.lib.lua | 57 |
2 files changed, 73 insertions, 0 deletions
diff --git a/plugins/mod_pubsub/mod_pubsub.lua b/plugins/mod_pubsub/mod_pubsub.lua index 33e729af..0ffa7981 100644 --- a/plugins/mod_pubsub/mod_pubsub.lua +++ b/plugins/mod_pubsub/mod_pubsub.lua @@ -64,6 +64,8 @@ local feature_map = { get_items = { "retrieve-items" }; add_subscription = { "subscribe" }; get_subscriptions = { "retrieve-subscriptions" }; + set_configure = { "config-node" }; + get_default = { "retrieve-default" }; }; local function add_disco_features_from_service(service) @@ -195,6 +197,7 @@ function module.load() retract = true; delete = true; get_nodes = true; + configure = true; subscribe = true; unsubscribe = true; @@ -215,6 +218,19 @@ function module.load() }; }; + node_config_form = require"util.dataforms".new { + { + type = "hidden"; + name = "FORM_TYPE"; + value = "http://jabber.org/protocol/pubsub#node_config"; + }; + { + type = "text-single"; + name = "pubsub#max_items"; + label = "Max # of items to persist"; + }; + }; + autocreate_on_publish = autocreate_on_publish; autocreate_on_subscribe = autocreate_on_subscribe; diff --git a/plugins/mod_pubsub/pubsub.lib.lua b/plugins/mod_pubsub/pubsub.lib.lua index 4e9acd68..8a22fa69 100644 --- a/plugins/mod_pubsub/pubsub.lib.lua +++ b/plugins/mod_pubsub/pubsub.lib.lua @@ -3,6 +3,7 @@ local uuid_generate = require "util.uuid".generate; local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; local xmlns_pubsub_errors = "http://jabber.org/protocol/pubsub#errors"; +local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner"; local _M = {}; @@ -17,6 +18,7 @@ local pubsub_errors = { ["item-not-found"] = { "cancel", "item-not-found" }; ["not-subscribed"] = { "modify", "unexpected-request", nil, "not-subscribed" }; ["forbidden"] = { "cancel", "forbidden" }; + ["not-allowed"] = { "cancel", "not-allowed" }; }; local function pubsub_error_reply(stanza, error) local e = pubsub_errors[error]; @@ -222,4 +224,59 @@ function handlers.set_purge(origin, stanza, purge, service) return origin.send(reply); end +function handlers.get_configure(origin, stanza, config, service) + local node = config.attr.node; + if not node then + return origin.send(pubsub_error_reply(stanza, "nodeid-required")); + end + + if not service:may(node, actor, "configure") then + return origin.send(pubsub_error_reply(stanza, "forbidden")); + end + + local node_obj = service.nodes[node]; + if not node_obj then + return origin.send(pubsub_error_reply(stanza, "item-not-found")); + end + + local form = self.config.node_config_form; + if not form then + return origin.send(pubsub_error_reply(stanza, "not-allowed")); + end + + local reply = st.reply(stanza) + :tag("pubsub", { xmlns = xmlns_pubsub_owner }) + :tag("configure", { node = node }) + :add_child(form:form(node_obj.config)); + return origin.send(reply); +end + +function handlers.set_configure(origin, stanza, config, service) + local node = config.attr.node; + if not node then + return origin.send(pubsub_error_reply(stanza, "nodeid-required")); + end + local form, node_obj = service:get_node_config_form(node, stanza.attr.from); + if not form then + return origin.send(pubsub_error_reply(stanza, node_obj)); + end + local new_config, err = form:data(config.tags[1]); + if not new_config then + return origin.send(st.error_reply(stanza, "modify", "bad-request", err)); + end + local ok, err = service:set_node_config(node, stanza.attr.from, new_config); + if not ok then + return origin.send(pubsub_error_reply(stanza, err)); + end + return origin.send(st.reply(stanza)); +end + +function handlers.get_default(origin, stanza, default, service) + local reply = st.reply(stanza) + :tag("pubsub", { xmlns = xmlns_pubsub_owner }) + :tag("configure", { node = node }) + :add_child(form:form(service.node_default_config)); + return origin.send(reply); +end + return _M; |