annotate src/plugins/plugin_xep_0297.py @ 2138:6e509ee853a8

plugin OTR, core; use of new sendMessage + OTR mini refactoring: - new client.sendMessage method is used instead of sendMessageToStream - client.feedback is used in OTR - OTR now add message processing hints and carbon private element as recommanded by XEP-0364. Explicit Message Encryption is still TODO - OTR use the new sendMessageFinish trigger, this has a number of advantages: * there is little risk that OTR is skipped by other plugins (they have to use client.sendMessage as recommanded) * being at the end of the chain, OTR can check and remove any HTML or other leaking elements * OTR doesn't have to skip other plugins anymore, this means that things like delivery receipts are now working with OTR (but because there is not full stanza encryption, they can leak metadata) * OTR can decide to follow storage hint by letting or deleting "history" key
author Goffi <goffi@goffi.org>
date Sun, 05 Feb 2017 15:00:01 +0100
parents 410e7a940a8b
children 1d3f73e065e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1934
2daf7b4c6756 use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
1 #!/usr/bin/env python2
1274
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
3
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
4 # SAT plugin for Stanza Forwarding (XEP-0297)
1766
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org)
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
6 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org)
1274
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
7
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
8 # This program is free software: you can redistribute it and/or modify
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
9 # it under the terms of the GNU Affero General Public License as published by
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
10 # the Free Software Foundation, either version 3 of the License, or
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
11 # (at your option) any later version.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
12
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
13 # This program is distributed in the hope that it will be useful,
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
16 # GNU Affero General Public License for more details.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
17
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
18 # You should have received a copy of the GNU Affero General Public License
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
20
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
21 from sat.core.constants import Const as C
2137
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
22 from sat.core.i18n import _, D_
1274
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
23 from sat.core.log import getLogger
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
24 log = getLogger(__name__)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
25
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
26 from wokkel import disco, iwokkel
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
27 try:
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
28 from twisted.words.protocols.xmlstream import XMPPHandler
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
29 except ImportError:
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
30 from wokkel.subprotocols import XMPPHandler
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
31 from zope.interface import implements
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
32
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
33 from twisted.words.xish import domish
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
34
2099
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
35 NS_SF = C.NS_FORWARD
1274
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
36
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
37 PLUGIN_INFO = {
2137
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
38 u"name": u"Stanza Forwarding",
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
39 u"import_name": u"XEP-0297",
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
40 u"type": u"XEP",
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
41 u"protocols": [u"XEP-0297"],
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
42 u"main": "XEP_0297",
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
43 u"handler": u"yes",
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
44 u"description": D_(u"""Implementation of Stanza Forwarding""")
1274
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
45 }
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
46
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
47
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
48 class XEP_0297(object):
2137
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
49 # FIXME: check this implementation which doesn't seems to be used
1274
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
50
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
51 def __init__(self, host):
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
52 log.info(_("Stanza Forwarding plugin initialization"))
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
53 self.host = host
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
54
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
55 def getHandler(self, profile):
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
56 return XEP_0297_handler(self, profile)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
57
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
58 @classmethod
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
59 def updateUri(cls, element, uri):
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
60 """Update recursively the element URI.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
61
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
62 @param element (domish.Element): element to update
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
63 @param uri (unicode): new URI
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
64 """
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
65 # XXX: we need this because changing the URI of an existing element
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
66 # containing children doesn't update the children's blank URI.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
67 element.uri = uri
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
68 element.defaultUri = uri
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
69 for child in element.children:
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
70 if isinstance(child, domish.Element) and not child.uri:
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
71 XEP_0297.updateUri(child, uri)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
72
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
73 def forward(self, stanza, to_jid, stamp, body='', profile_key=C.PROF_KEY_NONE):
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
74 """Forward a message to the given JID.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
75
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
76 @param stanza (domish.Element): original stanza to be forwarded.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
77 @param to_jid (JID): recipient JID.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
78 @param stamp (datetime): offset-aware timestamp of the original reception.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
79 @param body (unicode): optional description.
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
80 @param profile_key (unicode): %(doc_profile_key)s
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
81 @return: a Deferred when the message has been sent
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
82 """
2137
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
83 # FIXME: this method is not used and doesn't use mess_data which should be used for client.sendMessage
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
84 # should it be deprecated? A method constructing the element without sending it seems more natural
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
85 log.warning(u"THIS METHOD IS DEPRECATED") # FIXME: we use this warning until we check the method
1274
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
86 msg = domish.Element((None, 'message'))
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
87 msg['to'] = to_jid.full()
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
88 msg['type'] = stanza['type']
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
89
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
90 body_elt = domish.Element((None, 'body'))
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
91 if body:
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
92 body_elt.addContent(body)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
93
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
94 forwarded_elt = domish.Element((NS_SF, 'forwarded'))
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
95 delay_elt = self.host.plugins['XEP-0203'].delay(stamp)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
96 forwarded_elt.addChild(delay_elt)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
97 if not stanza.uri: # None or ''
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
98 XEP_0297.updateUri(stanza, 'jabber:client')
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
99 forwarded_elt.addChild(stanza)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
100
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
101 msg.addChild(body_elt)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
102 msg.addChild(forwarded_elt)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
103
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
104 client = self.host.getClient(profile_key)
2137
410e7a940a8b plugin XEP-0297: used sendMessage in forward, and added comment/warning:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
105 return client.sendMessage({u'xml': msg})
1274
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
106
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
107
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
108 class XEP_0297_handler(XMPPHandler):
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
109 implements(iwokkel.IDisco)
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
110
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
111 def __init__(self, plugin_parent, profile):
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
112 self.plugin_parent = plugin_parent
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
113 self.host = plugin_parent.host
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
114 self.profile = profile
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
115
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
116 def getDiscoInfo(self, requestor, target, nodeIdentifier=''):
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
117 return [disco.DiscoFeature(NS_SF)]
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
118
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
119 def getDiscoItems(self, requestor, target, nodeIdentifier=''):
5b6d5e2d6caa plugin XEP-0297: first draft
souliane <souliane@mailoo.org>
parents:
diff changeset
120 return []