import logging import base64 from xml.etree import cElementTree as ET from sleekxmpp.xmlstream.stanzabase import ElementBase, register_stanza_plugin from sleekxmpp.plugins import base from sleekxmpp.xmlstream.handler.callback import Callback from sleekxmpp.xmlstream.matcher.xpath import MatchXPath from sleekxmpp.stanza.iq import Iq import object class AliasQuery(ElementBase): namespace = 'alias:query' name = 'query' plugin_attrib = 'alias' interfaces = set(('node', 'type', 'items', 'object')) sub_interfaces = set(('items')) def addItem(self, node, permission = None): item = AliasItem(None, self) item['node'] = node if permission is not None: item['permission'] = permission class AliasItem(ElementBase): namespace = 'alias:query' name = 'item' plugin_attrib = 'item' interfaces = set(('node', 'permission')) class AliasPlugin(base.base_plugin): def plugin_init(self): self.description = 'Plugin to handle alias queries' register_stanza_plugin(Iq, AliasQuery) query_parser = MatchXPath('{{{}}}iq/{{{}}}query'.format(self.xmpp.default_ns, AliasQuery.namespace)) self.xmpp.register_handler(Callback('Alias queries', query_parser, self.handle_alias_query)) def handle_alias_query(self, iq): callee = base64.b64decode(iq['to'].user) caller = iq['alias']['from'] handler = object.ObjectHandler(callee) node = iq['alias']['node'] if not node: node = handler.get_home_node() if iq['alias']['type'] == 'items': logging.debug('childs of {} requested'.format(node)) childs = handler.get_child_list(node, caller) reply = AliasQuery() reply['node'] = node reply['type'] = 'items' for child in childs: reply.addItem(child, "test") iq.reply().set_payload(reply).send()