Fixed password changing in gateway mode + working RIE

This commit is contained in:
HanzZ 2011-09-19 14:22:01 +02:00
parent ab6a0ecf30
commit e23f8e3c7f
11 changed files with 87 additions and 29 deletions

View file

@ -43,6 +43,7 @@ INCLUDE(FindQt4)
FIND_PACKAGE(Qt4 COMPONENTS QtCore)
# ADD_DEFINITIONS(${SWIFTEN_CFLAGS})
ADD_DEFINITIONS(-DSUPPORT_LEGACY_CAPS)
message(" Supported features")
message("-----------------------")

View file

@ -157,6 +157,8 @@ namespace Transport {
/// \param presence presence data
boost::signal<void (Swift::Presence::ref presence)> onUserPresenceReceived;
boost::signal<void (const Swift::JID& jid, boost::shared_ptr<Swift::DiscoInfo> info)> onUserDiscoInfoReceived;
// boost::signal<void (boost::shared_ptr<Swift::DiscoInfo> 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<Swift::DiscoInfo> info, Swift::ErrorPayload::ref error, const Swift::JID& jid);
void handleDiscoInfoResponse(boost::shared_ptr<Swift::DiscoInfo> info, Swift::ErrorPayload::ref error, const Swift::JID& jid);
void handleCapsChanged(const Swift::JID& jid);
Swift::NetworkFactories *m_factories;

View file

@ -75,6 +75,8 @@ class User {
void handleSubscription(Swift::Presence::ref presence);
void handleDiscoInfo(const Swift::JID& jid, boost::shared_ptr<Swift::DiscoInfo> info);
time_t &getLastActivity() {
return m_lastActivity;
}
@ -127,6 +129,7 @@ class User {
Swift::Timer::ref m_reconnectTimer;
boost::shared_ptr<Swift::Connection> connection;
time_t m_lastActivity;
std::map<Swift::JID, Swift::DiscoInfo::ref> m_legacyCaps;
};
}

View file

@ -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<Swift::DiscoInfo> info, Swift::ErrorPayload::ref error, const Swift::JID& jid);
void handleDiscoInfo(const Swift::JID& jid, boost::shared_ptr<Swift::DiscoInfo> info);
void addUser(User *user);
long m_onlineBuddies;

View file

@ -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();
}

View file

@ -198,7 +198,7 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptr<Swift::RosterPa
}
LOG4CXX_INFO(logger, m_user->getJID().toString() << ": This server supports remote roster protoXEP");
m_supportRemoteRoster = true;
// m_supportRemoteRoster = true;
return;
BOOST_FOREACH(const Swift::RosterItemPayload &item, payload->getItems()) {

View file

@ -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=?");

View file

@ -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<Swift::DiscoInfo> 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));
}
}

View file

@ -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<Swift::DiscoInfo> 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) {

View file

@ -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<Swift::DiscoInfo> 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();

View file

@ -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;