Bug 324937

Summary: Kopete cannot connect to facebook jabber server
Product: [Applications] kopete Reporter: Daniel Ziltener <zilti>
Component: Jabber PluginAssignee: Kopete Developers <kopete-bugs-null>
Status: RESOLVED FIXED    
Severity: major CC: cfeck, cyberbeat, f.presel, frederic.coiffier, ht990332, johu, nico.kruber, pali.rohar, rdieter, Sherocksatnite, tailings, valdu85
Priority: NOR    
Version: 1.5.1   
Target Milestone: ---   
Platform: OpenSUSE   
OS: Linux   
Latest Commit: Version Fixed In: 4.11.3
Attachments: Fix JabberResourcePool::lockToResource()
patch to fix facebook connection (incorporates all changes from the previous discussion)
patch to fix facebook connection (incorporates all changes from the previous discussion)
This patch change only resource (not bare JID) for client()->jid()
crash data

Description Daniel Ziltener 2013-09-15 18:20:35 UTC
I use the Jabber plugin to connect to Facebook, with username@chat.facebook.com . This used to work just fine. But now it's stuck at telling me it's connecting, yet the contact list gets loaded (all marked as offline) and incoming messages arrive. I can't send any, though.

Reproducible: Always

Steps to Reproduce:
1. Add facebook account
2. Connect
3. Try to send a message
Actual Results:  
"Please connect first", and refuses to send.

Expected Results:  
Message gets sent.
Comment 1 H.H. 2013-09-15 20:26:22 UTC
I have the same problem.
Comment 2 tailings 2013-09-16 21:33:34 UTC
Same here. Thanks!
Comment 3 Pali Rohár 2013-09-17 01:38:29 UTC
Facebook jabber server changed something and lot of jabber clinets cannot connect anymore.
Comment 4 tailings 2013-09-17 03:26:12 UTC
Just to comment, Kde-Telepathy continues working.
Comment 5 Val 2013-09-17 10:50:55 UTC
Same here on KDE 4.11.1

Apparently the bug was solved in Telepathy here: https://bugs.freedesktop.org/show_bug.cgi?id=68829
So I guess the code from this patch can be adapted to Kopete
Comment 6 Pali Rohár 2013-09-17 10:56:26 UTC
Kopete using libiris xmpp library. So this bug needs to be fixed in libiris: https://github.com/psi-im/iris
Comment 7 H.H. 2013-09-17 12:51:18 UTC
I tried psi and also kadu (both use libiris), and both continue working with facebook. so it has to be a kopete bug.
Comment 8 Pali Rohár 2013-09-17 13:04:42 UTC
Ok, thanks for info. Can you enable debug output for jabber via kdebugdialog and post errors?
Comment 9 H.H. 2013-09-17 14:05:43 UTC
This is the debug output. I shortened long lists with "..." and anonymized IDs and names with XXXX.

YYYYY@chat.facebook.com stands for my facebook-username and XXXX@chat.facebook.com stands for friend facebook-numbers like "-2312132321@chat.facebook.com".


