From 5f680931df54bd6fabf5b5c325e30593fb96db64 Mon Sep 17 00:00:00 2001 From: Goffi Date: Tue, 1 Dec 2015 17:17:09 +0100 Subject: [PATCH] plugin XEP-0054: use full jid to manage the card/avatar if the bare jid correspond to a MUC room --- src/plugins/plugin_xep_0054.py | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/plugins/plugin_xep_0054.py b/src/plugins/plugin_xep_0054.py index 9e2fae9c..9fbf299f 100755 --- a/src/plugins/plugin_xep_0054.py +++ b/src/plugins/plugin_xep_0054.py @@ -67,6 +67,7 @@ PLUGIN_INFO = { "type": "XEP", "protocols": ["XEP-0054", "XEP-0153"], "dependencies": [], + "recommendations": ["XEP-0045"], "main": "XEP_0054", "handler": "yes", "description": _("""Implementation of vcard-temp""") @@ -108,6 +109,17 @@ class XEP_0054(object): return True + def isInRoom(self, entity_jid, profile): + """Tell if an full jid is a member of a room + + @param entity_jid(jid.JID): full jid of the entity + @return (bool): True if the bare jid of the entity is a room jid + """ + try: + return self.host.plugins['XEP-0045'].isRoom(entity_jid.userhostJID(), profile_key=profile) + except KeyError: + return False + def _fillCachedValues(self, profile): #FIXME: this is really suboptimal, need to be reworked # the current naive approach keeps a map between all jids of all profiles @@ -140,7 +152,12 @@ class XEP_0054(object): @param value(unicode): new value of the item @param profile(unicode): profile which received the update """ - assert not jid_.resource # VCard are retrieved with bare jid + if jid_.resource: + if not self.isInRoom(jid_, profile): + # VCard are retrieved with bare jid + # but MUC room is a special case + jid_ = jid.userhostJID() + self.host.memory.updateEntityData(jid_, name, value, profile_key=profile) if name in CACHED_DATA: jid_s = jid_.userhost() @@ -154,7 +171,11 @@ class XEP_0054(object): @param name: name of the value ('nick' or 'avatar') @param profile: %(doc_profile)s @return: wanted value or None""" - assert not entity_jid.resource # VCard are retrieved with bare jid + if entity_jid.resource: + if not self.isInRoom(entity_jid, profile): + # VCard are retrieved with bare jid + # but MUC room is a special case + entity_jid = jid.userhostJID() try: data = self.host.memory.getEntityData(entity_jid, [name], profile) except exceptions.UnknownEntityError: @@ -363,8 +384,9 @@ class XEP_0054_handler(XMPPHandler): Check for avatar information, and get VCard if needed @param presend(domish.Element): stanza """ - # FIXME: doesn't manage MUC correctly - from_jid = jid.JID(presence['from']).userhostJID() + from_jid = jid.JID(presence['from']) + if from_jid.resource and not self.plugin_parent.isInRoom(from_jid, self.parent.profile): + from_jid = from_jid.userhostJID() #FIXME: wokkel's data_form should be used here try: x_elt = presence.elements(NS_VCARD_UPDATE, 'x').next()