# HG changeset patch # User Emmanuel Gil Peyrot # Date 1328117877 -3600 # Node ID b1e75cdbb0ad6affb28531883294bedf030b7eb3 # Parent d1ba6f0e2a9244207d5775d29941894393ae608f Don’t allow more than one iq handler to respond, and respond with an service-unavailable when not handled. diff --git a/lightstring.js b/lightstring.js --- a/lightstring.js +++ b/lightstring.js @@ -44,6 +44,18 @@ var Lightstring = { close: function() { return ""; } + }, + errors: { + iq: function(type, error) { + return "" + + "" + + "<" + error + " xmlns='" + Lightstring.namespaces['xmpp_stanzas'] + "'/>" + //TODO: allow text content. + //TODO: allow text and payload. + "" + + ""; + } } }, plugins: {}, @@ -429,8 +441,24 @@ Lightstring.Connection.prototype = { if (!handlers) return; - for (var i = 0; i < handlers.length; i++) - handlers[i].call(this, aData); + if (aData.localName !== 'iq') { + for (var i = 0; i < handlers.length; i++) + handlers[i].call(this, aData); + + return; + } + + var ret; + for (var i = 0; i < handlers.length; i++) { + ret = handlers[i].call(this, aData); + if (typeof ret !== 'boolean') + return; //TODO: emit a big error! + + if (ret) + return; + } + + conn.send(Lightstring.stanzas.errors.iq('cancel', 'service-unavailable')); }, /** * @function Register an event handler. diff --git a/plugins/feature-not-implemented.js b/plugins/feature-not-implemented.js deleted file mode 100644 --- a/plugins/feature-not-implemented.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -/** - Copyright (c) 2012, Emmanuel Gil Peyrot - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -Lightstring.plugins['feature-not-implemented'] = { - namespaces: { - xmpp_stanzas: 'urn:ietf:params:xml:ns:xmpp-stanzas' - }, - handlers: { - 'iq': function callback(stanza) { - var type = stanza.DOM.getAttributeNS(null, 'type'); - if (type !== 'get' && type !== 'set') - return; - - var handlers = conn.handlers; - var events = [handlers['iq']]; - - var payload = stanza.DOM.firstChild; - if (payload) - events.push('iq/' + payload.namespaceURI + ':' + payload.localName); - - var only = events.every(function(handler) { - for (var i in handler) - if (callback !== handler[i]) - return false; - return true; - }); - - if (only) - conn.send("" + - "" + - "" + - "" + - ""); - } - } -};