annotate sat/plugins/plugin_xep_0334.py @ 3981:acc9dfc8ba8d

component AP gateway: parse body immediately on `POST` request: the body is parsed immediately during a `POST` request: this avoids duplication of code, and allows to check the body data before continuing (will be used to filter some requests in a future patch).
author Goffi <goffi@goffi.org>
date Tue, 15 Nov 2022 18:07:34 +0100
parents 13a2403774d4
children 524856bd7b19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
1279
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)
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
5 # Copyright (C) 2009-2021 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
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3830
diff changeset
21 from typing import Iterable
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
22 from sat.core.i18n import _, D_
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
23 from sat.core.log import getLogger
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
24
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
25 log = getLogger(__name__)
2132
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2131
diff changeset
26 from sat.core.constants import Const as C
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
27
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
28 from sat.tools.common import data_format
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
29
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
30 from wokkel import disco, iwokkel
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
31
2698
5060cbeec01e core: minor style/typos fixes
Goffi <goffi@goffi.org>
parents: 2652
diff changeset
32 from twisted.words.protocols.jabber import xmlstream
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3830
diff changeset
33 from twisted.words.xish import domish
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
34 from zope.interface import implementer
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
35 from textwrap import dedent
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
36
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 PLUGIN_INFO = {
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
39 C.PI_NAME: "Message Processing Hints",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
40 C.PI_IMPORT_NAME: "XEP-0334",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
41 C.PI_TYPE: "XEP",
3830
68a11b95a7d3 plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
42 C.PI_MODES: C.PLUG_MODE_BOTH,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
43 C.PI_PROTOCOLS: ["XEP-0334"],
2145
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",
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
45 C.PI_HANDLER: "yes",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
46 C.PI_DESCRIPTION: D_("""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_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
49 """\
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
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
57 NS_HINTS = "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):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
61 HINT_NO_PERMANENT_STORE = "no-permanent-store"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
62 HINT_NO_STORE = "no-store"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
63 HINT_NO_COPY = "no-copy"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
64 HINT_STORE = "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)
3172
dcebc585c29f core: renamed "MessageReceived" trigger to "messageReceived" for consistency.
Goffi <goffi@goffi.org>
parents: 3137
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(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
79 "{hint} can only be used with full jids! Ignoring it.".format(hint=hint)
2624
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:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
86 log.error("Unknown hint: {}".format(hint))
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
87
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3830
diff changeset
88 def addHintElements(self, message_elt: domish.Element, hints: Iterable[str]) -> None:
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
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
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3830
diff changeset
91 @param message_elt: stanza where hints must be added
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3830
diff changeset
92 @param hints: hints to add
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
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:
3923
13a2403774d4 plugin XEP-0334: avoid adding twice the same hint:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
95 if not list(message_elt.elements(NS_HINTS, hint)):
13a2403774d4 plugin XEP-0334: avoid adding twice the same hint:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
96 message_elt.addElement((NS_HINTS, hint))
13a2403774d4 plugin XEP-0334: avoid adding twice the same hint:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
97 else:
13a2403774d4 plugin XEP-0334: avoid adding twice the same hint:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
98 log.debug('Not adding {hint!r} hint: it is already present in <message>')
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
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
100 def _sendPostXmlTreatment(self, mess_data):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
101 if "hints" in mess_data:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
102 self.addHintElements(mess_data["xml"], mess_data["hints"])
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
103 return mess_data
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
104
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
105 def sendMessageTrigger(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
106 self, client, mess_data, pre_xml_treatments, post_xml_treatments
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
107 ):
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
108 """Add the hints element to the message to be sent"""
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
109 if "hints" in mess_data["extra"]:
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
110 for hint in data_format.dict2iter("hints", mess_data["extra"], pop=True):
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
111 self.addHint(hint)
1279
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 post_xml_treatments.addCallback(self._sendPostXmlTreatment)
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
114 return True
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
115
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
116 def _receivedSkipHistory(self, mess_data):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
117 mess_data["history"] = C.HISTORY_SKIP
2132
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2131
diff changeset
118 return mess_data
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
119
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
120 def messageReceivedTrigger(self, client, message_elt, post_treat):
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
121 """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
122 for elt in message_elt.elements():
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
123 if elt.uri == NS_HINTS and elt.name in (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
124 self.HINT_NO_PERMANENT_STORE,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
125 self.HINT_NO_STORE,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
126 ):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
127 log.debug("history will be skipped for this message, as requested")
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
128 post_treat.addCallback(self._receivedSkipHistory)
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
129 break
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
130 return True
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
131
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
132
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
133 @implementer(iwokkel.IDisco)
2698
5060cbeec01e core: minor style/typos fixes
Goffi <goffi@goffi.org>
parents: 2652
diff changeset
134 class XEP_0334_handler(xmlstream.XMPPHandler):
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 getDiscoInfo(self, requestor, target, nodeIdentifier=""):
2131
628c1c95f442 plugin XEP-0334: fixed and improved message processing hints:
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
137 return [disco.DiscoFeature(NS_HINTS)]
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
138
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
139 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
1279
d84905c3e124 plugin XEP-0334: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
140 return []