kopete(17348)/libkopete Kopete::OnlineStatusManager::cacheLookupByObject: Missed  "Offline/jabber_protocol/#ff0000//24/a"  in icon cache!
kopete(17348)/kopete (jabber) JabberResourcePool::bestJabberResource: Determining best resource for  "YYYYYYYY@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::lockedJabberResource: No lock available for  "YYYYYYYY@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberAccount::connectWithPassword: called
kopete(17348)/kopete (jabber) JabberAccount::connectWithPassword: Determined timezone  "CEST"  with UTC offset  2  hours.
kopete(17348)/kopete (jabber) JabberAccount::connectWithPassword: Connecting to Jabber server  "chat.facebook.com" : 5222
kopete(17348)/kopete (jabber) JabberAccount::setPresence: Status:  "connecting" , Reason:  ""
kopete(17348)/kopete (jabber) JabberAccount::setPresence: New priority:  4
kopete(17348)/kopete (jabber) JabberAccount::setPresence: Old resource: ""
kopete(17348)/kopete (jabber) JabberResourcePool::addResource: Adding new resource  "Kopete"  for  "YYYYYYYY@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::addResource: Initial update of capabilities for JID:  "YYYYYYYY@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: Determining new status for  "YYYYYYYY@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::bestJabberResource: Determining best resource for  "YYYYYYYY@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::lockedJabberResource: No lock available for  "YYYYYYYY@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::bestJabberResource: Taking ' "Kopete" ' as first available resource.
kopete(17348)/libkopete Kopete::OnlineStatusManager::cacheLookupByObject: Missed  "Verbindung wird aufgebaut/jabber_protocol/#ff0000/jabber_connecting/16/a"  in icon cache!
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: New status for  "YYYYYYYY@chat.facebook.com"  is  "Verbindung wird aufgebaut"
kopete(17348) KopeteWindow::slotIdentityStatusIconChanged: QVariant(, )
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status title property with this:  ""
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status message property with this:  ""
kopete(17348)/kopete (jabber) JabberResourcePool::lockToResource: Locking  "YYYYYYYY@chat.facebook.com"  to  "Kopete"
kopete(17348)/kopete (jabber) JabberResourcePool::removeLock: Removing resource lock for  "YYYYYYYY@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::removeLock: No locks found.
kopete(17348)/kopete (jabber) JabberAccount::setPresence: New resource: "Kopete"
Unknown signature value:  7 
Unknown signature value:  7 
Unknown signature value:  795 
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <?xml version="1.0"?>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xmlns="jabber:client" to="chat.facebook.com">
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <?xml version='1.0' ?><stream:stream from='chat.facebook.com' id='1' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' xml:lang='en'>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <stream:features>
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
<mechanism>X-FACEBOOK-PLATFORM</mechanism>
<mechanism>PLAIN</mechanism>
</mechanisms>
</stream:features>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
"
unexpected version response
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "TLS handshake done, testing certificate validity..."
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "Identity and certificate valid, continuing."
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <?xml version="1.0"?>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xmlns="jabber:client" to="chat.facebook.com">
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <?xml version='1.0' ?><stream:stream from='chat.facebook.com' id='1' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' xml:lang='en'>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <stream:features>
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
<mechanism>X-FACEBOOK-PLATFORM</mechanism>
<mechanism>PLAIN</mechanism>
</mechanisms>
</stream:features>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "Sending auth credentials..."
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="PLAIN">XXXXXXXXXXXXXXXXXXXXXXX</auth>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <?xml version="1.0"?>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xmlns="jabber:client" to="chat.facebook.com">
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <?xml version='1.0' ?><stream:stream from='chat.facebook.com' id='1' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' xml:lang='en'>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <stream:features>
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</stream:features>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <iq type="set" id="bind_1">
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
<resource>Kopete</resource>
</bind>
</iq>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <iq xmlns="jabber:client" from="chat.facebook.com" type="result" id="bind_1">
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
<jid>XXXXX@chat.facebook.com/Kopete</jid>
</bind>
</iq>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "Connected to Jabber server."
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <iq type="set" id="aab4a">
<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</iq>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <iq from="chat.facebook.com" type="result" id="aab4a">
<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</iq>
"
kopete(17348)/kopete (jabber) JabberAccount::slotConnected: Connected to Jabber server.
kopete(17348)/kopete (jabber) JabberAccount::slotConnected: Requesting roster...
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML OUT: <iq type="get" id="XXXXX">
<query xmlns="jabber:iq:roster"/>
</iq>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <presence from="XXXXX@chat.facebook.com" to="XXXXX@chat.facebook.com/Kopete">
<x xmlns="vcard-temp:x:update">
<photo>XXXXXXXXXXXXX</photo>
</x>
</presence>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <presence from="XXXXX@chat.facebook.com" to="XXXXX@chat.facebook.com/Kopete">
<x xmlns="vcard-temp:x:update">
<photo>XXXXXXXXXXXXX</photo>
</x>
</presence>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <presence from="XXXXX@chat.facebook.com" to="XXXXX@chat.facebook.com/Kopete">
<x xmlns="vcard-temp:x:update">
<photo>XXXXXXXXXXXXX</photo>
</x>
</presence>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <presence from="XXXXX@chat.facebook.com" to="XXXXX@chat.facebook.com/Kopete">
<x xmlns="vcard-temp:x:update">
<photo>XXXXXXXXXXXXX</photo>
</x>
</presence>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <presence from="XXXXX@chat.facebook.com" to="XXXXX@chat.facebook.com/Kopete">
<x xmlns="vcard-temp:x:update">
<photo>XXXXXXXXXXXXX</photo>
</x>
</presence>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <presence from="XXXXX@chat.facebook.com" to="XXXXX@chat.facebook.com/Kopete">
<x xmlns="vcard-temp:x:update">
<photo>XXXXXXXXXXXXX</photo>
</x>
</presence>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <presence from="XXXXX@chat.facebook.com" to="XXXXX@chat.facebook.com/Kopete">
<x xmlns="vcard-temp:x:update">
<photo>XXXXXXXXXXXXX</photo>
</x>
</presence>
"
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <iq type="result" id="XXXXX" to="XXXXX@chat.facebook.com/Kopete">
<query xmlns="jabber:iq:roster">
<item subscription="both" name="XXXXXX" jid="XXXXX@chat.facebook.com">
<group>Facebook Friends</group>
</item>
<item subscription="both" name="XXXXXX" jid="XXXXX@chat.facebook.com">
<group>Facebook Friends</group>
</item>

....

</query>
</iq>
"
kopete(17348)/kopete (jabber) JabberAccount::slotContactUpdated: New roster item  "XXXXX@chat.facebook.com"  (Subscription:  "both" )
kopete(17348)/kopete (jabber) JabberContactPool::addContact: Updating existing contact  "XXXXX@chat.facebook.com"    -   JabberContact(0xc4edc0)
kopete(17348)/kopete (jabber) JabberBaseContact::updateContact: Synchronizing local copy of  "XXXXX@chat.facebook.com"  with information received from server.  (name=' "XXXXXX" ' groups=' ("Facebook Friends") ')
kopete(17348)/kopete (jabber) JabberAccount::slotContactUpdated: New roster item  "XXXXX@chat.facebook.com"  (Subscription:  "both" )
kopete(17348)/kopete (jabber) JabberContactPool::addContact: Updating existing contact  "XXXXX@chat.facebook.com"    -   JabberContact(0x8d6300)
kopete(17348)/kopete (jabber) JabberBaseContact::updateContact: Synchronizing local copy of  "XXXXX@chat.facebook.com"  with information received from server.  (name=' "XXXXXX" ' groups=' ("Facebook Friends") ')

