From e23f8e3c7f9d7c21ee3586f57b9870cb7821aba6 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 19 Sep 2011 14:22:01 +0200 Subject: [PATCH] Fixed password changing in gateway mode + working RIE --- CMakeLists.txt | 1 + include/transport/transport.h | 4 +- include/transport/user.h | 3 ++ include/transport/usermanager.h | 2 +- src/mysqlbackend.cpp | 4 +- src/rostermanager.cpp | 2 +- src/sqlite3backend.cpp | 2 +- src/transport.cpp | 20 +++++++--- src/user.cpp | 66 +++++++++++++++++++++++++-------- src/usermanager.cpp | 11 +++++- src/userregistration.cpp | 1 + 11 files changed, 87 insertions(+), 29 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fc4f75de..6ce72640 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ INCLUDE(FindQt4) FIND_PACKAGE(Qt4 COMPONENTS QtCore) # ADD_DEFINITIONS(${SWIFTEN_CFLAGS}) +ADD_DEFINITIONS(-DSUPPORT_LEGACY_CAPS) message(" Supported features") message("-----------------------") diff --git a/include/transport/transport.h b/include/transport/transport.h index 010e2fbf..79cb2546 100644 --- a/include/transport/transport.h +++ b/include/transport/transport.h @@ -157,6 +157,8 @@ namespace Transport { /// \param presence presence data boost::signal onUserPresenceReceived; + boost::signal info)> onUserDiscoInfoReceived; + // boost::signal info, Swift::ErrorPayload::ref error, const Swift::JID& jid)> onDiscoInfoResponse; private: @@ -166,7 +168,7 @@ namespace Transport { void handleDataRead(const Swift::SafeByteArray &data); void handleDataWritten(const Swift::SafeByteArray &data); -// void handleDiscoInfoResponse(boost::shared_ptr info, Swift::ErrorPayload::ref error, const Swift::JID& jid); + void handleDiscoInfoResponse(boost::shared_ptr info, Swift::ErrorPayload::ref error, const Swift::JID& jid); void handleCapsChanged(const Swift::JID& jid); Swift::NetworkFactories *m_factories; diff --git a/include/transport/user.h b/include/transport/user.h index dcf9a9fe..0ad6693a 100644 --- a/include/transport/user.h +++ b/include/transport/user.h @@ -75,6 +75,8 @@ class User { void handleSubscription(Swift::Presence::ref presence); + void handleDiscoInfo(const Swift::JID& jid, boost::shared_ptr info); + time_t &getLastActivity() { return m_lastActivity; } @@ -127,6 +129,7 @@ class User { Swift::Timer::ref m_reconnectTimer; boost::shared_ptr connection; time_t m_lastActivity; + std::map m_legacyCaps; }; } diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index 839c612f..0c23b245 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -117,7 +117,7 @@ class UserManager { void handleProbePresence(Swift::Presence::ref presence); void handleSubscription(Swift::Presence::ref presence); void handleRemoveTimeout(const std::string jid, User *user, bool reconnect); -// void handleDiscoInfoResponse(boost::shared_ptr info, Swift::ErrorPayload::ref error, const Swift::JID& jid); + void handleDiscoInfo(const Swift::JID& jid, boost::shared_ptr info); void addUser(User *user); long m_onlineBuddies; diff --git a/src/mysqlbackend.cpp b/src/mysqlbackend.cpp index 0cfdd59a..d2f4d2fd 100644 --- a/src/mysqlbackend.cpp +++ b/src/mysqlbackend.cpp @@ -296,7 +296,7 @@ bool MySQLBackend::connect() { createDatabase(); - m_setUser = new Statement(&m_conn, "sssssb", "INSERT INTO " + m_prefix + "users (jid, uin, password, language, encoding, last_login, vip) VALUES (?, ?, ?, ?, ?, NOW(), ?)"); + m_setUser = new Statement(&m_conn, "sssssbs", "INSERT INTO " + m_prefix + "users (jid, uin, password, language, encoding, last_login, vip) VALUES (?, ?, ?, ?, ?, NOW(), ?) ON DUPLICATE KEY UPDATE password=?"); m_getUser = new Statement(&m_conn, "s|isssssb", "SELECT id, jid, uin, password, encoding, language, vip FROM " + m_prefix + "users WHERE jid=?"); m_removeUser = new Statement(&m_conn, "i", "DELETE FROM " + m_prefix + "users WHERE id=?"); @@ -386,7 +386,7 @@ bool MySQLBackend::exec(const std::string &query) { } void MySQLBackend::setUser(const UserInfo &user) { - *m_setUser << user.jid << user.uin << user.password << user.language << user.encoding << user.vip; + *m_setUser << user.jid << user.uin << user.password << user.language << user.encoding << user.vip << user.password; m_setUser->execute(); } diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 5f397ba8..d0f28d85 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -198,7 +198,7 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptrgetJID().toString() << ": This server supports remote roster protoXEP"); - m_supportRemoteRoster = true; +// m_supportRemoteRoster = true; return; BOOST_FOREACH(const Swift::RosterItemPayload &item, payload->getItems()) { diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index f79ce9fb..7a4f444b 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -112,7 +112,7 @@ bool SQLite3Backend::connect() { if (createDatabase() == false) return false; - PREP_STMT(m_setUser, "INSERT INTO " + m_prefix + "users (jid, uin, password, language, encoding, last_login, vip) VALUES (?, ?, ?, ?, ?, DATETIME('NOW'), ?)"); + PREP_STMT(m_setUser, "INSERT OR REPLACE INTO " + m_prefix + "users (jid, uin, password, language, encoding, last_login, vip) VALUES (?, ?, ?, ?, ?, DATETIME('NOW'), ?)"); PREP_STMT(m_getUser, "SELECT id, jid, uin, password, encoding, language, vip FROM " + m_prefix + "users WHERE jid=?"); PREP_STMT(m_removeUser, "DELETE FROM " + m_prefix + "users WHERE id=?"); diff --git a/src/transport.cpp b/src/transport.cpp index f451a818..612b51bc 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -245,18 +245,26 @@ void Component::handlePresence(Swift::Presence::ref presence) { if (capsInfo && capsInfo->getHash() == "sha-1") { /*haveFeatures = */m_entityCapsManager->getCaps(presence->getFrom()) != DiscoInfo::ref(); } -// else { -// GetDiscoInfoRequest::ref discoInfoRequest = GetDiscoInfoRequest::create(presence->getFrom(), m_iqRouter); -// discoInfoRequest->onResponse.connect(boost::bind(&Component::handleDiscoInfoResponse, this, _1, _2, presence->getFrom())); -// discoInfoRequest->send(); -// } +#ifdef SUPPORT_LEGACY_CAPS + else { + GetDiscoInfoRequest::ref discoInfoRequest = GetDiscoInfoRequest::create(presence->getFrom(), m_iqRouter); + discoInfoRequest->onResponse.connect(boost::bind(&Component::handleDiscoInfoResponse, this, _1, _2, presence->getFrom())); + discoInfoRequest->send(); + } +#endif } onUserPresenceReceived(presence); } +void Component::handleDiscoInfoResponse(boost::shared_ptr info, Swift::ErrorPayload::ref error, const Swift::JID& jid) { +#ifdef SUPPORT_LEGACY_CAPS + onUserDiscoInfoReceived(jid, info); +#endif +} + void Component::handleCapsChanged(const Swift::JID& jid) { - m_entityCapsManager->getCaps(jid) != DiscoInfo::ref(); + onUserDiscoInfoReceived(jid, m_entityCapsManager->getCaps(jid)); } } diff --git a/src/user.cpp b/src/user.cpp index 5adc59ce..7b3ba237 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -88,8 +88,18 @@ Swift::JID User::getJIDWithFeature(const std::string &feature) { continue; Swift::DiscoInfo::ref discoInfo = m_entityCapsManager->getCaps(presence->getFrom()); - if (!discoInfo) + if (!discoInfo) { +#ifdef SUPPORT_LEGACY_CAPS + if (m_legacyCaps.find(presence->getFrom()) != m_legacyCaps.end()) { + discoInfo = m_legacyCaps[presence->getFrom()]; + } + else { + continue; + } +#else continue; +#endif + } if (discoInfo->hasFeature(feature)) { LOG4CXX_INFO(logger, m_jid.toString() << ": Found JID with " << feature << " feature: " << presence->getFrom().toString()); @@ -97,7 +107,7 @@ Swift::JID User::getJIDWithFeature(const std::string &feature) { } } - LOG4CXX_INFO(logger, m_jid.toString() << ": No JID with " << feature << " feature"); + LOG4CXX_INFO(logger, m_jid.toString() << ": No JID with " << feature << " feature " << m_legacyCaps.size()); return jid; } @@ -189,21 +199,24 @@ void User::handlePresence(Swift::Presence::ref presence) { sendCurrentPresence(); + // Change legacy network presence - Swift::Presence::ref highest = m_presenceOracle->getHighestPriorityPresence(m_jid.toBare()); - if (highest) { - Swift::Presence::ref response = Swift::Presence::create(highest); - response->setTo(m_jid); - response->setFrom(m_component->getJID()); - LOG4CXX_INFO(logger, m_jid.toString() << ": Changing legacy network presence to " << response->getType()); - onPresenceChanged(highest); - } - else { - Swift::Presence::ref response = Swift::Presence::create(); - response->setTo(m_jid.toBare()); - response->setFrom(m_component->getJID()); - response->setType(Swift::Presence::Unavailable); - onPresenceChanged(response); + if (m_readyForConnect) { + Swift::Presence::ref highest = m_presenceOracle->getHighestPriorityPresence(m_jid.toBare()); + if (highest) { + Swift::Presence::ref response = Swift::Presence::create(highest); + response->setTo(m_jid); + response->setFrom(m_component->getJID()); + LOG4CXX_INFO(logger, m_jid.toString() << ": Changing legacy network presence to " << response->getType()); + onPresenceChanged(highest); + } + else { + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo(m_jid.toBare()); + response->setFrom(m_component->getJID()); + response->setType(Swift::Presence::Unavailable); + onPresenceChanged(response); + } } } @@ -211,12 +224,33 @@ void User::handleSubscription(Swift::Presence::ref presence) { m_rosterManager->handleSubscription(presence); } +void User::handleDiscoInfo(const Swift::JID& jid, boost::shared_ptr info) { + LOG4CXX_INFO(logger, jid.toString() << ": got disco#info"); +#ifdef SUPPORT_LEGACY_CAPS + Swift::DiscoInfo::ref discoInfo = m_entityCapsManager->getCaps(jid); + // This is old legacy cap which is not stored in entityCapsManager, + // we have to store it in our user class. + if (!discoInfo) { + LOG4CXX_INFO(logger, jid.toString() << ": LEGACY"); + m_legacyCaps[jid] = info; + } +#endif + + onConnectingTimeout(); +} + void User::onConnectingTimeout() { if (m_connected || m_readyForConnect) return; m_reconnectTimer->stop(); m_readyForConnect = true; onReadyToConnect(); + + Swift::Presence::ref highest = m_presenceOracle->getHighestPriorityPresence(m_jid.toBare()); + if (highest) { + LOG4CXX_INFO(logger, m_jid.toString() << ": Changing legacy network presence to " << highest->getType()); + onPresenceChanged(highest); + } } void User::setIgnoreDisconnect(bool ignoreDisconnect) { diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 69c6ef68..b42eef41 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -53,12 +53,12 @@ UserManager::UserManager(Component *component, UserRegistry *userRegistry, Stora } component->onUserPresenceReceived.connect(bind(&UserManager::handlePresence, this, _1)); + component->onUserDiscoInfoReceived.connect(bind(&UserManager::handleDiscoInfo, this, _1, _2)); m_component->getStanzaChannel()->onMessageReceived.connect(bind(&UserManager::handleMessageReceived, this, _1)); m_component->getStanzaChannel()->onPresenceReceived.connect(bind(&UserManager::handleGeneralPresenceReceived, this, _1)); m_userRegistry->onConnectUser.connect(bind(&UserManager::connectUser, this, _1)); m_userRegistry->onDisconnectUser.connect(bind(&UserManager::disconnectUser, this, _1)); -// component->onDiscoInfoResponse.connect(bind(&UserManager::handleDiscoInfoResponse, this, _1, _2, _3)); m_removeTimer = m_component->getNetworkFactories()->getTimerFactory()->createTimer(1); } @@ -122,6 +122,15 @@ int UserManager::getUserCount() { return m_users.size(); } +void UserManager::handleDiscoInfo(const Swift::JID& jid, boost::shared_ptr info) { + User *user = getUser(jid.toBare().toString()); + if (!user) { + return; + } + + user->handleDiscoInfo(jid, info); +} + void UserManager::handlePresence(Swift::Presence::ref presence) { std::string barejid = presence->getTo().toBare().toString(); std::string userkey = presence->getFrom().toBare().toString(); diff --git a/src/userregistration.cpp b/src/userregistration.cpp index bb4bc89a..7b05216f 100644 --- a/src/userregistration.cpp +++ b/src/userregistration.cpp @@ -388,6 +388,7 @@ bool UserRegistration::handleSetRequest(const Swift::JID& from, const Swift::JID } else { res.jid = barejid; + res.uin = username; res.password = *payload->getPassword(); res.language = language; res.encoding = encoding;