Mercurial > psgxs
view modules/mod_publish_message.js @ 35:6697f394301f
Replace util with fdsq to work around a stupid bug.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Wed, 10 Nov 2010 01:30:03 +0100 |
parents | dcf1f09f8cee |
children | bc717575e66a |
line wrap: on
line source
var config = require('../configuration'); var storage = require('../storage'); var notifs = require('../notifs'); var errors = require('../errors'); var makeError = errors.makeError; var fdsq = require('../fdsq'); var toBareJID = fdsq.toBareJID; var NS = require('../namespaces'); var xmpp = require('xmpp'); exports.publishMessage = { stanza: 'message', child: 'body', func: function(response, stanza, request, to, from) { if (!config.enabled('publish')) return makeError(response, errors.pub.publish.item_publication_not_supported.n); var nodeID = fdsq.toResource(from); if (!nodeID || nodeID == '') return makeError(response, errors.nodeid_required.n); var autocreate = false; if (!storage.existsNode(nodeID)) { if (config.enabled('auto-create')) autocreate = true; else return makeError(response, errors.node_does_not_exist.n); } var affil = storage.getAffiliation(toBareJID(to), nodeID); if (typeof affil == 'number' && affil != errors.node_does_not_exist.n) return makeError(response, affil); if (!autocreate && affil != 'super-owner' && affil != 'owner' && affil != 'publisher' && affil != 'publish-only') return makeError(response, errors.forbidden.n); if (!config.enabled('item-ids')) return makeError(response, errors.itemid_required.n); var itemID = fdsq.makeRandomId(); var now = new Date(); var item = xmpp.stanza('item', {xmlns: NS.PUBSUB, id: itemID}); item.c('entry', {xmlns: NS.ATOM}); if (stanza.getChild('subject')) item.c('title').t(stanza.getChild('subject')).up(); item.c('summary').t(request.getText()).up(); item.c('id').t(itemID).up(); item.c('published').t(now.toString()).up(); item.c('updated').t(now.toString()).up(); if (!config.enabled('persistent-items')) { var notifications = storage.purgeNode(nodeID); if (typeof notifications == 'number') return makeError(response, r); } if (autocreate) { if (!form) form = {}; form['pubsub#creator'] = toBareJID(to); var r = storage.createNode(nodeID, form); if (typeof r == 'number') return makeError(response, r); } var content = item.getChild(); subscribers = storage.setItem(nodeID, itemID, content); if (typeof subscribers == 'number') return makeError(response, subscribers); var attrs = {}; if (content) attrs[itemID] = {content: content}; else attrs[itemID] = {}; notifs.send(subscribers, 'items', nodeID, attrs); response.c('pubsub', {xmlns: NS.PUBSUB}) .c('publish', {node: nodeID}) .c('item', {id: itemID}); return response; } }