Fixed password changing in gateway mode + working RIE
This commit is contained in:
parent
ab6a0ecf30
commit
e23f8e3c7f
11 changed files with 87 additions and 29 deletions
|
@ -43,6 +43,7 @@ INCLUDE(FindQt4)
|
|||
FIND_PACKAGE(Qt4 COMPONENTS QtCore)
|
||||
|
||||
# ADD_DEFINITIONS(${SWIFTEN_CFLAGS})
|
||||
ADD_DEFINITIONS(-DSUPPORT_LEGACY_CAPS)
|
||||
|
||||
message(" Supported features")
|
||||
message("-----------------------")
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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=?");
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
66
src/user.cpp
66
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<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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue