annotate sat/core/xmpp.py @ 3008:c8c68a3b0a79

plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done: when resuming is not possible with stream management, a hot reconnection is done (reconnecting without restarting every plugin). This was causing trouble for joined MUC rooms, which were not accessible anymore (because they were not re-joined). This patch fixes it by clearing rooms first (to avoid considering the room joined and broadcasting the initial presence to them), then re-joining them. fix 322
author Goffi <goffi@goffi.org>
date Tue, 16 Jul 2019 21:59:30 +0200
parents 94708a7d3ecf
children ab2696e34d29
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
0
goffi@necton2
parents:
diff changeset
2 # -*- coding: utf-8 -*-
goffi@necton2
parents:
diff changeset
3
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
4 # SAT: a jabber client
2771
003b8b4b56a7 date update
Goffi <goffi@goffi.org>
parents: 2751
diff changeset
5 # Copyright (C) 2009-2019 Jérôme Poisson (goffi@goffi.org)
0
goffi@necton2
parents:
diff changeset
6
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
7 # This program is free software: you can redistribute it and/or modify
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
10 # (at your option) any later version.
0
goffi@necton2
parents:
diff changeset
11
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
12 # This program is distributed in the hope that it will be useful,
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
15 # GNU Affero General Public License for more details.
0
goffi@necton2
parents:
diff changeset
16
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 589
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
0
goffi@necton2
parents:
diff changeset
19
2984
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
20 import sys
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
21 import time
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
22 import calendar
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
23 import uuid
2885
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
24 from functools import partial
1053
71d63750963e core (XMPP): message received (onMessage) refactoring:
Goffi <goffi@goffi.org>
parents: 1037
diff changeset
25 from sat.core.i18n import _
923
e77948faaef3 core: removed default_config:
Goffi <goffi@goffi.org>
parents: 875
diff changeset
26 from sat.core.constants import Const as C
2109
85f3e12e984d core (memory/cache): file caching handling, first draft:
Goffi <goffi@goffi.org>
parents: 2099
diff changeset
27 from sat.memory import cache
2885
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
28 from twisted.internet import defer, error as internet_error
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
29 from twisted.words.protocols.jabber.xmlstream import XMPPHandler
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
30 from twisted.words.protocols.jabber import xmlstream
1573
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
31 from twisted.words.protocols.jabber import error
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
32 from twisted.words.protocols.jabber import jid
2130
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
33 from twisted.words.xish import domish
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
34 from twisted.python import failure
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
35 from wokkel import client as wokkel_client, disco, xmppim, generic, iwokkel
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
36 from wokkel import component
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
37 from wokkel import delay
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 960
diff changeset
38 from sat.core.log import getLogger
501
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 487
diff changeset
39 from sat.core import exceptions
2646
712cb4ff3e13 core: new EncryptionHandler class which manage encrypted session as a core feature:
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
40 from sat.memory import encryption
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
41 from sat.memory import persistent
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
42 from sat.tools import xml_tools
666
2a7185b8452c core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents: 663
diff changeset
43 from zope.interface import implements
0
goffi@necton2
parents:
diff changeset
44
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
45 log = getLogger(__name__)
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
46
333
4c835d614bdb core: fixed a None sent instead of empty dict in unavailableReceived
Goffi <goffi@goffi.org>
parents: 330
diff changeset
47
2688
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
48 NS_X_DATA = u"jabber:x:data"
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
49 NS_DISCO_INFO = u"http://jabber.org/protocol/disco#info"
2778
f7deb1c36b47 core, XEP-0315: move XML element handling to sat_tmp:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
50 NS_XML_ELEMENT = u"urn:xmpp:xml-element"
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
51 NS_ROSTER_VER = u"urn:xmpp:features:rosterver"
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
52 # we use 2 "@" which is illegal in a jid, to be sure we are not mixing keys
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
53 # with roster jids
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
54 ROSTER_VER_KEY = u"@version@"
2688
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
55
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
56
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
57 class SatXMPPEntity(object):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
58 """Common code for Client and Component"""
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
59
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
60 def __init__(self, host_app, profile, max_retries):
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
61 factory = self.factory
2885
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
62
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
63 # we monkey patch clientConnectionLost to handle networkEnabled/networkDisabled
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
64 # and to allow plugins to tune reconnection mechanism
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
65 clientConnectionFailed_ori = factory.clientConnectionFailed
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
66 clientConnectionLost_ori = factory.clientConnectionLost
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
67 factory.clientConnectionFailed = partial(
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
68 self.connectionTerminated, term_type=u"failed", cb=clientConnectionFailed_ori)
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
69 factory.clientConnectionLost = partial(
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
70 self.connectionTerminated, term_type=u"lost", cb=clientConnectionLost_ori)
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
71
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
72 factory.maxRetries = max_retries
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
73 factory.maxDelay = 30
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
74 # when self._connected_d is None, we are not connected
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
75 # else, it's a deferred which fire on disconnection
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
76 self._connected_d = None
62
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
77 self.profile = profile
64
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
78 self.host_app = host_app
2109
85f3e12e984d core (memory/cache): file caching handling, first draft:
Goffi <goffi@goffi.org>
parents: 2099
diff changeset
79 self.cache = cache.Cache(host_app, profile)
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
80 self.mess_id2uid = {} # map from message id to uid used in history.
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
81 # Key: (full_jid, message_id) Value: uid
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
82 # this Deferred fire when entity is connected
341
9eebdc655b8b code: added asyncConnect
Goffi <goffi@goffi.org>
parents: 336
diff changeset
83 self.conn_deferred = defer.Deferred()
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
84 self._progress_cb = {} # callback called when a progress is requested
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
85 # (key = progress id)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
86 self.actions = {} # used to keep track of actions for retrieval (key = action_id)
2658
4e130cc9bfc0 core (memore/encryption): new methods and checks:
Goffi <goffi@goffi.org>
parents: 2650
diff changeset
87 self.encryption = encryption.EncryptionHandler(self)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
88
2742
1f5b02623355 core (xmpp): implemented human friendly __unicode__ for client
Goffi <goffi@goffi.org>
parents: 2736
diff changeset
89 def __unicode__(self):
1f5b02623355 core (xmpp): implemented human friendly __unicode__ for client
Goffi <goffi@goffi.org>
parents: 2736
diff changeset
90 return u"Client instance for profile {profile}".format(profile=self.profile)
1f5b02623355 core (xmpp): implemented human friendly __unicode__ for client
Goffi <goffi@goffi.org>
parents: 2736
diff changeset
91
1f5b02623355 core (xmpp): implemented human friendly __unicode__ for client
Goffi <goffi@goffi.org>
parents: 2736
diff changeset
92 def __str__(self):
1f5b02623355 core (xmpp): implemented human friendly __unicode__ for client
Goffi <goffi@goffi.org>
parents: 2736
diff changeset
93 return self.__unicode__.encode('utf-8')
1f5b02623355 core (xmpp): implemented human friendly __unicode__ for client
Goffi <goffi@goffi.org>
parents: 2736
diff changeset
94
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
95 ## initialisation ##
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
96
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
97 @defer.inlineCallbacks
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
98 def _callConnectionTriggers(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
99 """Call conneting trigger prepare connected trigger
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
100
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
101 @param plugins(iterable): plugins to use
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
102 @return (list[object, callable]): plugin to trigger tuples with:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
103 - plugin instance
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
104 - profileConnected* triggers (to call after connection)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
105 """
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
106 plugin_conn_cb = []
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
107 for plugin in self._getPluginsList():
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
108 # we check if plugin handle client mode
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
109 if plugin.is_handler:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
110 plugin.getHandler(self).setHandlerParent(self)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
111
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
112 # profileConnecting/profileConnected methods handling
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
113
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
114 # profile connecting is called right now (before actually starting client)
2498
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
115 connecting_cb = getattr(plugin, "profileConnecting", None)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
116 if connecting_cb is not None:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
117 yield connecting_cb(self)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
118
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
119 # profile connected is called after client is ready and roster is got
2498
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
120 connected_cb = getattr(plugin, "profileConnected", None)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
121 if connected_cb is not None:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
122 plugin_conn_cb.append((plugin, connected_cb))
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
123
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
124 defer.returnValue(plugin_conn_cb)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
125
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
126 def _getPluginsList(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
127 """Return list of plugin to use
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
128
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
129 need to be implemented by subclasses
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
130 this list is used to call profileConnect* triggers
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
131 @return(iterable[object]): plugins to use
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
132 """
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
133 raise NotImplementedError
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
134
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
135 def _createSubProtocols(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
136 return
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
137
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
138 def entityConnected(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
139 """Called once connection is done
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
140
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
141 may return a Deferred, to perform initialisation tasks
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
142 """
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
143 return
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
145 @classmethod
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
146 @defer.inlineCallbacks
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
147 def startConnection(cls, host, profile, max_retries):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
148 """instantiate the entity and start the connection"""
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
149 # FIXME: reconnection doesn't seems to be handled correclty
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
150 # (client is deleted then recreated from scratch)
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
151 # most of methods called here should be called once on first connection
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
152 # (e.g. adding subprotocols)
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
153 # but client should not be deleted except if session is finished
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
154 # (independently of connection/deconnection)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
155 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
156 port = int(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
157 host.memory.getParamA(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
158 C.FORCE_PORT_PARAM, "Connection", profile_key=profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
159 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
160 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
161 except ValueError:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
162 log.debug(_("Can't parse port value, using default value"))
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
163 port = (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
164 None
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
165 ) # will use default value 5222 or be retrieved from a DNS SRV record
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
166
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
167 password = yield host.memory.asyncGetParamA(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
168 "Password", "Connection", profile_key=profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
169 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
170 entity = host.profiles[profile] = cls(
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
171 host, profile, jid.JID(host.memory.getParamA("JabberID", "Connection",
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
172 profile_key=profile)), password,
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
173 host.memory.getParamA(C.FORCE_SERVER_PARAM, "Connection",
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
174 profile_key=profile) or None,
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
175 port, max_retries,
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
176 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
177
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
178 entity._createSubProtocols()
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
179
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
180 entity.fallBack = SatFallbackHandler(host)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
181 entity.fallBack.setHandlerParent(entity)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
182
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
183 entity.versionHandler = SatVersionHandler(C.APP_NAME_FULL, host.full_version)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
184 entity.versionHandler.setHandlerParent(entity)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
185
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
186 entity.identityHandler = SatIdentityHandler()
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
187 entity.identityHandler.setHandlerParent(entity)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
188
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
189 log.debug(_("setting plugins parents"))
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
190
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
191 plugin_conn_cb = yield entity._callConnectionTriggers()
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
192
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
193 entity.startService()
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
194
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
195 yield entity.conn_deferred
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
196
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
197 yield defer.maybeDeferred(entity.entityConnected)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
198
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
199 # Call profileConnected callback for all plugins,
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
200 # and print error message if any of them fails
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
201 conn_cb_list = []
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
202 for __, callback in plugin_conn_cb:
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
203 conn_cb_list.append(defer.maybeDeferred(callback, entity))
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
204 list_d = defer.DeferredList(conn_cb_list)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
205
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
206 def logPluginResults(results):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
207 all_succeed = all([success for success, result in results])
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
208 if not all_succeed:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
209 log.error(_(u"Plugins initialisation error"))
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
210 for idx, (success, result) in enumerate(results):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
211 if not success:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
212 log.error(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
213 u"error (plugin %(name)s): %(failure)s"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
214 % {
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
215 "name": plugin_conn_cb[idx][0]._info["import_name"],
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
216 "failure": result,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
217 }
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
218 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
219
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
220 yield list_d.addCallback(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
221 logPluginResults
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
222 ) # FIXME: we should have a timeout here, and a way to know if a plugin freeze
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
223 # TODO: mesure launch time of each plugin
341
9eebdc655b8b code: added asyncConnect
Goffi <goffi@goffi.org>
parents: 336
diff changeset
224
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
225 def _disconnectionCb(self, __):
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
226 self._connected_d = None
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
227
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
228 def _disconnectionEb(self, failure_):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
229 log.error(_(u"Error while disconnecting: {}".format(failure_)))
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
230
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
231 def _authd(self, xmlstream):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
232 super(SatXMPPEntity, self)._authd(xmlstream)
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
233 log.debug(_(u"{profile} identified").format(profile=self.profile))
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
234 self.streamInitialized()
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
235
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
236 def _finish_connection(self, __):
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
237 self.conn_deferred.callback(None)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
238
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
239 def streamInitialized(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
240 """Called after _authd"""
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
241 log.debug(_(u"XML stream is initialized"))
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
242 if not self.host_app.trigger.point("xml_init", self):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
243 return
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
244 self.postStreamInit()
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
245
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
246 def postStreamInit(self):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
247 """Workflow after stream initalisation."""
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
248 log.info(
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
249 _(u"********** [{profile}] CONNECTED **********").format(profile=self.profile)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
250 )
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
251
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
252 # the following Deferred is used to know when we are connected
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
253 # so we need to be set it to None when connection is lost
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
254 self._connected_d = defer.Deferred()
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
255 self._connected_d.addCallback(self._cleanConnection)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
256 self._connected_d.addCallback(self._disconnectionCb)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
257 self._connected_d.addErrback(self._disconnectionEb)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
258
2894
c7c52c0dc13a core, quick_frontend(app): fixed connected signal handling
Goffi <goffi@goffi.org>
parents: 2892
diff changeset
259 # we send the signal to the clients
c7c52c0dc13a core, quick_frontend(app): fixed connected signal handling
Goffi <goffi@goffi.org>
parents: 2892
diff changeset
260 self.host_app.bridge.connected(self.jid.full(), self.profile)
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
261
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
262 self.disco = SatDiscoProtocol(self)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
263 self.disco.setHandlerParent(self)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
264 self.discoHandler = disco.DiscoHandler()
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
265 self.discoHandler.setHandlerParent(self)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
266 disco_d = defer.succeed(None)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
267
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
268 if not self.host_app.trigger.point("Disco handled", disco_d, self.profile):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
269 return
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
270
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
271 disco_d.addCallback(self._finish_connection)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
272
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
273 def initializationFailed(self, reason):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
274 log.error(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
275 _(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
276 u"ERROR: XMPP connection failed for profile '%(profile)s': %(reason)s"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
277 % {"profile": self.profile, "reason": reason}
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
278 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
279 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
280 self.conn_deferred.errback(reason.value)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
281 try:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
282 super(SatXMPPEntity, self).initializationFailed(reason)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
283 except:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
284 # we already chained an errback, no need to raise an exception
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
285 pass
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
286
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
287 ## connection ##
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
288
2885
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
289 def connectionTerminated(self, connector, reason, term_type, cb):
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
290 """Display disconnection reason, and call factory method
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
291
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
292 This method is monkey patched to factory, allowing plugins to handle finely
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
293 reconnection with the triggers.
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
294 @param connector(twisted.internet.base.BaseConnector): current connector
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
295 @param reason(failure.Failure): why connection has been terminated
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
296 @param term_type(unicode): on of 'failed' or 'lost'
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
297 @param cb(callable): original factory method
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
298
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
299 @trigger connection_failed(connector, reason): connection can't be established
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
300 @trigger connection_lost(connector, reason): connection was available but it not
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
301 anymore
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
302 """
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
303 # we save connector because it may be deleted when connection will be dropped
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
304 # if reconnection is disabled
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
305 self._saved_connector = connector
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
306 if reason is not None and not isinstance(reason.value,
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
307 internet_error.ConnectionDone):
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
308 try:
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
309 reason_str = unicode(reason.value)
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
310 except Exception:
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
311 # FIXME: workaround for Android were p4a strips docstrings
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
312 # while Twisted use docstring in __str__
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
313 # TODO: create a ticket upstream, Twisted should work when optimization
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
314 # is used
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
315 reason_str = unicode(reason.value.__class__)
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
316 log.warning(u"Connection {term_type}: {reason}".format(
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
317 term_type = term_type,
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
318 reason=reason_str))
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
319 if not self.host_app.trigger.point(u"connection_" + term_type, connector, reason):
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
320 return
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
321 return cb(connector, reason)
e9016bfd8cb2 core (xmpp): advanced handling of connection termination
Goffi <goffi@goffi.org>
parents: 2884
diff changeset
322
2886
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
323 def networkDisabled(self):
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
324 """Indicate that network has been completely disabled
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
325
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
326 In other words, internet is not available anymore and transport must be stopped.
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
327 Retrying is disabled too, as it makes no sense to try without network, and it may
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
328 use resources (notably battery on mobiles).
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
329 """
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
330 log.info(_(u"stopping connection because of network disabled"))
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
331 self.factory.continueTrying = 0
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
332 self._network_disabled = True
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
333 if self.xmlstream is not None:
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
334 self.xmlstream.transport.abortConnection()
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
335
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
336 def networkEnabled(self):
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
337 """Indicate that network has been (re)enabled
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
338
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
339 This happens when e.g. user activate WIFI connection.
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
340 """
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
341 try:
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
342 connector = self._saved_connector
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
343 network_disabled = self._network_disabled
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
344 except AttributeError:
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
345 # connection has not been stopped by networkDisabled
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
346 # we don't have to restart it
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
347 log.debug(u"no connection to restart")
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
348 return
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
349 else:
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
350 del self._network_disabled
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
351 if not network_disabled:
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
352 raise exceptions.InternalError(u"network_disabled should be True")
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
353 log.info(_(u"network is available, trying to connect"))
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
354 # we want to be sure to start fresh
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
355 self.factory.resetDelay()
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
356 # we have a saved connector, meaning the connection has been stopped previously
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
357 # we can now try to reconnect
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
358 connector.connect()
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
359
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
360 def _connected(self, xs):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
361 send_hooks = []
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
362 receive_hooks = []
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
363 self.host_app.trigger.point(
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
364 "stream_hooks", self, receive_hooks, send_hooks)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
365 for hook in receive_hooks:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
366 xs.addHook(C.STREAM_HOOK_RECEIVE, hook)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
367 for hook in send_hooks:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
368 xs.addHook(C.STREAM_HOOK_SEND, hook)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
369 super(SatXMPPEntity, self)._connected(xs)
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
370
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
371 def disconnectProfile(self, reason):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
372 if self._connected_d is not None:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
373 self.host_app.bridge.disconnected(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
374 self.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
375 ) # we send the signal to the clients
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
376 self._connected_d.callback(None)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
377 self.host_app.purgeEntity(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
378 self.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
379 ) # and we remove references to this client
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
380 log.info(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
381 _(u"********** [{profile}] DISCONNECTED **********").format(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
382 profile=self.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
383 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
384 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
385 if not self.conn_deferred.called:
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
386 if reason is None:
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
387 err = error.StreamError(u"Server unexpectedly closed the connection")
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
388 else:
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
389 err = reason
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
390 try:
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
391 if err.value.args[0][0][2] == "certificate verify failed":
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
392 err = exceptions.InvalidCertificate(
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
393 _(u"Your server certificate is not valid "
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
394 u"(its identity can't be checked).\n\n"
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
395 u"This should never happen and may indicate that "
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
396 u"somebody is trying to spy on you.\n"
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
397 u"Please contact your server administrator."))
2884
368a60f05d0e core (xmpp): use the cleaner stopTrying() instead of setting `continueTrying = 0` when connection is not possible due to invalid certificate.
Goffi <goffi@goffi.org>
parents: 2820
diff changeset
398 self.factory.stopTrying()
2886
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
399 try:
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
400 # with invalid certificate, we should not retry to connect
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
401 # so we delete saved connector to avoid reconnection if
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
402 # networkEnabled is called.
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
403 del self._saved_connector
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
404 except AttributeError:
b06cb71079fa core (xmpp): new networkEnabled() and networkDisabled() methods:
Goffi <goffi@goffi.org>
parents: 2885
diff changeset
405 pass
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
406 except (IndexError, TypeError):
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
407 pass
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
408 self.conn_deferred.errback(err)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
409
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
410 def _disconnected(self, reason):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
411 super(SatXMPPEntity, self)._disconnected(reason)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
412 if not self.host_app.trigger.point("disconnected", self, reason):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
413 return
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
414 self.disconnectProfile(reason)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
415
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
416 @defer.inlineCallbacks
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
417 def _cleanConnection(self, __):
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
418 """method called on disconnection
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
419
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
420 used to call profileDisconnected* triggers
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
421 """
2498
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
422 trigger_name = "profileDisconnected"
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
423 for plugin in self._getPluginsList():
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
424 disconnected_cb = getattr(plugin, trigger_name, None)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
425 if disconnected_cb is not None:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
426 yield disconnected_cb(self)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
427
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
428 def isConnected(self):
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
429 try:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
430 return bool(self.xmlstream.transport.connected)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
431 except AttributeError:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
432 return False
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
433
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
434 def entityDisconnect(self):
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
435 if not self.host_app.trigger.point("disconnecting", self):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
436 return
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
437 log.info(_(u"Disconnecting..."))
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
438 self.stopService()
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
439 if self._connected_d is not None:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
440 return self._connected_d
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
441 else:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
442 return defer.succeed(None)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
443
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
444 ## sending ##
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
445
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
446 def IQ(self, type_=u"set", timeout=60):
1551
591c32dbfb0b core (client): add IQ method to easily create an IQ stanza with the current xmlstream, and manage result with a Deferred.
Goffi <goffi@goffi.org>
parents: 1522
diff changeset
447 """shortcut to create an IQ element managing deferred
591c32dbfb0b core (client): add IQ method to easily create an IQ stanza with the current xmlstream, and manage result with a Deferred.
Goffi <goffi@goffi.org>
parents: 1522
diff changeset
448
591c32dbfb0b core (client): add IQ method to easily create an IQ stanza with the current xmlstream, and manage result with a Deferred.
Goffi <goffi@goffi.org>
parents: 1522
diff changeset
449 @param type_(unicode): IQ type ('set' or 'get')
591c32dbfb0b core (client): add IQ method to easily create an IQ stanza with the current xmlstream, and manage result with a Deferred.
Goffi <goffi@goffi.org>
parents: 1522
diff changeset
450 @param timeout(None, int): timeout in seconds
2110
2d633b3c923d plugin XEP-0231: Bits of Binary first draft:
Goffi <goffi@goffi.org>
parents: 2109
diff changeset
451 @return((D)domish.Element: result stanza
2d633b3c923d plugin XEP-0231: Bits of Binary first draft:
Goffi <goffi@goffi.org>
parents: 2109
diff changeset
452 errback is called if and error stanza is returned
1551
591c32dbfb0b core (client): add IQ method to easily create an IQ stanza with the current xmlstream, and manage result with a Deferred.
Goffi <goffi@goffi.org>
parents: 1522
diff changeset
453 """
591c32dbfb0b core (client): add IQ method to easily create an IQ stanza with the current xmlstream, and manage result with a Deferred.
Goffi <goffi@goffi.org>
parents: 1522
diff changeset
454 iq_elt = xmlstream.IQ(self.xmlstream, type_)
591c32dbfb0b core (client): add IQ method to easily create an IQ stanza with the current xmlstream, and manage result with a Deferred.
Goffi <goffi@goffi.org>
parents: 1522
diff changeset
455 iq_elt.timeout = timeout
591c32dbfb0b core (client): add IQ method to easily create an IQ stanza with the current xmlstream, and manage result with a Deferred.
Goffi <goffi@goffi.org>
parents: 1522
diff changeset
456 return iq_elt
591c32dbfb0b core (client): add IQ method to easily create an IQ stanza with the current xmlstream, and manage result with a Deferred.
Goffi <goffi@goffi.org>
parents: 1522
diff changeset
457
1573
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
458 def sendError(self, iq_elt, condition):
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
459 """Send error stanza build from iq_elt
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
460
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
461 @param iq_elt(domish.Element): initial IQ element
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
462 @param condition(unicode): error condition
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
463 """
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
464 iq_error_elt = error.StanzaError(condition).toResponse(iq_elt)
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
465 self.xmlstream.send(iq_error_elt)
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1564
diff changeset
466
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
467 def generateMessageXML(self, data):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
468 """Generate <message/> stanza from message data
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
469
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
470 @param data(dict): message data
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
471 domish element will be put in data['xml']
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
472 following keys are needed:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
473 - from
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
474 - to
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
475 - uid: can be set to '' if uid attribute is not wanted
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
476 - message
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
477 - type
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
478 - subject
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
479 - extra
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
480 @return (dict) message data
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
481 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
482 data["xml"] = message_elt = domish.Element((None, "message"))
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
483 message_elt["to"] = data["to"].full()
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
484 message_elt["from"] = data["from"].full()
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
485 message_elt["type"] = data["type"]
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
486 if data["uid"]: # key must be present but can be set to ''
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
487 # by a plugin to avoid id on purpose
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
488 message_elt["id"] = data["uid"]
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
489 for lang, subject in data["subject"].iteritems():
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
490 subject_elt = message_elt.addElement("subject", content=subject)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
491 if lang:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
492 subject_elt[(C.NS_XML, "lang")] = lang
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
493 for lang, message in data["message"].iteritems():
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
494 body_elt = message_elt.addElement("body", content=message)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
495 if lang:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
496 body_elt[(C.NS_XML, "lang")] = lang
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
497 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
498 thread = data["extra"]["thread"]
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
499 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
500 if "thread_parent" in data["extra"]:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
501 raise exceptions.InternalError(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
502 u"thread_parent found while there is not associated thread"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
503 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
504 else:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
505 thread_elt = message_elt.addElement("thread", content=thread)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
506 try:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
507 thread_elt["parent"] = data["extra"]["thread_parent"]
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
508 except KeyError:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
509 pass
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
510 return data
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
511
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
512 def addPostXmlCallbacks(self, post_xml_treatments):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
513 """Used to add class level callbacks at the end of the workflow
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
514
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
515 @param post_xml_treatments(D): the same Deferred as in sendMessage trigger
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
516 """
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
517 raise NotImplementedError
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
518
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
519 def sendMessage(self, to_jid, message, subject=None, mess_type="auto", extra=None,
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
520 uid=None, no_trigger=False,):
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
521 r"""Send a message to an entity
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
522
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
523 @param to_jid(jid.JID): destinee of the message
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
524 @param message(dict): message body, key is the language (use '' when unknown)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
525 @param subject(dict): message subject, key is the language (use '' when unknown)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
526 @param mess_type(str): one of standard message type (cf RFC 6121 §5.2.2) or:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
527 - auto: for automatic type detection
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
528 - info: for information ("info_type" can be specified in extra)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
529 @param extra(dict, None): extra data. Key can be:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
530 - info_type: information type, can be
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
531 TODO
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
532 @param uid(unicode, None): unique id:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
533 should be unique at least in this XMPP session
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
534 if None, an uuid will be generated
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
535 @param no_trigger (bool): if True, sendMessage[suffix] trigger will no be used
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
536 useful when a message need to be sent without any modification
2646
712cb4ff3e13 core: new EncryptionHandler class which manage encrypted session as a core feature:
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
537 /!\ this will also skip encryption methods!
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
538 """
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
539 if subject is None:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
540 subject = {}
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
541 if extra is None:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
542 extra = {}
2460
feaacc462fef core: moved CHAT_* constants from frontends to core constants + uses constants for MESS_TYPE_* in sendMessage
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
543
feaacc462fef core: moved CHAT_* constants from frontends to core constants + uses constants for MESS_TYPE_* in sendMessage
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
544 assert mess_type in C.MESS_TYPE_ALL
feaacc462fef core: moved CHAT_* constants from frontends to core constants + uses constants for MESS_TYPE_* in sendMessage
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
545
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
546 data = { # dict is similar to the one used in client.onMessage
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
547 "from": self.jid,
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
548 "to": to_jid,
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
549 "uid": uid or unicode(uuid.uuid4()),
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
550 "message": message,
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
551 "subject": subject,
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
552 "type": mess_type,
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
553 "extra": extra,
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
554 "timestamp": time.time(),
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
555 }
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
556 # XXX: plugin can add their pre XML treatments to this deferred
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
557 pre_xml_treatments = defer.Deferred()
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
558 # XXX: plugin can add their post XML treatments to this deferred
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
559 post_xml_treatments = defer.Deferred()
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
560
2460
feaacc462fef core: moved CHAT_* constants from frontends to core constants + uses constants for MESS_TYPE_* in sendMessage
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
561 if data["type"] == C.MESS_TYPE_AUTO:
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
562 # we try to guess the type
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
563 if data["subject"]:
2460
feaacc462fef core: moved CHAT_* constants from frontends to core constants + uses constants for MESS_TYPE_* in sendMessage
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
564 data["type"] = C.MESS_TYPE_NORMAL
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
565 elif not data["to"].resource: # if to JID has a resource,
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
566 # the type is not 'groupchat'
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
567 # we may have a groupchat message, we check if the we know this jid
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
568 try:
2994
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2985
diff changeset
569 entity_type = self.host_app.memory.getEntityDatum(
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2985
diff changeset
570 data["to"], C.ENTITY_TYPE, self.profile
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2985
diff changeset
571 )
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
572 # FIXME: should entity_type manage resources ?
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
573 except (exceptions.UnknownEntityError, KeyError):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
574 entity_type = "contact"
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
575
2994
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2985
diff changeset
576 if entity_type == C.ENTITY_TYPE_MUC:
2460
feaacc462fef core: moved CHAT_* constants from frontends to core constants + uses constants for MESS_TYPE_* in sendMessage
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
577 data["type"] = C.MESS_TYPE_GROUPCHAT
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
578 else:
2460
feaacc462fef core: moved CHAT_* constants from frontends to core constants + uses constants for MESS_TYPE_* in sendMessage
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
579 data["type"] = C.MESS_TYPE_CHAT
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
580 else:
2460
feaacc462fef core: moved CHAT_* constants from frontends to core constants + uses constants for MESS_TYPE_* in sendMessage
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
581 data["type"] == C.MESS_TYPE_CHAT
feaacc462fef core: moved CHAT_* constants from frontends to core constants + uses constants for MESS_TYPE_* in sendMessage
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
582 data["type"] == C.MESS_TYPE_CHAT if data["subject"] else C.MESS_TYPE_NORMAL
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
583
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
584 # FIXME: send_only is used by libervia's OTR plugin to avoid
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
585 # the triggers from frontend, and no_trigger do the same
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
586 # thing internally, this could be unified
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
587 send_only = data["extra"].get("send_only", False)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
588
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
589 if not no_trigger and not send_only:
2646
712cb4ff3e13 core: new EncryptionHandler class which manage encrypted session as a core feature:
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
590 # is the session encrypted? If so we indicate it in data
712cb4ff3e13 core: new EncryptionHandler class which manage encrypted session as a core feature:
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
591 self.encryption.setEncryptionFlag(data)
712cb4ff3e13 core: new EncryptionHandler class which manage encrypted session as a core feature:
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
592
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
593 if not self.host_app.trigger.point(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
594 "sendMessage" + self.trigger_suffix,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
595 self,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
596 data,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
597 pre_xml_treatments,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
598 post_xml_treatments,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
599 ):
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
600 return defer.succeed(None)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
601
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
602 log.debug(_(u"Sending message (type {type}, to {to})")
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
603 .format(type=data["type"], to=to_jid.full()))
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
604
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
605 pre_xml_treatments.addCallback(lambda __: self.generateMessageXML(data))
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
606 pre_xml_treatments.chainDeferred(post_xml_treatments)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
607 post_xml_treatments.addCallback(self.sendMessageData)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
608 if send_only:
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
609 log.debug(_(u"Triggers, storage and echo have been inhibited by the "
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
610 u"'send_only' parameter"))
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
611 else:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
612 self.addPostXmlCallbacks(post_xml_treatments)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
613 post_xml_treatments.addErrback(self._cancelErrorTrap)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
614 post_xml_treatments.addErrback(self.host_app.logErrback)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
615 pre_xml_treatments.callback(data)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
616 return pre_xml_treatments
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
617
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
618 def _cancelErrorTrap(self, failure):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
619 """A message sending can be cancelled by a plugin treatment"""
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
620 failure.trap(exceptions.CancelError)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
621
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
622 def messageAddToHistory(self, data):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
623 """Store message into database (for local history)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
624
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
625 @param data: message data dictionnary
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
626 @param client: profile's client
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
627 """
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
628 if data[u"type"] != C.MESS_TYPE_GROUPCHAT:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
629 # we don't add groupchat message to history, as we get them back
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
630 # and they will be added then
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
631 if data[u"message"] or data[u"subject"]: # we need a message to store
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
632 self.host_app.memory.addToHistory(self, data)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
633 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
634 log.warning(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
635 u"No message found"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
636 ) # empty body should be managed by plugins before this point
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
637 return data
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
638
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
639 def messageGetBridgeArgs(self, data):
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
640 """Generate args to use with bridge from data dict"""
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
641 return (data[u"uid"], data[u"timestamp"], data[u"from"].full(),
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
642 data[u"to"].full(), data[u"message"], data[u"subject"],
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
643 data[u"type"], data[u"extra"])
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
644
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
645
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
646 def messageSendToBridge(self, data):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
647 """Send message to bridge, so frontends can display it
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
648
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
649 @param data: message data dictionnary
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
650 @param client: profile's client
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
651 """
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
652 if data[u"type"] != C.MESS_TYPE_GROUPCHAT:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
653 # we don't send groupchat message to bridge, as we get them back
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
654 # and they will be added the
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
655 if (data[u"message"] or data[u"subject"]): # we need a message to send
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
656 # something
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
657
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
658 # We send back the message, so all frontends are aware of it
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
659 self.host_app.bridge.messageNew(
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
660 *self.messageGetBridgeArgs(data),
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
661 profile=self.profile
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
662 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
663 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
664 log.warning(_(u"No message found"))
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
665 return data
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
666
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
667
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
668 class SatXMPPClient(SatXMPPEntity, wokkel_client.XMPPClient):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
669 implements(iwokkel.IDisco)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
670 trigger_suffix = ""
2498
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
671 is_component = False
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
672
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
673 def __init__(self, host_app, profile, user_jid, password, host=None,
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
674 port=C.XMPP_C2S_PORT, max_retries=C.XMPP_MAX_RETRIES):
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
675 # XXX: DNS SRV records are checked when the host is not specified.
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
676 # If no SRV record is found, the host is directly extracted from the JID.
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
677 self.started = time.time()
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
678
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
679 # Currently, we use "client/pc/Salut à Toi", but as
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
680 # SàT is multi-frontends and can be used on mobile devices, as a bot,
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
681 # with a web frontend,
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
682 # etc., we should implement a way to dynamically update identities through the
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
683 # bridge
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
684 self.identities = [disco.DiscoIdentity(u"client", u"pc", C.APP_NAME)]
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
685 if sys.platform == "android":
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
686 # FIXME: temporary hack as SRV is not working on android
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
687 # TODO: remove this hack and fix SRV
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
688 log.info(u"FIXME: Android hack, ignoring SRV")
2596
93d64ce7a429 core (xmpp): fixed "Force server" param on Android
Goffi <goffi@goffi.org>
parents: 2594
diff changeset
689 if host is None:
93d64ce7a429 core (xmpp): fixed "Force server" param on Android
Goffi <goffi@goffi.org>
parents: 2594
diff changeset
690 host = user_jid.host
2594
59ba387c17ea core (xmpp): use "phone" type in identities when backend is started from Android
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
691 # for now we consider Android devices to be always phones
59ba387c17ea core (xmpp): use "phone" type in identities when backend is started from Android
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
692 self.identities = [disco.DiscoIdentity(u"client", u"phone", C.APP_NAME)]
2259
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
693
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
694 hosts_map = host_app.memory.getConfig(None, "hosts_dict", {})
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
695 if host is None and user_jid.host in hosts_map:
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
696 host_data = hosts_map[user_jid.host]
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
697 if isinstance(host_data, basestring):
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
698 host = host_data
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
699 elif isinstance(host_data, dict):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
700 if u"host" in host_data:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
701 host = host_data[u"host"]
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
702 if u"port" in host_data:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
703 port = host_data[u"port"]
2259
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
704 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
705 log.warning(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
706 _(u"invalid data used for host: {data}").format(data=host_data)
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
707 )
2259
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
708 host_data = None
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
709 if host_data is not None:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
710 log.info(
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
711 u"using {host}:{port} for host {host_ori} as requested in config"
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
712 .format(host_ori=user_jid.host, host=host, port=port)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
713 )
2259
f51315500eb1 core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents: 2172
diff changeset
714
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
715 self.check_certificate = host_app.memory.getParamA(
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
716 "check_certificate", "Connection", profile_key=profile)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
717
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
718 wokkel_client.XMPPClient.__init__(
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
719 self, user_jid, password, host or None, port or C.XMPP_C2S_PORT,
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
720 check_certificate = self.check_certificate
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
721 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
722 SatXMPPEntity.__init__(self, host_app, profile, max_retries)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
723
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
724 if not self.check_certificate:
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
725 msg = (_(u"Certificate validation is deactivated, this is unsecure and "
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
726 u"somebody may be spying on you. If you have no good reason to disable "
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
727 u"certificate validation, please activate \"Check certificate\" in your "
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
728 u"settings in \"Connection\" tab."))
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
729 xml_tools.quickNote(host_app, self, msg, _(u"Security notice"),
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
730 level = C.XMLUI_DATA_LVL_WARNING)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
731
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents: 2661
diff changeset
732
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
733 def _getPluginsList(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
734 for p in self.host_app.plugins.itervalues():
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
735 if C.PLUG_MODE_CLIENT in p._info[u"modes"]:
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
736 yield p
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
737
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
738 def _createSubProtocols(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
739 self.messageProt = SatMessageProtocol(self.host_app)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
740 self.messageProt.setHandlerParent(self)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
741
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
742 self.roster = SatRosterProtocol(self.host_app)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
743 self.roster.setHandlerParent(self)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
744
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
745 self.presence = SatPresenceProtocol(self.host_app)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
746 self.presence.setHandlerParent(self)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
747
2915
d1fcb8e9aced core: fixed component connexion:
Goffi <goffi@goffi.org>
parents: 2901
diff changeset
748 @classmethod
d1fcb8e9aced core: fixed component connexion:
Goffi <goffi@goffi.org>
parents: 2901
diff changeset
749 @defer.inlineCallbacks
d1fcb8e9aced core: fixed component connexion:
Goffi <goffi@goffi.org>
parents: 2901
diff changeset
750 def startConnection(cls, host, profile, max_retries):
d1fcb8e9aced core: fixed component connexion:
Goffi <goffi@goffi.org>
parents: 2901
diff changeset
751 yield super(SatXMPPClient, cls).startConnection(host, profile, max_retries)
d1fcb8e9aced core: fixed component connexion:
Goffi <goffi@goffi.org>
parents: 2901
diff changeset
752 entity = host.profiles[profile]
d1fcb8e9aced core: fixed component connexion:
Goffi <goffi@goffi.org>
parents: 2901
diff changeset
753 # we finally send our presence
d1fcb8e9aced core: fixed component connexion:
Goffi <goffi@goffi.org>
parents: 2901
diff changeset
754 entity.presence.available()
d1fcb8e9aced core: fixed component connexion:
Goffi <goffi@goffi.org>
parents: 2901
diff changeset
755
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
756 def entityConnected(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
757 # we want to be sure that we got the roster
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
758 return self.roster.got_roster
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
759
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
760 def addPostXmlCallbacks(self, post_xml_treatments):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
761 post_xml_treatments.addCallback(self.messageAddToHistory)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
762 post_xml_treatments.addCallback(self.messageSendToBridge)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
763
2130
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
764 def send(self, obj):
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
765 # original send method accept string
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
766 # but we restrict to domish.Element to make trigger treatments easier
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
767 assert isinstance(obj, domish.Element)
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
768 # XXX: this trigger is the last one before sending stanza on wire
2509
d485e9416493 core (memory/cache): common cache:
Goffi <goffi@goffi.org>
parents: 2498
diff changeset
769 # it is intended for things like end 2 end encryption.
2130
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
770 # *DO NOT* cancel (i.e. return False) without very good reason
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
771 # (out of band transmission for instance).
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
772 # e2e should have a priority of 0 here, and out of band transmission
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
773 # a lower priority
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
774 #  FIXME: trigger not used yet, can be uncommented when e2e full stanza
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
775 # encryption is implemented
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
776 #  if not self.host_app.trigger.point("send", self, obj):
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
777 #   return
2136
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
778 super(SatXMPPClient, self).send(obj)
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
779
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
780 @defer.inlineCallbacks
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
781 def sendMessageData(self, mess_data):
2136
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
782 """Convenient method to send message data to stream
2130
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
783
2136
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
784 This method will send mess_data[u'xml'] to stream, but a trigger is there
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
785 The trigger can't be cancelled, it's a good place for e2e encryption which
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
786 don't handle full stanza encryption
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
787 This trigger can return a Deferred (it's an asyncPoint)
2136
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
788 @param mess_data(dict): message data as constructed by onMessage workflow
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
789 @return (dict): mess_data (so it can be used in a deferred chain)
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
790 """
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
791 # XXX: This is the last trigger before u"send" (last but one globally)
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
792 # for sending message.
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
793 # This is intented for e2e encryption which doesn't do full stanza
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
794 # encryption (e.g. OTR)
2136
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
795 # This trigger point can't cancel the method
2650
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2646
diff changeset
796 yield self.host_app.trigger.asyncPoint("sendMessageData", self, mess_data,
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2646
diff changeset
797 triggers_no_cancel=True)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
798 self.send(mess_data[u"xml"])
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
799 defer.returnValue(mess_data)
2136
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
800
2748
ec9445c04a36 core (xmpp): added "extra" argument to client.feedback
Goffi <goffi@goffi.org>
parents: 2742
diff changeset
801 def feedback(self, to_jid, message, extra=None):
2136
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
802 """Send message to frontends
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
803
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
804 This message will be an info message, not recorded in history.
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
805 It can be used to give feedback of a command
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
806 @param to_jid(jid.JID): destinee jid
2136
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
807 @param message(unicode): message to send to frontends
2748
ec9445c04a36 core (xmpp): added "extra" argument to client.feedback
Goffi <goffi@goffi.org>
parents: 2742
diff changeset
808 @param extra(None, dict): extra data to use
ec9445c04a36 core (xmpp): added "extra" argument to client.feedback
Goffi <goffi@goffi.org>
parents: 2742
diff changeset
809 in particular, info subtype can be specified with MESS_EXTRA_INFO
2136
cc3a6aea9508 core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
810 """
2748
ec9445c04a36 core (xmpp): added "extra" argument to client.feedback
Goffi <goffi@goffi.org>
parents: 2742
diff changeset
811 if extra is None:
ec9445c04a36 core (xmpp): added "extra" argument to client.feedback
Goffi <goffi@goffi.org>
parents: 2742
diff changeset
812 extra = {}
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
813 self.host_app.bridge.messageNew(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
814 uid=unicode(uuid.uuid4()),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
815 timestamp=time.time(),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
816 from_jid=self.jid.full(),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
817 to_jid=to_jid.full(),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
818 message={u"": message},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
819 subject={},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
820 mess_type=C.MESS_TYPE_INFO,
2748
ec9445c04a36 core (xmpp): added "extra" argument to client.feedback
Goffi <goffi@goffi.org>
parents: 2742
diff changeset
821 extra=extra,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
822 profile=self.profile,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
823 )
2130
f0bc29dc8157 added "send" trigger point as the last one before sending, can be used for e2e encryption
Goffi <goffi@goffi.org>
parents: 2113
diff changeset
824
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
825 def _finish_connection(self, __):
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
826 d = self.roster.requestRoster()
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
827 d.addCallback(lambda __: super(SatXMPPClient, self)._finish_connection(__))
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
828
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
829
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
830 class SatXMPPComponent(SatXMPPEntity, component.Component):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
831 """XMPP component
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
832
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
833 This component are similar but not identical to clients.
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
834 An entry point plugin is launched after component is connected.
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
835 Component need to instantiate MessageProtocol itself
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
836 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
837
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
838 implements(iwokkel.IDisco)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
839 trigger_suffix = (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
840 "Component"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
841 ) # used for to distinguish some trigger points set in SatXMPPEntity
2498
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
842 is_component = True
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
843 sendHistory = (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
844 False
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
845 ) # XXX: set to True from entry plugin to keep messages in history for received
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
846 # messages
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
847
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
848 def __init__(self, host_app, profile, component_jid, password, host=None, port=None,
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2688
diff changeset
849 max_retries=C.XMPP_MAX_RETRIES):
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
850 self.started = time.time()
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
851 if port is None:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
852 port = C.XMPP_COMPONENT_PORT
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
853
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
854 ## entry point ##
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
855 entry_point = host_app.memory.getEntryPoint(profile)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
856 try:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
857 self.entry_plugin = host_app.plugins[entry_point]
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
858 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
859 raise exceptions.NotFound(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
860 _(u"The requested entry point ({entry_point}) is not available").format(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
861 entry_point=entry_point
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
862 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
863 )
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
864
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
865 self.identities = [disco.DiscoIdentity(u"component", u"generic", C.APP_NAME)]
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
866 # jid is set automatically on bind by Twisted for Client, but not for Component
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
867 self.jid = component_jid
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
868 if host is None:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
869 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
870 host = component_jid.host.split(u".", 1)[1]
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
871 except IndexError:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
872 raise ValueError(u"Can't guess host from jid, please specify a host")
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
873 # XXX: component.Component expect unicode jid, while Client expect jid.JID.
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
874 # this is not consistent, so we use jid.JID for SatXMPP*
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
875 component.Component.__init__(self, host, port, component_jid.full(), password)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
876 SatXMPPEntity.__init__(self, host_app, profile, max_retries)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
877
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
878 def _buildDependencies(self, current, plugins, required=True):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
879 """build recursively dependencies needed for a plugin
62
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
880
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
881 this method build list of plugin needed for a component and raises
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
882 errors if they are not available or not allowed for components
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
883 @param current(object): parent plugin to check
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
884 use entry_point for first call
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
885 @param plugins(list): list of validated plugins, will be filled by the method
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
886 give an empty list for first call
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
887 @param required(bool): True if plugin is mandatory
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
888 for recursive calls only, should not be modified by inital caller
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
889 @raise InternalError: one of the plugin is not handling components
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
890 @raise KeyError: one plugin should be present in self.host_app.plugins but it
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
891 is not
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
892 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
893 if C.PLUG_MODE_COMPONENT not in current._info[u"modes"]:
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
894 if not required:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
895 return
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
896 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
897 log.error(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
898 _(
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
899 u"Plugin {current_name} is needed for {entry_name}, "
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
900 u"but it doesn't handle component mode"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
901 ).format(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
902 current_name=current._info[u"import_name"],
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
903 entry_name=self.entry_plugin._info[u"import_name"],
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
904 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
905 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
906 raise exceptions.InternalError(_(u"invalid plugin mode"))
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
907
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
908 for import_name in current._info.get(C.PI_DEPENDENCIES, []):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
909 # plugins are already loaded as dependencies
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
910 # so we know they are in self.host_app.plugins
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
911 dep = self.host_app.plugins[import_name]
2498
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
912 self._buildDependencies(dep, plugins)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
913
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
914 for import_name in current._info.get(C.PI_RECOMMENDATIONS, []):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
915 # here plugins are only recommendations,
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
916 # so they may not exist in self.host_app.plugins
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
917 try:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
918 dep = self.host_app.plugins[import_name]
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
919 except KeyError:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
920 continue
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
921 self._buildDependencies(dep, plugins, required=False)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
922
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
923 if current not in plugins:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
924 # current can be required for several plugins and so
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
925 # it can already be present in the list
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
926 plugins.append(current)
262
af3d4f11fe43 Added management of connection error
Goffi <goffi@goffi.org>
parents: 260
diff changeset
927
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
928 def _getPluginsList(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
929 # XXX: for component we don't launch all plugins triggers
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
930 # but only the ones from which there is a dependency
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
931 plugins = []
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
932 self._buildDependencies(self.entry_plugin, plugins)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
933 return plugins
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
934
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
935 def entityConnected(self):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
936 # we can now launch entry point
2498
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
937 try:
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
938 start_cb = self.entry_plugin.componentStart
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
939 except AttributeError:
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
940 return
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
941 else:
d6de69da3dd4 core (client): component improvments:
Goffi <goffi@goffi.org>
parents: 2497
diff changeset
942 return start_cb(self)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
943
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
944 def addPostXmlCallbacks(self, post_xml_treatments):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
945 if self.sendHistory:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
946 post_xml_treatments.addCallback(self.messageAddToHistory)
0
goffi@necton2
parents:
diff changeset
947
goffi@necton2
parents:
diff changeset
948
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
949 class SatMessageProtocol(xmppim.MessageProtocol):
2714
57eac4fd0ec0 core (xmpp): check <message> namespace in parseMessage, and accept empty namespace (happen with Wokkel)
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
950
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
951 def __init__(self, host):
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
952 xmppim.MessageProtocol.__init__(self)
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
953 self.host = host
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
954
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
955 def parseMessage(self, message_elt):
2099
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
956 """parse a message XML and return message_data
663
8004c7d4aba7 core: Deferred in onMessage.
Goffi <goffi@goffi.org>
parents: 636
diff changeset
957
2099
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
958 @param message_elt(domish.Element): raw <message> xml
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
959 @param client(SatXMPPClient, None): client to map message id to uid
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
960 if None, mapping will not be done
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
961 @return(dict): message data
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
962 """
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
963 if message_elt.name != u"message":
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
964 log.warning(_(
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
965 u"parseMessage used with a non <message/> stanza, ignoring: {xml}"
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
966 .format(xml=message_elt.toXml())))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
967 return {}
2714
57eac4fd0ec0 core (xmpp): check <message> namespace in parseMessage, and accept empty namespace (happen with Wokkel)
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
968
57eac4fd0ec0 core (xmpp): check <message> namespace in parseMessage, and accept empty namespace (happen with Wokkel)
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
969 if message_elt.uri is None:
57eac4fd0ec0 core (xmpp): check <message> namespace in parseMessage, and accept empty namespace (happen with Wokkel)
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
970 # wokkel element parsing strip out root namespace
2794
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2778
diff changeset
971 message_elt.defaultUri = message_elt.uri = C.NS_CLIENT
2979
f44a95f566d2 core, plugin XEP-0045: fix crashes when changing URIs:
Goffi <goffi@goffi.org>
parents: 2915
diff changeset
972 for c in message_elt.elements():
2794
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2778
diff changeset
973 if c.uri is None:
2983
97a1faca8f58 core (xmpp): fixed URI correction while parsing messages:
Goffi <goffi@goffi.org>
parents: 2979
diff changeset
974 c.uri = C.NS_CLIENT
2714
57eac4fd0ec0 core (xmpp): check <message> namespace in parseMessage, and accept empty namespace (happen with Wokkel)
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
975 elif message_elt.uri != C.NS_CLIENT:
57eac4fd0ec0 core (xmpp): check <message> namespace in parseMessage, and accept empty namespace (happen with Wokkel)
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
976 log.warning(_(
57eac4fd0ec0 core (xmpp): check <message> namespace in parseMessage, and accept empty namespace (happen with Wokkel)
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
977 u"received <message> with a wrong namespace: {xml}"
57eac4fd0ec0 core (xmpp): check <message> namespace in parseMessage, and accept empty namespace (happen with Wokkel)
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
978 .format(xml=message_elt.toXml())))
57eac4fd0ec0 core (xmpp): check <message> namespace in parseMessage, and accept empty namespace (happen with Wokkel)
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
979
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
980 client = self.parent
2731
a58e380c1c37 core (xmpp): set "to" attribute to <message> element when it's missing:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
981
a58e380c1c37 core (xmpp): set "to" attribute to <message> element when it's missing:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
982 if not message_elt.hasAttribute(u'to'):
a58e380c1c37 core (xmpp): set "to" attribute to <message> element when it's missing:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
983 message_elt['to'] = client.jid.full()
a58e380c1c37 core (xmpp): set "to" attribute to <message> element when it's missing:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
984
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
985 message = {}
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
986 subject = {}
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
987 extra = {}
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
988 data = {
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
989 u"from": jid.JID(message_elt["from"]),
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
990 u"to": jid.JID(message_elt["to"]),
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
991 u"uid": message_elt.getAttribute(
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
992 u"uid", unicode(uuid.uuid4())
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
993 ), # XXX: uid is not a standard attribute but may be added by plugins
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
994 u"message": message,
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
995 u"subject": subject,
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
996 u"type": message_elt.getAttribute(u"type", u"normal"),
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
997 u"extra": extra,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
998 }
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
999
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
1000 try:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
1001 message_id = data[u"extra"][u"message_id"] = message_elt[u"id"]
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
1002 except KeyError:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
1003 pass
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
1004 else:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
1005 client.mess_id2uid[(data["from"], message_id)] = data["uid"]
663
8004c7d4aba7 core: Deferred in onMessage.
Goffi <goffi@goffi.org>
parents: 636
diff changeset
1006
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1007 # message
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1008 for e in message_elt.elements(C.NS_CLIENT, "body"):
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1009 message[e.getAttribute((C.NS_XML, "lang"), "")] = unicode(e)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1010
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1011 # subject
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1012 for e in message_elt.elements(C.NS_CLIENT, "subject"):
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1013 subject[e.getAttribute((C.NS_XML, "lang"), "")] = unicode(e)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1014
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1015 # delay and timestamp
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1016 try:
2984
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1017 received_timestamp = message_elt._received_timestamp
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1018 except AttributeError:
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1019 # message_elt._received_timestamp should have been set in onMessage
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1020 # but if parseMessage is called directly, it can be missing
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1021 log.debug(u"missing received timestamp for {message_elt}".format(
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1022 message_elt=message_elt))
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1023 received_timestamp = time.time()
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1024
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1025 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1026 delay_elt = message_elt.elements(delay.NS_DELAY, "delay").next()
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1027 except StopIteration:
2984
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1028 data["timestamp"] = received_timestamp
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1029 else:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1030 parsed_delay = delay.Delay.fromElement(delay_elt)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1031 data["timestamp"] = calendar.timegm(parsed_delay.stamp.utctimetuple())
2984
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1032 data["received_timestamp"] = received_timestamp
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1033 if parsed_delay.sender:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1034 data["delay_sender"] = parsed_delay.sender.full()
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
1035
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
1036 self.host.trigger.point("message_parse", client, message_elt, data)
2099
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
1037 return data
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1038
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1039 def _onMessageStartWorkflow(self, cont, client, message_elt, post_treat):
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1040 """Parse message and do post treatments
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1041
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1042 It is the first callback called after MessageReceived trigger
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1043 @param cont(bool): workflow will continue only if this is True
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1044 @param message_elt(domish.Element): message stanza
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1045 may have be modified by triggers
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1046 @param post_treat(defer.Deferred): post parsing treatments
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1047 """
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1048 if not cont:
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1049 return
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2694
diff changeset
1050 data = self.parseMessage(message_elt)
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1051 post_treat.addCallback(self.skipEmptyMessage)
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2714
diff changeset
1052 post_treat.addCallback(self.addToHistory)
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2714
diff changeset
1053 post_treat.addCallback(self.bridgeSignal, data)
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1054 post_treat.addErrback(self.cancelErrorTrap)
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1055 post_treat.callback(data)
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1056
2099
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
1057 def onMessage(self, message_elt):
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
1058 # TODO: handle threads
2984
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1059 message_elt._received_timestamp = time.time()
2099
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
1060 client = self.parent
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1061 if not "from" in message_elt.attributes:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1062 message_elt["from"] = client.jid.host
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1063 log.debug(_(u"got message from: {from_}").format(from_=message_elt["from"]))
2099
ad88808591ef plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents: 2089
diff changeset
1064
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1065 # plugin can add their treatments to this deferred
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1066 post_treat = defer.Deferred()
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1067
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1068 d = self.host.trigger.asyncPoint(
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1069 "MessageReceived", client, message_elt, post_treat
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1070 )
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1071
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
1072 d.addCallback(self._onMessageStartWorkflow, client, message_elt, post_treat)
663
8004c7d4aba7 core: Deferred in onMessage.
Goffi <goffi@goffi.org>
parents: 636
diff changeset
1073
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1074 def skipEmptyMessage(self, data):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1075 if not data["message"] and not data["extra"] and not data["subject"]:
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1076 raise failure.Failure(exceptions.CancelError("Cancelled empty message"))
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1077 return data
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1078
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2714
diff changeset
1079 def addToHistory(self, data):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1080 if data.pop(u"history", None) == C.HISTORY_SKIP:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1081 log.info(u"history is skipped as requested")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1082 data[u"extra"][u"history"] = C.HISTORY_SKIP
2132
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2130
diff changeset
1083 else:
2751
286a32a187e7 core (xmpp): don't add to history a message if there is no message and no subject.
Goffi <goffi@goffi.org>
parents: 2748
diff changeset
1084 if data[u"message"] or data[u"subject"]: # we need a message to store
286a32a187e7 core (xmpp): don't add to history a message if there is no message and no subject.
Goffi <goffi@goffi.org>
parents: 2748
diff changeset
1085 return self.host.memory.addToHistory(self.parent, data)
286a32a187e7 core (xmpp): don't add to history a message if there is no message and no subject.
Goffi <goffi@goffi.org>
parents: 2748
diff changeset
1086 else:
286a32a187e7 core (xmpp): don't add to history a message if there is no message and no subject.
Goffi <goffi@goffi.org>
parents: 2748
diff changeset
1087 log.debug(u"not storing empty message to history: {data}"
286a32a187e7 core (xmpp): don't add to history a message if there is no message and no subject.
Goffi <goffi@goffi.org>
parents: 2748
diff changeset
1088 .format(data=data))
663
8004c7d4aba7 core: Deferred in onMessage.
Goffi <goffi@goffi.org>
parents: 636
diff changeset
1089
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2714
diff changeset
1090 def bridgeSignal(self, __, data):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1091 try:
2984
4bac4e734666 core (xmpp): set message timestamp on message reception:
Goffi <goffi@goffi.org>
parents: 2983
diff changeset
1092 data["extra"]["received_timestamp"] = unicode(data["received_timestamp"])
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1093 data["extra"]["delay_sender"] = data["delay_sender"]
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1094 except KeyError:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1095 pass
2658
4e130cc9bfc0 core (memore/encryption): new methods and checks:
Goffi <goffi@goffi.org>
parents: 2650
diff changeset
1096 if C.MESS_KEY_ENCRYPTION in data:
4e130cc9bfc0 core (memore/encryption): new methods and checks:
Goffi <goffi@goffi.org>
parents: 2650
diff changeset
1097 data[u"extra"][u"encrypted"] = C.BOOL_TRUE
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1098 if data is not None:
2736
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1099 if data["message"] or data["subject"] or data["type"] == C.MESS_TYPE_INFO:
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1100 self.host.bridge.messageNew(
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1101 data["uid"],
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1102 data["timestamp"],
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1103 data["from"].full(),
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1104 data["to"].full(),
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1105 data["message"],
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1106 data["subject"],
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1107 data["type"],
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1108 data["extra"],
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1109 profile=self.parent.profile,
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1110 )
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1111 else:
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1112 log.debug(u"Discarding bridge signal for empty message: {data}".format(
df2bc2e704bc core (xmpp): don't send message without message or subject to bridge (and log a warning in frontends if such a message is received)
Goffi <goffi@goffi.org>
parents: 2731
diff changeset
1113 data=data))
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1114 return data
1053
71d63750963e core (XMPP): message received (onMessage) refactoring:
Goffi <goffi@goffi.org>
parents: 1037
diff changeset
1115
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1116 def cancelErrorTrap(self, failure_):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1117 """A message sending can be cancelled by a plugin treatment"""
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1118 failure_.trap(exceptions.CancelError)
636
7ea6d5a86e58 plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents: 611
diff changeset
1119
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1120
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1121 class SatRosterProtocol(xmppim.RosterClientProtocol):
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1122
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1123 def __init__(self, host):
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1124 xmppim.RosterClientProtocol.__init__(self)
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1125 self.host = host
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1126 self.got_roster = defer.Deferred() # called when roster is received and ready
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1127 # XXX: the two following dicts keep a local copy of the roster
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1128 self._jids = {} # map from jids to RosterItem: key=jid value=RosterItem
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1129 self._groups = {} # map from groups to jids: key=group value=set of jids
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1130
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1131 @property
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1132 def versioning(self):
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1133 """True if server support roster versioning"""
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1134 return (NS_ROSTER_VER, u'ver') in self.parent.xmlstream.features
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1135
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1136 @property
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1137 def roster_cache(self):
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1138 """Cache of roster from storage
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1139
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1140 This property return a new PersistentDict on each call, it must be loaded
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1141 manually if necessary
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1142 """
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1143 return persistent.PersistentDict(NS_ROSTER_VER, self.parent.profile)
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1144
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1145 def _registerItem(self, item):
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1146 """Register item in local cache
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1147
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1148 item must be already registered in self._jids before this method is called
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1149 @param item (RosterIem): item added
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1150 """
1426
614145ef6e60 core (xmpp): RosterItem.jid is deprecated in Wokkel 0.7.1, use RosterItem.entity instead
souliane <souliane@mailoo.org>
parents: 1417
diff changeset
1151 log.debug(u"registering item: {}".format(item.entity.full()))
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1152 if item.entity.resource:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1153 log.warning(
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1154 u"Received a roster item with a resource, this is not common but not "
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1155 u"restricted by RFC 6121, this case may be not well tested."
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1156 )
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1157 if not item.subscriptionTo:
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1158 if not item.subscriptionFrom:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1159 log.info(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1160 _(u"There's no subscription between you and [{}]!").format(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1161 item.entity.full()
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1162 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1163 )
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1164 else:
1426
614145ef6e60 core (xmpp): RosterItem.jid is deprecated in Wokkel 0.7.1, use RosterItem.entity instead
souliane <souliane@mailoo.org>
parents: 1417
diff changeset
1165 log.info(_(u"You are not subscribed to [{}]!").format(item.entity.full()))
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1166 if not item.subscriptionFrom:
1426
614145ef6e60 core (xmpp): RosterItem.jid is deprecated in Wokkel 0.7.1, use RosterItem.entity instead
souliane <souliane@mailoo.org>
parents: 1417
diff changeset
1167 log.info(_(u"[{}] is not subscribed to you!").format(item.entity.full()))
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1168
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1169 for group in item.groups:
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1170 self._groups.setdefault(group, set()).add(item.entity)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1171
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1172 @defer.inlineCallbacks
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1173 def _cacheRoster(self, version):
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1174 """Serialise local roster and save it to storage
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1175
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1176 @param version(unicode): version of roster in local cache
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1177 """
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1178 roster_cache = self.roster_cache
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1179 yield roster_cache.clear()
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1180 roster_cache[ROSTER_VER_KEY] = version
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1181 for roster_jid, roster_item in self._jids.iteritems():
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1182 roster_jid_s = roster_jid.full()
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1183 roster_item_elt = roster_item.toElement().toXml()
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1184 roster_cache[roster_jid_s] = roster_item_elt
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1185
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1186 @defer.inlineCallbacks
2892
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1187 def resync(self):
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1188 """Ask full roster to resync database
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1189
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1190 this should not be necessary, but may be used if user suspsect roster
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1191 to be somehow corrupted
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1192 """
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1193 roster_cache = self.roster_cache
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1194 yield roster_cache.clear()
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1195 self._jids.clear()
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1196 self._groups.clear()
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1197 yield self.requestRoster()
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1198
82b781c46841 core: added a rosterResync method to bridge:
Goffi <goffi@goffi.org>
parents: 2891
diff changeset
1199 @defer.inlineCallbacks
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1200 def requestRoster(self):
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1201 """Ask the server for Roster list """
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1202 if self.versioning:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1203 log.info(_(u"our server support roster versioning, we use it"))
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1204 roster_cache = self.roster_cache
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1205 yield roster_cache.load()
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1206 try:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1207 version = roster_cache[ROSTER_VER_KEY]
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1208 except KeyError:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1209 log.info(_(u"no roster in cache, we start fresh"))
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1210 # u"" means we use versioning without valid roster in cache
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1211 version = u""
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1212 else:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1213 log.info(_(u"We have roster v{version} in cache").format(version=version))
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1214 # we deserialise cached roster to our local cache
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1215 for roster_jid_s, roster_item_elt_s in roster_cache.iteritems():
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1216 if roster_jid_s == ROSTER_VER_KEY:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1217 continue
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1218 roster_jid = jid.JID(roster_jid_s)
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1219 roster_item_elt = generic.parseXml(roster_item_elt_s.encode('utf-8'))
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1220 roster_item = xmppim.RosterItem.fromElement(roster_item_elt)
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1221 self._jids[roster_jid] = roster_item
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1222 self._registerItem(roster_item)
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1223 else:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1224 log.warning(_(u"our server doesn't support roster versioning"))
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1225 version = None
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1226
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1227 log.debug("requesting roster")
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1228 roster = yield self.getRoster(version=version)
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1229 if roster is None:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1230 log.debug(u"empty roster result received, we'll get roster item with roster "
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1231 u"pushes")
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1232 else:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1233 # a full roster is received
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1234 self._groups.clear()
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1235 self._jids = roster
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1236 for item in roster.itervalues():
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1237 if not item.subscriptionTo and not item.subscriptionFrom and not item.ask:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1238 # XXX: current behaviour: we don't want contact in our roster list
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1239 # if there is no presence subscription
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1240 # may change in the future
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1241 log.info(
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1242 u"Removing contact {} from roster because there is no presence "
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1243 u"subscription".format(
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1244 item.jid
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1245 )
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1246 )
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1247 self.removeItem(item.entity) # FIXME: to be checked
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1248 else:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1249 self._registerItem(item)
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1250 yield self._cacheRoster(roster.version)
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1251
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1252 if not self.got_roster.called:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1253 # got_roster may already be called if we use resync()
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1254 self.got_roster.callback(None)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1255
875
19d7d077478a core (xmpp): fix automatic contact deletion
souliane <souliane@mailoo.org>
parents: 819
diff changeset
1256 def removeItem(self, to_jid):
19d7d077478a core (xmpp): fix automatic contact deletion
souliane <souliane@mailoo.org>
parents: 819
diff changeset
1257 """Remove a contact from roster list
19d7d077478a core (xmpp): fix automatic contact deletion
souliane <souliane@mailoo.org>
parents: 819
diff changeset
1258 @param to_jid: a JID instance
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1259 @return: Deferred
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1260 """
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1261 return xmppim.RosterClientProtocol.removeItem(self, to_jid)
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1262
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1263 def getAttributes(self, item):
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1264 """Return dictionary of attributes as used in bridge from a RosterItem
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1265
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1266 @param item: RosterItem
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1267 @return: dictionary of attributes
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1268 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1269 item_attr = {
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1270 "to": unicode(item.subscriptionTo),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1271 "from": unicode(item.subscriptionFrom),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1272 "ask": unicode(item.ask),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1273 }
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1274 if item.name:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1275 item_attr["name"] = item.name
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1276 return item_attr
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1277
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1278 def setReceived(self, request):
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1279 item = request.item
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1280 entity = item.entity
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1281 log.info(_(u"adding {entity} to roster").format(entity=entity.full()))
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1282 if request.version is not None:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1283 # we update the cache in storage
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1284 roster_cache = self.roster_cache
2901
f6b0088ce247 code (xmpp): store version after roster item update + fix item removal:
Goffi <goffi@goffi.org>
parents: 2894
diff changeset
1285 roster_cache[entity.full()] = item.toElement().toXml()
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1286 roster_cache[ROSTER_VER_KEY] = request.version
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1287
1427
1e833970b7f0 core (xmpp): update the cache for a contact group when a contact is removed from it
souliane <souliane@mailoo.org>
parents: 1426
diff changeset
1288 try: # update the cache for the groups the contact has been removed from
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1289 left_groups = set(self._jids[entity].groups).difference(item.groups)
1427
1e833970b7f0 core (xmpp): update the cache for a contact group when a contact is removed from it
souliane <souliane@mailoo.org>
parents: 1426
diff changeset
1290 for group in left_groups:
1e833970b7f0 core (xmpp): update the cache for a contact group when a contact is removed from it
souliane <souliane@mailoo.org>
parents: 1426
diff changeset
1291 jids_set = self._groups[group]
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1292 jids_set.remove(entity)
1427
1e833970b7f0 core (xmpp): update the cache for a contact group when a contact is removed from it
souliane <souliane@mailoo.org>
parents: 1426
diff changeset
1293 if not jids_set:
1e833970b7f0 core (xmpp): update the cache for a contact group when a contact is removed from it
souliane <souliane@mailoo.org>
parents: 1426
diff changeset
1294 del self._groups[group]
1e833970b7f0 core (xmpp): update the cache for a contact group when a contact is removed from it
souliane <souliane@mailoo.org>
parents: 1426
diff changeset
1295 except KeyError:
1e833970b7f0 core (xmpp): update the cache for a contact group when a contact is removed from it
souliane <souliane@mailoo.org>
parents: 1426
diff changeset
1296 pass # no previous item registration (or it's been cleared)
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1297 self._jids[entity] = item
1398
f8ecce11a0bc core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
1298 self._registerItem(item)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1299 self.host.bridge.newContact(
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1300 entity.full(), self.getAttributes(item), item.groups, self.parent.profile
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1301 )
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1302
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1303 def removeReceived(self, request):
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1304 entity = request.item.entity
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1305 log.info(_(u"removing {entity} from roster").format(entity=entity.full()))
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1306 if request.version is not None:
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1307 # we update the cache in storage
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1308 roster_cache = self.roster_cache
2901
f6b0088ce247 code (xmpp): store version after roster item update + fix item removal:
Goffi <goffi@goffi.org>
parents: 2894
diff changeset
1309 try:
f6b0088ce247 code (xmpp): store version after roster item update + fix item removal:
Goffi <goffi@goffi.org>
parents: 2894
diff changeset
1310 del roster_cache[request.item.entity.full()]
f6b0088ce247 code (xmpp): store version after roster item update + fix item removal:
Goffi <goffi@goffi.org>
parents: 2894
diff changeset
1311 except KeyError:
f6b0088ce247 code (xmpp): store version after roster item update + fix item removal:
Goffi <goffi@goffi.org>
parents: 2894
diff changeset
1312 # because we don't use load(), cache won't have the key, but it
f6b0088ce247 code (xmpp): store version after roster item update + fix item removal:
Goffi <goffi@goffi.org>
parents: 2894
diff changeset
1313 # will be deleted from storage anyway
f6b0088ce247 code (xmpp): store version after roster item update + fix item removal:
Goffi <goffi@goffi.org>
parents: 2894
diff changeset
1314 pass
2891
6a0f42e9410a core (xmpp): implemented roster versioning
Goffi <goffi@goffi.org>
parents: 2886
diff changeset
1315 roster_cache[ROSTER_VER_KEY] = request.version
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1316
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1317 # we first remove item from local cache (self._groups and self._jids)
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1318 try:
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1319 item = self._jids.pop(entity)
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1320 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1321 log.error(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1322 u"Received a roster remove event for an item not in cache ({})".format(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1323 entity
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1324 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1325 )
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1326 return
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1327 for group in item.groups:
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1328 try:
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1329 jids_set = self._groups[group]
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1330 jids_set.remove(entity)
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1331 if not jids_set:
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1332 del self._groups[group]
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1333 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1334 log.warning(
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1335 u"there is no cache for the group [{group}] of the removed roster "
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1336 u"item [{jid_}]".format(group=group, jid=entity)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1337 )
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1338
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1339 # then we send the bridge signal
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1340 self.host.bridge.contactDeleted(entity.full(), self.parent.profile)
50
daa1f01a5332 SàT improvement:
Goffi <goffi@goffi.org>
parents: 41
diff changeset
1341
305
15a12bf2bb62 core: server identities are now save in memory
Goffi <goffi@goffi.org>
parents: 292
diff changeset
1342 def getGroups(self):
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1343 """Return a list of groups"""
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1344 return self._groups.keys()
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1345
1300
ba73798317a7 core: fixed items registration in roster management
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
1346 def getItem(self, entity_jid):
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1347 """Return RosterItem for a given jid
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1348
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1349 @param entity_jid(jid.JID): jid of the contact
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1350 @return(RosterItem, None): RosterItem instance
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1351 None if contact is not in cache
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1352 """
1300
ba73798317a7 core: fixed items registration in roster management
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
1353 return self._jids.get(entity_jid, None)
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1354
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1355 def getJids(self):
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1356 """Return all jids of the roster"""
467
47af60767013 plugin group blog: getMassiveGroupBlog first draft
Goffi <goffi@goffi.org>
parents: 466
diff changeset
1357 return self._jids.keys()
487
e789917fb59d core: added isJidInRoster method
Goffi <goffi@goffi.org>
parents: 484
diff changeset
1358
e789917fb59d core: added isJidInRoster method
Goffi <goffi@goffi.org>
parents: 484
diff changeset
1359 def isJidInRoster(self, entity_jid):
e789917fb59d core: added isJidInRoster method
Goffi <goffi@goffi.org>
parents: 484
diff changeset
1360 """Return True if jid is in roster"""
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
1361 return entity_jid in self._jids
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1362
2139
f8401024ab28 core (roster): added isPresenceAuthorised to check if an entity is authorised to see our presence
Goffi <goffi@goffi.org>
parents: 2136
diff changeset
1363 def isPresenceAuthorised(self, entity_jid):
f8401024ab28 core (roster): added isPresenceAuthorised to check if an entity is authorised to see our presence
Goffi <goffi@goffi.org>
parents: 2136
diff changeset
1364 """Return True if entity is authorised to see our presence"""
f8401024ab28 core (roster): added isPresenceAuthorised to check if an entity is authorised to see our presence
Goffi <goffi@goffi.org>
parents: 2136
diff changeset
1365 try:
f8401024ab28 core (roster): added isPresenceAuthorised to check if an entity is authorised to see our presence
Goffi <goffi@goffi.org>
parents: 2136
diff changeset
1366 item = self._jids[entity_jid.userhostJID()]
f8401024ab28 core (roster): added isPresenceAuthorised to check if an entity is authorised to see our presence
Goffi <goffi@goffi.org>
parents: 2136
diff changeset
1367 except KeyError:
f8401024ab28 core (roster): added isPresenceAuthorised to check if an entity is authorised to see our presence
Goffi <goffi@goffi.org>
parents: 2136
diff changeset
1368 return False
f8401024ab28 core (roster): added isPresenceAuthorised to check if an entity is authorised to see our presence
Goffi <goffi@goffi.org>
parents: 2136
diff changeset
1369 return item.subscriptionFrom
f8401024ab28 core (roster): added isPresenceAuthorised to check if an entity is authorised to see our presence
Goffi <goffi@goffi.org>
parents: 2136
diff changeset
1370
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1371 def getItems(self):
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1372 """Return all items of the roster"""
467
47af60767013 plugin group blog: getMassiveGroupBlog first draft
Goffi <goffi@goffi.org>
parents: 466
diff changeset
1373 return self._jids.values()
501
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 487
diff changeset
1374
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 487
diff changeset
1375 def getJidsFromGroup(self, group):
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 487
diff changeset
1376 try:
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 487
diff changeset
1377 return self._groups[group]
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 487
diff changeset
1378 except KeyError:
1300
ba73798317a7 core: fixed items registration in roster management
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
1379 raise exceptions.UnknownGroupError(group)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1380
1450
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1381 def getJidsSet(self, type_, groups=None):
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1382 """Helper method to get a set of jids
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1383
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1384 @param type_(unicode): one of:
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1385 C.ALL: get all jids from roster
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1386 C.GROUP: get jids from groups (listed in "groups")
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1387 @groups(list[unicode]): list of groups used if type_==C.GROUP
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1388 @return (set(jid.JID)): set of selected jids
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1389 """
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1390 if type_ == C.ALL and groups is not None:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1391 raise ValueError("groups must not be set for {} type".format(C.ALL))
1450
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1392
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1393 if type_ == C.ALL:
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1394 return set(self.getJids())
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1395 elif type_ == C.GROUP:
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1396 jids = set()
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1397 for group in groups:
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1398 jids.update(self.getJidsFromGroup(group))
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1399 return jids
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1400 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1401 raise ValueError(u"Unexpected type_ {}".format(type_))
1450
7797dda847ae plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
1402
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1403 def getNick(self, entity_jid):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1404 """Return a nick name for an entity
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1405
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1406 return nick choosed by user if available
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1407 else return user part of entity_jid
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1408 """
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1409 item = self.getItem(entity_jid)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1410 if item is None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1411 return entity_jid.user
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1412 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1413 return item.name or entity_jid.user
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1414
305
15a12bf2bb62 core: server identities are now save in memory
Goffi <goffi@goffi.org>
parents: 292
diff changeset
1415
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1416 class SatPresenceProtocol(xmppim.PresenceClientProtocol):
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1417 def __init__(self, host):
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1418 xmppim.PresenceClientProtocol.__init__(self)
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1419 self.host = host
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1420
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 934
diff changeset
1421 def send(self, obj):
2543
60758de1c227 plugin XEP-0115: fixed caps initial check
Goffi <goffi@goffi.org>
parents: 2527
diff changeset
1422 presence_d = defer.succeed(None)
60758de1c227 plugin XEP-0115: fixed caps initial check
Goffi <goffi@goffi.org>
parents: 2527
diff changeset
1423 if not self.host.trigger.point("Presence send", self.parent, obj, presence_d):
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 934
diff changeset
1424 return
2543
60758de1c227 plugin XEP-0115: fixed caps initial check
Goffi <goffi@goffi.org>
parents: 2527
diff changeset
1425 presence_d.addCallback(lambda __: super(SatPresenceProtocol, self).send(obj))
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 934
diff changeset
1426
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1427 def availableReceived(self, entity, show=None, statuses=None, priority=0):
334
698cbc6ebec8 core: fixed None instead of empty dict in availableReceived
Goffi <goffi@goffi.org>
parents: 333
diff changeset
1428 if not statuses:
698cbc6ebec8 core: fixed None instead of empty dict in availableReceived
Goffi <goffi@goffi.org>
parents: 333
diff changeset
1429 statuses = {}
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1430
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1431 if None in statuses: # we only want string keys
1417
176de79c8c39 core, plugin XEP-0045, frontends: change frontend method "setStatusOnline" for "setPresenceStatus":
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
1432 statuses[C.PRESENCE_STATUSES_DEFAULT] = statuses.pop(None)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1433
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1434 if not self.host.trigger.point(
2820
7ab8684784c6 core: renamed presenceReceived to presence_reveiced + use "client" as first arguments instead of "profile"
Goffi <goffi@goffi.org>
parents: 2794
diff changeset
1435 "presence_received", self.parent, entity, show, priority, statuses
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1436 ):
1480
8d61160ee4b8 core, plugin watched: new plugin, show an alert when a watched entity goes online
Goffi <goffi@goffi.org>
parents: 1450
diff changeset
1437 return
8d61160ee4b8 core, plugin watched: new plugin, show an alert when a watched entity goes online
Goffi <goffi@goffi.org>
parents: 1450
diff changeset
1438
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1439 self.host.memory.setPresenceStatus(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1440 entity, show or "", int(priority), statuses, self.parent.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1441 )
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1442
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1443 # now it's time to notify frontends
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1444 self.host.bridge.presenceUpdate(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1445 entity.full(), show or "", int(priority), statuses, self.parent.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1446 )
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1447
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1448 def unavailableReceived(self, entity, statuses=None):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1449 log.debug(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1450 _(u"presence update for [%(entity)s] (unavailable, statuses=%(statuses)s)")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1451 % {"entity": entity, C.PRESENCE_STATUSES: statuses}
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1452 )
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1453
333
4c835d614bdb core: fixed a None sent instead of empty dict in unavailableReceived
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1454 if not statuses:
4c835d614bdb core: fixed a None sent instead of empty dict in unavailableReceived
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1455 statuses = {}
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1456
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1457 if None in statuses: # we only want string keys
1417
176de79c8c39 core, plugin XEP-0045, frontends: change frontend method "setStatusOnline" for "setPresenceStatus":
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
1458 statuses[C.PRESENCE_STATUSES_DEFAULT] = statuses.pop(None)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1459
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1460 if not self.host.trigger.point(
2820
7ab8684784c6 core: renamed presenceReceived to presence_reveiced + use "client" as first arguments instead of "profile"
Goffi <goffi@goffi.org>
parents: 2794
diff changeset
1461 "presence_received", self.parent, entity, C.PRESENCE_UNAVAILABLE, 0, statuses,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1462 ):
1170
2df6427a5299 plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents: 1167
diff changeset
1463 return
2df6427a5299 plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents: 1167
diff changeset
1464
1685
43a127b6a4f2 core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1465 # now it's time to notify frontends
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1466 # if the entity is not known yet in this session or is already unavailable,
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1467 # there is no need to send an unavailable signal
1685
43a127b6a4f2 core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1468 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1469 presence = self.host.memory.getEntityDatum(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1470 entity, "presence", self.parent.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1471 )
1690
772c8edd1057 core: fixed cache check on presence unavailable
Goffi <goffi@goffi.org>
parents: 1685
diff changeset
1472 except (KeyError, exceptions.UnknownEntityError):
1685
43a127b6a4f2 core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1473 # the entity has not been seen yet in this session
43a127b6a4f2 core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1474 pass
43a127b6a4f2 core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1475 else:
43a127b6a4f2 core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1476 if presence.show != C.PRESENCE_UNAVAILABLE:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1477 self.host.bridge.presenceUpdate(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1478 entity.full(),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1479 C.PRESENCE_UNAVAILABLE,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1480 0,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1481 statuses,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1482 self.parent.profile,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1483 )
1480
8d61160ee4b8 core, plugin watched: new plugin, show an alert when a watched entity goes online
Goffi <goffi@goffi.org>
parents: 1450
diff changeset
1484
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1485 self.host.memory.setPresenceStatus(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1486 entity, C.PRESENCE_UNAVAILABLE, 0, statuses, self.parent.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1487 )
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1488
611
d722778b152c core: added Priority management
Goffi <goffi@goffi.org>
parents: 609
diff changeset
1489 def available(self, entity=None, show=None, statuses=None, priority=None):
1434
b06047e1c1fb primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents: 1431
diff changeset
1490 """Set a presence and statuses.
b06047e1c1fb primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents: 1431
diff changeset
1491
b06047e1c1fb primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents: 1431
diff changeset
1492 @param entity (jid.JID): entity
b06047e1c1fb primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents: 1431
diff changeset
1493 @param show (unicode): value in ('unavailable', '', 'away', 'xa', 'chat', 'dnd')
b06047e1c1fb primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents: 1431
diff changeset
1494 @param statuses (dict{unicode: unicode}): multilingual statuses with
b06047e1c1fb primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents: 1431
diff changeset
1495 the entry key beeing a language code on 2 characters or "default".
b06047e1c1fb primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents: 1431
diff changeset
1496 """
611
d722778b152c core: added Priority management
Goffi <goffi@goffi.org>
parents: 609
diff changeset
1497 if priority is None:
d722778b152c core: added Priority management
Goffi <goffi@goffi.org>
parents: 609
diff changeset
1498 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1499 priority = int(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1500 self.host.memory.getParamA(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1501 "Priority", "Connection", profile_key=self.parent.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1502 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1503 )
611
d722778b152c core: added Priority management
Goffi <goffi@goffi.org>
parents: 609
diff changeset
1504 except ValueError:
d722778b152c core: added Priority management
Goffi <goffi@goffi.org>
parents: 609
diff changeset
1505 priority = 0
d722778b152c core: added Priority management
Goffi <goffi@goffi.org>
parents: 609
diff changeset
1506
734
b26dfac8e46c core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents: 726
diff changeset
1507 if statuses is None:
562
0bb2e0d1c878 core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents: 549
diff changeset
1508 statuses = {}
734
b26dfac8e46c core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents: 726
diff changeset
1509
b26dfac8e46c core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents: 726
diff changeset
1510 # default for us is None for wokkel
b26dfac8e46c core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents: 726
diff changeset
1511 # so we must temporarily switch to wokkel's convention...
1417
176de79c8c39 core, plugin XEP-0045, frontends: change frontend method "setStatusOnline" for "setPresenceStatus":
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
1512 if C.PRESENCE_STATUSES_DEFAULT in statuses:
176de79c8c39 core, plugin XEP-0045, frontends: change frontend method "setStatusOnline" for "setPresenceStatus":
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
1513 statuses[None] = statuses.pop(C.PRESENCE_STATUSES_DEFAULT)
379
adcc41e4d6ea core: Fix status update crash
Xavier Maillard <xavier@maillard.im>
parents: 347
diff changeset
1514
734
b26dfac8e46c core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents: 726
diff changeset
1515 presence_elt = xmppim.AvailablePresence(entity, show, statuses, priority)
379
adcc41e4d6ea core: Fix status update crash
Xavier Maillard <xavier@maillard.im>
parents: 347
diff changeset
1516
562
0bb2e0d1c878 core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents: 549
diff changeset
1517 # ... before switching back
0bb2e0d1c878 core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents: 549
diff changeset
1518 if None in statuses:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1519 statuses["default"] = statuses.pop(None)
379
adcc41e4d6ea core: Fix status update crash
Xavier Maillard <xavier@maillard.im>
parents: 347
diff changeset
1520
1167
fe102b4cf275 core (xmpp): fixes SatPresenceProtocol.available to prevent an eventual code skipping
souliane <souliane@mailoo.org>
parents: 1089
diff changeset
1521 if not self.host.trigger.point("presence_available", presence_elt, self.parent):
fe102b4cf275 core (xmpp): fixes SatPresenceProtocol.available to prevent an eventual code skipping
souliane <souliane@mailoo.org>
parents: 1089
diff changeset
1522 return
fe102b4cf275 core (xmpp): fixes SatPresenceProtocol.available to prevent an eventual code skipping
souliane <souliane@mailoo.org>
parents: 1089
diff changeset
1523 self.send(presence_elt)
fe102b4cf275 core (xmpp): fixes SatPresenceProtocol.available to prevent an eventual code skipping
souliane <souliane@mailoo.org>
parents: 1089
diff changeset
1524
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1525 @defer.inlineCallbacks
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1526 def subscribed(self, entity):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1527 yield self.parent.roster.got_roster
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1528 xmppim.PresenceClientProtocol.subscribed(self, entity)
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1529 self.host.memory.delWaitingSub(entity.userhost(), self.parent.profile)
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1530 item = self.parent.roster.getItem(entity)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1531 if (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1532 not item or not item.subscriptionTo
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1533 ): # we automatically subscribe to 'to' presence
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 960
diff changeset
1534 log.debug(_('sending automatic "from" subscription request'))
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1535 self.subscribe(entity)
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1536
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1537 def unsubscribed(self, entity):
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1538 xmppim.PresenceClientProtocol.unsubscribed(self, entity)
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1539 self.host.memory.delWaitingSub(entity.userhost(), self.parent.profile)
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1540
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1541 def subscribedReceived(self, entity):
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1398
diff changeset
1542 log.debug(_(u"subscription approved for [%s]") % entity.userhost())
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1543 self.host.bridge.subscribe("subscribed", entity.userhost(), self.parent.profile)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1544
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1545 def unsubscribedReceived(self, entity):
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1398
diff changeset
1546 log.debug(_(u"unsubscription confirmed for [%s]") % entity.userhost())
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1547 self.host.bridge.subscribe("unsubscribed", entity.userhost(), self.parent.profile)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1548
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1549 @defer.inlineCallbacks
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1550 def subscribeReceived(self, entity):
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1398
diff changeset
1551 log.debug(_(u"subscription request from [%s]") % entity.userhost())
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1552 yield self.parent.roster.got_roster
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1553 item = self.parent.roster.getItem(entity)
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1554 if item and item.subscriptionTo:
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1555 # We automatically accept subscription if we are already subscribed to
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1556 # contact presence
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1557 log.debug(_("sending automatic subscription acceptance"))
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1558 self.subscribed(entity)
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1559 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1560 self.host.memory.addWaitingSub(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1561 "subscribe", entity.userhost(), self.parent.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1562 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1563 self.host.bridge.subscribe(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1564 "subscribe", entity.userhost(), self.parent.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1565 )
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1566
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1567 @defer.inlineCallbacks
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1568 def unsubscribeReceived(self, entity):
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1398
diff changeset
1569 log.debug(_(u"unsubscription asked for [%s]") % entity.userhost())
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
1570 yield self.parent.roster.got_roster
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 461
diff changeset
1571 item = self.parent.roster.getItem(entity)
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1572 if item and item.subscriptionFrom: # we automatically remove contact
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1573 log.debug(_("automatic contact deletion"))
875
19d7d077478a core (xmpp): fix automatic contact deletion
souliane <souliane@mailoo.org>
parents: 819
diff changeset
1574 self.host.delContact(entity, self.parent.profile)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1575 self.host.bridge.subscribe("unsubscribe", entity.userhost(), self.parent.profile)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
1576
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1577
14
a62d7d453f22 wokkel integration, part II
Goffi <goffi@goffi.org>
parents: 13
diff changeset
1578 class SatDiscoProtocol(disco.DiscoClientProtocol):
2688
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
1579 implements(iwokkel.IDisco)
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
1580
14
a62d7d453f22 wokkel integration, part II
Goffi <goffi@goffi.org>
parents: 13
diff changeset
1581 def __init__(self, host):
a62d7d453f22 wokkel integration, part II
Goffi <goffi@goffi.org>
parents: 13
diff changeset
1582 disco.DiscoClientProtocol.__init__(self)
a62d7d453f22 wokkel integration, part II
Goffi <goffi@goffi.org>
parents: 13
diff changeset
1583
2688
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
1584 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
2778
f7deb1c36b47 core, XEP-0315: move XML element handling to sat_tmp:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1585 # those features are implemented in Wokkel (or sat_tmp.wokkel)
f7deb1c36b47 core, XEP-0315: move XML element handling to sat_tmp:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1586 # and thus are always available
2693
f64f1158a26e core (xmpp): added NS_X_DATA to disco features
Goffi <goffi@goffi.org>
parents: 2691
diff changeset
1587 return [disco.DiscoFeature(NS_X_DATA),
2778
f7deb1c36b47 core, XEP-0315: move XML element handling to sat_tmp:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1588 disco.DiscoFeature(NS_XML_ELEMENT),
2693
f64f1158a26e core (xmpp): added NS_X_DATA to disco features
Goffi <goffi@goffi.org>
parents: 2691
diff changeset
1589 disco.DiscoFeature(NS_DISCO_INFO)]
2688
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
1590
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
1591 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
1592 return []
943e78e18882 core (xmpp): added missing disco#info namespace to disco info result.
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
1593
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1594
15
218ec9984fa5 wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1595 class SatFallbackHandler(generic.FallbackHandler):
218ec9984fa5 wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1596 def __init__(self, host):
218ec9984fa5 wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1597 generic.FallbackHandler.__init__(self)
218ec9984fa5 wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1598
218ec9984fa5 wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1599 def iqFallback(self, iq):
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1600 if iq.handled is True:
292
f7bd973bba5a core: wokkel behavious work around on VersionHandler to avoid XEP-0115 issue with ejabberd (see comments for details)
Goffi <goffi@goffi.org>
parents: 288
diff changeset
1601 return
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 960
diff changeset
1602 log.debug(u"iqFallback: xml = [%s]" % (iq.toXml()))
15
218ec9984fa5 wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1603 generic.FallbackHandler.iqFallback(self, iq)
16
0a024d5e0cd0 New account creation (in-band registration)
Goffi <goffi@goffi.org>
parents: 15
diff changeset
1604
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
1605
292
f7bd973bba5a core: wokkel behavious work around on VersionHandler to avoid XEP-0115 issue with ejabberd (see comments for details)
Goffi <goffi@goffi.org>
parents: 288
diff changeset
1606 class SatVersionHandler(generic.VersionHandler):
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1607
292
f7bd973bba5a core: wokkel behavious work around on VersionHandler to avoid XEP-0115 issue with ejabberd (see comments for details)
Goffi <goffi@goffi.org>
parents: 288
diff changeset
1608 def getDiscoInfo(self, requestor, target, node):
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1609 # XXX: We need to work around wokkel's behaviour (namespace not added if there
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1610 # is a node) as it cause issues with XEP-0115 & PEP (XEP-0163): there is a
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1611 # node when server ask for disco info, and not when we generate the key, so
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1612 # the hash is used with different disco features, and when the server (seen
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1613 # on ejabberd) generate its own hash for security check it reject our
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1614 # features (resulting in e.g. no notification on PEP)
292
f7bd973bba5a core: wokkel behavious work around on VersionHandler to avoid XEP-0115 issue with ejabberd (see comments for details)
Goffi <goffi@goffi.org>
parents: 288
diff changeset
1615 return generic.VersionHandler.getDiscoInfo(self, requestor, target, None)
666
2a7185b8452c core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents: 663
diff changeset
1616
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
1617
666
2a7185b8452c core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents: 663
diff changeset
1618 class SatIdentityHandler(XMPPHandler):
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1619 """Manage disco Identity of SàT."""
666
2a7185b8452c core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents: 663
diff changeset
1620 implements(iwokkel.IDisco)
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1621 # TODO: dynamic identity update (see docstring). Note that a XMPP entity can have
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
1622 # several identities
666
2a7185b8452c core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents: 663
diff changeset
1623
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1624 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2139
diff changeset
1625 return self.parent.identities
666
2a7185b8452c core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents: 663
diff changeset
1626
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2596
diff changeset
1627 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
666
2a7185b8452c core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents: 663
diff changeset
1628 return []