...


kopete(17348)/kopete (jabber) JabberContactPool::cleanUp: Cleaning dirty items from contact pool.
kopete(17348)/kopete (jabber) JabberAccount::slotRosterRequestFinished: Setting initial presence...
kopete(17348)/kopete (jabber) JabberAccount::setPresence: Status:  "" , Reason:  ""
kopete(17348)/kopete (jabber) JabberAccount::setPresence: New priority:  4
kopete(17348)/kopete (jabber) JabberAccount::setPresence: Old resource: "Kopete"
kopete(17348)/kopete (jabber) JabberResourcePool::addResource: Adding new resource  "Kopete"  for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::addResource: Initial update of capabilities for JID:  "XXXXX@chat.facebook.com/Kopete"
kopete(17348)/kopete (jabber) JabberResourcePool::lockToResource: Locking  "XXXXX@chat.facebook.com/Kopete"  to  "Kopete"
kopete(17348)/kopete (jabber) JabberResourcePool::removeLock: Removing resource lock for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::removeLock: No locks found.
kopete(17348)/kopete (jabber) JabberResourcePool::lockToResource: WARNING: No match found!
kopete(17348)/kopete (jabber) JabberAccount::setPresence: New resource: "Kopete"
kopete(17348)/kopete (jabber) JabberAccount::setPresence: We were not connected, presence update aborted.
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: Determining new status for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::bestJabberResource: Determining best resource for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::lockedJabberResource: No lock available for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: New status for  "XXXXX@chat.facebook.com"  is  "Offline"
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status title property with this:  ""
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status message property with this:  ""
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: Determining new status for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::bestJabberResource: Determining best resource for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::lockedJabberResource: No lock available for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: New status for  "XXXXX@chat.facebook.com"  is  "Offline"
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status title property with this:  ""
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status message property with this:  ""

....

kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <presence from="XXXXX@chat.facebook.com" to="XXXXX@chat.facebook.com/Kopete">
<x xmlns="vcard-temp:x:update">
<photo>XXXXXXXXXXXXX</photo>
</x>
</presence>
"
kopete(17348)/kopete (jabber) JabberAccount::slotResourceAvailable: New resource available for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::addResource: Adding new resource  ""  for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: Determining new status for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::bestJabberResource: Determining best resource for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::lockedJabberResource: No lock available for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::bestJabberResource: Taking ' "" ' as first available resource.
kopete(17348)/libkopete Kopete::OnlineStatusManager::cacheLookupByObject: Missed  "Online/jabber_protocol/#ff0000//16/a"  in icon cache!
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: New status for  "XXXXX@chat.facebook.com"  is  "Online"
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status title property with this:  ""
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status message property with this:  ""
kopete(17348)/kopete (jabber - raw protocol) JabberAccount::slotClientDebugMessage: "XML IN: <presence from="XXXXX@chat.facebook.com" to="XXXXX@chat.facebook.com/Kopete">
<x xmlns="vcard-temp:x:update">
<photo>XXXXXXXXXXXXX</photo>
</x>
</presence>
"
kopete(17348)/kopete (jabber) JabberAccount::slotResourceAvailable: New resource available for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::addResource: Adding new resource  ""  for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: Determining new status for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::bestJabberResource: Determining best resource for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::lockedJabberResource: No lock available for  "XXXXX@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::bestJabberResource: Taking ' "" ' as first available resource.
kopete(17348)/kopete (jabber) JabberBaseContact::reevaluateStatus: New status for  "XXXXX@chat.facebook.com"  is  "Online"
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status title property with this:  ""
kopete(17348)/libkopete Kopete::Contact::setStatusMessage: Setting up the status message property with this:  ""

...
Comment 10 Pali Rohár 2013-09-17 14:55:44 UTC
(In reply to comment #9)
> kopete(17348)/kopete (jabber) JabberResourcePool::addResource: Adding new resource  "Kopete"  for  "XXXXX@chat.facebook.com"
> kopete(17348)/kopete (jabber) JabberResourcePool::addResource: Initial update of capabilities for JID:  "XXXXX@chat.facebook.com/Kopete"
> kopete(17348)/kopete (jabber) JabberResourcePool::lockToResource: Locking  "XXXXX@chat.facebook.com/Kopete"  to  "Kopete"
> kopete(17348)/kopete (jabber) JabberResourcePool::removeLock: Removing resource lock for  "XXXXX@chat.facebook.com"
> kopete(17348)/kopete (jabber) JabberResourcePool::removeLock: No locks found.

Here can be problem. Kopete cannot find resource "Kopete".

In function JabberResourcePool::lockToResource() is one foreach loop. Can you list all available resources  in this loop?

kDebug(JABBER_DEBUG_GLOBAL) << "testing resource: " << mResource->resource().name().toLower();

Also problem is here:

(In reply to comment #9)
> kopete(17348)/kopete (jabber) JabberAccount::setPresence: We were not connected, presence update aborted.

Account::isConnected() returning false and this happen only when myself()->isOnline() is false.
Comment 11 H.H. 2013-09-17 15:42:42 UTC
I inserted your debug-code:

it appears 3 times:

1)
kopete(17348)/kopete (jabber) JabberResourcePool::lockToResource: Locking   YYYYYYYY@chat.facebook.com"  to  "Kopete"
kopete(17348)/kopete (jabber) JabberResourcePool::removeLock: Removing resource lock for   YYYYYYYY@chat.facebook.com"
kopete(17348)/kopete (jabber) JabberResourcePool::removeLock: No locks found.
kopete(9956)/kopete (jabber) JabberResourcePool::lockToResource: testing resource:  "kopete"
kopete(9956)/kopete (jabber) JabberAccount::setPresence: New resource: "Kopete"

2+3)

