Mercurial > psgxs
diff modules/mod_configure.js @ 24:b80ab94da447
Add new modules files.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Mon, 01 Nov 2010 00:02:27 +0100 |
parents | |
children | b2faacfefb90 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/modules/mod_configure.js @@ -0,0 +1,103 @@ +var config = require('../configuration'); +var storage = require('../storage'); +var forms = require('../forms'); +var errors = require('../errors'); +var makeError = errors.makeError; +var toBareJID = require('../util').toBareJID; +var NS = require('../namespaces'); + +// SECTION 8.2: Configure a Node +exports.getConfigure = { + type: 'get', + child: 'pubsub', + ns: NS.PUBSUB_OWNER, + pschild: 'configure', + func: function(response, stanza, request, to) { + if (!config.enabled('config-node')) + return makeError(response, errors.owner.configure.node_configuration_not_supported.n); + + var nodeID = request.getAttribute('node'); + if (!nodeID || nodeID == '') + return makeError(response, errors.nodeid_required.n); + if (!storage.existsNode(nodeID)) + return makeError(response, errors.node_does_not_exist.n); + + var affil = storage.getAffiliation(toBareJID(to), nodeID); + if (affil != 'super-owner' && affil != 'owner' && affil != 'publish-only') + return makeError(response, errors.pub.publish.insufficient_privileges.n); + + response.c('pubsub', {xmlns: NS.PUBSUB_OWNER}); + response.c('configure', {node: nodeID}); + + var form = forms.build('form', 'node_config', 'default', true); + response.cnode(form); + + return response; + } +} + +// SECTION 8.3: Request Default Node Configuration Options +exports.default = { + type: 'get', + child: 'pubsub', + ns: NS.PUBSUB_OWNER, + pschild: 'default', + func: function(response) { + if (!config.enabled('config-node')) + return makeError(response, errors.owner.default_options.node_configuration_not_supported.n); + + response.c('pubsub', {xmlns: NS.PUBSUB_OWNER}); + response.c('default'); + + var form = forms.build('node_config', service_configuration.node_config, null, true); + response.cnode(form); + + return response; + } +} + +// SECTION 8.2.4: Form Submission +exports.setConfigure = { + type: 'set', + child: 'pubsub', + ns: NS.PUBSUB_OWNER, + pschild: 'configure', + func: function(response, stanza, request, to) { + if (!config.enabled('config-node')) + return makeError(response, errors.owner.configure.node_configuration_not_supported.n); + + var nodeID = request.getAttribute('node'); + if (!nodeID) + return makeError(response, errors.nodeid_required.n); + if (!storage.existsNode(nodeID)) + return makeError(response, errors.node_does_not_exist.n); + + var affil = storage.getAffiliation(toBareJID(to), nodeID); + if (affil != 'super-owner' && affil != 'owner' && affil != 'publish-only') + return makeError(response, errors.forbidden.n); + + var x = request.getChild('x', 'jabber:x:data'); + if (!x) + return makeError(response, errors.bad_request.n); + + var type = x.getAttribute('type'); + if (type == 'cancel') { + conn.send(response); + return; + } + if (type != 'submit') + return makeError(response, errors.bad_request.n); + + var form = forms.parse(x, true); + if (typeof form == 'number') + return makeError(response, form); + + var conf = form; + + var set = storage.configure(nodeID, conf); + if (typeof set == 'number') + return makeError(response, set); + + return response; + } +}