Mercurial > psgxs
diff modules/mod_manage.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_manage.js @@ -0,0 +1,162 @@ +var config = require('../configuration'); +var storage = require('../storage'); +var errors = require('../errors'); +var makeError = errors.makeError; +var toBareJID = require('../util').toBareJID; +var NS = require('../namespaces'); + +// SECTION 8.8.1: Retrieve Subscriptions List +exports.manageRetrieveSub = { + type: 'get', + child: 'pubsub', + ns: NS.PUBSUB_OWNER, + pschild: 'subscriptions', + func: function(response, stanza, request, to) { + if (!config.enabled('manage-subscriptions')) + return makeError(response, errors.owner.manage_subscriptions.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') + return makeError(response, errors.forbidden.n); + + response.c('pubsub', {xmlns: NS.PUBSUB_OWNER}); + response.c('subscriptions', {node: nodeID}); + + var subs = storage.getSubscriptionsFromNodeID(nodeID) + for (var jid in subs) + response.c('subscription', {jid: jid, subscription: subs[jid].type, subid: subs[jid].subid}).up(); + + return response; + } +} + +// SECTION 8.9.1: Retrieve Affiliations List +exports.manageRetrieveAff = { + type: 'get', + child: 'pubsub', + ns: NS.PUBSUB_OWNER, + pschild: 'affiliations', + func: function(response, stanza, request, to) { + if (!config.enabled('modify-affiliations')) + return makeError(response, errors.owner.manage_affiliations.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 affils = storage.getAffiliationsFromNodeID(nodeID); + var affil = affils[toBareJID(to)]; + if (affil != 'super-owner' && affil != 'owner') + return makeError(response, errors.owner.manage_affiliations.retrieve_list.entity_is_not_an_owner.n); + + response.c('pubsub', {xmlns: NS.PUBSUB_OWNER}); + response.c('affiliations', {node: nodeID}); + + for (var jid in affils) + response.c('affiliation', {jid: jid, affiliation: affils[jid]}).up(); + + return response; + } +} + +// SECTION 8.8.2: Modify Subscriptions +exports.modifySub = { + type: 'set', + child: 'pubsub', + ns: NS.PUBSUB_OWNER, + pschild: 'subscriptions', + func: function(response, stanza, request, to) { + if (!config.enabled('manage-subscriptions')) + return makeError(response, errors.owner.manage_subscriptions.not_supported.n); //XXX + + 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') + return makeError(response, errors.forbidden.n); + + var e = false; + var tags2 = []; + for (i in request.tags) { + var tag = request.tags[i]; + var jid = tag.getAttribute('jid'); + var sub = tag.getAttribute('subscription'); + + if (sub == 'none' || sub == 'pending' || sub == 'subscribed' || sub == 'unconfigured') { + var set = storage.subscribe(nodeID, jid, sub); + + if (typeof set == 'number') { + e = true; + tags2.push(tag); + } else { + // SECTION 8.8.4 + notifs.send(jid, 'subscription', nodeID, {jid: jid, subscription: sub}); + } + } else { + e = true; + tags2.push(tag); + } + } + + request.tags = tags2; + + if (e) + return makeError(response, errors.owner.manage_subscriptions.modify.multiple_simultaneous_modifications.n, pubsub); + + return response; + } +} + +// SECTION 8.9.2: Modify Affiliation +exports.modifyAff = { + type: 'set', + child: 'pubsub', + ns: NS.PUBSUB_OWNER, + pschild: 'affiliations', + func: function(response, stanza, request, to) { + if (!config.enabled('modify-affiliations')) + return makeError(response, errors.owner.manage_affiliations.not_supported.n); //XXX + + 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') + return makeError(response, errors.forbidden.n); + + var e = false; + for (i in request.children) { + var jid = request.children[i].getAttribute('jid'); + var affiliation = request.children[i].getAttribute('affiliation'); + + var set = storage.setAffiliation(nodeID, jid, affiliation); + if (typeof set == 'number') + e = true; + else { + // SECTION 8.9.4 + notifs.send(jid, 'affiliations', nodeID, {jid: jid, affiliation: affiliation}); + request.children.splice(i, 1); + } + } + + if (e) + return makeError(response, errors.owner.manage_affiliations.modify.multiple_simultaneous_modifications.n, pubsub); + + return response; + } +}