kopete(9956)/kopete (jabber) JabberResourcePool::removeLock: No locks found.
kopete(9956)/kopete (jabber) JabberResourcePool::lockToResource: testing resource:  "kopete"
kopete(9956)/kopete (jabber) JabberResourcePool::lockToResource: testing resource:  "kopete"
kopete(9956)/kopete (jabber) JabberResourcePool::lockToResource: WARNING: No match found!
kopete(9956)/kopete (jabber) JabberAccount::setPresence: New resource: "Kopete"
kopete(9956)/kopete (jabber) JabberAccount::setPresence: We were not connected, presence update aborted.
Comment 12 H.H. 2013-09-17 15:48:10 UTC
I extended your debug code:

		kDebug(JABBER_DEBUG_GLOBAL) << "testing resource: " <<	mResource->resource().name().toLower();
		kDebug(JABBER_DEBUG_GLOBAL) << "name2: " << resource.name().toLower();
		kDebug(JABBER_DEBUG_GLOBAL) << "jid: " << mResource->jid().bare().toLower();
		kDebug(JABBER_DEBUG_GLOBAL) << "jid2: " << jid.full().toLower();


with result:

kopete(10235)/kopete (jabber) JabberResourcePool::lockToResource: testing resource:  "kopete"
kopete(10235)/kopete (jabber) JabberResourcePool::lockToResource: name2:  "kopete"
kopete(10235)/kopete (jabber) JabberResourcePool::lockToResource: jid:  "mynick@chat.facebook.com"
kopete(10235)/kopete (jabber) JabberResourcePool::lockToResource: jid2:  "-12345@chat.facebook.com/kopete"
kopete(10235)/kopete (jabber) JabberResourcePool::lockToResource: testing resource:  "kopete"
kopete(10235)/kopete (jabber) JabberResourcePool::lockToResource: name2:  "kopete"
kopete(10235)/kopete (jabber) JabberResourcePool::lockToResource: jid:  "-12345@chat.facebook.com"
kopete(10235)/kopete (jabber) JabberResourcePool::lockToResource: jid2:  "-12345@chat.facebook.com/kopete"
kopete(10235)/kopete (jabber) JabberResourcePool::lockToResource: WARNING: No match found!
Comment 13 Pali Rohár 2013-09-18 09:59:00 UTC
Created attachment 82388 [details]
Fix JabberResourcePool::lockToResource()

Try this patch (also with verbose debug output) what happen.
Comment 14 H.H. 2013-09-18 13:34:56 UTC
still not working, output:

first appearance:

kopete(3676)/kopete (jabber) JabberBaseContact::reevaluateStatus: New status for  "mynick@chat.facebook.com"  is  "Verbindung wird aufgebaut"
kopete(3676) KopeteWindow::slotIdentityStatusIconChanged: QVariant(, )
kopete(3676)/libkopete Kopete::Contact::setStatusMessage: Setting up the status title property with this:  ""
kopete(3676)/libkopete Kopete::Contact::setStatusMessage: Setting up the status message property with this:  ""
kopete(3676)/kopete (jabber) JabberResourcePool::lockToResource: Locking  "mynick@chat.facebook.com"  to  "Kopete"
kopete(3676)/kopete (jabber) JabberResourcePool::removeLock: Removing resource lock for  "mynick@chat.facebook.com"
kopete(3676)/kopete (jabber) JabberResourcePool::removeLock: No locks found.
kopete(3676)/kopete (jabber) JabberAccount::setPresence: New resource: "Kopete"

second appearance:

kopete(3676)/kopete (jabber) JabberResourcePool::addResource: Adding new resource  "Kopete"  for  "-12345@chat.facebook.com"
kopete(3676)/kopete (jabber) JabberResourcePool::addResource: Initial update of capabilities for JID:  "-12345@chat.facebook.com/Kopete"
kopete(3676)/kopete (jabber) JabberResourcePool::lockToResource: Locking  "-12345@chat.facebook.com"  to  "Kopete"
kopete(3676)/kopete (jabber) JabberResourcePool::removeLock: Removing resource lock for  "-12345@chat.facebook.com"
kopete(3676)/kopete (jabber) JabberResourcePool::removeLock: No locks found.
kopete(3676)/kopete (jabber) JabberAccount::setPresence: New resource: "Kopete"
kopete(3676)/kopete (jabber) JabberAccount::setPresence: We were not connected, presence update aborted.
Comment 15 Pali Rohár 2013-09-18 13:47:27 UTC
Ok, you found another bug in JabberResourcePool::lockToResource() and I will commit my patch after testing it. Lock to resource not working (correctly).

