Mercurial > libervia-backend
annotate src/plugins/plugin_xep_0033.py @ 1265:e3a9ea76de35 frontends_multi_profiles
quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
This refactoring allow primitivus to manage correctly several profiles at once, with various other improvments:
- profile_manager can now plug several profiles at once, requesting password when needed. No more profile plug specific method is used anymore in backend, instead a "validated" key is used in actions
- Primitivus widget are now based on a common "PrimitivusWidget" classe which mainly manage the decoration so far
- all widgets are treated in the same way (contactList, Chat, Progress, etc), no more chat_wins specific behaviour
- widgets are created in a dedicated manager, with facilities to react on new widget creation or other events
- quick_frontend introduce a new QuickWidget class, which aims to be as generic and flexible as possible. It can manage several targets (jids or something else), and several profiles
- each widget class return a Hash according to its target. For example if given a target jid and a profile, a widget class return a hash like (target.bare, profile), the same widget will be used for all resources of the same jid
- better management of CHAT_GROUP mode for Chat widgets
- some code moved from Primitivus to QuickFrontend, the final goal is to have most non backend code in QuickFrontend, and just graphic code in subclasses
- no more (un)escapePrivate/PRIVATE_PREFIX
- contactList improved a lot: entities not in roster and special entities (private MUC conversations) are better managed
- resources can be displayed in Primitivus, and their status messages
- profiles are managed in QuickFrontend with dedicated managers
This is work in progress, other frontends are broken. Urwid SàText need to be updated. Most of features of Primitivus should work as before (or in a better way ;))
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 10 Dec 2014 19:00:09 +0100 |
parents | 3e234902177a |
children | 0befb14ecf62 |
rev | line source |
---|---|
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
1 #!/usr/bin/python |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
3 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
4 # SAT plugin for Extended Stanza Addressing (xep-0033) |
811 | 5 # Copyright (C) 2013, 2014 Adrien Cossa (souliane@mailoo.org) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
6 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
11 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
16 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
19 |
771 | 20 from sat.core.i18n import _ |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
922
diff
changeset
|
21 from sat.core.log import getLogger |
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
922
diff
changeset
|
22 log = getLogger(__name__) |
1052
e88bff4c8b77
core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents:
999
diff
changeset
|
23 from sat.core import exceptions |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
24 from wokkel import disco, iwokkel |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
25 from zope.interface import implements |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
26 from twisted.words.protocols.jabber.jid import JID |
1052
e88bff4c8b77
core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents:
999
diff
changeset
|
27 from twisted.python import failure |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
28 import copy |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
29 try: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
30 from twisted.words.protocols.xmlstream import XMPPHandler |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
31 except ImportError: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
32 from wokkel.subprotocols import XMPPHandler |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
33 from twisted.words.xish import domish |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
922
diff
changeset
|
34 from twisted.internet import defer |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
35 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
36 from sat.tools.misc import TriggerManager |
749
192b804ee446
plugin XEP-0033: bug fix for sending messages with the addressing feature to several servers
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
37 from time import time |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
38 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
39 # TODO: fix Prosody "addressing" plugin to leave the concerned bcc according to the spec: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
40 # |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
41 # http://xmpp.org/extensions/xep-0033.html#addr-type-bcc |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
42 # "This means that the server MUST remove these addresses before the stanza is delivered to anyone other than the given bcc addressee or the multicast service of the bcc addressee." |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
43 # |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
44 # http://xmpp.org/extensions/xep-0033.html#multicast |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
45 # "Each 'bcc' recipient MUST receive only the <address type='bcc'/> associated with that addressee." |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
46 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
47 # TODO: fix Prosody "addressing" plugin to determine itself if remote servers supports this XEP |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
48 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
49 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
50 NS_XMPP_CLIENT = "jabber:client" |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
51 NS_ADDRESS = "http://jabber.org/protocol/address" |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
52 ATTRIBUTES = ["jid", "uri", "node", "desc", "delivered", "type"] |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
53 ADDRESS_TYPES = ["to", "cc", "bcc", "replyto", "replyroom", "noreply"] |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
54 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
55 PLUGIN_INFO = { |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
56 "name": "Extended Stanza Addressing Protocol Plugin", |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
57 "import_name": "XEP-0033", |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
58 "type": "XEP", |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
59 "protocols": ["XEP-0033"], |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
60 "dependencies": [], |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
61 "main": "XEP_0033", |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
62 "handler": "yes", |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
63 "description": _("""Implementation of Extended Stanza Addressing""") |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
64 } |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
65 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
66 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
67 class XEP_0033(object): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
68 """ |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
69 Implementation for XEP 0033 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
70 """ |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
71 def __init__(self, host): |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
922
diff
changeset
|
72 log.info(_("Extended Stanza Addressing plugin initialization")) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
73 self.host = host |
749
192b804ee446
plugin XEP-0033: bug fix for sending messages with the addressing feature to several servers
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
74 self.internal_data = {} |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
75 host.trigger.add("sendMessage", self.sendMessageTrigger, TriggerManager.MIN_PRIORITY) |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
76 host.trigger.add("MessageReceived", self.messageReceivedTrigger) |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
77 |
922
c897c8d321b3
core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
Goffi <goffi@goffi.org>
parents:
844
diff
changeset
|
78 def sendMessageTrigger(self, mess_data, pre_xml_treatments, post_xml_treatments, profile): |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
79 """Process the XEP-0033 related data to be sent""" |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
80 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
81 def treatment(mess_data): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
82 if not 'address' in mess_data['extra']: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
83 return mess_data |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
84 |
999
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
85 def discoCallback(entities): |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
86 if not entities: |
1052
e88bff4c8b77
core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents:
999
diff
changeset
|
87 log.warning(_("XEP-0033 is being used but the server doesn't support it!")) |
e88bff4c8b77
core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents:
999
diff
changeset
|
88 raise failure.Failure(exceptions.CancelError()) |
999
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
89 if mess_data["to"] not in entities: |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
90 expected = _(' or ').join([entity.userhost() for entity in entities]) |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
91 log.warning(_("Stanzas using XEP-0033 should be addressed to %(expected)s, not %(current)s!") % {'expected': expected, 'current': mess_data["to"]}) |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
92 log.warning(_("TODO: addressing has been fixed by the backend... fix it in the frontend!")) |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
93 mess_data["to"] = list(entities)[0].userhostJID() |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
94 element = mess_data['xml'].addElement('addresses', NS_ADDRESS) |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
95 entries = [entry.split(':') for entry in mess_data['extra']['address'].split('\n') if entry != ''] |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
96 for type_, jid_ in entries: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
97 element.addChild(domish.Element((None, 'address'), None, {'type': type_, 'jid': jid_})) |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
98 # when the prosody plugin is completed, we can immediately return mess_data from here |
750
c8b9f675ac17
plugin XEP-0033: avoid the controlled error to explode (use return Failure(...) instead of raise)
souliane <souliane@mailoo.org>
parents:
749
diff
changeset
|
99 self.sendAndStoreMessage(mess_data, entries, profile) |
1052
e88bff4c8b77
core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents:
999
diff
changeset
|
100 log.debug("XEP-0033 took over") |
e88bff4c8b77
core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents:
999
diff
changeset
|
101 raise failure.Failure(exceptions.CancelError()) |
999
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
102 d = self.host.findFeaturesSet([NS_ADDRESS], profile_key=profile) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
103 d.addCallbacks(discoCallback, lambda dummy: discoCallback(None)) |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
104 return d |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
105 |
922
c897c8d321b3
core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
Goffi <goffi@goffi.org>
parents:
844
diff
changeset
|
106 post_xml_treatments.addCallback(treatment) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
107 return True |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
108 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
109 def sendAndStoreMessage(self, mess_data, entries, profile): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
110 """Check if target servers support XEP-0033, send and store the messages |
750
c8b9f675ac17
plugin XEP-0033: avoid the controlled error to explode (use return Failure(...) instead of raise)
souliane <souliane@mailoo.org>
parents:
749
diff
changeset
|
111 @return: a friendly failure to let the core know that we sent the message already |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
112 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
113 Later we should be able to remove this method because: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
114 # XXX: sending the messages should be done by the local server |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
115 # FIXME: for now we duplicate the messages in the history for each recipient, this should change |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
116 # FIXME: for now we duplicate the echoes to the sender, this should also change |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
117 Ideas: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
118 - fix Prosody plugin to check if target server support the feature |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
119 - redesign the database to save only one entry to the database |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
120 - change the newMessage signal to eventually pass more than one recipient |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
121 """ |
1205
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
122 def send(mess_data, skip_send=False): |
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
123 client = self.host.profiles[profile] |
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
124 d = defer.Deferred() |
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
125 if not skip_send: |
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
126 d.addCallback(self.host._sendMessageToStream, client) |
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
127 d.addCallback(self.host._storeMessage, client) |
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
128 d.addCallback(self.host.sendMessageToBridge, client) |
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
129 d.addErrback(lambda failure: failure.trap(exceptions.CancelError)) |
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
130 return d.callback(mess_data) |
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
131 |
999
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
132 def discoCallback(entities, to_jid_s): |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
133 history_data = copy.deepcopy(mess_data) |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
134 history_data['to'] = JID(to_jid_s) |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
135 history_data['xml']['to'] = to_jid_s |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
136 if entities: |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
137 if entities not in self.internal_data[timestamp]: |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
138 sent_data = copy.deepcopy(mess_data) |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
139 sent_data['to'] = JID(JID(to_jid_s).host) |
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
140 sent_data['xml']['to'] = JID(to_jid_s).host |
1205
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
141 send(sent_data) |
999
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
142 self.internal_data[timestamp].append(entities) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
143 # we still need to fill the history and signal the echo... |
1205
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
144 send(history_data, skip_send=True) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
145 else: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
146 # target server misses the addressing feature |
1205
3e234902177a
plugin XEP-0033: fixes sending the message after the changes made in rev 1052 (e88bff4c8b77)
souliane <souliane@mailoo.org>
parents:
1052
diff
changeset
|
147 send(history_data) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
148 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
149 def errback(failure, to_jid): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
150 discoCallback(None, to_jid) |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
151 |
749
192b804ee446
plugin XEP-0033: bug fix for sending messages with the addressing feature to several servers
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
152 timestamp = time() |
192b804ee446
plugin XEP-0033: bug fix for sending messages with the addressing feature to several servers
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
153 self.internal_data[timestamp] = [] |
192b804ee446
plugin XEP-0033: bug fix for sending messages with the addressing feature to several servers
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
154 defer_list = [] |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
155 for type_, jid_ in entries: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
156 d = defer.Deferred() |
999
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
157 d.addCallback(self.host.findFeaturesSet, jid_=JID(JID(jid_).host), profile_key=profile) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
158 d.addCallbacks(discoCallback, errback, callbackArgs=[jid_], errbackArgs=[jid_]) |
999
c37a24922f27
plugin XEP_0033: fixes the server part and the tests
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
159 d.callback([NS_ADDRESS]) |
749
192b804ee446
plugin XEP-0033: bug fix for sending messages with the addressing feature to several servers
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
160 defer_list.append(d) |
192b804ee446
plugin XEP-0033: bug fix for sending messages with the addressing feature to several servers
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
161 d = defer.Deferred().addCallback(lambda dummy: self.internal_data.pop(timestamp)) |
192b804ee446
plugin XEP-0033: bug fix for sending messages with the addressing feature to several servers
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
162 defer.DeferredList(defer_list).chainDeferred(d) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
163 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
164 def messageReceivedTrigger(self, message, post_treat, profile): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
165 """In order to save the addressing information in the history""" |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
166 def post_treat_addr(data, addresses): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
167 data['extra']['addresses'] = "" |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
168 for address in addresses: |
787
dd656d745d6a
test: added tests for XEP-0033
souliane <souliane@mailoo.org>
parents:
785
diff
changeset
|
169 # Depending how message has been constructed, we could get here |
dd656d745d6a
test: added tests for XEP-0033
souliane <souliane@mailoo.org>
parents:
785
diff
changeset
|
170 # some noise like "\n " instead of an address element. |
dd656d745d6a
test: added tests for XEP-0033
souliane <souliane@mailoo.org>
parents:
785
diff
changeset
|
171 if isinstance(address, domish.Element): |
dd656d745d6a
test: added tests for XEP-0033
souliane <souliane@mailoo.org>
parents:
785
diff
changeset
|
172 data['extra']['addresses'] += '%s:%s\n' % (address['type'], address['jid']) |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
173 return data |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
174 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
175 try: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
176 addresses = message.elements(NS_ADDRESS, 'addresses').next() |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
177 post_treat.addCallback(post_treat_addr, addresses.children) |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
178 except StopIteration: |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
179 pass # no addresses |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
180 return True |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
181 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
182 def getHandler(self, profile): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
183 return XEP_0033_handler(self, profile) |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
184 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
185 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
186 class XEP_0033_handler(XMPPHandler): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
187 implements(iwokkel.IDisco) |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
188 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
189 def __init__(self, plugin_parent, profile): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
190 self.plugin_parent = plugin_parent |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
191 self.host = plugin_parent.host |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
192 self.profile = profile |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
193 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
194 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
195 return [disco.DiscoFeature(NS_ADDRESS)] |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
196 |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
197 def getDiscoItems(self, requestor, target, nodeIdentifier=''): |
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
198 return [] |