aboutsummaryrefslogtreecommitdiffstats
path: root/plugin.py
blob: 5b909cfcceebbb955d77861a34271705a4e34776 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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()