Mercurial > psgxs
view modules/mod_subscribe.js @ 39:4c808bfe0658
Various little fixes.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Wed, 15 Dec 2010 22:22:14 +0100 |
parents | 6697f394301f |
children | bc717575e66a |
line wrap: on
line source
var config = require('../configuration'); var storage = require('../storage'); var errors = require('../errors'); var notifs = require('../notifs'); var makeError = errors.makeError; var toBareJID = require('../fdsq').toBareJID; var NS = require('../namespaces'); // SECTION 6.1: Subscribe to a Node exports.subscribe = { type: 'set', child: 'pubsub', ns: NS.PUBSUB, child2: 'subscribe', func: function(response, stanza, request, to) { if (!config.enabled('subscribe')) return makeError(response, errors.sub.subscribe.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 configuration = storage.getConfiguration(nodeID); if (!configuration['pubsub#subscribe']) return makeError(response, errors.sub.subscribe.not_supported.n); var affil = storage.getAffiliation(toBareJID(to), nodeID); if (affil == 'publish-only' || affil == 'outcast') return makeError(response, errors.pub.publish.insufficient_privileges.n); var jid = request.getAttribute('jid'); if (!jid || toBareJID(jid) != toBareJID(to)) return makeError(response, errors.sub.subscribe.jids_do_not_match.n); /* // SECTION 6.3.7 var options = pubsub.getChild('options'); if (options && config.enabled('subscription-options')) { if (options.getAttribute('node') || options.getAttribute('jid')) return makeError(response, errors.bad_request.n); var x = options.getChild('x', 'jabber:x:data'); if (!x || x.getAttribute('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 subID; if (configuration['pubsub#access_model'] == 'open') { subID = storage.subscribe(nodeID, jid, 'subscribe'); if (typeof subID == 'number') return makeError(response, subID); } else if (configuration['pubsub#access_model'] == 'authorize') { subID = storage.subscribe(nodeID, jid, 'pending'); if (typeof subID == 'number') return makeError(response, subID); var affiliates = storage.getAffiliationsFromNodeID(nodeID); var form = forms.build('form', 'subscribe_authorization', {allow: false, node: nodeID, subscriber_jid: jid}, true); //168 for (var i in affiliates) { if (affiliates[i] == 'super-owner' || affiliates[i] == 'owner') { var message = xmpp.message({to: i}).cnode(form); conn.send(message); // FIXME: impossible à faire d’ici } } } else if (configuration['pubsub#access_model'] == 'whitelist') { var affil = storage.getAffiliation(jid, nodeID); if (affil != 'super-owner' && affil != 'owner' && affil != 'publisher' && affil != 'member') return makeError(response, errors.sub.subscribe.not_on_whitelist.n); subID = storage.subscribe(nodeID, jid); if (typeof subID == 'number') return makeError(response, subID); } response.c('pubsub', {xmlns: NS.PUBSUB}) .c('subscription', {node: nodeID, jid: jid, subid: subID.subid, subscription: subID.type}); if (config.enabled('last-published')) { var last = storage.getLastItem(nodeID); if (typeof last != 'number') { var item = storage.getItem(nodeID, last); if (typeof item != 'number') { var attr = {}; attr[last] = {content: item}; notifs.send(jid, 'items', nodeID, attr); } } } return response; } } // SECTION 6.2: Unsubscribe from a Node exports.unsubscribe = { type: 'set', child: 'pubsub', ns: NS.PUBSUB, child2: 'unsubscribe', func: function(response, stanza, request, to) { if (!config.enabled('subscribe')) return makeError(response, errors.sub.subscribe.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 jid = request.getAttribute('jid'); if (!jid || toBareJID(jid) != toBareJID(to)) return makeError(response, errors.sub.unsubscribe.insufficient_privileges.n); var subID = storage.subscribe(nodeID, jid, 'none'); if (typeof subID == 'number') return makeError(response, subID); return response; } }