summaryrefslogtreecommitdiff
path: root/slixmpp/plugins/xep_0223.py
blob: 2461bb2063925c4acb9cf852f4923a6dea0c8d39 (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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
"""
    Slixmpp: The Slick XMPP Library
    Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
    This file is part of Slixmpp.

    See the file LICENSE for copying permission.
"""

import logging

from slixmpp.xmlstream import register_stanza_plugin
from slixmpp.plugins.base import BasePlugin, register_plugin


log = logging.getLogger(__name__)


class XEP_0223(BasePlugin):

    """
    XEP-0223: Persistent Storage of Private Data via PubSub
    """

    name = 'xep_0223'
    description = 'XEP-0223: Persistent Storage of Private Data via PubSub'
    dependencies = set(['xep_0163', 'xep_0060', 'xep_0004'])

    profile = {'pubsub#persist_items': True,
               'pubsub#send_last_published_item': 'never'}

    def configure(self, node):
        """
        Update a node's configuration to match the public storage profile.
        """
        # TODO: that cannot possibly work, why is this here?
        config = self.xmpp['xep_0004'].Form()
        config['type'] = 'submit'

        for field, value in self.profile.items():
            config.add_field(var=field, value=value)

        return self.xmpp['xep_0060'].set_node_config(None, node, config,
                                                     ifrom=ifrom,
                                                     callback=callback,
                                                     timeout=timeout)

    def store(self, stanza, node=None, id=None, ifrom=None, options=None,
              callback=None, timeout=None, timeout_callback=None):
        """
        Store private data via PEP.

        This is just a (very) thin wrapper around the XEP-0060 publish()
        method to set the defaults expected by PEP.

        Arguments:
            stanza   -- The private content to store.
            node     -- The node to publish the content to. If not specified,
                        the stanza's namespace will be used.
            id       -- Optionally specify the ID of the item.
            options  -- Publish options to use, which will be modified to
                        fit the persistent storage option profile.
            ifrom    -- Specify the sender's JID.
            timeout  -- The length of time (in seconds) to wait for a response
                        before exiting the send call if blocking is used.
                        Defaults to slixmpp.xmlstream.RESPONSE_TIMEOUT
            callback -- Optional reference to a stream handler function. Will
                        be executed when a reply stanza is received.
        """
        if not options:
            options = self.xmpp['xep_0004'].stanza.Form()
            options['type'] = 'submit'
            options.add_field(
                var='FORM_TYPE',
                ftype='hidden',
                value='http://jabber.org/protocol/pubsub#publish-options')

        fields = options['fields']
        for field, value in self.profile.items():
            if field not in fields:
                options.add_field(var=field)
            options['fields'][field]['value'] = value

        return self.xmpp['xep_0163'].publish(stanza, node, options=options,
                                             ifrom=ifrom, callback=callback,
                                             timeout=timeout,
                                             timeout_callback=timeout_callback)

    def retrieve(self, node, id=None, item_ids=None, ifrom=None,
                 callback=None, timeout=None, timeout_callback=None):
        """
        Retrieve private data via PEP.

        This is just a (very) thin wrapper around the XEP-0060 publish()
        method to set the defaults expected by PEP.

        Arguments:
            node     -- The node to retrieve content from.
            id       -- Optionally specify the ID of the item.
            item_ids -- Specify a group of IDs. If id is also specified, it
                        will be included in item_ids.
            ifrom    -- Specify the sender's JID.
            timeout  -- The length of time (in seconds) to wait for a response
                        before exiting the send call if blocking is used.
                        Defaults to slixmpp.xmlstream.RESPONSE_TIMEOUT
            callback -- Optional reference to a stream handler function. Will
                        be executed when a reply stanza is received.
        """
        if item_ids is None:
            item_ids = []
        if id is not None:
            item_ids.append(id)

        return self.xmpp['xep_0060'].get_items(None, node,
                                               item_ids=item_ids, ifrom=ifrom,
                                               callback=callback, timeout=timeout,
                                               timeout_callback=timeout_callback)


register_plugin(XEP_0223)