Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0372.py @ 3913:944f51f9c2b4
core (xmpp): make `send` a blocking method, fix `sendMessageData` calls:
original `send` method is blocking, and it is used as such by Wokkel and thus can't be
changed to an async method easily. However, an Async method is necessary to have an async
trigger at the very end of the send workflow for end-to-end encryption. To workaround
that, `send` is an async method which call `a_send`, an async method which actually does
the sending. This way legacy method can still call `send` while `a_send` can be await
otherwise.
Fix calls to `sendMessageData`: the method now being an `async` one, `ensureDeferred` had
to be used in some calls.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 24 Sep 2022 16:31:39 +0200 |
parents | 68a11b95a7d3 |
children | 524856bd7b19 |
rev | line source |
---|---|
3830
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # Libervia plugin for XEP-0372 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # Copyright (C) 2009-2022 Jérôme Poisson (goffi@goffi.org) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 from typing import Optional, Dict, Union |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 from textwrap import dedent |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 from sat.core import exceptions |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from sat.tools.common import uri as xmpp_uri |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from twisted.internet import defer |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from twisted.words.protocols.jabber import jid |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from twisted.words.protocols.jabber.xmlstream import XMPPHandler |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 from twisted.words.xish import domish |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from zope.interface import implementer |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from wokkel import disco, iwokkel |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 from sat.core.constants import Const as C |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 from sat.core.i18n import _ |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 from sat.core.log import getLogger |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 from sat.core.core_types import SatXMPPEntity |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 from sat.tools.common import data_format |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 log = getLogger(__name__) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 PLUGIN_INFO = { |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 C.PI_NAME: "References", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 C.PI_IMPORT_NAME: "XEP-0372", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 C.PI_TYPE: C.PLUG_TYPE_XEP, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 C.PI_MODES: C.PLUG_MODE_BOTH, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 C.PI_PROTOCOLS: ["XEP-0372"], |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 C.PI_DEPENDENCIES: ["XEP-0334"], |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 C.PI_MAIN: "XEP_0372", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 C.PI_HANDLER: "yes", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 C.PI_DESCRIPTION: _(dedent("""\ |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 XEP-0372 (References) implementation |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 This plugin implement generic references and mentions. |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 """)), |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 } |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 NS_REFS = "urn:xmpp:reference:0" |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 ALLOWED_TYPES = ("mention", "data") |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 class XEP_0372: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 namespace = NS_REFS |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 def __init__(self, host): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 log.info(_("References plugin initialization")) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 host.registerNamespace("refs", NS_REFS) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 self.host = host |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 self._h = host.plugins["XEP-0334"] |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 host.trigger.add("messageReceived", self._messageReceivedTrigger) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 host.bridge.addMethod( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 "referenceSend", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 ".plugin", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 in_sign="sssss", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 out_sign="", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 method=self._sendReference, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 async_=False, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 ) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 def getHandler(self, client): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 return XEP_0372_Handler() |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 def refElementToRefData( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 self, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 reference_elt: domish.Element |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 ) -> Dict[str, Union[str, int, dict]]: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 ref_data: Dict[str, Union[str, int, dict]] = { |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 "uri": reference_elt["uri"], |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 "type": reference_elt["type"] |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 } |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 if ref_data["uri"].startswith("xmpp:"): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 ref_data["parsed_uri"] = xmpp_uri.parseXMPPUri(ref_data["uri"]) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 for attr in ("begin", "end"): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 try: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 ref_data[attr] = int(reference_elt[attr]) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 except (KeyError, ValueError, TypeError): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 continue |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 anchor = reference_elt.getAttribute("anchor") |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 if anchor is not None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 ref_data["anchor"] = anchor |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 if anchor.startswith("xmpp:"): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 ref_data["parsed_anchor"] = xmpp_uri.parseXMPPUri(anchor) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 return ref_data |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 async def _messageReceivedTrigger( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 self, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 client: SatXMPPEntity, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 message_elt: domish.Element, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 post_treat: defer.Deferred |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 ) -> bool: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 """Check if a direct invitation is in the message, and handle it""" |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 reference_elt = next(message_elt.elements(NS_REFS, "reference"), None) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 if reference_elt is None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 return True |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 try: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 ref_data = self.refElementToRefData(reference_elt) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 except KeyError: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 log.warning("invalid <reference> element: {reference_elt.toXml}") |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 return True |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 if not await self.host.trigger.asyncPoint( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 "XEP-0372_ref_received", client, message_elt, ref_data |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 ): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 return False |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 return True |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 def buildRefElement( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
129 self, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 uri: str, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 type_: str = "mention", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 begin: Optional[int] = None, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 end: Optional[int] = None, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 anchor: Optional[str] = None, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 ) -> domish.Element: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 """Build and return the <reference> element""" |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 if type_ not in ALLOWED_TYPES: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 raise ValueError(f"Unknown type: {type_!r}") |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 reference_elt = domish.Element( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 (NS_REFS, "reference"), |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 attribs={"uri": uri, "type": type_} |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 ) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 if begin is not None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 reference_elt["begin"] = str(begin) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 if end is not None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 reference_elt["end"] = str(end) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
147 if anchor is not None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 reference_elt["anchor"] = anchor |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
149 return reference_elt |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
150 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 def _sendReference( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 self, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 recipient: str, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 anchor: str, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 type_: str, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 extra_s: str, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 profile_key: str |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 ) -> defer.Deferred: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 recipient_jid = jid.JID(recipient) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 client = self.host.getClient(profile_key) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 extra: dict = data_format.deserialise(extra_s, default={}) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 self.sendReference( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 client, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 uri=extra.get("uri"), |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 type_=type_, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 anchor=anchor, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 to_jid=recipient_jid |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 ) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
170 def sendReference( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 self, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 client: "SatXMPPEntity", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 uri: Optional[str] = None, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
174 type_: str = "mention", |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
175 begin: Optional[int] = None, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 end: Optional[int] = None, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 anchor: Optional[str] = None, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 message_elt: Optional[domish.Element] = None, |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 to_jid: Optional[jid.JID] = None |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 ) -> None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 """Build and send a reference_elt |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 @param uri: URI pointing to referenced object (XMPP entity, Pubsub Item, etc) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 if not set, "to_jid" will be used to build an URI to the entity |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 @param type_: type of reference |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 one of [ALLOWED_TYPES] |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 @param begin: optional begin index |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 @param end: optional end index |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 @param anchor: URI of refering object (message, pubsub item), when the refence |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 is not already in the wrapping message element. In other words, it's the |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 object where the reference appears. |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 @param message_elt: wrapping <message> element, if not set a new one will be |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 generated |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 @param to_jid: destinee of the reference. If not specified, "to" attribute of |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
195 message_elt will be used. |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
197 """ |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
198 if uri is None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
199 if to_jid is None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
200 raise exceptions.InternalError( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
201 '"to_jid" must be set if "uri is None"' |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
202 ) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 uri = xmpp_uri.buildXMPPUri(path=to_jid.full()) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
204 if message_elt is None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
205 message_elt = domish.Element((None, "message")) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
206 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
207 if to_jid is not None: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
208 message_elt["to"] = to_jid.full() |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
209 else: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
210 try: |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
211 to_jid = jid.JID(message_elt["to"]) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
212 except (KeyError, RuntimeError): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
213 raise exceptions.InternalError( |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
214 'invalid "to" attribute in given message element: ' |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
215 '{message_elt.toXml()}' |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 ) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
217 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
218 message_elt.addChild(self.buildRefElement(uri, type_, begin, end, anchor)) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
219 self._h.addHintElements(message_elt, [self._h.HINT_STORE]) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
220 client.send(message_elt) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
221 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
222 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
223 @implementer(iwokkel.IDisco) |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
224 class XEP_0372_Handler(XMPPHandler): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
225 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
226 def getDiscoInfo(self, requestor, service, nodeIdentifier=""): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
227 return [disco.DiscoFeature(NS_REFS)] |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
228 |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
229 def getDiscoItems(self, requestor, service, nodeIdentifier=""): |
68a11b95a7d3
plugin XEP-0372: References implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
230 return [] |