aboutsummaryrefslogtreecommitdiffstats
path: root/server/alias_plugin.py
blob: fb57bd81aeea8e63f7defd8cedde772e52481736 (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import logging
logger = logging.getLogger(__name__)
import base64
import hashlib
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

from object import ObjectReader, ObjectError
from permission import PermissionError
from config import config

class AliasQuery(ElementBase):
    namespace = 'alias:iq:object'
    name = 'query'
    plugin_attrib = 'alias'
    interfaces = set(('node', 'type', 'content', 'permission', 'key'))
    sub_interfaces = set(('content', 'permission', 'key'))

    def addItem(self, node, key, permission = None):
        item = AliasItem(None, self)
        item['node'] = node
        item['key'] = key
        if permission is not None:
            item['permission'] = str(permission)

class AliasItem(ElementBase):
    namespace = 'alias:query'
    name = 'item'
    plugin_attrib = 'item'
    interfaces = set(('node', 'permission', 'key'))

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 post_init(self):
        base.base_plugin.post_init(self)
        self.xmpp.plugin['xep_0030'].add_feature("alias:query")

    def send_permission_error(self, iq, message):
        node = iq['alias']['node']
        iq.reply()
        iq['alias']['type'] = 'error'
        iq['alias']['node'] = node
        iq['alias']['permission'] = message
        iq.send()

    def handle_alias_query(self, iq):
        caller = iq['from'].bare
            
        try:
            callee = base64.b64decode(iq['to'].user)
        except TypeError:
            logger.error("callee field not base64 encoded")
        
        node = iq['alias']['node']
        node = ObjectReader(node, callee)
        if iq['alias']['type'] == 'get':
            try:
                content, key = node.get_content(caller)
            except PermissionError:
                self.send_permission_error(iq, 'Permission')
            else:
                iq.reply()
                iq['alias']['type'] = 'get'
                iq['alias']['node'] = node.hash
                iq['alias']['content'] = content
                iq['alias']['key'] = key
                iq.send()

        if iq['alias']['type'] == 'list':
            try:
                list = node.get_children_list(caller)
            except PermissionError:
                self.send_permission_error(iq, 'Permission')
            else:
                iq.reply()
                iq['alias']['type'] = 'content'
                iq['alias']['node'] = node.hash
                iq['alias']['content'] = content
                iq['alias']['key'] = key
                iq.send()