Mercurial > psgxs
view modules/mod_retrieve.js @ 54:c2c9c06d6e9d
Fix problems with unneeded text nodes.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Fri, 06 May 2011 17:51:15 +0200 |
parents | 0d3f18bb1d36 |
children | addbf6bbfaa8 |
line wrap: on
line source
/* * Copyright (C) 2010 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> * * This file is part of PSĜS, a PubSub server written in JavaScript. * * PSĜS is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License. * * PSĜS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with PSĜS. If not, see <http://www.gnu.org/licenses/>. */ 'use strict'; // SECTION 5.6: Retrieve Subscriptions exports.retrieveSubscriptions = { type: 'get', child: 'pubsub', ns: NS.PUBSUB, child2: 'subscriptions', func: function(response, stanza, request, to) { if (!config.enabled('retrieve-subscriptions')) return makeError(response, errors.subscriptions_retrieval_not_supported.n); var nodeID = request.getAttribute('node'); if (nodeID && nodeID != '') { if (!storage.existsNode(nodeID)) return makeError(response, errors.node_does_not_exist.n); var subs = storage.getSubscription(JID.toBare(to), nodeID); } else var subs = storage.getSubscription(JID.toBare(to)); response.c('pubsub', {xmlns: NS.PUBSUB}) .c('subscriptions'); for (i in subs) response.c('subscription', {node: i, jid: to, subscription: subs[i].type, subid: subs[i].subid}).up(); return response; } } // SECTION 5.7: Retrieve Affiliations exports.retrieveAffiliations = { type: 'get', child: 'pubsub', ns: NS.PUBSUB, child2: 'affiliations', func: function(response, stanza, request, to) { if (!config.enabled('retrieve-affiliations')) return makeError(response, errors.affiliations_retrieval_not_supported.n); var nodeID = request.getAttribute('node'); if (nodeID && nodeID != '') { if (!storage.existsNode(nodeID)) return makeError(response, errors.node_does_not_exist.n); var affils = {}; affils[nodeID] = storage.getAffiliation(JID.toBare(to), nodeID); } else var affils = storage.getAffiliationsFromJID(JID.toBare(to)); response.c('pubsub', {xmlns: NS.PUBSUB}) .c('affiliations'); for (i in affils) response.c('affiliation', {node: i, affiliation: affils[i]}).up(); return response; } } // SECTION 6.5: Retrieve Items from a Node exports.retrieveItems = { type: 'get', child: 'pubsub', ns: NS.PUBSUB, child2: 'items', func: function(response, stanza, request, to) { if (!config.enabled('retrieve-items')) return makeError(response, errors.sub.default_options.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 configuration = storage.getConfiguration(nodeID); if (configuration['pubsub#access_model'] == 'whitelist') { var affil = storage.getAffiliation(JID.toBare(to), nodeID); if (affil != 'super-owner' && affil != 'owner' && affil != 'publisher' && affil != 'member') return makeError(response, errors.pub.publish.insufficient_privileges.n); } var item = []; for (var i=0; i<request.tags.length; i++) { var j = request.tags[i]; if (j.name == 'item' && j.attr['id'] && j.attr['id'] != '') item.push(j.attr['id']); } response.c('pubsub', {xmlns: NS.PUBSUB}); var max_items = request.getAttribute('max_items'); if (max_items) max_items = Number (max_items); if (item.length) { response.c('items', {node: nodeID}); for (var i=0; i<item.length; i++) { var j = storage.getItem(nodeID, item[i]); if (typeof j == 'number') return makeError(response, j); if (j == errors.success) continue; response.c('item', {id: item[i]}) .cnode(j).up().up(); } } else { response.c('items', {node: nodeID}); var j; if (max_items) j = storage.getLastItem(nodeID, max_items); else j = storage.getItems(nodeID); if (typeof j == 'number') return makeError(response, j); var k = 0; for (var i in j) response.c('item', {id: i}).t(j[i].content).up(); } return response; } }