annotate libervia/backend/plugins/plugin_xep_0071.py @ 4306:94e0968987cd

plugin XEP-0033: code modernisation, improve delivery, data validation: - Code has been rewritten using Pydantic models and `async` coroutines for data validation and cleaner element parsing/generation. - Delivery has been completely rewritten. It now works even if server doesn't support multicast, and send to local multicast service first. Delivering to local multicast service first is due to bad support of XEP-0033 in server (notably Prosody which has an incomplete implementation), and the current impossibility to detect if a sub-domain service handles fully multicast or only for local domains. This is a workaround to have a good balance between backward compatilibity and use of bandwith, and to make it work with the incoming email gateway implementation (the gateway will only deliver to entities of its own domain). - disco feature checking now uses `async` corountines. `host` implementation still use Deferred return values for compatibility with legacy code. rel 450
author Goffi <goffi@goffi.org>
date Thu, 26 Sep 2024 16:12:01 +0200
parents 0d7bb4df2343
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
3
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT plugin for Publish-Subscribe (xep-0071)
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
6
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
11
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
16
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
19
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
20 from libervia.backend.core.i18n import _
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
21 from libervia.backend.core.constants import Const as C
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
22 from libervia.backend.core import exceptions
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
23 from libervia.backend.core.log import getLogger
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
24
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 922
diff changeset
25 log = getLogger(__name__)
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
26 from libervia.backend.tools.common import data_format
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
27
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
28 from twisted.internet import defer
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 922
diff changeset
29 from wokkel import disco, iwokkel
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
30 from zope.interface import implementer
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
31
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
32 # from lxml import etree
1542
94901070478e plugins: added new MissingModule exceptions to plugins using third party modules
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
33 try:
94901070478e plugins: added new MissingModule exceptions to plugins using third party modules
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
34 from lxml import html
94901070478e plugins: added new MissingModule exceptions to plugins using third party modules
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
35 except ImportError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
36 raise exceptions.MissingModule(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
37 "Missing module lxml, please download/install it from http://lxml.de/"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
38 )
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
39 try:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
40 from twisted.words.protocols.xmlstream import XMPPHandler
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
41 except ImportError:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
42 from wokkel.subprotocols import XMPPHandler
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
43
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
44 NS_XHTML_IM = "http://jabber.org/protocol/xhtml-im"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
45 NS_XHTML = "http://www.w3.org/1999/xhtml"
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
46
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
47 PLUGIN_INFO = {
2145
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
48 C.PI_NAME: "XHTML-IM Plugin",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
49 C.PI_IMPORT_NAME: "XEP-0071",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
50 C.PI_TYPE: "XEP",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
51 C.PI_PROTOCOLS: ["XEP-0071"],
2780
85d3240a400f plugin text syntaxes: changed import name to TEXT_SYNTAX (better with underscore for autocompletion)
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
52 C.PI_DEPENDENCIES: ["TEXT_SYNTAXES"],
2145
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
53 C.PI_MAIN: "XEP_0071",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
54 C.PI_HANDLER: "yes",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
55 C.PI_DESCRIPTION: _("""Implementation of XHTML-IM"""),
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
56 }
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
57
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
58 allowed = {
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
59 "a": set(["href", "style", "type"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
60 "blockquote": set(["style"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
61 "body": set(["style"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
62 "br": set([]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
63 "cite": set(["style"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
64 "em": set([]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
65 "img": set(["alt", "height", "src", "style", "width"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
66 "li": set(["style"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
67 "ol": set(["style"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
68 "p": set(["style"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
69 "span": set(["style"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
70 "strong": set([]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
71 "ul": set(["style"]),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
72 }
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
73
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
74 styles_allowed = [
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
75 "background-color",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
76 "color",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
77 "font-family",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
78 "font-size",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
79 "font-style",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
80 "font-weight",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
81 "margin-left",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
82 "margin-right",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
83 "text-align",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
84 "text-decoration",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
85 ]
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
86
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
87 blacklist = ["script"] # tag that we have to kill (we don't keep content)
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
88
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
89
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
90 class XEP_0071(object):
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
91 SYNTAX_XHTML_IM = "XHTML-IM"
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
92
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
93 def __init__(self, host):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 922
diff changeset
94 log.info(_("XHTML-IM plugin initialization"))
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
95 self.host = host
2780
85d3240a400f plugin text syntaxes: changed import name to TEXT_SYNTAX (better with underscore for autocompletion)
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
96 self._s = self.host.plugins["TEXT_SYNTAXES"]
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
97 self._s.add_syntax(
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
98 self.SYNTAX_XHTML_IM,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
99 lambda xhtml: xhtml,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
100 self.XHTML2XHTML_IM,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
101 [self._s.OPT_HIDDEN],
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
102 )
4051
c23cad65ae99 core: renamed `messageReceived` trigger to `message_received`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
103 host.trigger.add("message_received", self.message_received_trigger)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
104 host.trigger.add("sendMessage", self.send_message_trigger)
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
105
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
106 def get_handler(self, client):
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
107 return XEP_0071_handler(self)
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
108
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
109 def _message_post_treat(self, data, message_elt, body_elts, client):
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
110 """Callback which manage the post treatment of the message in case of XHTML-IM found
2110
2d633b3c923d plugin XEP-0231: Bits of Binary first draft:
Goffi <goffi@goffi.org>
parents: 2080
diff changeset
111
4051
c23cad65ae99 core: renamed `messageReceived` trigger to `message_received`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
112 @param data: data send by message_received trigger through post_treat deferred
2110
2d633b3c923d plugin XEP-0231: Bits of Binary first draft:
Goffi <goffi@goffi.org>
parents: 2080
diff changeset
113 @param message_elt: whole <message> stanza
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
114 @param body_elts: XHTML-IM body elements found
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
115 @return: the data with the extra parameter updated
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
116 """
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
117
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
118 # TODO: check if text only body is empty, then try to convert XHTML-IM to pure text and show a warning message
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
119 def converted(xhtml, lang):
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
120 if lang:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
121 data["extra"]["xhtml_{}".format(lang)] = xhtml
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
122 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
123 data["extra"]["xhtml"] = xhtml
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
124
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
125 defers = []
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
126 for body_elt in body_elts:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
127 lang = body_elt.getAttribute((C.NS_XML, "lang"), "")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
128 treat_d = defer.succeed(None) #  deferred used for treatments
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
129 if self.host.trigger.point(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
130 "xhtml_post_treat", client, message_elt, body_elt, lang, treat_d
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
131 ):
2110
2d633b3c923d plugin XEP-0231: Bits of Binary first draft:
Goffi <goffi@goffi.org>
parents: 2080
diff changeset
132 continue
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
133 treat_d.addCallback(
2765
378188abe941 misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
134 lambda __: self._s.convert(
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
135 body_elt.toXml(), self.SYNTAX_XHTML_IM, safe=True
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
136 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
137 )
2110
2d633b3c923d plugin XEP-0231: Bits of Binary first draft:
Goffi <goffi@goffi.org>
parents: 2080
diff changeset
138 treat_d.addCallback(converted, lang)
2d633b3c923d plugin XEP-0231: Bits of Binary first draft:
Goffi <goffi@goffi.org>
parents: 2080
diff changeset
139 defers.append(treat_d)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
140
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
141 d_list = defer.DeferredList(defers)
2765
378188abe941 misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
142 d_list.addCallback(lambda __: data)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
143 return d_list
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
144
2080
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
145 def _fill_body_text(self, text, data, lang):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
146 data["message"][lang or ""] = text
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
147 message_elt = data["xml"]
2080
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
148 body_elt = message_elt.addElement("body", content=text)
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
149 if lang:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
150 body_elt[(C.NS_XML, "lang")] = lang
2080
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
151
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
152 def _check_body_text(self, data, lang, markup, syntax, defers):
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
153 """check if simple text message exists, and fill if needed"""
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
154 if not (lang or "") in data["message"]:
2080
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
155 d = self._s.convert(markup, syntax, self._s.SYNTAX_TEXT)
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
156 d.addCallback(self._fill_body_text, data, lang)
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
157 defers.append(d)
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
158
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
159 def _send_message_add_rich(self, data, client):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
160 """Construct XHTML-IM node and add it XML element
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
161
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2110
diff changeset
162 @param data: message data as sended by sendMessage callback
702
a25db3fe3959 plugin XEP-0071: rich messages management for sendMessage
Goffi <goffi@goffi.org>
parents: 701
diff changeset
163 """
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
164 # at this point, either ['extra']['rich'] or ['extra']['xhtml'] exists
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
165 # but both can't exist at the same time
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
166 message_elt = data["xml"]
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
167 html_elt = message_elt.addElement((NS_XHTML_IM, "html"))
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
168
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
169 def syntax_converted(xhtml_im, lang):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
170 body_elt = html_elt.addElement((NS_XHTML, "body"))
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
171 if lang:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
172 body_elt[(C.NS_XML, "lang")] = lang
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
173 data["extra"]["xhtml_{}".format(lang)] = xhtml_im
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
174 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
175 data["extra"]["xhtml"] = xhtml_im
702
a25db3fe3959 plugin XEP-0071: rich messages management for sendMessage
Goffi <goffi@goffi.org>
parents: 701
diff changeset
176 body_elt.addRawXml(xhtml_im)
a25db3fe3959 plugin XEP-0071: rich messages management for sendMessage
Goffi <goffi@goffi.org>
parents: 701
diff changeset
177
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
178 syntax = self._s.get_current_syntax(client.profile)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
179 defers = []
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
180 if "xhtml" in data["extra"]:
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
181 # we have directly XHTML
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
182 for lang, xhtml in data_format.get_sub_dict("xhtml", data["extra"]):
2080
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
183 self._check_body_text(data, lang, xhtml, self._s.SYNTAX_XHTML, defers)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
184 d = self._s.convert(xhtml, self._s.SYNTAX_XHTML, self.SYNTAX_XHTML_IM)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
185 d.addCallback(syntax_converted, lang)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
186 defers.append(d)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
187 elif "rich" in data["extra"]:
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
188 # we have rich syntax to convert
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
189 for lang, rich_data in data_format.get_sub_dict("rich", data["extra"]):
2080
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
190 self._check_body_text(data, lang, rich_data, syntax, defers)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
191 d = self._s.convert(rich_data, syntax, self.SYNTAX_XHTML_IM)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
192 d.addCallback(syntax_converted, lang)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
193 defers.append(d)
2080
3626b2813158 plugin XEP-0071: fixed rich and xhtml sending + add simple text body if not present
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
194 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
195 exceptions.InternalError("xhtml or rich should be present at this point")
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
196 d_list = defer.DeferredList(defers)
2765
378188abe941 misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
197 d_list.addCallback(lambda __: data)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
198 return d_list
702
a25db3fe3959 plugin XEP-0071: rich messages management for sendMessage
Goffi <goffi@goffi.org>
parents: 701
diff changeset
199
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
200 def message_received_trigger(self, client, message, post_treat):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
201 """Check presence of XHTML-IM in message"""
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
202 try:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
203 html_elt = next(message.elements(NS_XHTML_IM, "html"))
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
204 except StopIteration:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
205 # No XHTML-IM
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
206 pass
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
207 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
208 body_elts = html_elt.elements(NS_XHTML, "body")
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
209 post_treat.addCallback(self._message_post_treat, message, body_elts, client)
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
210 return True
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
211
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
212 def send_message_trigger(self, client, data, pre_xml_treatments, post_xml_treatments):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
213 """Check presence of rich text in extra"""
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
214 rich = {}
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
215 xhtml = {}
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
216 for key, value in data["extra"].items():
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
217 if key.startswith("rich"):
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
218 rich[key[5:]] = value
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
219 elif key.startswith("xhtml"):
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
220 xhtml[key[6:]] = value
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
221 if rich and xhtml:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
222 raise exceptions.DataError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
223 _("Can't have XHTML and rich content at the same time")
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
224 )
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
225 if rich or xhtml:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
226 if rich:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
227 data["rich"] = rich
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
228 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
229 data["xhtml"] = xhtml
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
230 post_xml_treatments.addCallback(self._send_message_add_rich, client)
702
a25db3fe3959 plugin XEP-0071: rich messages management for sendMessage
Goffi <goffi@goffi.org>
parents: 701
diff changeset
231 return True
a25db3fe3959 plugin XEP-0071: rich messages management for sendMessage
Goffi <goffi@goffi.org>
parents: 701
diff changeset
232
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
233 def _purge_style(self, styles_raw):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
234 """Remove unauthorised styles according to the XEP-0071
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
235 @param styles_raw: raw styles (value of the style attribute)
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
236 """
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
237 purged = []
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
238
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
239 styles = [style.strip().split(":") for style in styles_raw.split(";")]
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
240
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
241 for style_tuple in styles:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
242 if len(style_tuple) != 2:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
243 continue
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
244 name, value = style_tuple
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
245 name = name.strip()
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
246 if name not in styles_allowed:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
247 continue
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
248 purged.append((name, value.strip()))
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
249
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
250 return "; ".join(["%s: %s" % data for data in purged])
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
251
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
252 def XHTML2XHTML_IM(self, xhtml):
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
253 """Convert XHTML document to XHTML_IM subset
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
254 @param xhtml: raw xhtml to convert
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
255 """
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
256 # TODO: more clever tag replacement (replace forbidden tags with equivalents when possible)
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
257
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
258 parser = html.HTMLParser(remove_comments=True, encoding="utf-8")
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
259 root = html.fromstring(xhtml, parser=parser)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
260 body_elt = root.find("body")
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
261 if body_elt is None:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
262 # we use the whole XML as body if no body element is found
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
263 body_elt = html.Element("body")
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
264 body_elt.append(root)
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
265 else:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
266 body_elt.attrib.clear()
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
267
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
268 allowed_tags = list(allowed.keys())
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
269 to_strip = []
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
270 for elem in body_elt.iter():
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
271 if elem.tag not in allowed_tags:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
272 to_strip.append(elem)
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
273 else:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
274 # we remove unallowed attributes
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
275 attrib = elem.attrib
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
276 att_to_remove = set(attrib).difference(allowed[elem.tag])
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
277 for att in att_to_remove:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
278 del attrib[att]
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
279 if "style" in attrib:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
280 attrib["style"] = self._purge_style(attrib["style"])
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
281
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
282 for elem in to_strip:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
283 if elem.tag in blacklist:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
284 # we need to remove the element and all descendants
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
285 log.debug("removing black listed tag: %s" % (elem.tag))
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
286 elem.drop_tree()
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
287 else:
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
288 elem.drop_tag()
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
289 if len(body_elt) != 1:
701
98b2400e17d6 plugin XEP-0071: XHTML2XHTML_IM don't return the <body> root tag anymore.
Goffi <goffi@goffi.org>
parents: 668
diff changeset
290 root_elt = body_elt
98b2400e17d6 plugin XEP-0071: XHTML2XHTML_IM don't return the <body> root tag anymore.
Goffi <goffi@goffi.org>
parents: 668
diff changeset
291 body_elt.tag = "p"
98b2400e17d6 plugin XEP-0071: XHTML2XHTML_IM don't return the <body> root tag anymore.
Goffi <goffi@goffi.org>
parents: 668
diff changeset
292 else:
98b2400e17d6 plugin XEP-0071: XHTML2XHTML_IM don't return the <body> root tag anymore.
Goffi <goffi@goffi.org>
parents: 668
diff changeset
293 root_elt = body_elt[0]
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
294
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
295 return html.tostring(root_elt, encoding="unicode", method="xml")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
296
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
297
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2780
diff changeset
298 @implementer(iwokkel.IDisco)
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
299 class XEP_0071_handler(XMPPHandler):
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
300
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
301 def __init__(self, plugin_parent):
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
302 self.plugin_parent = plugin_parent
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
303 self.host = plugin_parent.host
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
304
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
305 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
306 return [disco.DiscoFeature(NS_XHTML_IM)]
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
307
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
308 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
668
7bb50096d225 plugin XEP_0071: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
309 return []