But look like bug in JabberResourcePool::lockToResource() is not what causing facebook problems.

(In reply to comment #14)
> kopete(3676)/kopete (jabber) JabberAccount::setPresence: We were not
> connected, presence update aborted.

This is problem ^^^.

(In reply to comment #10)
> (In reply to comment #9)
> > kopete(17348)/kopete (jabber) JabberAccount::setPresence: We were not connected, presence update aborted.
> 
> Account::isConnected() returning false and this happen only when
> myself()->isOnline() is false.

So need to investigate why myself contact is offline.
Comment 16 H.H. 2013-09-18 14:22:06 UTC
when connecting to facebook to jabber-icon is blinking (=connecting) all the time (never stops).

do you know, when myself is set online in code? which signal/xml-message is responsable for that?
Comment 17 Pali Rohár 2013-09-18 16:04:46 UTC
Do not know. But myself contact is created as first contact in jabberaccount.cpp. You can look at jabbercontact and jaberbasecontact
Comment 18 H.H. 2013-09-27 23:21:10 UTC
I now had some time to investigate and found the relevant code paths:

1. facebook only allows two auth methods anymore: X-FACEBOOK-PLATFORM, PLAIN

so, in the jabber config dialog one has to allow plain login

2. jabberaccount.cpp setPresence Method there are these lines:
	if ( client() ){
		jid = client()->jid ();
	}

	if ( jid.isEmpty() && myself() ){
		jid = myself()->contactId ();
	}

On the first call (when connecting) the client->jid is empty, so the one from the account is taken and has the form "mynick@chat.facebook.com".  On the second call (after rooster update) the client->jid is set and it is a number like "-123123123@chat.facebook.com", which is my facebook-id. 

Because the second one is different, a new ressource is created
"XMPP::Resource newResource ( m_lastResource, newStatus );"
, which is not online, so the setpresence-method is aborted.

When I comment out that line:
//		jid = client()->jid ();
connecting works again. So what is this line for? It is important?


3. in libiris in xmmp_vcard.cpp:

the contact-photos don't work anymore. I found out, that facebook sends now "\r\n" sequences as line breaks so you have to replace the line

d->photo = QCA::Base64().stringToArray(subTagText(i, "BINVAL").replace("\n","")).toByteArray();

by

d->photo = QCA::Base64().stringToArray(subTagText(i, "BINVAL").replace("\n","").replace("\r","")).toByteArray();
Comment 19 Hussam Al-Tayeb 2013-10-04 15:59:48 UTC
(In reply to comment #18)
> I now had some time to investigate and found the relevant code paths:
> 
> 1. facebook only allows two auth methods anymore: X-FACEBOOK-PLATFORM, PLAIN
> 
> so, in the jabber config dialog one has to allow plain login
> 
> 2. jabberaccount.cpp setPresence Method there are these lines:
> 	if ( client() ){
> 		jid = client()->jid ();
> 	}
> 
> 	if ( jid.isEmpty() && myself() ){
> 		jid = myself()->contactId ();
> 	}
> 
> On the first call (when connecting) the client->jid is empty, so the one
> from the account is taken and has the form "mynick@chat.facebook.com".  On
> the second call (after rooster update) the client->jid is set and it is a
> number like "-123123123@chat.facebook.com", which is my facebook-id. 
> 
> Because the second one is different, a new ressource is created
> "XMPP::Resource newResource ( m_lastResource, newStatus );"
> , which is not online, so the setpresence-method is aborted.
> 
> When I comment out that line:
> //		jid = client()->jid ();
> connecting works again. So what is this line for? It is important?
> 
> 
> 3. in libiris in xmmp_vcard.cpp:
> 
> the contact-photos don't work anymore. I found out, that facebook sends now
> "\r\n" sequences as line breaks so you have to replace the line
> 
> d->photo = QCA::Base64().stringToArray(subTagText(i,
> "BINVAL").replace("\n","")).toByteArray();
> 
> by
> 
> d->photo = QCA::Base64().stringToArray(subTagText(i,
> "BINVAL").replace("\n","").replace("\r","")).toByteArray();


This fixes it for me :) thank you.
Comment 20 H.H. 2013-10-06 15:08:41 UTC
it would be good to know, if other jabber server still work with this fix. does anyone uses other jabber services?
Comment 21 Pali Rohár 2013-10-06 15:31:19 UTC
I will look at your patch properly, but now I do not have here kopete git and development env. Please wait about a week.
Comment 22 Hussam Al-Tayeb 2013-10-06 15:38:41 UTC
yes, gmail and it still works too.

One problem i am still having in facebook is when someone who is NOT on my buddy list sends me a message, they appear online even after they go offline till i close kopete.
Comment 23 Nico Kruber 2013-10-12 12:51:26 UTC
Created attachment 82798 [details]
patch to fix facebook connection (incorporates all changes from the previous discussion)

Thanks for the proposed fixes which seem to work for me, too. But instead of

.replace("\n","").replace("\r",""))

I'd propose to go over the string only once with a regular expression that replaces all valid "newline" representations only, i.e.:

.replace(QRegExp("\r?\n|\n\r?"),""))

I set up a branch of the openSUSE kopete package with this patch to test:
https://build.opensuse.org/package/show/home:NicoK:branches:KDE:Distro:Factory/kopete
Comment 24 Pali Rohár 2013-10-12 15:27:12 UTC
you have bug in first condition. you need to comment also "if" because you commented code after "if".
Comment 25 H.H. 2013-10-12 16:43:45 UTC
@pali: you are right, the "if" needs also commented. I am not firm with jabber. Could this patch have negative effects on other jabber servers?
Comment 26 Pali Rohár 2013-10-12 18:43:16 UTC
I did only quick look on patch and did syntax check :-) I wrote that I do not have env for testing (and semantic checking), so wait... Then I will look at patch and also test aginst more xmpp servers what happen.
Comment 27 Nico Kruber 2013-10-13 11:53:23 UTC
Created attachment 82825 [details]
patch to fix facebook connection (incorporates all changes from the previous discussion)

