Mercurial > libervia-backend
annotate src/plugins/plugin_xep_0054.py @ 2307:8fa7edd0da24
plugin Pubsub Hook: first draft:
This new plugin allow to attach an external action to a Pubsub event (i.e. notification).
Hook can be persitent accross restarts, or temporary (will be deleted on profile disconnection).
Only Python files are handled for now.
In the future, it may make sense to move hooks in a generic plugin which could be used by ad-hoc commands, messages, pubsub, etc.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 05 Jul 2017 15:05:47 +0200 |
parents | 074c2f157dc9 |
children | 8b37a62336c3 |
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 |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
594
diff
changeset
|
4 # SAT plugin for managing xep-0054 |
1766 | 5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org) |
788
d6652683c572
plugin XEP-0054: also work with python2-pillow
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
771
diff
changeset
|
6 # Copyright (C) 2014 Emmanuel Gil Peyrot (linkmauve@linkmauve.fr) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
594
diff
changeset
|
8 # 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
|
9 # 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
|
10 # 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
|
11 # (at your option) any later version. |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
594
diff
changeset
|
13 # 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
|
14 # 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
|
15 # 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
|
16 # GNU Affero General Public License for more details. |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
594
diff
changeset
|
18 # 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
|
19 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 |
771 | 21 from sat.core.i18n import _ |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
22 from sat.core.constants import Const as C |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
23 from sat.core.log import getLogger |
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
24 log = getLogger(__name__) |
939 | 25 from twisted.internet import threads, defer |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
26 from twisted.words.protocols.jabber import jid, error |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
27 from twisted.words.xish import domish |
765
787ee59dba9c
plugins radiocol, xep-0054: better handling of upload errors:
souliane <souliane@mailoo.org>
parents:
639
diff
changeset
|
28 from twisted.python.failure import Failure |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 from zope.interface import implements |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 from wokkel import disco, iwokkel |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
34 from base64 import b64decode, b64encode |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 from hashlib import sha1 |
504
65ecbb473cbb
core, quick frontend, plugin xep-0054, bridge: use of memory's entities data for vcard:
Goffi <goffi@goffi.org>
parents:
485
diff
changeset
|
36 from sat.core import exceptions |
1341
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
37 from sat.memory import persistent |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
38 import mimetypes |
1542
94901070478e
plugins: added new MissingModule exceptions to plugins using third party modules
Goffi <goffi@goffi.org>
parents:
1437
diff
changeset
|
39 try: |
94901070478e
plugins: added new MissingModule exceptions to plugins using third party modules
Goffi <goffi@goffi.org>
parents:
1437
diff
changeset
|
40 from PIL import Image |
94901070478e
plugins: added new MissingModule exceptions to plugins using third party modules
Goffi <goffi@goffi.org>
parents:
1437
diff
changeset
|
41 except: |
94901070478e
plugins: added new MissingModule exceptions to plugins using third party modules
Goffi <goffi@goffi.org>
parents:
1437
diff
changeset
|
42 raise exceptions.MissingModule(u"Missing module pillow, please download/install it from https://python-pillow.github.io") |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
43 from cStringIO import StringIO |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 |
48 | 45 try: |
46 from twisted.words.protocols.xmlstream import XMPPHandler | |
47 except ImportError: | |
48 from wokkel.subprotocols import XMPPHandler | |
49 | |
365
efbfccfed623
core: local_dir moved to config file
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
50 AVATAR_PATH = "avatars" |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
51 AVATAR_DIM = (64, 64) # FIXME: dim are not adapted to modern resolutions ! |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 IQ_GET = '/iq[@type="get"]' |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 NS_VCARD = 'vcard-temp' |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
55 VCARD_REQUEST = IQ_GET + '/vCard[@xmlns="' + NS_VCARD + '"]' # TODO: manage requests |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 |
48 | 57 PRESENCE = '/presence' |
58 NS_VCARD_UPDATE = 'vcard-temp:x:update' | |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
59 VCARD_UPDATE = PRESENCE + '/x[@xmlns="' + NS_VCARD_UPDATE + '"]' |
48 | 60 |
1341
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
61 CACHED_DATA = {'avatar', 'nick'} |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
62 MAX_AGE = 60 * 60 * 24 * 365 |
1341
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
63 |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 PLUGIN_INFO = { |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
65 C.PI_NAME: "XEP 0054 Plugin", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
66 C.PI_IMPORT_NAME: "XEP-0054", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
67 C.PI_TYPE: "XEP", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
68 C.PI_PROTOCOLS: ["XEP-0054", "XEP-0153"], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
69 C.PI_DEPENDENCIES: [], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
70 C.PI_RECOMMENDATIONS: ["XEP-0045"], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
71 C.PI_MAIN: "XEP_0054", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
72 C.PI_HANDLER: "yes", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
73 C.PI_DESCRIPTION: _("""Implementation of vcard-temp""") |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 } |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
76 |
588
beaf6bec2fcd
Remove every old-style class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
77 class XEP_0054(object): |
504
65ecbb473cbb
core, quick frontend, plugin xep-0054, bridge: use of memory's entities data for vcard:
Goffi <goffi@goffi.org>
parents:
485
diff
changeset
|
78 #TODO: - check that nickname is ok |
65ecbb473cbb
core, quick frontend, plugin xep-0054, bridge: use of memory's entities data for vcard:
Goffi <goffi@goffi.org>
parents:
485
diff
changeset
|
79 # - refactor the code/better use of Wokkel |
65ecbb473cbb
core, quick frontend, plugin xep-0054, bridge: use of memory's entities data for vcard:
Goffi <goffi@goffi.org>
parents:
485
diff
changeset
|
80 # - get missing values |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 def __init__(self, host): |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
83 log.info(_(u"Plugin XEP_0054 initialization")) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 self.host = host |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
85 host.bridge.addMethod(u"avatarGet", u".plugin", in_sign=u'sbbs', out_sign=u's', method=self._getAvatar, async=True) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
86 host.bridge.addMethod(u"avatarSet", u".plugin", in_sign=u'ss', out_sign=u'', method=self._setAvatar, async=True) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
87 host.trigger.add(u"presence_available", self.presenceAvailableTrigger) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
88 host.memory.setSignalOnUpdate(u"avatar") |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
89 host.memory.setSignalOnUpdate(u"nick") |
64 | 90 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2123
diff
changeset
|
91 def getHandler(self, client): |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
92 return XEP_0054_handler(self) |
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
93 |
2060
d44360763262
plugin XEP-0054: renamed isInRoom to isRoom as the method only tell if the entity belong to a MUC
Goffi <goffi@goffi.org>
parents:
2046
diff
changeset
|
94 def isRoom(self, client, entity_jid): |
d44360763262
plugin XEP-0054: renamed isInRoom to isRoom as the method only tell if the entity belong to a MUC
Goffi <goffi@goffi.org>
parents:
2046
diff
changeset
|
95 """Tell if a jid is a MUC one |
1710
7226280e70da
plugin XEP-0054: use full jid to manage the card/avatar if the bare jid correspond to a MUC room
Goffi <goffi@goffi.org>
parents:
1683
diff
changeset
|
96 |
2060
d44360763262
plugin XEP-0054: renamed isInRoom to isRoom as the method only tell if the entity belong to a MUC
Goffi <goffi@goffi.org>
parents:
2046
diff
changeset
|
97 @param entity_jid(jid.JID): full or bare jid of the entity check |
1710
7226280e70da
plugin XEP-0054: use full jid to manage the card/avatar if the bare jid correspond to a MUC room
Goffi <goffi@goffi.org>
parents:
1683
diff
changeset
|
98 @return (bool): True if the bare jid of the entity is a room jid |
7226280e70da
plugin XEP-0054: use full jid to manage the card/avatar if the bare jid correspond to a MUC room
Goffi <goffi@goffi.org>
parents:
1683
diff
changeset
|
99 """ |
7226280e70da
plugin XEP-0054: use full jid to manage the card/avatar if the bare jid correspond to a MUC room
Goffi <goffi@goffi.org>
parents:
1683
diff
changeset
|
100 try: |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
101 self.host.plugins['XEP-0045'].checkRoomJoined(client, entity_jid.userhostJID()) |
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
102 except exceptions.NotFound: |
1710
7226280e70da
plugin XEP-0054: use full jid to manage the card/avatar if the bare jid correspond to a MUC room
Goffi <goffi@goffi.org>
parents:
1683
diff
changeset
|
103 return False |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
104 else: |
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
105 return True |
1710
7226280e70da
plugin XEP-0054: use full jid to manage the card/avatar if the bare jid correspond to a MUC room
Goffi <goffi@goffi.org>
parents:
1683
diff
changeset
|
106 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
107 def getBareOrFull(self, client, jid_): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
108 """use full jid if jid_ is an occupant of a room, bare jid else |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
109 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
110 @param jid_(jid.JID): entity to test |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
111 @return (jid.JID): bare or full jid |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
112 """ |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
113 if jid_.resource: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
114 if not self.isRoom(client, jid_): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
115 return jid_.userhostJID() |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
116 return jid_ |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
117 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
118 def presenceAvailableTrigger(self, presence_elt, client): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
119 if client.jid.userhost() in client._cache_0054: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
120 try: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
121 avatar_hash = client._cache_0054[client.jid.userhost()]['avatar'] |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
122 except KeyError: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
123 log.info(u"No avatar in cache for {}".format(client.jid.userhost())) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
124 return True |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
125 x_elt = domish.Element((NS_VCARD_UPDATE, 'x')) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
126 x_elt.addElement('photo', content=avatar_hash) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
127 presence_elt.addChild(x_elt) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
128 return True |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
129 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
130 @defer.inlineCallbacks |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2123
diff
changeset
|
131 def profileConnecting(self, client): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2123
diff
changeset
|
132 client._cache_0054 = persistent.PersistentBinaryDict(NS_VCARD, client.profile) |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
133 yield client._cache_0054.load() |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2123
diff
changeset
|
134 self._fillCachedValues(client.profile) |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
135 |
1293
0541cb64217e
plugin XEP-0054: couple of fixes in VCard/avatar management:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
136 def _fillCachedValues(self, profile): |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
137 #FIXME: this may need to be reworked |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
138 # the current naive approach keeps a map between all jids |
1682
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
139 # in persistent cache, then put avatar hashs in memory. |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
140 # Hashes should be shared between profiles (or not ? what |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
141 # if the avatar is different depending on who is requesting it |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
142 # this is not possible with vcard-tmp, but it is with XEP-0084). |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
143 # Loading avatar on demand per jid may be a option to investigate. |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
144 client = self.host.getClient(profile) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
145 for jid_s, data in client._cache_0054.iteritems(): |
1293
0541cb64217e
plugin XEP-0054: couple of fixes in VCard/avatar management:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
146 jid_ = jid.JID(jid_s) |
1341
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
147 for name in CACHED_DATA: |
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
148 try: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
149 value = data[name] |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
150 if value is None: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
151 log.error(u"{name} value for {jid_} is None, ignoring".format(name=name, jid_=jid_)) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
152 continue |
1341
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
153 self.host.memory.updateEntityData(jid_, name, data[name], silent=True, profile_key=profile) |
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
154 except KeyError: |
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
155 pass |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
156 |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
157 def updateCache(self, client, jid_, name, value): |
48 | 158 """update cache value |
1293
0541cb64217e
plugin XEP-0054: couple of fixes in VCard/avatar management:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
159 |
0541cb64217e
plugin XEP-0054: couple of fixes in VCard/avatar management:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
160 save value in memory in case of change |
1317
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
161 @param jid_(jid.JID): jid of the owner of the vcard |
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
162 @param name(str): name of the item which changed |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
163 @param value(unicode, None): new value of the item |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
164 None to delete |
48 | 165 """ |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
166 jid_ = self.getBareOrFull(client, jid_) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
167 jid_s = jid_.full() |
1710
7226280e70da
plugin XEP-0054: use full jid to manage the card/avatar if the bare jid correspond to a MUC room
Goffi <goffi@goffi.org>
parents:
1683
diff
changeset
|
168 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
169 if value is None: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
170 try: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
171 self.host.memory.delEntityDatum(jid_, name, client.profile) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
172 except (KeyError, exceptions.UnknownEntityError): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
173 pass |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
174 if name in CACHED_DATA: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
175 try: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
176 del client._cache_0054[jid_s][name] |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
177 except KeyError: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
178 pass |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
179 else: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
180 client._cache_0054.force(jid_s) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
181 else: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
182 self.host.memory.updateEntityData(jid_, name, value, profile_key=client.profile) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
183 if name in CACHED_DATA: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
184 client._cache_0054.setdefault(jid_s, {})[name] = value |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
185 client._cache_0054.force(jid_s) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
186 |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
187 def getCache(self, client, entity_jid, name): |
48 | 188 """return cached value for jid |
1293
0541cb64217e
plugin XEP-0054: couple of fixes in VCard/avatar management:
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
189 |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
190 @param entity_jid(jid.JID): target contact |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
191 @param name(unicode): name of the value ('nick' or 'avatar') |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
192 @return(unicode, None): wanted value or None""" |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
193 entity_jid = self.getBareOrFull(client, entity_jid) |
48 | 194 try: |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
195 data = self.host.memory.getEntityData(entity_jid, [name], client.profile) |
504
65ecbb473cbb
core, quick frontend, plugin xep-0054, bridge: use of memory's entities data for vcard:
Goffi <goffi@goffi.org>
parents:
485
diff
changeset
|
196 except exceptions.UnknownEntityError: |
48 | 197 return None |
504
65ecbb473cbb
core, quick frontend, plugin xep-0054, bridge: use of memory's entities data for vcard:
Goffi <goffi@goffi.org>
parents:
485
diff
changeset
|
198 return data.get(name) |
48 | 199 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
200 def savePhoto(self, client, photo_elt, entity_jid): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
201 """Parse a <PHOTO> photo_elt and save the picture""" |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
202 # XXX: this method is launched in a separate thread |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
203 try: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
204 mime_type = unicode(photo_elt.elements(NS_VCARD, 'TYPE').next()) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
205 except StopIteration: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
206 log.warning(u"no MIME type found, assuming image/png") |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
207 mime_type = u"image/png" |
1317
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
208 else: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
209 if not mime_type: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
210 log.warning(u"empty MIME type, assuming image/png") |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
211 mime_type = u"image/png" |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
212 elif mime_type not in ("image/gif", "image/jpeg", "image/png"): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
213 if mime_type == "image/x-png": |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
214 # XXX: this old MIME type is still used by some clients |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
215 mime_type = "image/png" |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
216 else: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
217 # TODO: handle other image formats (svg?) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
218 log.warning(u"following avatar image format is not handled: {type} [{jid}]".format( |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
219 type=mime_type, jid=entity_jid.full())) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
220 raise Failure(exceptions.DataError()) |
1317
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
221 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
222 ext = mimetypes.guess_extension(mime_type, strict=False) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
223 assert ext is not None |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
224 log.debug(u'photo of type {type} with extension {ext} found [{jid}]'.format( |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
225 type=mime_type, ext=ext, jid=entity_jid.full())) |
2069
528e5fafc11b
plugin XEP-0054(XEP-0153): ignore image formats other than gif, jpeg and png, and empty BINVAL
Goffi <goffi@goffi.org>
parents:
2064
diff
changeset
|
226 try: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
227 buf = str(photo_elt.elements(NS_VCARD, 'BINVAL').next()) |
2069
528e5fafc11b
plugin XEP-0054(XEP-0153): ignore image formats other than gif, jpeg and png, and empty BINVAL
Goffi <goffi@goffi.org>
parents:
2064
diff
changeset
|
228 except StopIteration: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
229 log.warning(u"BINVAL element not found") |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
230 raise Failure(exceptions.NotFound()) |
2069
528e5fafc11b
plugin XEP-0054(XEP-0153): ignore image formats other than gif, jpeg and png, and empty BINVAL
Goffi <goffi@goffi.org>
parents:
2064
diff
changeset
|
231 if not buf: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
232 log.warning(u"empty avatar for {jid}".format(jid=entity_jid.full())) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
233 raise Failure(exceptions.NotFound()) |
2069
528e5fafc11b
plugin XEP-0054(XEP-0153): ignore image formats other than gif, jpeg and png, and empty BINVAL
Goffi <goffi@goffi.org>
parents:
2064
diff
changeset
|
234 log.debug(_(u'Decoding binary')) |
528e5fafc11b
plugin XEP-0054(XEP-0153): ignore image formats other than gif, jpeg and png, and empty BINVAL
Goffi <goffi@goffi.org>
parents:
2064
diff
changeset
|
235 decoded = b64decode(buf) |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
236 del buf |
2069
528e5fafc11b
plugin XEP-0054(XEP-0153): ignore image formats other than gif, jpeg and png, and empty BINVAL
Goffi <goffi@goffi.org>
parents:
2064
diff
changeset
|
237 image_hash = sha1(decoded).hexdigest() |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
238 with client.cache.cacheData( |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
239 PLUGIN_INFO['import_name'], |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
240 image_hash, |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
241 mime_type, |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
242 # we keep in cache for 1 year |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
243 MAX_AGE |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
244 ) as f: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
245 f.write(decoded) |
2069
528e5fafc11b
plugin XEP-0054(XEP-0153): ignore image formats other than gif, jpeg and png, and empty BINVAL
Goffi <goffi@goffi.org>
parents:
2064
diff
changeset
|
246 return image_hash |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
247 |
939 | 248 @defer.inlineCallbacks |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
249 def vCard2Dict(self, client, vcard, entity_jid): |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
250 """Convert a VCard to a dict, and save binaries""" |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
251 log.debug((u"parsing vcard")) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
252 vcard_dict = {} |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
253 |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
254 for elem in vcard.elements(): |
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
255 if elem.name == 'FN': |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
256 vcard_dict['fullname'] = unicode(elem) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
257 elif elem.name == 'NICKNAME': |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
258 vcard_dict['nick'] = unicode(elem) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
259 self.updateCache(client, entity_jid, 'nick', vcard_dict['nick']) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
260 elif elem.name == 'URL': |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
261 vcard_dict['website'] = unicode(elem) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
262 elif elem.name == 'EMAIL': |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
263 vcard_dict['email'] = unicode(elem) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
264 elif elem.name == 'BDAY': |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
265 vcard_dict['birthday'] = unicode(elem) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
266 elif elem.name == 'PHOTO': |
2069
528e5fafc11b
plugin XEP-0054(XEP-0153): ignore image formats other than gif, jpeg and png, and empty BINVAL
Goffi <goffi@goffi.org>
parents:
2064
diff
changeset
|
267 # TODO: handle EXTVAL |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
268 try: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
269 avatar_hash = yield threads.deferToThread( |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
270 self.savePhoto, client, elem, entity_jid) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
271 except (exceptions.DataError, exceptions.NotFound) as e: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
272 avatar_hash = '' |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
273 vcard_dict['avatar'] = avatar_hash |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
274 except Exception as e: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
275 log.error(u"avatar saving error: {}".format(e)) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
276 avatar_hash = None |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
277 else: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
278 vcard_dict['avatar'] = avatar_hash |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
279 self.updateCache(client, entity_jid, 'avatar', avatar_hash) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
280 else: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
281 log.debug(u'FIXME: [{}] VCard tag is not managed yet'.format(elem.name)) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
282 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
283 # if a data in cache doesn't exist anymore, we need to delete it |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
284 # so we check CACHED_DATA no gotten (i.e. not in vcard_dict keys) |
1341
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
285 # and we reset them |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
286 for datum in CACHED_DATA.difference(vcard_dict.keys()): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
287 log.debug(u"reseting vcard datum [{datum}] for {entity}".format(datum=datum, entity=entity_jid.full())) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
288 self.updateCache(client, entity_jid, datum, None) |
1341
6dbeb2ef966c
plugin XEP-0054: "nick" is now keeped in cache:
Goffi <goffi@goffi.org>
parents:
1317
diff
changeset
|
289 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
290 defer.returnValue(vcard_dict) |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
291 |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
292 def _vCardCb(self, vcard_elt, to_jid, client): |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
293 """Called after the first get IQ""" |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
294 log.debug(_("VCard found")) |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
295 iq_elt = vcard_elt.parent |
2046
b99bd02ea643
plugin XEP-0045, XEP-0054, XEP-0096: deprecated bridge method are not used anymore
Goffi <goffi@goffi.org>
parents:
1978
diff
changeset
|
296 try: |
b99bd02ea643
plugin XEP-0045, XEP-0054, XEP-0096: deprecated bridge method are not used anymore
Goffi <goffi@goffi.org>
parents:
1978
diff
changeset
|
297 from_jid = jid.JID(iq_elt["from"]) |
b99bd02ea643
plugin XEP-0045, XEP-0054, XEP-0096: deprecated bridge method are not used anymore
Goffi <goffi@goffi.org>
parents:
1978
diff
changeset
|
298 except KeyError: |
b99bd02ea643
plugin XEP-0045, XEP-0054, XEP-0096: deprecated bridge method are not used anymore
Goffi <goffi@goffi.org>
parents:
1978
diff
changeset
|
299 from_jid = client.jid.userhostJID() |
b99bd02ea643
plugin XEP-0045, XEP-0054, XEP-0096: deprecated bridge method are not used anymore
Goffi <goffi@goffi.org>
parents:
1978
diff
changeset
|
300 d = self.vCard2Dict(client, vcard_elt, from_jid) |
b99bd02ea643
plugin XEP-0045, XEP-0054, XEP-0096: deprecated bridge method are not used anymore
Goffi <goffi@goffi.org>
parents:
1978
diff
changeset
|
301 return d |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
302 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
303 def _vCardEb(self, failure_, to_jid, client): |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
304 """Called when something is wrong with registration""" |
2046
b99bd02ea643
plugin XEP-0045, XEP-0054, XEP-0096: deprecated bridge method are not used anymore
Goffi <goffi@goffi.org>
parents:
1978
diff
changeset
|
305 log.warning(u"Can't get vCard for {jid}: {failure}".format(jid=to_jid.full, failure=failure_)) |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
306 self.updateCache(client, to_jid, "avatar", None) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
307 |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
308 def _getVcardElt(self, iq_elt): |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
309 return iq_elt.elements(NS_VCARD, "vCard").next() |
1317
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
310 |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
311 def getCardRaw(self, client, entity_jid): |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
312 """get raw vCard XML |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
313 |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
314 params are as in [getCard] |
1317
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
315 """ |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
316 entity_jid = self.getBareOrFull(client, entity_jid) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
317 log.debug(u"Asking for {}'s VCard".format(entity_jid.full())) |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
318 reg_request = client.IQ('get') |
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
319 reg_request["from"] = client.jid.full() |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
320 reg_request["to"] = entity_jid.full() |
504
65ecbb473cbb
core, quick frontend, plugin xep-0054, bridge: use of memory's entities data for vcard:
Goffi <goffi@goffi.org>
parents:
485
diff
changeset
|
321 reg_request.addElement('vCard', NS_VCARD) |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
322 d = reg_request.send(entity_jid.full()) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
323 d.addCallback(self._getVcardElt) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
324 return d |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
325 |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
326 def getCard(self, client, entity_jid): |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
327 """Ask server for VCard |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
328 |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
329 @param entity_jid(jid.JID): jid from which we want the VCard |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
330 @result: id to retrieve the profile |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
331 """ |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
332 d = self.getCardRaw(client, entity_jid) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
333 d.addCallbacks(self._vCardCb, self._vCardEb, callbackArgs=[entity_jid, client], errbackArgs=[entity_jid, client]) |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
334 return d |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
335 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
336 def _getCardCb(self, dummy, client, entity): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
337 try: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
338 return client._cache_0054[entity.full()]['avatar'] |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
339 except KeyError: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
340 raise Failure(exceptions.NotFound()) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
341 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
342 def _getAvatar(self, entity, cache_only, hash_only, profile): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
343 client = self.host.getClient(profile) |
2258
074c2f157dc9
plugin XEP-0054: fixed not transmitted arguments in getAvatar
Goffi <goffi@goffi.org>
parents:
2252
diff
changeset
|
344 d = self.getAvatar(client, jid.JID(entity), cache_only, hash_only) |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
345 d.addErrback(lambda dummy: '') |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
346 |
2072
11fb5f5e2f89
plugin XEP-0054(XEP-0153): added a getAvatar:
Goffi <goffi@goffi.org>
parents:
2069
diff
changeset
|
347 return d |
42
874de3020e1c
Initial VCard (XEP-0054) support + misc fixes
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
348 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
349 def getAvatar(self, client, entity, cache_only=True, hash_only=False): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
350 """get avatar full path or hash |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
351 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
352 if avatar is not in local cache, it will be requested to the server |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
353 @param entity(jid.JID): entity to get avatar from |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
354 @param cache_only(bool): if False, will request vCard if avatar is |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
355 not in cache |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
356 @param hash_only(bool): if True only return hash, not full path |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
357 @raise exceptions.NotFound: no avatar found |
43 | 358 """ |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
359 entity = self.getBareOrFull(client, entity) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
360 full_path = None |
43 | 361 |
2072
11fb5f5e2f89
plugin XEP-0054(XEP-0153): added a getAvatar:
Goffi <goffi@goffi.org>
parents:
2069
diff
changeset
|
362 try: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
363 # we first check if we have avatar in cache |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
364 avatar_hash = client._cache_0054[entity.full()]['avatar'] |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
365 if avatar_hash: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
366 # avatar is known and exists |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
367 full_path = client.cache.getFilePath(avatar_hash) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
368 if full_path is None: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
369 # cache file is not available (probably expired) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
370 raise KeyError |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
371 else: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
372 # avatar has already been checked but it is not set |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
373 full_path = u'' |
2072
11fb5f5e2f89
plugin XEP-0054(XEP-0153): added a getAvatar:
Goffi <goffi@goffi.org>
parents:
2069
diff
changeset
|
374 except KeyError: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
375 # avatar is not in cache |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
376 if cache_only: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
377 return defer.fail(Failure(exceptions.NotFound())) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
378 # we request vCard to get avatar |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
379 d = self.getCard(client, entity) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
380 d.addCallback(self._getCardCb, client, entity) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
381 else: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
382 # avatar is in cache, we can return hash |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
383 d = defer.succeed(avatar_hash) |
2072
11fb5f5e2f89
plugin XEP-0054(XEP-0153): added a getAvatar:
Goffi <goffi@goffi.org>
parents:
2069
diff
changeset
|
384 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
385 if not hash_only: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
386 # full path is requested |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
387 if full_path is None: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
388 d.addCallback(client.cache.getFilePath) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
389 else: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
390 d.addCallback(lambda dummy: full_path) |
2072
11fb5f5e2f89
plugin XEP-0054(XEP-0153): added a getAvatar:
Goffi <goffi@goffi.org>
parents:
2069
diff
changeset
|
391 return d |
11fb5f5e2f89
plugin XEP-0054(XEP-0153): added a getAvatar:
Goffi <goffi@goffi.org>
parents:
2069
diff
changeset
|
392 |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
393 @defer.inlineCallbacks |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
394 def getNick(self, client, entity): |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
395 """get nick from cache, or check vCard |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
396 |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
397 @param entity(jid.JID): entity to get nick from |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
398 @return(unicode, None): nick or None if not found |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
399 """ |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
400 nick = self.getCache(client, entity, u'nick') |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
401 if nick is not None: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
402 defer.returnValue(nick) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
403 yield self.getCard(client, entity) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
404 defer.returnValue(self.getCache(client, entity, u'nick')) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
405 |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
406 @defer.inlineCallbacks |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
407 def setNick(self, client, nick): |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
408 """update our vCard and set a nickname |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
409 |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
410 @param nick(unicode): new nickname to use |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
411 """ |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
412 jid_ = client.jid.userhostJID() |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
413 try: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
414 vcard_elt = yield self.getCardRaw(client, jid_) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
415 except error.StanzaError as e: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
416 if e.condition == 'item-not-found': |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
417 vcard_elt = domish.Element((NS_VCARD, 'vCard')) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
418 else: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
419 raise e |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
420 try: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
421 nickname_elt = next(vcard_elt.elements(NS_VCARD, u'NICKNAME')) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
422 except StopIteration: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
423 pass |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
424 else: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
425 vcard_elt.children.remove(nickname_elt) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
426 |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
427 nickname_elt = vcard_elt.addElement((NS_VCARD, u'NICKNAME'), content=nick) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
428 iq_elt = client.IQ() |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
429 vcard_elt = iq_elt.addChild(vcard_elt) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
430 yield iq_elt.send() |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
431 self.updateCache(client, jid_, u'nick', unicode(nick)) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
432 |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
433 def _buildSetAvatar(self, client, vcard_elt, file_path): |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
434 # XXX: this method is executed in a separate thread |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
435 try: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
436 img = Image.open(file_path) |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
437 except IOError: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
438 return Failure(exceptions.DataError(u"Can't open image")) |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
439 |
1081
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
440 if img.size != AVATAR_DIM: |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
441 img.thumbnail(AVATAR_DIM, Image.ANTIALIAS) |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
442 if img.size[0] != img.size[1]: # we need to crop first |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
443 left, upper = (0, 0) |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
444 right, lower = img.size |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
445 offset = abs(right - lower) / 2 |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
446 if right == min(img.size): |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
447 upper += offset |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
448 lower -= offset |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
449 else: |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
450 left += offset |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
451 right -= offset |
5d89fecdf667
plugin XEP-0054: crop uploaded avatar to get a square
souliane <souliane@mailoo.org>
parents:
1075
diff
changeset
|
452 img = img.crop((left, upper, right, lower)) |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
453 img_buf = StringIO() |
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
454 img.save(img_buf, 'PNG') |
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
455 |
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
456 photo_elt = vcard_elt.addElement('PHOTO') |
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
457 photo_elt.addElement('TYPE', content='image/png') |
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
458 photo_elt.addElement('BINVAL', content=b64encode(img_buf.getvalue())) |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
459 image_hash = sha1(img_buf.getvalue()).hexdigest() |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
460 with client.cache.cacheData( |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
461 PLUGIN_INFO['import_name'], |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
462 image_hash, |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
463 "image/png", |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
464 MAX_AGE |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
465 ) as f: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
466 f.write(img_buf.getvalue()) |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
467 return image_hash |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
468 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
469 def _setAvatar(self, file_path, profile_key=C.PROF_KEY_NONE): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
470 client = self.host.getClient(profile_key) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
471 return self.setAvatar(client, file_path) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
472 |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
473 @defer.inlineCallbacks |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
474 def setAvatar(self, client, file_path): |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
475 """Set avatar of the profile |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
476 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
477 @param file_path: path of the image of the avatar |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
478 """ |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
479 try: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
480 # we first check if a vcard already exists, to keep data |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
481 vcard_elt = yield self.getCardRaw(client, client.jid.userhostJID()) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
482 except error.StanzaError as e: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
483 if e.condition == 'item-not-found': |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
484 vcard_elt = domish.Element((NS_VCARD, 'vCard')) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
485 else: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
486 raise e |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
487 else: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
488 # the vcard exists, we need to remove PHOTO element as we'll make a new one |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
489 try: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
490 photo_elt = next(vcard_elt.elements(NS_VCARD, u'PHOTO')) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
491 except StopIteration: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
492 pass |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
493 else: |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
494 vcard_elt.children.remove(photo_elt) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
495 |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
496 iq_elt = client.IQ() |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
497 iq_elt.addChild(vcard_elt) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
498 image_hash = yield threads.deferToThread(self._buildSetAvatar, client, vcard_elt, file_path) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
499 # image is now at the right size/format |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
500 |
2252
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
501 self.updateCache(client, client.jid.userhostJID(), 'avatar', image_hash) |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
502 yield iq_elt.send() |
cffa50c9f26b
plugin XEP-0054: nick handling + don't remove data on avatar set
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
503 client.presence.available() # FIXME: should send the current presence, not always "available" ! |
562
0bb2e0d1c878
core, plugin XEP-0054: avatar upload:
Goffi <goffi@goffi.org>
parents:
560
diff
changeset
|
504 |
64 | 505 |
506 class XEP_0054_handler(XMPPHandler): | |
507 implements(iwokkel.IDisco) | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
508 |
64 | 509 def __init__(self, plugin_parent): |
510 self.plugin_parent = plugin_parent | |
511 self.host = plugin_parent.host | |
512 | |
513 def connectionInitialized(self): | |
514 self.xmlstream.addObserver(VCARD_UPDATE, self.update) | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
515 |
64 | 516 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): |
517 return [disco.DiscoFeature(NS_VCARD)] | |
518 | |
519 def getDiscoItems(self, requestor, target, nodeIdentifier=''): | |
520 return [] | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
521 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
522 def _checkAvatarHash(self, dummy, client, entity, given_hash): |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
523 """check that hash in cash (i.e. computed hash) is the same as given one""" |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
524 # XXX: if they differ, the avater will be requested on each connection |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
525 # TODO: try to avoid re-requesting avatar in this case |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
526 computed_hash = self.plugin_parent.getCache(client, entity, 'avatar') |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
527 if computed_hash != given_hash: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
528 log.warning(u"computed hash differs from given hash for {entity}:\n" |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
529 "computed: {computed}\ngiven: {given}".format( |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
530 entity=entity, computed=computed_hash, given=given_hash)) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
531 |
48 | 532 def update(self, presence): |
1317
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
533 """Called on <presence/> stanza with vcard data |
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
534 |
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
535 Check for avatar information, and get VCard if needed |
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
536 @param presend(domish.Element): <presence/> stanza |
48 | 537 """ |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
538 client = self.parent |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
539 entity_jid = self.plugin_parent.getBareOrFull(client, jid.JID(presence['from'])) |
435
c243f4cb2ad9
plugin XEP-0054: cache now use storage
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
540 #FIXME: wokkel's data_form should be used here |
1682
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
541 try: |
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
542 x_elt = presence.elements(NS_VCARD_UPDATE, 'x').next() |
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
543 except StopIteration: |
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
544 return |
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
545 |
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
546 try: |
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
547 photo_elt = x_elt.elements(NS_VCARD_UPDATE, 'photo').next() |
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
548 except StopIteration: |
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
549 return |
1317
bd69d341d969
plugin xep-0054: various improvments on avatars management:
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
550 |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
551 hash_ = unicode(photo_elt).strip() |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
552 if hash_ == C.HASH_SHA1_EMPTY: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
553 hash_ = u'' |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
554 old_avatar = self.plugin_parent.getCache(client, entity_jid, 'avatar') |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
555 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
556 if old_avatar == hash_: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
557 # no change, we can return... |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
558 if hash_: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
559 # ...but we double check that avatar is in cache |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
560 file_path = client.cache.getFilePath(hash_) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
561 if file_path is None: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
562 log.error(u"Avatar for [{}] should be in cache but it is not! We get it".format(entity_jid.full())) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
563 self.plugin_parent.getCard(client, entity_jid) |
1682
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
564 else: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
565 log.debug(u"avatar for {} already in cache".format(entity_jid.full())) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
566 return |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
567 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
568 if not hash_: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
569 # the avatar has been removed |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
570 # XXX: we use empty string instead of None to indicate that we took avatar |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
571 # but it is empty on purpose |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
572 self.plugin_parent.updateCache(client, entity_jid, 'avatar', '') |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
573 return |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
574 |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
575 file_path = client.cache.getFilePath(hash_) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
576 if file_path is not None: |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
577 log.debug(u"New avatar found for [{}], it's already in cache, we use it".format(entity_jid.full())) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
578 self.plugin_parent.updateCache(client, entity_jid, 'avatar', hash_) |
1682
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1542
diff
changeset
|
579 else: |
2123
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
580 log.debug(u'New avatar found for [{}], requesting vcard'.format(entity_jid.full())) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
581 d = self.plugin_parent.getCard(client, entity_jid) |
c42aab22c2c0
plugin XEP-0054, quick frontend(app): various improvments:
Goffi <goffi@goffi.org>
parents:
2072
diff
changeset
|
582 d.addCallback(self._checkAvatarHash, client, entity_jid, hash_) |