# HG changeset patch # User Emmanuel Gil Peyrot # Date 1282862343 -7200 # Node ID a6429f48e40397fb69d0367bd1d4012db767eeee # Parent efe8dbd34780c7deae7353c03307ad8a66e3ffa2 First implementation of XEP-0050 (ad-hoc commands). diff --git a/psgxs.js b/psgxs.js --- a/psgxs.js +++ b/psgxs.js @@ -70,7 +70,7 @@ function onIq(stanza) { if (type == 'get') { - // XEP-0092 + // XEP-0092: Software Version if (stanza.getChild('query', 'jabber:iq:version')) { var query = xmpp.stanza('query', {xmlns: 'jabber:iq:version'}) .s('name').t('PSĜS') @@ -116,10 +116,12 @@ function onIq(stanza) { .s('feature', {'var': 'http://jabber.org/protocol/disco#items'}) .s('feature', {'var': 'http://jabber.org/protocol/pubsub'}) .s('feature', {'var': 'jabber:iq:version'}) -// .s('feature', {'var': 'http://jabber.org/protocol/commands'}) - for (var i in config.activated) - if (typeof i == 'string') - q.s('feature', {'var': 'http://jabber.org/protocol/pubsub#' + config.activated[i]}); + .s('feature', {'var': 'http://jabber.org/protocol/commands'}); + + for (var i in config.activated) + if (typeof i == 'string') + q.s('feature', {'var': 'http://jabber.org/protocol/pubsub#' + config.activated[i]}); + response.cnode(q); } @@ -130,14 +132,25 @@ function onIq(stanza) { var children; var nodeID = query.getAttribute('node'); if (nodeID && nodeID != '') { - if (!storage.existsNode(nodeID)) - return makeError(response, errors.node_does_not_exist.n); + if (nodeID == 'http://jabber.org/protocol/commands') { + // XEP-0050: Ad-Hoc Commands + + q = xmpp.stanza('query', {xmlns: 'http://jabber.org/protocol/disco#items', node: nodeID}) + .s('item', {jid: componentJID, node: 'ping', name: 'Ping'}) + .s('item', {jid: componentJID, node: 'reload', name: 'Reload'}); - q = xmpp.stanza('query', {xmlns: 'http://jabber.org/protocol/disco#items', node: nodeID}); + response.cnode(q); + return conn.send(response); + } else { + if (!storage.existsNode(nodeID)) + return makeError(response, errors.node_does_not_exist.n); - children = storage.getChildren(nodeID); - if (typeof children == 'number') - return makeError(response, children); + q = xmpp.stanza('query', {xmlns: 'http://jabber.org/protocol/disco#items', node: nodeID}); + + children = storage.getChildren(nodeID); + if (typeof children == 'number') + return makeError(response, children); + } } else { q = xmpp.stanza('query', {xmlns: 'http://jabber.org/protocol/disco#items'}); @@ -427,7 +440,31 @@ function onIq(stanza) { } else return makeError(response, errors.feature_not_implemented.n); } else if (type == 'set') { - if (stanza.getChild('pubsub', 'http://jabber.org/protocol/pubsub')) { + if (stanza.getChild('command', 'http://jabber.org/protocol/commands')) { + // XEP-0050: Ad-Hoc Commands + var command = stanza.getChild('command', 'http://jabber.org/protocol/commands'); + + var action = command.getAttribute('action'); + if (action != 'execute') + return makeError(response, errors.bad_request.n); + + var node = command.getAttribute('node'); + if (node == 'ping') { + var cmd = xmpp.stanza('command', {xmlns: 'http://jabber.org/protocol/commands', +// sessionid: 'list:20020923T213616Z-700', + node: node, + 'status': 'completed'}) + .c('note', {type: 'info'}).t('pong'); + response.cnode(cmd); + } else if (node == 'reload') { + storage.load(); + response.c('command', {xmlns: 'http://jabber.org/protocol/commands', + node: node, + 'status': 'completed'}) + .c('note', {type: 'info'}).t('The server has correctly reloaded.'); + } else + return makeError(response, errors.bad_request.n); + } else if (stanza.getChild('pubsub', 'http://jabber.org/protocol/pubsub')) { var pubsub = stanza.getChild('pubsub', 'http://jabber.org/protocol/pubsub'); // SECTION 6.1 diff --git a/storage.js b/storage.js --- a/storage.js +++ b/storage.js @@ -33,7 +33,7 @@ var Item = nodes.Item; var fs = require('fs'); -var list = {}; +var list; var storage = exports; storage.createNode = function(nodeID, params) {