ok, fix the comment around the if
(I usually add braces around if's and didn't see that this one doesn't)
Comment 28 Nico Kruber 2013-10-13 11:56:35 UTC
regarding affects on other Jabber servers:
my jabber.org and google mail servers show online at least, pictures of gmail contacts are still shown - I don't have enough jabber.org contacts though to verify
Comment 29 Francesco Presel 2013-10-14 09:21:07 UTC
(In reply to comment #27)
> Created attachment 82825 [details]
> patch to fix facebook connection (incorporates all changes from the previous
> discussion)
> 
> ok, fix the comment around the if
> (I usually add braces around if's and didn't see that this one doesn't)

I was also affected by this bug, on debian.
Your patch worked for me, thanks!
Comment 30 Hussam Al-Tayeb 2013-10-15 09:27:34 UTC
There is a regression. now on gtalk if someone who was set as 'busy' with a custom message loses connection, it won't show them as offline on my buddy list till I go offline and online again.
Comment 31 Pali Rohár 2013-10-15 20:22:25 UTC
Now I looked at code and JabberClient::jid() is what we should use. (Correct me if I'm wrong) So problem is that JabberClient::jid() returning bad value which cause that facebook not working. Please note that JabberClient::jid() is used on more places (not only in this problematic). Can somebody with facebook account dig why it returing bad value and jid is not correctly updated?
Comment 32 Pali Rohár 2013-10-20 12:47:19 UTC
@Nico Kruber: Your patch changing file protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_vcard.cpp which is part of external libiris library. I want to periodically sync libiris from upstream, so please review this  change with upstream iris project: https://github.com/psi-im/iris
Comment 33 Johannes Huber 2013-10-20 13:15:51 UTC
(In reply to comment #32)
> @Nico Kruber: Your patch changing file
> protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_vcard.cpp which is part of
> external libiris library. I want to periodically sync libiris from upstream,
> so please review this  change with upstream iris project:
> https://github.com/psi-im/iris

Unbundle third party libs is the solution ;)
Comment 34 Pali Rohár 2013-10-20 13:21:30 UTC
I know, but that xmpp library (libiris) is part of kopete tree for many years, because (upstream) library does not support building shared version and is used as glue only...
Comment 35 Johannes Huber 2013-10-20 14:10:52 UTC
(In reply to comment #34)
> I know, but that xmpp library (libiris) is part of kopete tree for many
> years, because (upstream) library does not support building shared version
> and is used as glue only...

Yeah sorry that was just off-topic by me. When do you expect to have a working patch for the problem. We need this issue fixed in downstream :-/
Comment 36 H.H. 2013-10-20 14:30:56 UTC
(In reply to comment #31)
> Now I looked at code and JabberClient::jid() is what we should use. (Correct
> me if I'm wrong) So problem is that JabberClient::jid() returning bad value
> which cause that facebook not working. Please note that JabberClient::jid()
> is used on more places (not only in this problematic). Can somebody with
> facebook account dig why it returing bad value and jid is not correctly
> updated?

I have no time to dig in the code currently, but I saw, that facebook account-ids look like

nickname@chat.facebook.com

and in the exchanged jabber-xml-messages the own id changes after login to something like

-1234566@chat.facebook.com

both, the nickname and the number are unique identifiers for the facebook account. but you can't for example use the second one as the account-id in kopete.

see my log from above.
Comment 37 Pali Rohár 2013-10-21 11:32:48 UTC
(In reply to comment #18)
> 2. jabberaccount.cpp setPresence Method there are these lines:
> 	if ( client() ){
> 		jid = client()->jid ();
> 	}
> 
> 	if ( jid.isEmpty() && myself() ){
> 		jid = myself()->contactId ();
> 	}
> 
> On the first call (when connecting) the client->jid is empty, so the one
> from the account is taken and has the form "mynick@chat.facebook.com".  On
> the second call (after rooster update) the client->jid is set and it is a
> number like "-123123123@chat.facebook.com", which is my facebook-id. 
> 
> Because the second one is different, a new ressource is created
> "XMPP::Resource newResource ( m_lastResource, newStatus );"
> , which is not online, so the setpresence-method is aborted.
> 
> When I comment out that line:
> //		jid = client()->jid ();
> connecting works again. So what is this line for? It is important?
> 
> 

I read this again and maybe I understand where is problem. Id of kopete contact (myself too) cannot be changed and is defined in constructor. So myself contact id is always account id. At startup client()->jid() is contact id with configured resource name (from account settings). But after successfull login it is changed to something which server returns. It can send to you new resource name which you will use (e.g gmail adding some hash after resource which you selected...). So client()->jid() has correct resource name for myself contact which is in use. And if I understand it correctly, facebook xmpp server also changing JID (not only resource name) and then JabberAccount::setPresence() remove old resource from pool for myself account and add some new resource for new JID (returned by client()->jid()).

If above is true (xmpp server force you to use other/new JID), then it is hard to use this new JID and show it to GUI. But you wrote that if you change code to use "mynick@..." JID then it working. Because it is not possible to change JID of any existing contact (myself too), I can try to create patch which will do not change bare JID in client->jid() (only change resource name). If my idea is correct, then this should fix this problem.

BTW, I do not know if xmpp specification allows xmpp server to force xmpp client to use another JID as specified in loggin.

But I need some other tests:

1. Use some other Jabber client (e.g Pidgin) to connect to facebook xmpp server. Then start Kopete (unpatched!) and try to connect via same username and check if this (have some already logged in jabber client) fixing this problem. (Debug log will be usefull too)

2. Try to create new kopete jabber account in form "-123123123@chat.facebook.com" and post debug log whe logging

3. Check if you can add new contact to your roster in form "-123123123@chat.facebook.com" and also in form "nick@chat.facebook.com"
Comment 38 Pali Rohár 2013-10-21 11:35:03 UTC
(In reply to comment #30)
> There is a regression. now on gtalk if someone who was set as 'busy' with a
> custom message loses connection, it won't show them as offline on my buddy
> list till I go offline and online again.

Are you sure that patch(es) proposed here really breaking gtalk as you described? Can you reproduce it? Or maybe it was only some problem on gtalk server? I'm asking because patch(es) here have nothing to do with message and statuses of *other* (non myself) contacts.
Comment 39 Pali Rohár 2013-10-21 13:19:33 UTC
Created attachment 82989 [details]
This patch change only resource (not bare JID) for client()->jid()
Comment 40 H.H. 2013-10-21 17:55:48 UTC
your patch works for me with facebook :-)

(except the avatar-picture, see the other patch for libiris)

I currently have no time to make the other three tests, perhaps in the next 2 weeks.
Comment 41 Pali Rohár 2013-10-21 20:41:50 UTC
I updated libiris from github and pushed more jabber patches (fixed filetransfer support too) to my cloned repo: http://quickgit.kde.org/?p=clones/kopete/pali/kopete.git

Please check if everything working (facebook and other jabber servers). After testing I will push it to kopete master git. But needs to be sure that it not bring new regressions.
Comment 42 Hussam Al-Tayeb 2013-10-21 21:16:40 UTC
(In reply to comment #38)
> (In reply to comment #30)
> > There is a regression. now on gtalk if someone who was set as 'busy' with a
> > custom message loses connection, it won't show them as offline on my buddy
> > list till I go offline and online again.
> 
> Are you sure that patch(es) proposed here really breaking gtalk as you
> described? Can you reproduce it? Or maybe it was only some problem on gtalk
> server? I'm asking because patch(es) here have nothing to do with message
> and statuses of *other* (non myself) contacts.

Nope, only happened once. I should not have labeled it a regression. but it was the first time it happened and I can't reproduce it so just disregard my note. :)
Comment 43 Nico Kruber 2013-10-22 13:51:02 UTC
thank you for the updates, Pali - I applied all the changes to my openSUSE package of kopete 4.11.2 at
https://build.opensuse.org/package/show/home:NicoK:branches:KDE:Distro:Factory/kopete
(basically everything from "git diff 33c0bd4acb^ 9178763fbd")

Facebook and Google Talk login work - will try the rest later
Comment 44 Nico Kruber 2013-10-22 22:27:14 UTC
there is one thing that changed with these patches but I'm not sure whether this is intended or not - it is probably related to commit f0b1e6afb3

1) I'm in "do not disturb" aka. "busy" state in a google talk account
2) I set kopete to go offline which is done successfully
3) after a while without doing anything on kopete I appear as "away"
-> now my mobile may login to google in the meantime but this shouldn't affect the online/offline state of kopete, should it? IMHO, offline = no connections / connection attempts
Comment 45 Pali Rohár 2013-10-23 09:01:38 UTC
Ah, commit f0b1e6afb3 should fix your above problem :-( Can you send me debug output from kopete (enable libkopete and kopete jabber in kdebugdialog)?
Comment 46 Hussam Al-Tayeb 2013-10-23 18:37:44 UTC
Created attachment 83065 [details]
crash data

http://quickgit.kde.org/?p=clones/kopete/pali/kopete.git
I did a kopete build from this address
it crashes with the attached backtrace when i disconnect
Comment 47 Pali Rohár 2013-10-23 19:03:17 UTC
(In reply to comment #46)
> Created attachment 83065 [details]
> crash data
> 
> http://quickgit.kde.org/?p=clones/kopete/pali/kopete.git
> I did a kopete build from this address
> it crashes with the attached backtrace when i disconnect

Please recompile with debug symbols.
Comment 48 Pali Rohár 2013-10-24 18:27:04 UTC
Git commit dd536999ce5611ad5d80adb813f7857ab29f20d4 by Pali Rohár.
Committed on 21/10/2013 at 13:33.
Pushed by pali into branch 'master'.

Do not allow overwriting bare jid of myself account in jabber client

Kopete account id and myself contact id cannot be changed. This means that all
jabber code must use bare jid for myself contact specified in account dialog.
Jabber server can change user jid after successfull login, but there is no
way in Kopete to propage it. So allow changing only of resource name and do not
tell other Kopete code about bare jid changes (which is account id and myself
contact id). Chaning resource name is OK. Without this patch it is not possible
to login to jabber servers which chaning bare jid (e.g facebook).
FIXED-IN: 4.12

M  +2    -3    protocols/jabber/jabberclient.cpp

http://commits.kde.org/kopete/dd536999ce5611ad5d80adb813f7857ab29f20d4
Comment 49 Pali Rohár 2013-10-24 18:27:28 UTC
Git commit 7801dae888e6fd145e6755e9f89d2bf04092bf4a by Pali Rohár.
Committed on 21/10/2013 at 10:45.
Pushed by pali into branch 'master'.

Fix JabberResourcePool::lockToResource

When locking contact to resource check only for bare JID. It does not make sense to check for full JID with (maybe old/bad) resource name

M  +2    -2    protocols/jabber/jabberresourcepool.cpp

http://commits.kde.org/kopete/7801dae888e6fd145e6755e9f89d2bf04092bf4a
Comment 50 Pali Rohár 2013-10-24 18:32:14 UTC
I pushed some commits to kopete master, so test if it working...
Comment 51 Johannes Huber 2013-10-24 18:37:10 UTC
Will the patches be backported to KDE/4.11?
Comment 52 Pali Rohár 2013-10-24 18:42:54 UTC
@Johannes Huber: I do not want to backport full patchset (with updated libiris and filetransfer) because there could be regression. But if you can test above two small commits (dd536999ce5611ad5d80adb813f7857ab29f20d4 and 7801dae888e6fd145e6755e9f89d2bf04092bf4a) cherry-picking on KDE 4.11 if fixing logging to facebook server, I can backport them.
Comment 53 Johannes Huber 2013-10-24 18:52:10 UTC
(In reply to comment #52)
> @Johannes Huber: I do not want to backport full patchset (with updated
> libiris and filetransfer) because there could be regression. But if you can
> test above two small commits (dd536999ce5611ad5d80adb813f7857ab29f20d4 and
> 7801dae888e6fd145e6755e9f89d2bf04092bf4a) cherry-picking on KDE 4.11 if
> fixing logging to facebook server, I can backport them.

Tested master, works for me. Backporting is appreciated from downstream side. :)
Comment 54 Pali Rohár 2013-10-25 11:21:00 UTC
I mean to test above two commits (patches) on branch KDE/4.11 (not master)
Comment 55 Johannes Huber 2013-10-25 21:03:57 UTC
Applied both patches to kopete-4.11.2. $BUG summary fixed. So please backport them to KDE/4.11. 
Greetings
Comment 56 Pali Rohár 2013-10-26 11:47:48 UTC
Git commit bf072df3136e2980d3dba356aa79c0060f64b1ea by Pali Rohár.
Committed on 21/10/2013 at 13:33.
Pushed by pali into branch 'KDE/4.11'.

Do not allow overwriting bare jid of myself account in jabber client

Kopete account id and myself contact id cannot be changed. This means that all
jabber code must use bare jid for myself contact specified in account dialog.
Jabber server can change user jid after successfull login, but there is no
way in Kopete to propage it. So allow changing only of resource name and do not
tell other Kopete code about bare jid changes (which is account id and myself
contact id). Chaning resource name is OK. Without this patch it is not possible
to login to jabber servers which chaning bare jid (e.g facebook).
FIXED-IN: 4.11.3

M  +2    -3    protocols/jabber/jabberclient.cpp

http://commits.kde.org/kopete/bf072df3136e2980d3dba356aa79c0060f64b1ea
Comment 57 Pali Rohár 2013-11-10 10:10:41 UTC
Git commit 0352c3eea69fbcac7687878cf6b076794ab10e3a by Pali Rohár.
Committed on 07/11/2013 at 15:57.
Pushed by pali into branch 'KDE/4.12'.

Update libiris from https://github.com/psi-im/iris.git commit e1e776b5b7752dca7b9383677850f72dc7375fdb

Ignore /[\r\n]+/ in vcard base64 photo

M  +1    -1    protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_vcard.cpp

http://commits.kde.org/kopete/0352c3eea69fbcac7687878cf6b076794ab10e3a
Comment 58 Pali Rohár 2013-11-10 10:11:29 UTC
Git commit 57f5eecc323531b29db42fa44b27052c900fea2d by Pali Rohár.
Committed on 07/11/2013 at 16:08.
Pushed by pali into branch 'KDE/4.11'.

Jabber libiris library: Ignore /[\r\n]+/ in vcard base64 photo

A  +13   -0    protocols/jabber/libiris/patches/09_vcard_photo.patch
M  +1    -1    protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_vcard.cpp

http://commits.kde.org/kopete/57f5eecc323531b29db42fa44b27052c900fea2d