Mercurial > libervia-backend
annotate src/core/xmpp.py @ 2554:0062d3e79d12
plugin uri finder, jp (merge-request): labels handling:
- a label can now be specified as metadata after specifing a "xmpp:" URI in doc (with « use "[label]" label" » after the URI)
- updated jp to handle new signature of URIFind
- jp (merge-request/set): labels can now be specified using --label
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 01 Apr 2018 20:17:00 +0200 |
parents | 60758de1c227 |
children |
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 | 2 # -*- coding: utf-8 -*- |
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 |
2483 | 5 # Copyright (C) 2009-2018 Jérôme Poisson (goffi@goffi.org) |
0 | 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 | 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 | 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 | 19 |
1053
71d63750963e
core (XMPP): message received (onMessage) refactoring:
Goffi <goffi@goffi.org>
parents:
1037
diff
changeset
|
20 from sat.core.i18n import _ |
923 | 21 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
|
22 from sat.memory import cache |
330
608a4a2ba94e
Core: created a new core module where xmpp classes are put
Goffi <goffi@goffi.org>
parents:
324
diff
changeset
|
23 from twisted.internet import task, defer |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
24 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
|
25 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
|
26 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
|
27 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
|
28 from twisted.words.xish import domish |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
29 from twisted.python import failure |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
30 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
|
31 from wokkel import component |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
32 from wokkel import delay |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
960
diff
changeset
|
33 from sat.core.log import getLogger |
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
960
diff
changeset
|
34 log = getLogger(__name__) |
501
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
487
diff
changeset
|
35 from sat.core import exceptions |
666
2a7185b8452c
core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
36 from zope.interface import implements |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
37 import time |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
38 import calendar |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
39 import uuid |
2089
0931b5a6213c
core, quick_frontends: android compatibility hacks:
Goffi <goffi@goffi.org>
parents:
2050
diff
changeset
|
40 import sys |
0 | 41 |
333
4c835d614bdb
core: fixed a None sent instead of empty dict in unavailableReceived
Goffi <goffi@goffi.org>
parents:
330
diff
changeset
|
42 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
43 class SatXMPPEntity(object): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
44 """Common code for Client and Component""" |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
45 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
46 def __init__(self, host_app, profile, max_retries): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
47 |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
48 self.factory.clientConnectionLost = self.connectionLost |
1725
c1be6363bfab
core, plugin misc_account: set XMPP connection max retries to 0 when checking if an external account exists
souliane <souliane@mailoo.org>
parents:
1722
diff
changeset
|
49 self.factory.maxRetries = max_retries |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
50 # when self._connected is None, we are not connected |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
51 # else, it's a deferred which fire on disconnection |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
52 self._connected = None |
62
93cb45a7420f
SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents:
60
diff
changeset
|
53 self.profile = profile |
64 | 54 self.host_app = host_app |
2109
85f3e12e984d
core (memory/cache): file caching handling, first draft:
Goffi <goffi@goffi.org>
parents:
2099
diff
changeset
|
55 self.cache = cache.Cache(host_app, profile) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
56 self._mess_id_uid = {} # map from message id to uid used in history. Key: (full_jid,message_id) Value: uid |
341 | 57 self.conn_deferred = defer.Deferred() |
2498
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
58 self._progress_cb = {} # callback called when a progress is requested (key = progress id) |
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
59 self.actions = {} # used to keep track of actions for retrieval (key = action_id) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
60 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
61 ## initialisation ## |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
62 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
63 @defer.inlineCallbacks |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
64 def _callConnectionTriggers(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
65 """Call conneting trigger prepare connected trigger |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
66 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
67 @param plugins(iterable): plugins to use |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
68 @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
|
69 - plugin instance |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
70 - profileConnected* triggers (to call after connection) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
71 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
72 plugin_conn_cb = [] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
73 for plugin in self._getPluginsList(): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
74 # we check if plugin handle client mode |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
75 if plugin.is_handler: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
76 plugin.getHandler(self).setHandlerParent(self) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
77 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
78 # profileConnecting/profileConnected methods handling |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
79 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
80 # profile connecting is called right now (before actually starting client) |
2498
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
81 connecting_cb = getattr(plugin, "profileConnecting", None) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
82 if connecting_cb is not None: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
83 yield connecting_cb(self) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
84 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
85 # 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
|
86 connected_cb = getattr(plugin, "profileConnected", None) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
87 if connected_cb is not None: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
88 plugin_conn_cb.append((plugin, connected_cb)) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
89 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
90 defer.returnValue(plugin_conn_cb) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
91 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
92 def _getPluginsList(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
93 """Return list of plugin to use |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
94 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
95 need to be implemented by subclasses |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
96 this list is used to call profileConnect* triggers |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
97 @return(iterable[object]): plugins to use |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
98 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
99 raise NotImplementedError |
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 def _createSubProtocols(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
102 return |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
103 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
104 def entityConnected(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
105 """Called once connection is done |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
106 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
107 may return a Deferred, to perform initialisation tasks |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
108 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
109 return |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
110 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
111 @classmethod |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
112 @defer.inlineCallbacks |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
113 def startConnection(cls, host, profile, max_retries): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
114 """instantiate the entity and start the connection""" |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
115 # FIXME: reconnection doesn't seems to be handled correclty (client is deleted then recreated from scrash |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
116 # most of methods called here should be called once on first connection (e.g. adding subprotocols) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
117 # but client should not be deleted except if session is finished (independently of connection/deconnection |
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 try: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
120 port = int(host.memory.getParamA(C.FORCE_PORT_PARAM, "Connection", profile_key=profile)) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
121 except ValueError: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
122 log.debug(_("Can't parse port value, using default value")) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
123 port = None # will use default value 5222 or be retrieved from a DNS SRV record |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
124 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
125 password = yield host.memory.asyncGetParamA("Password", "Connection", profile_key=profile) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
126 entity = host.profiles[profile] = cls(host, profile, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
127 jid.JID(host.memory.getParamA("JabberID", "Connection", profile_key=profile)), |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
128 password, host.memory.getParamA(C.FORCE_SERVER_PARAM, "Connection", profile_key=profile) or None, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
129 port, max_retries) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
130 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
131 entity._createSubProtocols() |
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 entity.fallBack = SatFallbackHandler(host) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
134 entity.fallBack.setHandlerParent(entity) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
135 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
136 entity.versionHandler = SatVersionHandler(C.APP_NAME_FULL, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
137 host.full_version) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
138 entity.versionHandler.setHandlerParent(entity) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
139 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
140 entity.identityHandler = SatIdentityHandler() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
141 entity.identityHandler.setHandlerParent(entity) |
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 log.debug(_("setting plugins parents")) |
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 plugin_conn_cb = yield entity._callConnectionTriggers() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
146 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
147 entity.startService() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
148 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
149 yield entity.getConnectionDeferred() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
150 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
151 yield defer.maybeDeferred(entity.entityConnected) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
152 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
153 # Call profileConnected callback for all plugins, and print error message if any of them fails |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
154 conn_cb_list = [] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
155 for dummy, callback in plugin_conn_cb: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
156 conn_cb_list.append(defer.maybeDeferred(callback, entity)) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
157 list_d = defer.DeferredList(conn_cb_list) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
158 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
159 def logPluginResults(results): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
160 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
|
161 if not all_succeed: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
162 log.error(_(u"Plugins initialisation error")) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
163 for idx, (success, result) in enumerate(results): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
164 if not success: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
165 log.error(u"error (plugin %(name)s): %(failure)s" % |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
166 {'name': plugin_conn_cb[idx][0]._info['import_name'], 'failure': result}) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
167 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
168 yield list_d.addCallback(logPluginResults) # FIXME: we should have a timeout here, and a way to know if a plugin freeze |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
169 # TODO: mesure launch time of each plugin |
341 | 170 |
171 def getConnectionDeferred(self): | |
172 """Return a deferred which fire when the client is connected""" | |
173 return self.conn_deferred | |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
174 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
175 def _disconnectionCb(self, dummy): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
176 self._connected = None |
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 def _disconnectionEb(self, failure_): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
179 log.error(_(u"Error while disconnecting: {}".format(failure_))) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
180 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
181 def _authd(self, xmlstream): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
182 if not self.host_app.trigger.point("XML Initialized", xmlstream, self.profile): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
183 return |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
184 super(SatXMPPEntity, self)._authd(xmlstream) |
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 # the following Deferred is used to know when we are connected |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
187 # so we need to be set it to None when connection is lost |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
188 self._connected = defer.Deferred() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
189 self._connected.addCallback(self._cleanConnection) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
190 self._connected.addCallback(self._disconnectionCb) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
191 self._connected.addErrback(self._disconnectionEb) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
192 |
2543
60758de1c227
plugin XEP-0115: fixed caps initial check
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
193 log.info(_(u"********** [{profile}] CONNECTED **********").format(profile=self.profile)) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
194 self.streamInitialized() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
195 self.host_app.bridge.connected(self.profile, unicode(self.jid)) # we send the signal to the clients |
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 def _finish_connection(self, dummy): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
198 self.conn_deferred.callback(None) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
199 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
200 def streamInitialized(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
201 """Called after _authd""" |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
202 log.debug(_(u"XML stream is initialized")) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
203 self.keep_alife = task.LoopingCall(self.xmlstream.send, " ") # Needed to avoid disconnection (specially with openfire) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
204 self.keep_alife.start(C.XMPP_KEEP_ALIFE) |
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 self.disco = SatDiscoProtocol(self) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
207 self.disco.setHandlerParent(self) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
208 self.discoHandler = disco.DiscoHandler() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
209 self.discoHandler.setHandlerParent(self) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
210 disco_d = defer.succeed(None) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
211 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
212 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
|
213 return |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
214 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
215 disco_d.addCallback(self._finish_connection) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
216 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
217 def initializationFailed(self, reason): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
218 log.error(_(u"ERROR: XMPP connection failed for profile '%(profile)s': %(reason)s" % {'profile': self.profile, 'reason': reason})) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
219 self.conn_deferred.errback(reason.value) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
220 try: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
221 super(SatXMPPEntity, self).initializationFailed(reason) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
222 except: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
223 # 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
|
224 pass |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
225 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
226 ## connection ## |
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 connectionLost(self, connector, reason): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
229 try: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
230 self.keep_alife.stop() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
231 except AttributeError: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
232 log.debug(_("No keep_alife")) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
233 if self._connected is not None: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
234 self.host_app.bridge.disconnected(self.profile) # we send the signal to the clients |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
235 self._connected.callback(None) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
236 self.host_app.purgeEntity(self.profile) # and we remove references to this client |
2543
60758de1c227
plugin XEP-0115: fixed caps initial check
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
237 log.info(_(u"********** [{profile}] DISCONNECTED **********").format(profile=self.profile)) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
238 if not self.conn_deferred.called: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
239 # FIXME: real error is not gotten here (e.g. if jid is not know by Prosody, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
240 # we should have the real error) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
241 self.conn_deferred.errback(error.StreamError(u"Server unexpectedly closed the connection")) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
242 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
243 @defer.inlineCallbacks |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
244 def _cleanConnection(self, dummy): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
245 """method called on disconnection |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
246 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
247 used to call profileDisconnected* triggers |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
248 """ |
2498
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
249 trigger_name = "profileDisconnected" |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
250 for plugin in self._getPluginsList(): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
251 disconnected_cb = getattr(plugin, trigger_name, None) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
252 if disconnected_cb is not None: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
253 yield disconnected_cb(self) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
254 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
255 def isConnected(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
256 return self._connected is not None |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
257 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
258 def entityDisconnect(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
259 log.info(_(u"Disconnecting...")) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
260 self.stopService() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
261 if self._connected is not None: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
262 return self._connected |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
263 else: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
264 return defer.succeed(None) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
265 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
266 ## sending ## |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
267 |
2497
38f472dbfcf0
core (client): set default timeout of IQ to 60 seconds
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
268 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
|
269 """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
|
270 |
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
|
271 @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
|
272 @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
|
273 @return((D)domish.Element: result stanza |
2d633b3c923d
plugin XEP-0231: Bits of Binary first draft:
Goffi <goffi@goffi.org>
parents:
2109
diff
changeset
|
274 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
|
275 """ |
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
|
276 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
|
277 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
|
278 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
|
279 |
1573
6338677f3a89
core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents:
1564
diff
changeset
|
280 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
|
281 """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
|
282 |
6338677f3a89
core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents:
1564
diff
changeset
|
283 @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
|
284 @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
|
285 """ |
6338677f3a89
core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents:
1564
diff
changeset
|
286 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
|
287 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
|
288 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
289 def generateMessageXML(self, data): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
290 """Generate <message/> stanza from message data |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
291 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
292 @param data(dict): message data |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
293 domish element will be put in data['xml'] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
294 following keys are needed: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
295 - from |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
296 - to |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
297 - 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
|
298 - message |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
299 - type |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
300 - subject |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
301 - extra |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
302 @return (dict) message data |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
303 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
304 data['xml'] = message_elt = domish.Element((None, 'message')) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
305 message_elt["to"] = data["to"].full() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
306 message_elt["from"] = data['from'].full() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
307 message_elt["type"] = data["type"] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
308 if data['uid']: # key must be present but can be set to '' |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
309 # by a plugin to avoid id on purpose |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
310 message_elt['id'] = data['uid'] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
311 for lang, subject in data["subject"].iteritems(): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
312 subject_elt = message_elt.addElement("subject", content=subject) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
313 if lang: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
314 subject_elt[(C.NS_XML, 'lang')] = lang |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
315 for lang, message in data["message"].iteritems(): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
316 body_elt = message_elt.addElement("body", content=message) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
317 if lang: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
318 body_elt[(C.NS_XML, 'lang')] = lang |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
319 try: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
320 thread = data['extra']['thread'] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
321 except KeyError: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
322 if 'thread_parent' in data['extra']: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
323 raise exceptions.InternalError(u"thread_parent found while there is not associated thread") |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
324 else: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
325 thread_elt = message_elt.addElement("thread", content=thread) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
326 try: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
327 thread_elt["parent"] = data["extra"]["thread_parent"] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
328 except KeyError: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
329 pass |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
330 return data |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
331 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
332 def addPostXmlCallbacks(self, post_xml_treatments): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
333 """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
|
334 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
335 @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
|
336 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
337 raise NotImplementedError |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
338 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
339 def sendMessage(self, to_jid, message, subject=None, mess_type='auto', extra=None, uid=None, no_trigger=False): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
340 """Send a message to an entity |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
341 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
342 @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
|
343 @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
|
344 @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
|
345 @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
|
346 - auto: for automatic type detection |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
347 - 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
|
348 @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
|
349 - info_type: information type, can be |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
350 TODO |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
351 @param uid(unicode, None): unique id: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
352 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
|
353 if None, an uuid will be generated |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
354 @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
|
355 useful when a message need to be sent without any modification |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
356 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
357 if subject is None: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
358 subject = {} |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
359 if extra is None: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
360 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
|
361 |
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
|
362 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
|
363 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
364 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
|
365 "from": self.jid, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
366 "to": to_jid, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
367 "uid": uid or unicode(uuid.uuid4()), |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
368 "message": message, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
369 "subject": subject, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
370 "type": mess_type, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
371 "extra": extra, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
372 "timestamp": time.time(), |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
373 } |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
374 pre_xml_treatments = defer.Deferred() # XXX: plugin can add their pre XML treatments to this deferred |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
375 post_xml_treatments = defer.Deferred() # XXX: plugin can add their post XML treatments to this deferred |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
376 |
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
|
377 if data["type"] == C.MESS_TYPE_AUTO: |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
378 # we try to guess the type |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
379 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
|
380 data["type"] = C.MESS_TYPE_NORMAL |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
381 elif not data["to"].resource: # if to JID has a resource, the type is not 'groupchat' |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
382 # 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
|
383 try: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
384 entity_type = self.host_app.memory.getEntityData(data["to"], ['type'], self.profile)["type"] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
385 #FIXME: should entity_type manage resources ? |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
386 except (exceptions.UnknownEntityError, KeyError): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
387 entity_type = "contact" |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
388 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
389 if entity_type == "chatroom": |
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
|
390 data["type"] = C.MESS_TYPE_GROUPCHAT |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
391 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
|
392 data["type"] = C.MESS_TYPE_CHAT |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
393 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
|
394 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
|
395 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
|
396 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
397 # 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
|
398 # 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
|
399 # thing internally, this could be unified |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
400 send_only = data['extra'].get('send_only', False) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
401 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
402 if not no_trigger and not send_only: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
403 if not self.host_app.trigger.point("sendMessage" + self.trigger_suffix, self, data, pre_xml_treatments, post_xml_treatments): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
404 return defer.succeed(None) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
405 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
406 log.debug(_(u"Sending message (type {type}, to {to})").format(type=data["type"], to=to_jid.full())) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
407 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
408 pre_xml_treatments.addCallback(lambda dummy: self.generateMessageXML(data)) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
409 pre_xml_treatments.chainDeferred(post_xml_treatments) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
410 post_xml_treatments.addCallback(self.sendMessageData) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
411 if send_only: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
412 log.debug(_("Triggers, storage and echo have been inhibited by the 'send_only' parameter")) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
413 else: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
414 self.addPostXmlCallbacks(post_xml_treatments) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
415 post_xml_treatments.addErrback(self._cancelErrorTrap) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
416 post_xml_treatments.addErrback(self.host_app.logErrback) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
417 pre_xml_treatments.callback(data) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
418 return pre_xml_treatments |
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 def _cancelErrorTrap(self, failure): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
421 """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
|
422 failure.trap(exceptions.CancelError) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
423 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
424 def messageAddToHistory(self, data): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
425 """Store message into database (for local history) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
426 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
427 @param data: message data dictionnary |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
428 @param client: profile's client |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
429 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
430 if data[u"type"] != C.MESS_TYPE_GROUPCHAT: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
431 # 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
|
432 # and they will be added then |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
433 if data[u'message'] or data[u'subject']: # we need a message to store |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
434 self.host_app.memory.addToHistory(self, data) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
435 else: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
436 log.warning(u"No message found") # empty body should be managed by plugins before this point |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
437 return data |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
438 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
439 def messageSendToBridge(self, data): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
440 """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
|
441 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
442 @param data: message data dictionnary |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
443 @param client: profile's client |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
444 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
445 if data[u"type"] != C.MESS_TYPE_GROUPCHAT: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
446 # 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
|
447 # and they will be added the |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
448 if data[u'message'] or data[u'subject']: # we need a message to send something |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
449 # We send back the message, so all frontends are aware of it |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
450 self.host_app.bridge.messageNew(data[u'uid'], data[u'timestamp'], data[u'from'].full(), data[u'to'].full(), data[u'message'], data[u'subject'], data[u'type'], data[u'extra'], profile=self.profile) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
451 else: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
452 log.warning(_(u"No message found")) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
453 return data |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
454 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
455 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
456 class SatXMPPClient(SatXMPPEntity, wokkel_client.XMPPClient): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
457 implements(iwokkel.IDisco) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
458 trigger_suffix = "" |
2498
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
459 is_component = False |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
460 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
461 def __init__(self, host_app, profile, user_jid, password, host=None, port=C.XMPP_C2S_PORT, max_retries=C.XMPP_MAX_RETRIES): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
462 # 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
|
463 # 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
|
464 self.started = time.time() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
465 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
466 # Currently, we use "client/pc/Salut à Toi", but as |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
467 # SàT is multi-frontends and can be used on mobile devices, as a bot, with a web frontend, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
468 # etc., we should implement a way to dynamically update identities through the bridge |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
469 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
|
470 if sys.platform == "android": |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
471 # 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
|
472 # TODO: remove this hack and fix SRV |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
473 log.info(u"FIXME: Android hack, ignoring SRV") |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
474 host = user_jid.host |
2259
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
475 |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
476 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
|
477 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
|
478 host_data = hosts_map[user_jid.host] |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
479 if isinstance(host_data, basestring): |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
480 host = host_data |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
481 elif isinstance(host_data, dict): |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
482 if u'host' in host_data: |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
483 host = host_data[u'host'] |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
484 if u'port' in host_data: |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
485 port = host_data[u'port'] |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
486 else: |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
487 log.warning(_(u"invalid data used for host: {data}").format(data=host_data)) |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
488 host_data = None |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
489 if host_data is not None: |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
490 log.info(u"using {host}:{port} for host {host_ori} as requested in config".format( |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
491 host_ori = user_jid.host, |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
492 host = host, |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
493 port = port)) |
f51315500eb1
core: added hosts_dict handling in general config:
Goffi <goffi@goffi.org>
parents:
2172
diff
changeset
|
494 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
495 wokkel_client.XMPPClient.__init__(self, user_jid, password, host or None, port or C.XMPP_C2S_PORT) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
496 SatXMPPEntity.__init__(self, host_app, profile, max_retries) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
497 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
498 def _getPluginsList(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
499 for p in self.host_app.plugins.itervalues(): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
500 if C.PLUG_MODE_CLIENT in p._info[u'modes']: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
501 yield p |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
502 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
503 def _createSubProtocols(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
504 self.messageProt = SatMessageProtocol(self.host_app) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
505 self.messageProt.setHandlerParent(self) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
506 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
507 self.roster = SatRosterProtocol(self.host_app) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
508 self.roster.setHandlerParent(self) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
509 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
510 self.presence = SatPresenceProtocol(self.host_app) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
511 self.presence.setHandlerParent(self) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
512 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
513 def entityConnected(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
514 # 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
|
515 return self.roster.got_roster |
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 def addPostXmlCallbacks(self, post_xml_treatments): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
518 post_xml_treatments.addCallback(self.messageAddToHistory) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
519 post_xml_treatments.addCallback(self.messageSendToBridge) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
520 |
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
|
521 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
|
522 # 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
|
523 # 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
|
524 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
|
525 # 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
|
526 # 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
|
527 # *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
|
528 # (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
|
529 # 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
|
530 # a lower priority |
2136
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
531 # FIXME: trigger not used yet, can be uncommented when e2e full stanza encryption is implemented |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
532 # if not self.host_app.trigger.point("send", self, obj): |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
533 # return |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
534 super(SatXMPPClient, self).send(obj) |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
535 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
536 def sendMessageData(self, mess_data): |
2136
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
537 """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
|
538 |
2136
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
539 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
|
540 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
|
541 don't handle full stanza encryption |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
542 @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
|
543 @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
|
544 """ |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
545 # XXX: This is the last trigger before u"send" (last but one globally) for sending message. |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
546 # This is intented for e2e encryption which doesn't do full stanza encryption (e.g. OTR) |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
547 # This trigger point can't cancel the method |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
548 self.host_app.trigger.point("sendMessageData", self, mess_data) |
2136
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
549 self.send(mess_data[u'xml']) |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
550 return mess_data |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
551 |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
552 def feedback(self, to_jid, message): |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
553 """Send message to frontends |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
554 |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
555 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
|
556 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
|
557 @param to_jid(jid.JID): destinee jid |
2136
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
558 @param message(unicode): message to send to frontends |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
559 """ |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
560 self.host_app.bridge.messageNew(uid=unicode(uuid.uuid4()), |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
561 timestamp=time.time(), |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
562 from_jid=self.jid.full(), |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
563 to_jid=to_jid.full(), |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
564 message={u'': message}, |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
565 subject={}, |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
566 mess_type=C.MESS_TYPE_INFO, |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
567 extra={}, |
cc3a6aea9508
core (client): added feedback and sendMessage methods:
Goffi <goffi@goffi.org>
parents:
2132
diff
changeset
|
568 profile=self.profile) |
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
|
569 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
570 def _finish_connection(self, dummy): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
571 self.roster.requestRoster() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
572 self.presence.available() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
573 super(SatXMPPClient, self)._finish_connection(dummy) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
574 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
575 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
576 class SatXMPPComponent(SatXMPPEntity, component.Component): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
577 """XMPP component |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
578 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
579 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
|
580 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
|
581 Component need to instantiate MessageProtocol itself |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
582 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
583 implements(iwokkel.IDisco) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
584 trigger_suffix = "Component" # used for to distinguish some trigger points set in SatXMPPEntity |
2498
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
585 is_component = True |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
586 sendHistory = False # XXX: set to True from entry plugin to keep messages in history for received messages |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
587 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
588 def __init__(self, host_app, profile, component_jid, password, host=None, port=None, max_retries=C.XMPP_MAX_RETRIES): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
589 self.started = time.time() |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
590 if port is None: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
591 port = C.XMPP_COMPONENT_PORT |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
592 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
593 ## entry point ## |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
594 entry_point = host_app.memory.getEntryPoint(profile) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
595 try: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
596 self.entry_plugin = host_app.plugins[entry_point] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
597 except KeyError: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
598 raise exceptions.NotFound(_(u"The requested entry point ({entry_point}) is not available").format( |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
599 entry_point = entry_point)) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
600 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
601 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
|
602 # 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
|
603 self.jid = component_jid |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
604 if host is None: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
605 try: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
606 host = component_jid.host.split(u'.', 1)[1] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
607 except IndexError: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
608 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
|
609 # 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
|
610 # 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
|
611 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
|
612 SatXMPPEntity.__init__(self, host_app, profile, max_retries) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
613 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
614 def _buildDependencies(self, current, plugins, required=True): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
615 """build recursively dependencies needed for a plugin |
62
93cb45a7420f
SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents:
60
diff
changeset
|
616 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
617 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
|
618 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
|
619 @param current(object): parent plugin to check |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
620 use entry_point for first call |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
621 @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
|
622 give an empty list for first call |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
623 @param required(bool): True if plugin is mandatory |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
624 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
|
625 @raise InternalError: one of the plugin is not handling components |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
626 @raise KeyError: one plugin should be present in self.host_app.plugins but it is not |
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 C.PLUG_MODE_COMPONENT not in current._info[u'modes']: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
629 if not required: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
630 return |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
631 else: |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2509
diff
changeset
|
632 log.error(_(u"Plugin {current_name} is needed for {entry_name}, but it doesn't handle component mode").format( |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
633 current_name = current._info[u'import_name'], |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
634 entry_name = self.entry_plugin._info[u'import_name'] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
635 )) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
636 raise exceptions.InternalError(_(u"invalid plugin mode")) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
637 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
638 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
|
639 # plugins are already loaded as dependencies |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
640 # 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
|
641 dep = self.host_app.plugins[import_name] |
2498
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
642 self._buildDependencies(dep, plugins) |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
643 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
644 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
|
645 # here plugins are only recommendations, |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
646 # 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
|
647 try: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
648 dep = self.host_app.plugins[import_name] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
649 except KeyError: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
650 continue |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
651 self._buildDependencies(dep, plugins, required = False) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
652 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
653 if current not in plugins: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
654 # 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
|
655 # it can already be present in the list |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
656 plugins.append(current) |
262
af3d4f11fe43
Added management of connection error
Goffi <goffi@goffi.org>
parents:
260
diff
changeset
|
657 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
658 def _getPluginsList(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
659 # 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
|
660 # 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
|
661 plugins = [] |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
662 self._buildDependencies(self.entry_plugin, plugins) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
663 return plugins |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
664 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
665 def entityConnected(self): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
666 # we can now launch entry point |
2498
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
667 try: |
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
668 start_cb = self.entry_plugin.componentStart |
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
669 except AttributeError: |
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
670 return |
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
671 else: |
d6de69da3dd4
core (client): component improvments:
Goffi <goffi@goffi.org>
parents:
2497
diff
changeset
|
672 return start_cb(self) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
673 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
674 def addPostXmlCallbacks(self, post_xml_treatments): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
675 if self.sendHistory: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
676 post_xml_treatments.addCallback(self.messageAddToHistory) |
0 | 677 |
678 | |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
679 class SatMessageProtocol(xmppim.MessageProtocol): |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
680 |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
681 def __init__(self, host): |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
682 xmppim.MessageProtocol.__init__(self) |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
683 self.host = host |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
684 |
2099
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
685 @staticmethod |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
686 def parseMessage(message_elt, client=None): |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
687 """parse a message XML and return message_data |
663 | 688 |
2099
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
689 @param message_elt(domish.Element): raw <message> xml |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
690 @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
|
691 if None, mapping will not be done |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
692 @return(dict): message data |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
693 """ |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
694 message = {} |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
695 subject = {} |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
696 extra = {} |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
697 data = {"from": jid.JID(message_elt['from']), |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
698 "to": jid.JID(message_elt['to']), |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
699 "uid": message_elt.getAttribute('uid', unicode(uuid.uuid4())), # XXX: uid is not a standard attribute but may be added by plugins |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
700 "message": message, |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
701 "subject": subject, |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
702 "type": message_elt.getAttribute('type', 'normal'), |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
703 "extra": extra} |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
704 |
2099
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
705 if client is not None: |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
706 try: |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
707 data['stanza_id'] = message_elt['id'] |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
708 except KeyError: |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
709 pass |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
710 else: |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
711 client._mess_id_uid[(data['from'], data['stanza_id'])] = data['uid'] |
663 | 712 |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
713 # message |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
714 for e in message_elt.elements(C.NS_CLIENT, 'body'): |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
715 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
|
716 |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
717 # subject |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
718 for e in message_elt.elements(C.NS_CLIENT, 'subject'): |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
719 subject[e.getAttribute((C.NS_XML, 'lang'),'')] = unicode(e) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
720 |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
721 # delay and timestamp |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
722 try: |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
723 delay_elt = message_elt.elements(delay.NS_DELAY, 'delay').next() |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
724 except StopIteration: |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
725 data['timestamp'] = time.time() |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
726 else: |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
727 parsed_delay = delay.Delay.fromElement(delay_elt) |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
728 data['timestamp'] = calendar.timegm(parsed_delay.stamp.utctimetuple()) |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
729 data['received_timestamp'] = unicode(time.time()) |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
730 if parsed_delay.sender: |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
731 data['delay_sender'] = parsed_delay.sender.full() |
2099
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
732 return data |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
733 |
2099
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
734 def onMessage(self, message_elt): |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
735 # TODO: handle threads |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
736 client = self.parent |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
737 if not 'from' in message_elt.attributes: |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
738 message_elt['from'] = client.jid.host |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
739 log.debug(_(u"got message from: {from_}").format(from_=message_elt['from'])) |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
740 post_treat = defer.Deferred() # XXX: plugin can add their treatments to this deferred |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
741 |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
742 if not self.host.trigger.point("MessageReceived", client, message_elt, post_treat): |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
743 return |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
744 |
ad88808591ef
plugin XEP-0280: Message Carbons first draft
Goffi <goffi@goffi.org>
parents:
2089
diff
changeset
|
745 data = self.parseMessage(message_elt, client) |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
746 |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
747 post_treat.addCallback(self.skipEmptyMessage) |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
748 post_treat.addCallback(self.addToHistory, client) |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
749 post_treat.addCallback(self.bridgeSignal, client, data) |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
750 post_treat.addErrback(self.cancelErrorTrap) |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
751 post_treat.callback(data) |
663 | 752 |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
753 def skipEmptyMessage(self, data): |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
754 if not data['message'] and not data['extra'] and not data['subject']: |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
755 raise failure.Failure(exceptions.CancelError("Cancelled empty message")) |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
756 return data |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
757 |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
758 def addToHistory(self, data, client): |
2132
c0577837680a
core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents:
2130
diff
changeset
|
759 if data.pop(u'history', None) == C.HISTORY_SKIP: |
c0577837680a
core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents:
2130
diff
changeset
|
760 log.info(u'history is skipped as requested') |
c0577837680a
core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents:
2130
diff
changeset
|
761 data[u'extra'][u'history'] = C.HISTORY_SKIP |
c0577837680a
core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents:
2130
diff
changeset
|
762 else: |
c0577837680a
core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents:
2130
diff
changeset
|
763 return self.host.memory.addToHistory(client, data) |
663 | 764 |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
765 def bridgeSignal(self, dummy, client, data): |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
766 try: |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
767 data['extra']['received_timestamp'] = data['received_timestamp'] |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
768 data['extra']['delay_sender'] = data['delay_sender'] |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
769 except KeyError: |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
770 pass |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
771 if data is not None: |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
772 self.host.bridge.messageNew(data['uid'], data['timestamp'], data['from'].full(), data['to'].full(), data['message'], data['subject'], data['type'], data['extra'], profile=client.profile) |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
773 return data |
1053
71d63750963e
core (XMPP): message received (onMessage) refactoring:
Goffi <goffi@goffi.org>
parents:
1037
diff
changeset
|
774 |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
775 def cancelErrorTrap(self, failure_): |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
776 """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
|
777 failure_.trap(exceptions.CancelError) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
611
diff
changeset
|
778 |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
779 |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
780 class SatRosterProtocol(xmppim.RosterClientProtocol): |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
781 |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
782 def __init__(self, host): |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
783 xmppim.RosterClientProtocol.__init__(self) |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
784 self.host = host |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
785 self.got_roster = defer.Deferred() # called when roster is received and ready |
466
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
786 #XXX: the two following dicts keep a local copy of the roster |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
787 self._groups = {} # map from groups to jids: key=group value=set of jids |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
788 self._jids = None # map from jids to RosterItem: key=jid value=RosterItem |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
789 |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
790 def rosterCb(self, roster): |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
791 assert roster is not None # FIXME: must be managed with roster versioning |
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
|
792 self._groups.clear() |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
793 self._jids = roster |
1398
f8ecce11a0bc
core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
794 for item in roster.itervalues(): |
f8ecce11a0bc
core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
795 if not item.subscriptionTo and not item.subscriptionFrom and not item.ask: |
f8ecce11a0bc
core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
796 #XXX: current behaviour: we don't want contact in our roster list |
f8ecce11a0bc
core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
797 # if there is no presence subscription |
f8ecce11a0bc
core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
798 # may change in the future |
1431
70abe871eac3
core (xmpp): added log message when a an entity without presence subscription is removed from roster
Goffi <goffi@goffi.org>
parents:
1427
diff
changeset
|
799 log.info(u"Removing contact {} from roster because there is no presence subscription".format(item.jid)) |
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
|
800 self.removeItem(item.entity) # FIXME: to be checked |
1398
f8ecce11a0bc
core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
801 else: |
f8ecce11a0bc
core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
802 self._registerItem(item) |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
803 |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
804 def _registerItem(self, item): |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
805 """Register item in local cache |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
806 |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
807 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
|
808 @param item (RosterIem): item added |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
809 """ |
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
|
810 log.debug(u"registering item: {}".format(item.entity.full())) |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
811 if item.entity.resource: |
1299
3360074a2f00
core: fixed some logging calls without unicode strings, and use of print
Goffi <goffi@goffi.org>
parents:
1262
diff
changeset
|
812 log.warning(u"Received a roster item with a resource, this is not common but not restricted by RFC 6121, this case may be not well tested.") |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
813 if not item.subscriptionTo: |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
814 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
|
815 log.info(_(u"There's no subscription between you and [{}]!").format(item.entity.full())) |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
816 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
|
817 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
|
818 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
|
819 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
|
820 |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
821 for group in item.groups: |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
822 self._groups.setdefault(group, set()).add(item.entity) |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
823 |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
824 def requestRoster(self): |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
825 """ ask the server for Roster list """ |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
960
diff
changeset
|
826 log.debug("requestRoster") |
549
2c5ef983f2ef
core: client.roster has now a got_roster deferred which is fired when roster is available
Goffi <goffi@goffi.org>
parents:
538
diff
changeset
|
827 d = self.getRoster().addCallback(self.rosterCb) |
2c5ef983f2ef
core: client.roster has now a got_roster deferred which is fired when roster is available
Goffi <goffi@goffi.org>
parents:
538
diff
changeset
|
828 d.chainDeferred(self.got_roster) |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
829 |
875
19d7d077478a
core (xmpp): fix automatic contact deletion
souliane <souliane@mailoo.org>
parents:
819
diff
changeset
|
830 def removeItem(self, to_jid): |
19d7d077478a
core (xmpp): fix automatic contact deletion
souliane <souliane@mailoo.org>
parents:
819
diff
changeset
|
831 """Remove a contact from roster list |
19d7d077478a
core (xmpp): fix automatic contact deletion
souliane <souliane@mailoo.org>
parents:
819
diff
changeset
|
832 @param to_jid: a JID instance |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
833 @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
|
834 """ |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
835 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
|
836 |
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
837 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
|
838 """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
|
839 |
466
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
840 @param item: RosterItem |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
841 @return: dictionary of attributes |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
842 """ |
501
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
487
diff
changeset
|
843 item_attr = {'to': unicode(item.subscriptionTo), |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
487
diff
changeset
|
844 'from': unicode(item.subscriptionFrom), |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
487
diff
changeset
|
845 'ask': unicode(item.ask) |
466
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
846 } |
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
847 if item.name: |
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
848 item_attr['name'] = item.name |
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
849 return item_attr |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
850 |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
851 def setReceived(self, request): |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
852 #TODO: implement roster versioning (cf RFC 6121 §2.6) |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
853 item = request.item |
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
|
854 try: # update the cache for the groups the contact has been removed from |
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
|
855 left_groups = set(self._jids[item.entity].groups).difference(item.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
|
856 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
|
857 jids_set = 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
|
858 jids_set.remove(item.entity) |
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
|
859 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
|
860 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
|
861 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
|
862 pass # no previous item registration (or it's been cleared) |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
863 self._jids[item.entity] = item |
1398
f8ecce11a0bc
core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
864 self._registerItem(item) |
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
|
865 self.host.bridge.newContact(item.entity.full(), self.getAttributes(item), item.groups, self.parent.profile) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
866 |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
867 def removeReceived(self, request): |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
868 entity = request.item.entity |
1299
3360074a2f00
core: fixed some logging calls without unicode strings, and use of print
Goffi <goffi@goffi.org>
parents:
1262
diff
changeset
|
869 log.info(u"removing %s from roster list" % entity.full()) |
466
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
870 |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
871 # 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
|
872 try: |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
873 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
|
874 except KeyError: |
1409
3265a2639182
massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents:
1398
diff
changeset
|
875 log.error(u"Received a roster remove event for an item not in cache ({})".format(entity)) |
466
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
876 return |
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
877 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
|
878 try: |
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
879 jids_set = self._groups[group] |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
880 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
|
881 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
|
882 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
|
883 except KeyError: |
1409
3265a2639182
massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents:
1398
diff
changeset
|
884 log.warning(u"there is no cache for the group [%(group)s] of the removed roster item [%(jid)s]" % |
1398
f8ecce11a0bc
core (xmmp): keep the roster groups cache synchronised + fixes a log.warning
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
885 {"group": group, "jid": entity}) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
886 |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
887 # then we send the bridge signal |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
888 self.host.bridge.contactDeleted(entity.full(), self.parent.profile) |
50 | 889 |
305
15a12bf2bb62
core: server identities are now save in memory
Goffi <goffi@goffi.org>
parents:
292
diff
changeset
|
890 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
|
891 """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
|
892 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
|
893 |
1300
ba73798317a7
core: fixed items registration in roster management
Goffi <goffi@goffi.org>
parents:
1299
diff
changeset
|
894 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
|
895 """Return RosterItem for a given jid |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
896 |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
897 @param entity_jid(jid.JID): jid of the contact |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
898 @return(RosterItem, None): RosterItem instance |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
899 None if contact is not in cache |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
900 """ |
1300
ba73798317a7
core: fixed items registration in roster management
Goffi <goffi@goffi.org>
parents:
1299
diff
changeset
|
901 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
|
902 |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
903 def getJids(self): |
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
904 """Return all jids of the roster""" |
467
47af60767013
plugin group blog: getMassiveGroupBlog first draft
Goffi <goffi@goffi.org>
parents:
466
diff
changeset
|
905 return self._jids.keys() |
487 | 906 |
907 def isJidInRoster(self, entity_jid): | |
908 """Return True if jid is in roster""" | |
1262
f8a8434dbac7
core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents:
1246
diff
changeset
|
909 return entity_jid in self._jids |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
910 |
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
|
911 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
|
912 """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
|
913 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
|
914 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
|
915 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
|
916 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
|
917 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
|
918 |
466
448ce3c9e2ac
core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
919 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
|
920 """Return all items of the roster""" |
467
47af60767013
plugin group blog: getMassiveGroupBlog first draft
Goffi <goffi@goffi.org>
parents:
466
diff
changeset
|
921 return self._jids.values() |
501
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
487
diff
changeset
|
922 |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
487
diff
changeset
|
923 def getJidsFromGroup(self, group): |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
487
diff
changeset
|
924 try: |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
487
diff
changeset
|
925 return self._groups[group] |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
487
diff
changeset
|
926 except KeyError: |
1300
ba73798317a7
core: fixed items registration in roster management
Goffi <goffi@goffi.org>
parents:
1299
diff
changeset
|
927 raise exceptions.UnknownGroupError(group) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
928 |
1450
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
929 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
|
930 """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
|
931 |
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
932 @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
|
933 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
|
934 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
|
935 @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
|
936 @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
|
937 """ |
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
938 if type_ == C.ALL and groups is not None: |
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
939 raise ValueError('groups must not be set for {} type'.format(C.ALL)) |
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
940 |
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
941 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
|
942 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
|
943 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
|
944 jids = set() |
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
945 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
|
946 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
|
947 return jids |
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
948 else: |
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
949 raise ValueError(u'Unexpected type_ {}'.format(type_)) |
7797dda847ae
plugins xep-0277, groupblog: added subscriteToMany to replace massiveSubscribeGroupBlogs + added SatRosterProtocol.getJidsSet
Goffi <goffi@goffi.org>
parents:
1435
diff
changeset
|
950 |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
951 def getNick(self, entity_jid): |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
952 """Return a nick name for an entity |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
953 |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
954 return nick choosed by user if available |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
955 else return user part of entity_jid |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
956 """ |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
957 item = self.getItem(entity_jid) |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
958 if item is None: |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
959 return entity_jid.user |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
960 else: |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
961 return item.name or entity_jid.user |
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
962 |
305
15a12bf2bb62
core: server identities are now save in memory
Goffi <goffi@goffi.org>
parents:
292
diff
changeset
|
963 |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
964 class SatPresenceProtocol(xmppim.PresenceClientProtocol): |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
965 |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
966 def __init__(self, host): |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
967 xmppim.PresenceClientProtocol.__init__(self) |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
968 self.host = host |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
969 |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
934
diff
changeset
|
970 def send(self, obj): |
2543
60758de1c227
plugin XEP-0115: fixed caps initial check
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
971 presence_d = defer.succeed(None) |
60758de1c227
plugin XEP-0115: fixed caps initial check
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
972 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
|
973 return |
2543
60758de1c227
plugin XEP-0115: fixed caps initial check
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
974 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
|
975 |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
976 def availableReceived(self, entity, show=None, statuses=None, priority=0): |
1409
3265a2639182
massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents:
1398
diff
changeset
|
977 log.debug(_(u"presence update for [%(entity)s] (available, show=%(show)s statuses=%(statuses)s priority=%(priority)d)") % {'entity': entity, C.PRESENCE_SHOW: show, C.PRESENCE_STATUSES: statuses, C.PRESENCE_PRIORITY: priority}) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
978 |
334
698cbc6ebec8
core: fixed None instead of empty dict in availableReceived
Goffi <goffi@goffi.org>
parents:
333
diff
changeset
|
979 if not statuses: |
698cbc6ebec8
core: fixed None instead of empty dict in availableReceived
Goffi <goffi@goffi.org>
parents:
333
diff
changeset
|
980 statuses = {} |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
981 |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
982 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
|
983 statuses[C.PRESENCE_STATUSES_DEFAULT] = statuses.pop(None) |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
984 |
1480
8d61160ee4b8
core, plugin watched: new plugin, show an alert when a watched entity goes online
Goffi <goffi@goffi.org>
parents:
1450
diff
changeset
|
985 if not self.host.trigger.point("presenceReceived", entity, show, priority, statuses, self.parent.profile): |
8d61160ee4b8
core, plugin watched: new plugin, show an alert when a watched entity goes online
Goffi <goffi@goffi.org>
parents:
1450
diff
changeset
|
986 return |
8d61160ee4b8
core, plugin watched: new plugin, show an alert when a watched entity goes online
Goffi <goffi@goffi.org>
parents:
1450
diff
changeset
|
987 |
484
23cbdf0a0777
core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
988 self.host.memory.setPresenceStatus(entity, show or "", |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
989 int(priority), statuses, |
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
990 self.parent.profile) |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
991 |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
992 # now it's time to notify frontends |
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
993 self.host.bridge.presenceUpdate(entity.full(), show or "", |
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
994 int(priority), statuses, |
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
995 self.parent.profile) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
996 |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
997 def unavailableReceived(self, entity, statuses=None): |
1409
3265a2639182
massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents:
1398
diff
changeset
|
998 log.debug(_(u"presence update for [%(entity)s] (unavailable, statuses=%(statuses)s)") % {'entity': entity, C.PRESENCE_STATUSES: statuses}) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
999 |
333
4c835d614bdb
core: fixed a None sent instead of empty dict in unavailableReceived
Goffi <goffi@goffi.org>
parents:
330
diff
changeset
|
1000 if not statuses: |
4c835d614bdb
core: fixed a None sent instead of empty dict in unavailableReceived
Goffi <goffi@goffi.org>
parents:
330
diff
changeset
|
1001 statuses = {} |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
1002 |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1003 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
|
1004 statuses[C.PRESENCE_STATUSES_DEFAULT] = statuses.pop(None) |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
1005 |
1170
2df6427a5299
plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents:
1167
diff
changeset
|
1006 if not self.host.trigger.point("presenceReceived", entity, "unavailable", 0, statuses, self.parent.profile): |
2df6427a5299
plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents:
1167
diff
changeset
|
1007 return |
2df6427a5299
plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents:
1167
diff
changeset
|
1008 |
1685
43a127b6a4f2
core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents:
1622
diff
changeset
|
1009 # now it's time to notify frontends |
43a127b6a4f2
core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents:
1622
diff
changeset
|
1010 # if the entity is not known yet in this session or is already unavailable, there is no need to send an unavailable signal |
43a127b6a4f2
core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents:
1622
diff
changeset
|
1011 try: |
43a127b6a4f2
core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents:
1622
diff
changeset
|
1012 presence = self.host.memory.getEntityDatum(entity, "presence", self.parent.profile) |
1690
772c8edd1057
core: fixed cache check on presence unavailable
Goffi <goffi@goffi.org>
parents:
1685
diff
changeset
|
1013 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
|
1014 # 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
|
1015 pass |
43a127b6a4f2
core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents:
1622
diff
changeset
|
1016 else: |
43a127b6a4f2
core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents:
1622
diff
changeset
|
1017 if presence.show != C.PRESENCE_UNAVAILABLE: |
43a127b6a4f2
core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents:
1622
diff
changeset
|
1018 self.host.bridge.presenceUpdate(entity.full(), C.PRESENCE_UNAVAILABLE, 0, statuses, self.parent.profile) |
1480
8d61160ee4b8
core, plugin watched: new plugin, show an alert when a watched entity goes online
Goffi <goffi@goffi.org>
parents:
1450
diff
changeset
|
1019 |
1685
43a127b6a4f2
core: avoid to send presence unavailable signal when it's not necessary
Goffi <goffi@goffi.org>
parents:
1622
diff
changeset
|
1020 self.host.memory.setPresenceStatus(entity, C.PRESENCE_UNAVAILABLE, 0, statuses, self.parent.profile) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
1021 |
611 | 1022 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
|
1023 """Set a presence and statuses. |
b06047e1c1fb
primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents:
1431
diff
changeset
|
1024 |
b06047e1c1fb
primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents:
1431
diff
changeset
|
1025 @param entity (jid.JID): entity |
b06047e1c1fb
primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents:
1431
diff
changeset
|
1026 @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
|
1027 @param statuses (dict{unicode: unicode}): multilingual statuses with |
b06047e1c1fb
primitivus: fix setting the presence and status
souliane <souliane@mailoo.org>
parents:
1431
diff
changeset
|
1028 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
|
1029 """ |
611 | 1030 if priority is None: |
1031 try: | |
1032 priority = int(self.host.memory.getParamA("Priority", "Connection", profile_key=self.parent.profile)) | |
1033 except ValueError: | |
1034 priority = 0 | |
1035 | |
734
b26dfac8e46c
core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents:
726
diff
changeset
|
1036 if statuses is None: |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
549
diff
changeset
|
1037 statuses = {} |
734
b26dfac8e46c
core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents:
726
diff
changeset
|
1038 |
b26dfac8e46c
core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents:
726
diff
changeset
|
1039 # default for us is None for wokkel |
b26dfac8e46c
core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents:
726
diff
changeset
|
1040 # 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
|
1041 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
|
1042 statuses[None] = statuses.pop(C.PRESENCE_STATUSES_DEFAULT) |
379
adcc41e4d6ea
core: Fix status update crash
Xavier Maillard <xavier@maillard.im>
parents:
347
diff
changeset
|
1043 |
734
b26dfac8e46c
core: bad indentation in SatPresenceProtocol.available
souliane <souliane@mailoo.org>
parents:
726
diff
changeset
|
1044 presence_elt = xmppim.AvailablePresence(entity, show, statuses, priority) |
379
adcc41e4d6ea
core: Fix status update crash
Xavier Maillard <xavier@maillard.im>
parents:
347
diff
changeset
|
1045 |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
549
diff
changeset
|
1046 # ... before switching back |
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
549
diff
changeset
|
1047 if None in statuses: |
1417
176de79c8c39
core, plugin XEP-0045, frontends: change frontend method "setStatusOnline" for "setPresenceStatus":
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
1048 statuses['default'] = statuses.pop(None) |
379
adcc41e4d6ea
core: Fix status update crash
Xavier Maillard <xavier@maillard.im>
parents:
347
diff
changeset
|
1049 |
1167
fe102b4cf275
core (xmpp): fixes SatPresenceProtocol.available to prevent an eventual code skipping
souliane <souliane@mailoo.org>
parents:
1089
diff
changeset
|
1050 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
|
1051 return |
fe102b4cf275
core (xmpp): fixes SatPresenceProtocol.available to prevent an eventual code skipping
souliane <souliane@mailoo.org>
parents:
1089
diff
changeset
|
1052 self.send(presence_elt) |
fe102b4cf275
core (xmpp): fixes SatPresenceProtocol.available to prevent an eventual code skipping
souliane <souliane@mailoo.org>
parents:
1089
diff
changeset
|
1053 |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
1054 @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
|
1055 def subscribed(self, entity): |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
1056 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
|
1057 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
|
1058 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
|
1059 item = self.parent.roster.getItem(entity) |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1060 if not item or not item.subscriptionTo: # we automatically subscribe to 'to' presence |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
960
diff
changeset
|
1061 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
|
1062 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
|
1063 |
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
|
1064 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
|
1065 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
|
1066 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
|
1067 |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
1068 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
|
1069 log.debug(_(u"subscription approved for [%s]") % entity.userhost()) |
66
8147b4f40809
SàT: multi-profile: DBus signals and frontend adaptation (first draft)
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
1070 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
|
1071 |
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
1072 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
|
1073 log.debug(_(u"unsubscription confirmed for [%s]") % entity.userhost()) |
66
8147b4f40809
SàT: multi-profile: DBus signals and frontend adaptation (first draft)
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
1074 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
|
1075 |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
1076 @defer.inlineCallbacks |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
1077 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
|
1078 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
|
1079 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
|
1080 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
|
1081 if item and item.subscriptionTo: |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1082 # We automatically accept subscription if we are already subscribed to contact presence |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
960
diff
changeset
|
1083 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
|
1084 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
|
1085 else: |
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
|
1086 self.host.memory.addWaitingSub('subscribe', 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
|
1087 self.host.bridge.subscribe('subscribe', entity.userhost(), self.parent.profile) |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
1088 |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
1089 @defer.inlineCallbacks |
13
bd9e9997d540
wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents:
12
diff
changeset
|
1090 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
|
1091 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
|
1092 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
|
1093 item = self.parent.roster.getItem(entity) |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1094 if item and item.subscriptionFrom: # we automatically remove contact |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
960
diff
changeset
|
1095 log.debug(_('automatic contact deletion')) |
875
19d7d077478a
core (xmpp): fix automatic contact deletion
souliane <souliane@mailoo.org>
parents:
819
diff
changeset
|
1096 self.host.delContact(entity, self.parent.profile) |
66
8147b4f40809
SàT: multi-profile: DBus signals and frontend adaptation (first draft)
Goffi <goffi@goffi.org>
parents:
65
diff
changeset
|
1097 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
|
1098 |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1099 |
14 | 1100 class SatDiscoProtocol(disco.DiscoClientProtocol): |
1101 def __init__(self, host): | |
1102 disco.DiscoClientProtocol.__init__(self) | |
1103 | |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1104 |
15
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
1105 class SatFallbackHandler(generic.FallbackHandler): |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
1106 def __init__(self, host): |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
1107 generic.FallbackHandler.__init__(self) |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
1108 |
218ec9984fa5
wokkel integration part III + memory saved again
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
1109 def iqFallback(self, iq): |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1110 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
|
1111 return |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
960
diff
changeset
|
1112 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
|
1113 generic.FallbackHandler.iqFallback(self, iq) |
16
0a024d5e0cd0
New account creation (in-band registration)
Goffi <goffi@goffi.org>
parents:
15
diff
changeset
|
1114 |
589
d1b4805124a1
Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1115 |
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
|
1116 class SatVersionHandler(generic.VersionHandler): |
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
|
1117 |
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
|
1118 def getDiscoInfo(self, requestor, target, node): |
461 | 1119 #XXX: We need to work around wokkel's behaviour (namespace not added if there is a |
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
|
1120 # node) as it cause issues with XEP-0115 & PEP (XEP-0163): there is a node when server |
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
|
1121 # ask for disco info, and not when we generate the key, so the hash is used with different |
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
|
1122 # disco features, and when the server (seen on ejabberd) generate its own hash for security check |
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
|
1123 # it reject our features (resulting in e.g. no notification on PEP) |
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
|
1124 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
|
1125 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
1126 |
666
2a7185b8452c
core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
1127 class SatIdentityHandler(XMPPHandler): |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
1128 """ Manage disco Identity of SàT. |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
1129 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
1130 """ |
666
2a7185b8452c
core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
1131 #TODO: dynamic identity update (see docstring). Note that a XMPP entity can have several identities |
2a7185b8452c
core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
1132 implements(iwokkel.IDisco) |
2a7185b8452c
core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
1133 |
2a7185b8452c
core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
1134 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2139
diff
changeset
|
1135 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
|
1136 |
2a7185b8452c
core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
1137 def getDiscoItems(self, requestor, target, nodeIdentifier=''): |
2a7185b8452c
core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
1138 return [] |