From 83f5f36c94a2e7c3af595a5decbb9cd3ae80088c Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 7 Aug 2012 17:41:13 +0200 Subject: [PATCH] Check if JID is valid when calling setName and ignore buddies with invalid JID --- include/transport/buddy.h | 2 +- src/buddy.cpp | 8 +++++--- src/localbuddy.cpp | 2 +- src/networkpluginserver.cpp | 2 +- src/rostermanager.cpp | 8 +++++--- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/include/transport/buddy.h b/include/transport/buddy.h index ea1a4090..490d5671 100644 --- a/include/transport/buddy.h +++ b/include/transport/buddy.h @@ -169,11 +169,11 @@ class Buddy { protected: void generateJID(); + Swift::JID m_jid; private: long m_id; // Swift::Presence::ref m_lastPresence; - Swift::JID m_jid; BuddyFlag m_flags; RosterManager *m_rosterManager; Subscription m_subscription; diff --git a/src/buddy.cpp b/src/buddy.cpp index 535a285a..f05fb901 100644 --- a/src/buddy.cpp +++ b/src/buddy.cpp @@ -51,9 +51,11 @@ long Buddy::getID() { void Buddy::setFlags(BuddyFlag flags) { m_flags = flags; - try { - generateJID(); - } catch (...) { + if (!getSafeName().empty()) { + try { + generateJID(); + } catch (...) { + } } } diff --git a/src/localbuddy.cpp b/src/localbuddy.cpp index 65d54d2b..e8e5e279 100644 --- a/src/localbuddy.cpp +++ b/src/localbuddy.cpp @@ -39,7 +39,7 @@ bool LocalBuddy::setName(const std::string &name) { m_name = name; try { generateJID(); - return true; + return m_jid.isValid(); } catch (...) { m_name = oldName; return false; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 2df33abf..b6981b25 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -95,6 +95,7 @@ class NetworkFactory : public Factory { Buddy *createBuddy(RosterManager *rosterManager, const BuddyInfo &buddyInfo) { LocalBuddy *buddy = new LocalBuddy(rosterManager, buddyInfo.id); buddy->setAlias(buddyInfo.alias); + buddy->setFlags((BuddyFlag) (buddyInfo.flags)); if (!buddy->setName(buddyInfo.legacyName)) { delete buddy; return NULL; @@ -106,7 +107,6 @@ class NetworkFactory : public Factory { buddy->setSubscription(Buddy::Ask); } buddy->setGroups(buddyInfo.groups); - buddy->setFlags((BuddyFlag) (buddyInfo.flags)); if (buddyInfo.settings.find("icon_hash") != buddyInfo.settings.end()) buddy->setIconHash(buddyInfo.settings.find("icon_hash")->second.s); return buddy; diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index c965c621..ea40db79 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -524,9 +524,11 @@ void RosterManager::setStorageBackend(StorageBackend *storageBackend) { for (std::list::const_iterator it = roster.begin(); it != roster.end(); it++) { Buddy *buddy = m_component->getFactory()->createBuddy(this, *it); - LOG4CXX_INFO(logger, m_user->getJID().toString() << ": Adding cached buddy " << buddy->getName() << " fom database"); - m_buddies[buddy->getName()] = buddy; - onBuddySet(buddy); + if (buddy) { + LOG4CXX_INFO(logger, m_user->getJID().toString() << ": Adding cached buddy " << buddy->getName() << " fom database"); + m_buddies[buddy->getName()] = buddy; + onBuddySet(buddy); + } } m_rosterStorage = storage;