Mercurial > libervia-backend
annotate sat/memory/disco.py @ 3254:6cf4bd6972c2
core, frontends: avatar refactoring:
/!\ huge commit
Avatar logic has been reworked around the IDENTITY plugin: plugins able to handle avatar
or other identity related metadata (like nicknames) register to IDENTITY plugin in the
same way as for other features like download/upload. Once registered, IDENTITY plugin will
call them when suitable in order of priority, and handle caching.
Methods to manage those metadata from frontend now use serialised data.
For now `avatar` and `nicknames` are handled:
- `avatar` is now a dict with `path` + metadata like `media_type`, instead of just a string
path
- `nicknames` is now a list of nicknames in order of priority. This list is never empty,
and `nicknames[0]` should be the preferred nickname to use by frontends in most cases.
In addition to contact specified nicknames, user set nickname (the one set in roster) is
used in priority when available.
Among the side changes done with this commit, there are:
- a new `contactGet` bridge method to get roster metadata for a single contact
- SatPresenceProtocol.send returns a Deferred to check when it has actually been sent
- memory's methods to handle entities data now use `client` as first argument
- metadata filter can be specified with `getIdentity`
- `getAvatar` and `setAvatar` are now part of the IDENTITY plugin instead of XEP-0054 (and
there signature has changed)
- `isRoom` and `getBareOrFull` are now part of XEP-0045 plugin
- jp avatar/get command uses `xdg-open` first when available for `--show` flag
- `--no-cache` has been added to jp avatar/get and identity/get
- jp identity/set has been simplified, explicit options (`--nickname` only for now) are
used instead of `--field`. `--field` may come back in the future if necessary for extra
data.
- QuickContactList `SetContact` now handle None as a value, and doesn't use it to delete the
metadata anymore
- improved cache handling for `metadata` and `nicknames` in quick frontend
- new `default` argument in QuickContactList `getCache`
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 14 Apr 2020 21:00:33 +0200 |
parents | e4d3ba75b1b2 |
children | be6d91572633 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
4 # SAT: a jabber client |
3136 | 5 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org) |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
594
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:
594
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:
594
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:
594
diff
changeset
|
10 # (at your option) any later version. |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
594
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:
594
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:
594
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:
594
diff
changeset
|
15 # GNU Affero General Public License for more details. |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
594
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:
594
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
771 | 20 from sat.core.i18n import _ |
951
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
21 from sat.core import exceptions |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
973
diff
changeset
|
22 from sat.core.log import getLogger |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
23 |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
973
diff
changeset
|
24 log = getLogger(__name__) |
941
c6d8fc63b1db
core, plugins: host.getClient now raise an exception instead of returning None when no profile is found, plugins have been adapted consequently and a bit cleaned
Goffi <goffi@goffi.org>
parents:
916
diff
changeset
|
25 from twisted.words.protocols.jabber import jid |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
26 from twisted.words.protocols.jabber.error import StanzaError |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
27 from twisted.internet import defer |
1189
7d640c303140
core (disco): added a timeout to get items
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
28 from twisted.internet import reactor |
1493
1285c714a6cc
core (disco): use of failure.Failure when raising FeatureNotFound to avoid a jump in debugger in debug mode
Goffi <goffi@goffi.org>
parents:
1491
diff
changeset
|
29 from twisted.python import failure |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
30 from sat.core.constants import Const as C |
1684
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
31 from sat.tools import xml_tools |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
32 from sat.memory import persistent |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
33 from wokkel import disco |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
34 from base64 import b64encode |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
35 from hashlib import sha1 |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 |
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 |
1189
7d640c303140
core (disco): added a timeout to get items
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
38 TIMEOUT = 15 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
39 CAP_HASH_ERROR = "ERROR" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
40 |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 |
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 class HashGenerationError(Exception): |
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 pass |
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
45 |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 class ByteIdentity(object): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
47 """This class manage identity as bytes (needed for i;octet sort), it is used for the hash generation""" |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 |
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 def __init__(self, identity, lang=None): |
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 assert isinstance(identity, disco.DiscoIdentity) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
51 self.category = identity.category.encode("utf-8") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
52 self.idType = identity.type.encode("utf-8") |
3028 | 53 self.name = identity.name.encode("utf-8") if identity.name else b"" |
54 self.lang = lang.encode("utf-8") if lang is not None else b"" | |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 |
3028 | 56 def __bytes__(self): |
57 return b"%s/%s/%s/%s" % (self.category, self.idType, self.lang, self.name) | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
58 |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 |
1684
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
60 class HashManager(object): |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
61 """map object which manage hashes |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
62 |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
63 persistent storage is update when a new hash is added |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
64 """ |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
65 |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
66 def __init__(self, persistent): |
1752
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
67 self.hashes = { |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
68 CAP_HASH_ERROR: disco.DiscoInfo() # used when we can't get disco infos |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
69 } |
1684
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
70 self.persistent = persistent |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
71 |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
72 def __getitem__(self, key): |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
73 return self.hashes[key] |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
74 |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
75 def __setitem__(self, hash_, disco_info): |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
76 if hash_ in self.hashes: |
3028 | 77 log.debug("ignoring hash set: it is already known") |
1684
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
78 return |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
79 self.hashes[hash_] = disco_info |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
80 self.persistent[hash_] = disco_info.toElement().toXml() |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
81 |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
82 def __contains__(self, hash_): |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
83 return self.hashes.__contains__(hash_) |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
84 |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
85 def load(self): |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
86 def fillHashes(hashes): |
3028 | 87 for hash_, xml in hashes.items(): |
1684
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
88 element = xml_tools.ElementParser()(xml) |
2587
e70023e84974
core (disco): fixed disco capabilities (empty disco was used)
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
89 disco_info = disco.DiscoInfo.fromElement(element) |
3250
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
90 for ext_form in disco_info.extensions.values(): |
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
91 # wokkel doesn't call typeCheck on reception, so we do it here |
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
92 ext_form.typeCheck() |
2587
e70023e84974
core (disco): fixed disco capabilities (empty disco was used)
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
93 if not disco_info.features and not disco_info.identities: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
94 log.warning( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
95 _( |
3028 | 96 "no feature/identity found in disco element (hash: {cap_hash}), ignoring: {xml}" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
97 ).format(cap_hash=hash_, xml=xml) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
98 ) |
2587
e70023e84974
core (disco): fixed disco capabilities (empty disco was used)
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
99 else: |
e70023e84974
core (disco): fixed disco capabilities (empty disco was used)
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
100 self.hashes[hash_] = disco_info |
e70023e84974
core (disco): fixed disco capabilities (empty disco was used)
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
101 |
3028 | 102 log.info("Disco hashes loaded") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
103 |
1684
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
104 d = self.persistent.load() |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
105 d.addCallback(fillHashes) |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
106 return d |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
107 |
1752
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
108 |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
109 class Discovery(object): |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
110 """ Manage capabilities of entities """ |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 |
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 def __init__(self, host): |
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 self.host = host |
1684
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
114 # TODO: remove legacy hashes |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
115 |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
116 def load(self): |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
117 """Load persistent hashes""" |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
118 self.hashes = HashManager(persistent.PersistentDict("disco")) |
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1675
diff
changeset
|
119 return self.hashes.load() |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
121 @defer.inlineCallbacks |
3028 | 122 def hasFeature(self, client, feature, jid_=None, node=""): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
123 """Tell if an entity has the required feature |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
124 |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
125 @param feature: feature namespace |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
126 @param jid_: jid of the target, or None for profile's server |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
127 @param node(unicode): optional node to use for disco request |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
128 @return: a Deferred which fire a boolean (True if feature is available) |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
129 """ |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
130 disco_infos = yield self.getInfos(client, jid_, node) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
131 defer.returnValue(feature in disco_infos.features) |
951
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
132 |
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
133 @defer.inlineCallbacks |
3028 | 134 def checkFeature(self, client, feature, jid_=None, node=""): |
951
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
135 """Like hasFeature, but raise an exception is feature is not Found |
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
136 |
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
137 @param feature: feature namespace |
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
138 @param jid_: jid of the target, or None for profile's server |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
139 @param node(unicode): optional node to use for disco request |
951
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
140 |
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
141 @raise: exceptions.FeatureNotFound |
027a054c6dda
core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
142 """ |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
143 disco_infos = yield self.getInfos(client, jid_, node) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
144 if not feature in disco_infos.features: |
3156
0318802dfe28
core (memory/disco): fixed checkFeature return Failure:
Goffi <goffi@goffi.org>
parents:
3152
diff
changeset
|
145 raise failure.Failure(exceptions.FeatureNotFound()) |
1491
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
146 |
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
147 @defer.inlineCallbacks |
3028 | 148 def checkFeatures(self, client, features, jid_=None, identity=None, node=""): |
1491
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
149 """Like checkFeature, but check several features at once, and check also identity |
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
150 |
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
151 @param features(iterable[unicode]): features to check |
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
152 @param jid_(jid.JID): jid of the target, or None for profile's server |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
153 @param node(unicode): optional node to use for disco request |
1491
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
154 @param identity(None, tuple(unicode, unicode): if not None, the entity must have an identity with this (category, type) tuple |
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
155 |
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
156 @raise: exceptions.FeatureNotFound |
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
157 """ |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
158 disco_infos = yield self.getInfos(client, jid_, node) |
1491
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
159 if not set(features).issubset(disco_infos.features): |
1493
1285c714a6cc
core (disco): use of failure.Failure when raising FeatureNotFound to avoid a jump in debugger in debug mode
Goffi <goffi@goffi.org>
parents:
1491
diff
changeset
|
160 raise failure.Failure(exceptions.FeatureNotFound()) |
1491
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
161 |
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
162 if identity is not None and identity not in disco_infos.identities: |
1493
1285c714a6cc
core (disco): use of failure.Failure when raising FeatureNotFound to avoid a jump in debugger in debug mode
Goffi <goffi@goffi.org>
parents:
1491
diff
changeset
|
163 raise failure.Failure(exceptions.FeatureNotFound()) |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 |
3028 | 165 def getInfos(self, client, jid_=None, node="", use_cache=True): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
166 """get disco infos from jid_, filling capability hash if needed |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
167 |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
168 @param jid_: jid of the target, or None for profile's server |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
169 @param node(unicode): optional node to use for disco request |
2342
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
170 @param use_cache(bool): if True, use cached data if available |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
171 @return: a Deferred which fire disco.DiscoInfo |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
172 """ |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
173 if jid_ is None: |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
174 jid_ = jid.JID(client.jid.host) |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
175 try: |
2342
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
176 if not use_cache: |
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
177 # we ignore cache, so we pretend we haven't found it |
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
178 raise KeyError |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
179 cap_hash = self.host.memory.getEntityData( |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3250
diff
changeset
|
180 client, jid_, [C.ENTITY_CAP_HASH] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
181 )[C.ENTITY_CAP_HASH] |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
182 except (KeyError, exceptions.UnknownEntityError): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
183 # capability hash is not available, we'll compute one |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
184 def infosCb(disco_infos): |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
185 cap_hash = self.generateHash(disco_infos) |
3250
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
186 for ext_form in disco_infos.extensions.values(): |
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
187 # wokkel doesn't call typeCheck on reception, so we do it here |
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
188 # to avoid ending up with incorrect types. We have to do it after |
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
189 # the hash has been generated (str value is needed to compute the |
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
190 # hash) |
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
191 ext_form.typeCheck() |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
192 self.hashes[cap_hash] = disco_infos |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
193 self.host.memory.updateEntityData( |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3250
diff
changeset
|
194 client, jid_, C.ENTITY_CAP_HASH, cap_hash |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
195 ) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
196 return disco_infos |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
197 |
1752
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
198 def infosEb(fail): |
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
199 if fail.check(defer.CancelledError): |
3028 | 200 reason = "request time-out" |
3152
7ce31f347ca3
core (memory/disco): fixed failure creation in infosEb
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
201 fail = failure.Failure(exceptions.TimeOutError(str(fail.value))) |
1752
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
202 else: |
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
203 try: |
3028 | 204 reason = str(fail.value) |
1752
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
205 except AttributeError: |
3028 | 206 reason = str(fail) |
2768
cb34af35af6f
core (disco): client.disco.requestInfo failure are re-raised:
Goffi <goffi@goffi.org>
parents:
2765
diff
changeset
|
207 |
cb34af35af6f
core (disco): client.disco.requestInfo failure are re-raised:
Goffi <goffi@goffi.org>
parents:
2765
diff
changeset
|
208 log.warning( |
3194
12486cd4fa8b
core (memory/disco): minor log message change
Goffi <goffi@goffi.org>
parents:
3156
diff
changeset
|
209 "can't request disco infos from {jid}: {reason}".format( |
2768
cb34af35af6f
core (disco): client.disco.requestInfo failure are re-raised:
Goffi <goffi@goffi.org>
parents:
2765
diff
changeset
|
210 jid=jid_.full(), reason=reason |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
211 ) |
2768
cb34af35af6f
core (disco): client.disco.requestInfo failure are re-raised:
Goffi <goffi@goffi.org>
parents:
2765
diff
changeset
|
212 ) |
cb34af35af6f
core (disco): client.disco.requestInfo failure are re-raised:
Goffi <goffi@goffi.org>
parents:
2765
diff
changeset
|
213 |
cb34af35af6f
core (disco): client.disco.requestInfo failure are re-raised:
Goffi <goffi@goffi.org>
parents:
2765
diff
changeset
|
214 # XXX we set empty disco in cache, to avoid getting an error or waiting |
cb34af35af6f
core (disco): client.disco.requestInfo failure are re-raised:
Goffi <goffi@goffi.org>
parents:
2765
diff
changeset
|
215 # for a timeout again the next time |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
216 self.host.memory.updateEntityData( |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3250
diff
changeset
|
217 client, jid_, C.ENTITY_CAP_HASH, CAP_HASH_ERROR |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
218 ) |
2768
cb34af35af6f
core (disco): client.disco.requestInfo failure are re-raised:
Goffi <goffi@goffi.org>
parents:
2765
diff
changeset
|
219 raise fail |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
220 |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
221 d = client.disco.requestInfo(jid_, nodeIdentifier=node) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
222 d.addCallback(infosCb) |
1752
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
223 d.addErrback(infosEb) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
224 return d |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
225 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
226 disco_infos = self.hashes[cap_hash] |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
227 return defer.succeed(disco_infos) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
228 |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
229 @defer.inlineCallbacks |
3028 | 230 def getItems(self, client, jid_=None, node="", use_cache=True): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
231 """get disco items from jid_, cache them for our own server |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
232 |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
233 @param jid_(jid.JID): jid of the target, or None for profile's server |
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
234 @param node(unicode): optional node to use for disco request |
2342
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
235 @param use_cache(bool): if True, use cached data if available |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
236 @return: a Deferred which fire disco.DiscoItems |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
237 """ |
2407
cf9b276f4a08
core (disco): do not cache disco items when node is set
Goffi <goffi@goffi.org>
parents:
2342
diff
changeset
|
238 server_jid = jid.JID(client.jid.host) |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
239 if jid_ is None: |
2407
cf9b276f4a08
core (disco): do not cache disco items when node is set
Goffi <goffi@goffi.org>
parents:
2342
diff
changeset
|
240 jid_ = server_jid |
cf9b276f4a08
core (disco): do not cache disco items when node is set
Goffi <goffi@goffi.org>
parents:
2342
diff
changeset
|
241 |
cf9b276f4a08
core (disco): do not cache disco items when node is set
Goffi <goffi@goffi.org>
parents:
2342
diff
changeset
|
242 if jid_ == server_jid and not node: |
cf9b276f4a08
core (disco): do not cache disco items when node is set
Goffi <goffi@goffi.org>
parents:
2342
diff
changeset
|
243 # we cache items only for our own server and if node is not set |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
244 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
245 items = self.host.memory.getEntityData( |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3250
diff
changeset
|
246 client, jid_, ["DISCO_ITEMS"] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
247 )["DISCO_ITEMS"] |
3028 | 248 log.debug("[%s] disco items are in cache" % jid_.full()) |
2342
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
249 if not use_cache: |
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
250 # we ignore cache, so we pretend we haven't found it |
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
251 raise KeyError |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
252 except (KeyError, exceptions.UnknownEntityError): |
3028 | 253 log.debug("Caching [%s] disco items" % jid_.full()) |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
254 items = yield client.disco.requestItems(jid_, nodeIdentifier=node) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
255 self.host.memory.updateEntityData( |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3250
diff
changeset
|
256 client, jid_, "DISCO_ITEMS", items |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
257 ) |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
258 else: |
1752
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
259 try: |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
260 items = yield client.disco.requestItems(jid_, nodeIdentifier=node) |
1752
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
261 except StanzaError as e: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
262 log.warning( |
3028 | 263 "Error while requesting items for {jid}: {reason}".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
264 jid=jid_.full(), reason=e.condition |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
265 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
266 ) |
1752
cbcc223c323a
core (disco): display a warning when a disco info/items request failed, and return empty DiscoInfo/DiscoITems
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
267 items = disco.DiscoItems() |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
268 |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
269 defer.returnValue(items) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
270 |
1493
1285c714a6cc
core (disco): use of failure.Failure when raising FeatureNotFound to avoid a jump in debugger in debug mode
Goffi <goffi@goffi.org>
parents:
1491
diff
changeset
|
271 def _infosEb(self, failure_, entity_jid): |
1285c714a6cc
core (disco): use of failure.Failure when raising FeatureNotFound to avoid a jump in debugger in debug mode
Goffi <goffi@goffi.org>
parents:
1491
diff
changeset
|
272 failure_.trap(StanzaError) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
273 log.warning( |
3028 | 274 _("Error while requesting [%(jid)s]: %(error)s") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
275 % {"jid": entity_jid.full(), "error": failure_.getErrorMessage()} |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
276 ) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
277 |
2431
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
278 def findServiceEntity(self, client, category, type_, jid_=None): |
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
279 """Helper method to find first available entity from findServiceEntities |
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
280 |
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
281 args are the same as for [findServiceEntities] |
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
282 @return (jid.JID, None): found entity |
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
283 """ |
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
284 d = self.host.findServiceEntities(client, "pubsub", "service") |
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
285 d.addCallback(lambda entities: entities.pop() if entities else None) |
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
286 return d |
a9fac72825a2
memory (disco): added findServiceEntity helper method to get first service of a kind
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
287 |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
288 def findServiceEntities(self, client, category, type_, jid_=None): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
289 """Return all available items of an entity which correspond to (category, type_) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
290 |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
291 @param category: identity's category |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
292 @param type_: identitiy's type |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
293 @param jid_: the jid of the target server (None for profile's server) |
1460
c7fd121a6180
core: getProfileName no raise ProfileUnknownError + minor doc fixes
Goffi <goffi@goffi.org>
parents:
1416
diff
changeset
|
294 @return: a set of found entities |
1675
fd143578fe89
plugin XEP-0065: fixed bad error handling
Goffi <goffi@goffi.org>
parents:
1552
diff
changeset
|
295 @raise defer.CancelledError: the request timed out |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
296 """ |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
297 found_entities = set() |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
298 |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
299 def infosCb(infos, entity_jid): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
300 if (category, type_) in infos.identities: |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
301 found_entities.add(entity_jid) |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
302 |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
303 def gotItems(items): |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
304 defers_list = [] |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
305 for item in items: |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
306 info_d = self.getInfos(client, item.entity) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
307 info_d.addCallbacks( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
308 infosCb, self._infosEb, [item.entity], None, [item.entity] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
309 ) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
310 defers_list.append(info_d) |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
311 return defer.DeferredList(defers_list) |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
312 |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
313 d = self.getItems(client, jid_) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
314 d.addCallback(gotItems) |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2712
diff
changeset
|
315 d.addCallback(lambda __: found_entities) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
316 reactor.callLater( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
317 TIMEOUT, d.cancel |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
318 ) # FIXME: one bad service make a general timeout |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
319 return d |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
320 |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
321 def findFeaturesSet(self, client, features, identity=None, jid_=None): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
322 """Return entities (including jid_ and its items) offering features |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
323 |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
324 @param features: iterable of features which must be present |
3014
b6abf8af87db
plugin ad-hoc D-Bus: fixed warning when no media player is found
Goffi <goffi@goffi.org>
parents:
3012
diff
changeset
|
325 @param identity(None, tuple(unicode, unicode)): if not None, accept only this |
b6abf8af87db
plugin ad-hoc D-Bus: fixed warning when no media player is found
Goffi <goffi@goffi.org>
parents:
3012
diff
changeset
|
326 (category/type) identity |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
327 @param jid_: the jid of the target server (None for profile's server) |
1552
e0bde0d0b321
core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents:
1493
diff
changeset
|
328 @param profile: %(doc_profile)s |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
329 @return: a set of found entities |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
330 """ |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
331 if jid_ is None: |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
332 jid_ = jid.JID(client.jid.host) |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
333 features = set(features) |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
334 found_entities = set() |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
335 |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
336 def infosCb(infos, entity): |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
337 if entity is None: |
3028 | 338 log.warning(_("received an item without jid")) |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
339 return |
1491
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
340 if identity is not None and identity not in infos.identities: |
704ca56f5ca9
core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents:
1484
diff
changeset
|
341 return |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
342 if features.issubset(infos.features): |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
343 found_entities.add(entity) |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
344 |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
345 def gotItems(items): |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
346 defer_list = [] |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
347 for entity in [jid_] + [item.entity for item in items]: |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
348 infos_d = self.getInfos(client, entity) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
349 infos_d.addCallbacks(infosCb, self._infosEb, [entity], None, [entity]) |
1484
05b821a0ff5a
core (disco): fixed bad indentation resulting in bad result in findFeaturesSet
Goffi <goffi@goffi.org>
parents:
1460
diff
changeset
|
350 defer_list.append(infos_d) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
351 return defer.DeferredList(defer_list) |
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
352 |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
353 d = self.getItems(client, jid_) |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
354 d.addCallback(gotItems) |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2712
diff
changeset
|
355 d.addCallback(lambda __: found_entities) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
356 reactor.callLater( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
357 TIMEOUT, d.cancel |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
358 ) # FIXME: one bad service make a general timeout |
973
4a8903021fda
core (disco): findFeaturesSet and findServiceEntities don't use inlineCallbacks anymore, that allow a better error management (no more anonying debugger raise when discoInfo fails in debug mode)
Goffi <goffi@goffi.org>
parents:
963
diff
changeset
|
359 return d |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
360 |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
361 def generateHash(self, services): |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
362 """ Generate a unique hash for given service |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
363 |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
364 hash algorithm is the one described in XEP-0115 |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
365 @param services: iterable of disco.DiscoIdentity/disco.DiscoFeature, as returned by discoHandler.info |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
366 |
282
6a0c6d8e119d
added plugin xep-0115: entity capabilities
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
367 """ |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
368 s = [] |
2830
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
369 # identities |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
370 byte_identities = [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
371 ByteIdentity(service) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
372 for service in services |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
373 if isinstance(service, disco.DiscoIdentity) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
374 ] # FIXME: lang must be managed here |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
375 byte_identities.sort(key=lambda i: i.lang) |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
376 byte_identities.sort(key=lambda i: i.idType) |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
377 byte_identities.sort(key=lambda i: i.category) |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
378 for identity in byte_identities: |
3028 | 379 s.append(bytes(identity)) |
380 s.append(b"<") | |
2830
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
381 # features |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
382 byte_features = [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
383 service.encode("utf-8") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
384 for service in services |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
385 if isinstance(service, disco.DiscoFeature) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
386 ] |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
387 byte_features.sort() # XXX: the default sort has the same behaviour as the requested RFC 4790 i;octet sort |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
388 for feature in byte_features: |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
389 s.append(feature) |
3028 | 390 s.append(b"<") |
2830
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
391 |
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
392 # extensions |
3028 | 393 ext = list(services.extensions.values()) |
2830
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
394 ext.sort(key=lambda f: f.formNamespace.encode('utf-8')) |
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
395 for extension in ext: |
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
396 s.append(extension.formNamespace.encode('utf-8')) |
3028 | 397 s.append(b"<") |
2830
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
398 fields = extension.fieldList |
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
399 fields.sort(key=lambda f: f.var.encode('utf-8')) |
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
400 for field in fields: |
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
401 s.append(field.var.encode('utf-8')) |
3028 | 402 s.append(b"<") |
2830
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
403 values = [v.encode('utf-8') for v in field.values] |
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
404 values.sort() |
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
405 for value in values: |
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
406 s.append(value) |
3028 | 407 s.append(b"<") |
2830
770ec685ff1f
core (disco): added missing disco extensions when generating the cap hash.
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
408 |
3028 | 409 cap_hash = b64encode(sha1(b"".join(s)).digest()).decode('utf-8') |
410 log.debug(_("Capability hash generated: [{cap_hash}]").format(cap_hash=cap_hash)) | |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
411 return cap_hash |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
412 |
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
413 @defer.inlineCallbacks |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
414 def _discoInfos( |
3028 | 415 self, entity_jid_s, node="", use_cache=True, profile_key=C.PROF_KEY_NONE |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
416 ): |
3250
e4d3ba75b1b2
core (memory/disco): fixed types of disco extensions:
Goffi <goffi@goffi.org>
parents:
3194
diff
changeset
|
417 """Discovery method for the bridge |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
418 @param entity_jid_s: entity we want to discover |
2342
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
419 @param use_cache(bool): if True, use cached data if available |
2150
91347fe95384
core(memory.disco), bridge: discoInfos and discoItems now handle node
Goffi <goffi@goffi.org>
parents:
2148
diff
changeset
|
420 @param node(unicode): optional node to use |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
421 |
1552
e0bde0d0b321
core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents:
1493
diff
changeset
|
422 @return: list of tuples |
e0bde0d0b321
core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents:
1493
diff
changeset
|
423 """ |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
424 client = self.host.getClient(profile_key) |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
425 entity = jid.JID(entity_jid_s) |
2342
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
426 disco_infos = yield self.getInfos(client, entity, node, use_cache) |
1414
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
427 extensions = {} |
2712
c3f59c1dcb0a
core (memory/disco): normalise booleans in extensions
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
428 # FIXME: should extensions be serialised using tools.common.data_format? |
3028 | 429 for form_type, form in list(disco_infos.extensions.items()): |
1414
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
430 fields = [] |
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
431 for field in form.fieldList: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
432 data = {"type": field.fieldType} |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
433 for attr in ("var", "label", "desc"): |
1414
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
434 value = getattr(field, attr) |
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
435 if value is not None: |
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
436 data[attr] = value |
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
437 |
1416
a419da93afef
core (disco): fixed bad indentation in _discoInfos (used by bridge)
Goffi <goffi@goffi.org>
parents:
1414
diff
changeset
|
438 values = [field.value] if field.value is not None else field.values |
3028 | 439 if field.fieldType == "boolean": |
3012
2224fbbd45dd
memory (disco): fixed boolean to string conversion
Goffi <goffi@goffi.org>
parents:
2830
diff
changeset
|
440 values = [C.boolConst(v) for v in values] |
1416
a419da93afef
core (disco): fixed bad indentation in _discoInfos (used by bridge)
Goffi <goffi@goffi.org>
parents:
1414
diff
changeset
|
441 fields.append((data, values)) |
1414
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
442 |
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
443 extensions[form_type or ""] = fields |
159d16336f87
core, bridge, jp: management of service discovery extensions (XEP-0128)
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
444 |
2712
c3f59c1dcb0a
core (memory/disco): normalise booleans in extensions
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
445 defer.returnValue(( |
3040 | 446 [str(f) for f in disco_infos.features], |
2712
c3f59c1dcb0a
core (memory/disco): normalise booleans in extensions
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
447 [(cat, type_, name or "") |
3028 | 448 for (cat, type_), name in list(disco_infos.identities.items())], |
2712
c3f59c1dcb0a
core (memory/disco): normalise booleans in extensions
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
449 extensions)) |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
450 |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
451 def items2tuples(self, disco_items): |
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
452 """convert disco items to tuple of strings |
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
453 |
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
454 @param disco_items(iterable[disco.DiscoItem]): items |
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
455 @return G(tuple[unicode,unicode,unicode]): serialised items |
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
456 """ |
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
457 for item in disco_items: |
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
458 if not item.entity: |
3028 | 459 log.warning(_("invalid item (no jid)")) |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
460 continue |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
461 yield (item.entity.full(), item.nodeIdentifier or "", item.name or "") |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
462 |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
463 @defer.inlineCallbacks |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
464 def _discoItems( |
3028 | 465 self, entity_jid_s, node="", use_cache=True, profile_key=C.PROF_KEY_NONE |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2587
diff
changeset
|
466 ): |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
467 """ Discovery method for the bridge |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
468 |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
469 @param entity_jid_s: entity we want to discover |
2150
91347fe95384
core(memory.disco), bridge: discoInfos and discoItems now handle node
Goffi <goffi@goffi.org>
parents:
2148
diff
changeset
|
470 @param node(unicode): optional node to use |
2342
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
471 @param use_cache(bool): if True, use cached data if available |
1552
e0bde0d0b321
core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents:
1493
diff
changeset
|
472 @return: list of tuples""" |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
473 client = self.host.getClient(profile_key) |
963
723f28cd15c7
core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents:
961
diff
changeset
|
474 entity = jid.JID(entity_jid_s) |
2342
f047d5410040
core (memory/disco): added use_cache parameter to discoInfos/discoItems (set to False to ignore cache)
Goffi <goffi@goffi.org>
parents:
2150
diff
changeset
|
475 disco_items = yield self.getItems(client, entity, node, use_cache) |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2096
diff
changeset
|
476 ret = list(self.items2tuples(disco_items)) |
2096
efe31f0881fb
core (memory/disco): recover getItems on bridge's discoItems method if an item is empty
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
477 defer.returnValue(ret) |