comparison libervia/backend/plugins/plugin_xep_0297.py @ 4071:4b842c1fb686

refactoring: renamed `sat` package to `libervia.backend`
author Goffi <goffi@goffi.org>
date Fri, 02 Jun 2023 11:49:51 +0200
parents sat/plugins/plugin_xep_0297.py@524856bd7b19
children
comparison
equal deleted inserted replaced
4070:d10748475025 4071:4b842c1fb686
1 #!/usr/bin/env python3
2
3
4 # SAT plugin for Stanza Forwarding (XEP-0297)
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
6 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org)
7
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU Affero General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU Affero General Public License for more details.
17
18 # You should have received a copy of the GNU Affero General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
21 from libervia.backend.core.constants import Const as C
22 from libervia.backend.core.i18n import _, D_
23 from libervia.backend.core.log import getLogger
24
25 from twisted.internet import defer
26
27 log = getLogger(__name__)
28
29 from wokkel import disco, iwokkel
30
31 try:
32 from twisted.words.protocols.xmlstream import XMPPHandler
33 except ImportError:
34 from wokkel.subprotocols import XMPPHandler
35 from zope.interface import implementer
36
37 from twisted.words.xish import domish
38
39 PLUGIN_INFO = {
40 C.PI_NAME: "Stanza Forwarding",
41 C.PI_IMPORT_NAME: "XEP-0297",
42 C.PI_TYPE: "XEP",
43 C.PI_PROTOCOLS: ["XEP-0297"],
44 C.PI_MAIN: "XEP_0297",
45 C.PI_HANDLER: "yes",
46 C.PI_DESCRIPTION: D_("""Implementation of Stanza Forwarding"""),
47 }
48
49
50 class XEP_0297(object):
51 # FIXME: check this implementation which doesn't seems to be used
52
53 def __init__(self, host):
54 log.info(_("Stanza Forwarding plugin initialization"))
55 self.host = host
56
57 def get_handler(self, client):
58 return XEP_0297_handler(self, client.profile)
59
60 @classmethod
61 def update_uri(cls, element, uri):
62 """Update recursively the element URI.
63
64 @param element (domish.Element): element to update
65 @param uri (unicode): new URI
66 """
67 # XXX: we need this because changing the URI of an existing element
68 # containing children doesn't update the children's blank URI.
69 element.uri = uri
70 element.defaultUri = uri
71 for child in element.children:
72 if isinstance(child, domish.Element) and not child.uri:
73 XEP_0297.update_uri(child, uri)
74
75 def forward(self, stanza, to_jid, stamp, body="", profile_key=C.PROF_KEY_NONE):
76 """Forward a message to the given JID.
77
78 @param stanza (domish.Element): original stanza to be forwarded.
79 @param to_jid (JID): recipient JID.
80 @param stamp (datetime): offset-aware timestamp of the original reception.
81 @param body (unicode): optional description.
82 @param profile_key (unicode): %(doc_profile_key)s
83 @return: a Deferred when the message has been sent
84 """
85 # FIXME: this method is not used and doesn't use mess_data which should be used for client.send_message_data
86 # should it be deprecated? A method constructing the element without sending it seems more natural
87 log.warning(
88 "THIS METHOD IS DEPRECATED"
89 ) #  FIXME: we use this warning until we check the method
90 msg = domish.Element((None, "message"))
91 msg["to"] = to_jid.full()
92 msg["type"] = stanza["type"]
93
94 body_elt = domish.Element((None, "body"))
95 if body:
96 body_elt.addContent(body)
97
98 forwarded_elt = domish.Element((C.NS_FORWARD, "forwarded"))
99 delay_elt = self.host.plugins["XEP-0203"].delay(stamp)
100 forwarded_elt.addChild(delay_elt)
101 if not stanza.uri: # None or ''
102 XEP_0297.update_uri(stanza, "jabber:client")
103 forwarded_elt.addChild(stanza)
104
105 msg.addChild(body_elt)
106 msg.addChild(forwarded_elt)
107
108 client = self.host.get_client(profile_key)
109 return defer.ensureDeferred(client.send_message_data({"xml": msg}))
110
111
112 @implementer(iwokkel.IDisco)
113 class XEP_0297_handler(XMPPHandler):
114
115 def __init__(self, plugin_parent, profile):
116 self.plugin_parent = plugin_parent
117 self.host = plugin_parent.host
118 self.profile = profile
119
120 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
121 return [disco.DiscoFeature(C.NS_FORWARD)]
122
123 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
124 return []