annotate sat/plugins/plugin_xep_0334.py @ 2652:baccc27d5c5c

plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
author Goffi <goffi@goffi.org>
date Sat, 11 Aug 2018 18:24:55 +0200
parents 56f94936df1e
children 5060cbeec01e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1934
2daf7b4c6756 use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
1 #!/usr/bin/env python2
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
3
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
4 # SAT plugin for Delayed Delivery (XEP-0334)
2483
0046283a285d dates update
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
5 # Copyright (C) 2009-2018 Jérôme Poisson (goffi@goffi.org)
1766
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
6 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org)
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
7
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
8 # This program is free software: you can redistribute it and/or modify
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
9 # it under the terms of the GNU Affero General Public License as published by
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
10 # the Free Software Foundation, either version 3 of the License, or
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
11 # (at your option) any later version.
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
12
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
13 # This program is distributed in the hope that it will be useful,
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
16 # GNU Affero General Public License for more details.
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
17
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
18 # You should have received a copy of the GNU Affero General Public License
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
20
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
21 from sat.core.i18n import _, D_
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
22 from sat.core.log import getLogger
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
23
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
24 log = getLogger(__name__)
2132
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2131
diff changeset
25 from sat.core.constants import Const as C
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
26
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
27 from sat.tools.common import data_format
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
28
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
29 from wokkel import disco, iwokkel
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
30
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
31 try:
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
32 from twisted.words.protocols.xmlstream import XMPPHandler
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
33 except ImportError:
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
34 from wokkel.subprotocols import XMPPHandler
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
35 from zope.interface import implements
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
36 from textwrap import dedent
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
37
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
38
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
39 PLUGIN_INFO = {
2145
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
40 C.PI_NAME: u"Message Processing Hints",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
41 C.PI_IMPORT_NAME: u"XEP-0334",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
42 C.PI_TYPE: u"XEP",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
43 C.PI_PROTOCOLS: [u"XEP-0334"],
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
44 C.PI_MAIN: "XEP_0334",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
45 C.PI_HANDLER: u"yes",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
46 C.PI_DESCRIPTION: D_(u"""Implementation of Message Processing Hints"""),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
47 C.PI_USAGE: dedent(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
48 D_(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
49 u"""\
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
50 Frontends can use HINT_* constants in mess_data['extra'] in a serialized 'hints' dict.
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
51 Internal plugins can use directly addHint([HINT_* constant]).
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
52 Will set mess_data['extra']['history'] to 'skipped' when no store is requested and message is not saved in history."""
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
53 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
54 ),
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
55 }
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
56
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
57 NS_HINTS = u"urn:xmpp:hints"
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
58
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
59
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
60 class XEP_0334(object):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
61 HINT_NO_PERMANENT_STORE = u"no-permanent-store"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
62 HINT_NO_STORE = u"no-store"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
63 HINT_NO_COPY = u"no-copy"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
64 HINT_STORE = u"store"
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
65 HINTS = (HINT_NO_PERMANENT_STORE, HINT_NO_STORE, HINT_NO_COPY, HINT_STORE)
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
66
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
67 def __init__(self, host):
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
68 log.info(_("Message Processing Hints plugin initialization"))
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
69 self.host = host
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
70 host.trigger.add("sendMessage", self.sendMessageTrigger)
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
71 host.trigger.add("MessageReceived", self.messageReceivedTrigger, priority=-1000)
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
72
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
73 def getHandler(self, client):
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
74 return XEP_0334_handler()
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
75
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
76 def addHint(self, mess_data, hint):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
77 if hint == self.HINT_NO_COPY and not mess_data["to"].resource:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
78 log.error(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
79 u"{hint} can only be used with full jids! Ignoring it.".format(hint=hint)
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
80 )
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
81 return
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
82 hints = mess_data.setdefault("hints", set())
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
83 if hint in self.HINTS:
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
84 hints.add(hint)
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
85 else:
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
86 log.error(u"Unknown hint: {}".format(hint))
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
87
2652
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
88 def addHintElements(self, message_elt, hints):
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
89 """Add hints elements to message stanza
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
90
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
91 @param message_elt(domish.Element): stanza where hints must be added
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
92 @param hints(iterable(unicode)): hints to add
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
93 """
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
94 for hint in hints:
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
95 message_elt.addElement((NS_HINTS, hint))
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
96
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
97 def _sendPostXmlTreatment(self, mess_data):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
98 if "hints" in mess_data:
2652
baccc27d5c5c plugin XEP-0334: added a method to add hint directly to elements (i.e. on domish.Element instead of message data)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
99 self.addHintElements(mess_data[u"xml"], mess_data[u"hints"])
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
100 return mess_data
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
101
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
102 def sendMessageTrigger(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
103 self, client, mess_data, pre_xml_treatments, post_xml_treatments
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
104 ):
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
105 """Add the hints element to the message to be sent"""
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
106 if u"hints" in mess_data[u"extra"]:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
107 for hint in data_format.dict2iter(u"hints", mess_data[u"extra"], pop=True):
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
108 self.addHint(hint)
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
109
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
110 post_xml_treatments.addCallback(self._sendPostXmlTreatment)
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
111 return True
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
112
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
113 def _receivedSkipHistory(self, mess_data):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
114 mess_data[u"history"] = C.HISTORY_SKIP
2132
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2131
diff changeset
115 return mess_data
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
116
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
117 def messageReceivedTrigger(self, client, message_elt, post_treat):
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
118 """Check for hints in the received message"""
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
119 for elt in message_elt.elements():
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
120 if elt.uri == NS_HINTS and elt.name in (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
121 self.HINT_NO_PERMANENT_STORE,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
122 self.HINT_NO_STORE,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
123 ):
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
124 log.debug(u"history will be skipped for this message, as requested")
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
125 post_treat.addCallback(self._receivedSkipHistory)
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
126 break
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
127 return True
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
128
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
129
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
130 class XEP_0334_handler(XMPPHandler):
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
131 implements(iwokkel.IDisco)
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
132
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
133 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
134 return [disco.DiscoFeature(NS_HINTS)]
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
135
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
136 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
137 return []