From 02df69b8318f866a70b3991b4bc169e549444156 Mon Sep 17 00:00:00 2001 From: Darchigh Date: Fri, 18 Jan 2013 17:42:19 +0100 Subject: [PATCH 1/8] Make Spectrum2 send full roster after receiving empty RemoteRoster-Payload --- src/rostermanager.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 0967fe56..449cd744 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -280,6 +280,15 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptrgetJID().toString() << ": This server supports remote roster protoXEP"); m_supportRemoteRoster = true; + + //If we receive empty RosterPayload initiate full RosterPush + if(payload->getItems().empty()){ + LOG4CXX_INFO(logger, "Received empty Roster. Pushing full Roster."); + for(std::map, boost::pool_allocator< std::pair > >::const_iterator c_it = m_buddies.begin(); + c_it != m_buddies.end(); c_it++) { + sendBuddyRosterPush(c_it->second); + } + } return; BOOST_FOREACH(const Swift::RosterItemPayload &item, payload->getItems()) { From 2f46d9f7a3ab814f76dce516bc5592496481ad53 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 22 Jan 2013 09:07:10 +0100 Subject: [PATCH 2/8] Working spectrum2_manager restart and hopefully working backend logging directory creation under unprivileged user --- spectrum/src/sample.cfg | 6 ++-- spectrum_manager/src/main.cpp | 3 ++ src/logging.cpp | 58 +++++++++++++++++++---------------- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index d795b60e..75735b97 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -13,15 +13,15 @@ admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -backend=../..//backends/swiften/spectrum2_swiften_backend +#backend=../..//backends/swiften/spectrum2_swiften_backend #backend=../../backends/twitter/spectrum2_twitter_backend -#backend=/home/hanzz/code/libtransport/backends/libcommuni/spectrum2_libcommuni_backend +backend=/home/hanzz/code/libtransport/backends/libcommuni/spectrum2_libcommuni_backend protocol=prpl-jabber #protocol=prpl-msn #protocol=any #protocol=prpl-icq working_dir=./ -portfile=$jid.port +portfile=./$jid.port irc_server=irc.freenode.org [backend] diff --git a/spectrum_manager/src/main.cpp b/spectrum_manager/src/main.cpp index 9f09d2af..58581be2 100644 --- a/spectrum_manager/src/main.cpp +++ b/spectrum_manager/src/main.cpp @@ -138,6 +138,9 @@ int main(int argc, char **argv) else if (command[0] == "list") { std::vector list = show_list(&config); } + else if (command[0] == "restart") { + return restart_instances(&config); + } else if (command[0] == "server") { Server server(&config); if (server.start() == false) { diff --git a/src/logging.cpp b/src/logging.cpp index b5c080b2..947eb2bb 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -136,30 +136,38 @@ static void initLogging(Config *config, std::string key, bool only_create_dir = p.setProperty("id", id); #endif - std::string dir; + std::vector dirs; BOOST_FOREACH(const log4cxx::LogString &prop, p.propertyNames()) { -// if (boost::ends_with(prop, ".File")) { + if (boost::ends_with(prop, ".File")) { + std::string dir; log4cxx::helpers::Transcoder::encode(p.get(prop), dir); boost::replace_all(dir, "${jid}", jid); boost::replace_all(dir, "${pid}", pid); boost::replace_all(dir, "${id}", id); - break; -// } + dirs.push_back(dir); + } } mode_t old_cmask; - if (!dir.empty()) { - // create directories + // create directories #ifndef WIN32 - old_cmask = umask(0007); + old_cmask = umask(0007); #endif - try { - Transport::Util::createDirectories(config, boost::filesystem::path(dir).parent_path()); - } - catch (const boost::filesystem::filesystem_error &e) { - std::cerr << "Can't create logging directory directory " << boost::filesystem::path(dir).parent_path().string() << ": " << e.what() << ".\n"; + + BOOST_FOREACH(std::string &dir, dirs) { + if (!dir.empty()) { + try { + Transport::Util::createDirectories(config, boost::filesystem::path(dir).parent_path()); + } + catch (const boost::filesystem::filesystem_error &e) { + std::cerr << "Can't create logging directory directory " << boost::filesystem::path(dir).parent_path().string() << ": " << e.what() << ".\n"; + } } } +#ifndef WIN32 + umask(old_cmask); +#endif + if (only_create_dir) { return; } @@ -168,24 +176,20 @@ static void initLogging(Config *config, std::string key, bool only_create_dir = // Change owner of main log file #ifndef WIN32 - if (!CONFIG_STRING(config, "service.group").empty() && !CONFIG_STRING(config, "service.user").empty()) { - struct group *gr; - if ((gr = getgrnam(CONFIG_STRING(config, "service.group").c_str())) == NULL) { - std::cerr << "Invalid service.group name " << CONFIG_STRING(config, "service.group") << "\n"; + BOOST_FOREACH(std::string &dir, dirs) { + if (!CONFIG_STRING(config, "service.group").empty() && !CONFIG_STRING(config, "service.user").empty()) { + struct group *gr; + if ((gr = getgrnam(CONFIG_STRING(config, "service.group").c_str())) == NULL) { + std::cerr << "Invalid service.group name " << CONFIG_STRING(config, "service.group") << "\n"; + } + struct passwd *pw; + if ((pw = getpwnam(CONFIG_STRING(config, "service.user").c_str())) == NULL) { + std::cerr << "Invalid service.user name " << CONFIG_STRING(config, "service.user") << "\n"; + } + chown(dir.c_str(), pw->pw_uid, gr->gr_gid); } - struct passwd *pw; - if ((pw = getpwnam(CONFIG_STRING(config, "service.user").c_str())) == NULL) { - std::cerr << "Invalid service.user name " << CONFIG_STRING(config, "service.user") << "\n"; - } - chown(dir.c_str(), pw->pw_uid, gr->gr_gid); } #endif - -#ifndef WIN32 - if (!dir.empty()) { - umask(old_cmask); - } -#endif } } From 22270d1b616ab3bc7aaa182fcedb6dccecc463bf Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 22 Jan 2013 09:23:02 +0100 Subject: [PATCH 3/8] Remove bad logging messages --- src/userregistry.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/userregistry.cpp b/src/userregistry.cpp index 8d8a3975..2b7e358c 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -79,9 +79,6 @@ void UserRegistry::stopLogin(const Swift::JID& user, Swift::ServerFromClientSess LOG4CXX_WARN(logger, key << ": Stopping login process (user probably disconnected while logging in), but this is not active session"); } } - else { - LOG4CXX_WARN(logger, key << ": Stopping login process (user probably disconnected while logging in) for invalid user"); - } // ::removeLater can be called only by libtransport, not by Swift and libtransport // takes care about user disconnecting itself, so don't call our signal. @@ -96,9 +93,6 @@ void UserRegistry::onPasswordValid(const Swift::JID &user) { users[key].session->handlePasswordValid(); users.erase(key); } - else { - LOG4CXX_INFO(logger, key << ": onPasswordValid called for invalid user"); - } } void UserRegistry::onPasswordInvalid(const Swift::JID &user, const std::string &error) { @@ -108,9 +102,6 @@ void UserRegistry::onPasswordInvalid(const Swift::JID &user, const std::string & users[key].session->handlePasswordInvalid(error); users.erase(key); } - else { - LOG4CXX_INFO(logger, key << ": onPasswordInvalid called for invalid user"); - } } void UserRegistry::handleRemoveTimeout(const Swift::JID &user) { From 58f50c754489d9712ce0dd6ba0361fc4b4ac9985 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 22 Jan 2013 09:28:26 +0100 Subject: [PATCH 4/8] better error message for server mode --- src/userregistry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/userregistry.cpp b/src/userregistry.cpp index 2b7e358c..c6cbdf32 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -98,7 +98,7 @@ void UserRegistry::onPasswordValid(const Swift::JID &user) { void UserRegistry::onPasswordInvalid(const Swift::JID &user, const std::string &error) { std::string key = user.toBare().toString(); if (users.find(key) != users.end()) { - LOG4CXX_INFO(logger, key << ": Password is invalid"); + LOG4CXX_INFO(logger, key << ": Password is invalid or there was an error when connecting the legacy network"); users[key].session->handlePasswordInvalid(error); users.erase(key); } From 5a0f94d26e4567ab57c2ee32376a375ab83c3498 Mon Sep 17 00:00:00 2001 From: Darchigh Date: Tue, 22 Jan 2013 09:49:18 +0100 Subject: [PATCH 5/8] Check if just being registered or normal login before doing remoteRosterPush --- src/rostermanager.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 449cd744..daabf440 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -281,12 +281,14 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptrgetJID().toString() << ": This server supports remote roster protoXEP"); m_supportRemoteRoster = true; - //If we receive empty RosterPayload initiate full RosterPush - if(payload->getItems().empty()){ - LOG4CXX_INFO(logger, "Received empty Roster. Pushing full Roster."); - for(std::map, boost::pool_allocator< std::pair > >::const_iterator c_it = m_buddies.begin(); - c_it != m_buddies.end(); c_it++) { - sendBuddyRosterPush(c_it->second); + //If we receive empty RosterPayload on login (not register) initiate full RosterPush + if(!m_buddies.empty()){ + if(payload->getItems().empty()){ + LOG4CXX_INFO(logger, "Received empty Roster upon login. Pushing full Roster."); + for(std::map, boost::pool_allocator< std::pair > >::const_iterator c_it = m_buddies.begin(); + c_it != m_buddies.end(); c_it++) { + sendBuddyRosterPush(c_it->second); + } } } return; From 799350e23fbf09f2dd15b1db378e7b898b0d88e8 Mon Sep 17 00:00:00 2001 From: Darchigh Date: Tue, 22 Jan 2013 10:29:36 +0100 Subject: [PATCH 6/8] Small change... --- src/rostermanager.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index daabf440..1cfedd0f 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -282,14 +282,12 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptrgetItems().empty()){ + if(!m_buddies.empty() && payload->getItems().empty()){ LOG4CXX_INFO(logger, "Received empty Roster upon login. Pushing full Roster."); for(std::map, boost::pool_allocator< std::pair > >::const_iterator c_it = m_buddies.begin(); c_it != m_buddies.end(); c_it++) { sendBuddyRosterPush(c_it->second); } - } } return; From 943990e76464a78de93590c6183541137898531b Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 22 Jan 2013 11:59:51 +0100 Subject: [PATCH 7/8] Show all resources of particular user when disconnecting to make debugging easier --- src/user.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/user.cpp b/src/user.cpp index a142fefc..442a34a1 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -320,6 +320,21 @@ void User::handlePresence(Swift::Presence::ref presence, bool forceJoin) { if (presence->getType() == Swift::Presence::Unavailable) { m_conversationManager->removeJID(presence->getFrom()); + + std::string presences; + std::vector ps = m_presenceOracle->getAllPresence(m_jid); + BOOST_FOREACH(Swift::Presence::ref p, ps) { + if (p != presence) { + presences += p->getFrom().toString() + " "; + } + }; + + if (!presences.empty()) { + LOG4CXX_INFO(logger, m_jid.toString() << ": User is still connected from following clients: " << presences); + } + else { + LOG4CXX_INFO(logger, m_jid.toString() << ": Last client disconnected"); + } } From 96aad929c0d2a3e6d7fcac3abd026ceb8382ce4b Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 22 Jan 2013 13:32:03 +0100 Subject: [PATCH 8/8] Communi: Compare lowercased names of channels --- backends/libcommuni/session.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/backends/libcommuni/session.cpp b/backends/libcommuni/session.cpp index c8b271f6..64993a6c 100644 --- a/backends/libcommuni/session.cpp +++ b/backends/libcommuni/session.cpp @@ -96,9 +96,9 @@ void MyIrcSession::on_joined(IrcMessage *message) { bool op = 0; std::string nickname = TO_UTF8(m->sender().name()); op = correctNickname(nickname); - getIRCBuddy(TO_UTF8(m->channel()), nickname).setOp(op); - np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel()) + suffix, op, pbnetwork::STATUS_ONLINE); - LOG4CXX_INFO(logger, user << ": " << nickname << " joined " << TO_UTF8(m->channel()) + suffix); + getIRCBuddy(TO_UTF8(m->channel().toLower()), nickname).setOp(op); + np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel().toLower()) + suffix, op, pbnetwork::STATUS_ONLINE); + LOG4CXX_INFO(logger, user << ": " << nickname << " joined " << TO_UTF8(m->channel().toLower()) + suffix); } @@ -107,9 +107,9 @@ void MyIrcSession::on_parted(IrcMessage *message) { bool op = 0; std::string nickname = TO_UTF8(m->sender().name()); op = correctNickname(nickname); - removeIRCBuddy(TO_UTF8(m->channel()), nickname); - LOG4CXX_INFO(logger, user << ": " << nickname << " parted " << TO_UTF8(m->channel()) + suffix); - np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel()) + suffix, op, pbnetwork::STATUS_NONE, TO_UTF8(m->reason())); + removeIRCBuddy(TO_UTF8(m->channel().toLower()), nickname); + LOG4CXX_INFO(logger, user << ": " << nickname << " parted " << TO_UTF8(m->channel().toLower()) + suffix); + np->handleParticipantChanged(user, nickname, TO_UTF8(m->channel().toLower()) + suffix, op, pbnetwork::STATUS_NONE, TO_UTF8(m->reason())); } void MyIrcSession::on_quit(IrcMessage *message) { @@ -172,7 +172,7 @@ void MyIrcSession::on_topicChanged(IrcMessage *message) { correctNickname(nickname); LOG4CXX_INFO(logger, user << ": " << nickname << " topic changed to " << TO_UTF8(m->topic())); - np->handleSubject(user, TO_UTF8(m->channel()) + suffix, TO_UTF8(m->topic()), nickname); + np->handleSubject(user, TO_UTF8(m->channel().toLower()) + suffix, TO_UTF8(m->topic()), nickname); } void MyIrcSession::on_messageReceived(IrcMessage *message) { @@ -190,7 +190,7 @@ void MyIrcSession::on_messageReceived(IrcMessage *message) { msg = QString("/me ") + msg; } - std::string target = TO_UTF8(m->target()); + std::string target = TO_UTF8(m->target().toLower()); LOG4CXX_INFO(logger, user << ": Message from " << target); if (target.find("#") == 0) { std::string nickname = TO_UTF8(m->sender().name()); @@ -229,10 +229,10 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { if (nick.find("/") != std::string::npos) { nick = nick.substr(0, nick.find("/")); } - np->handleSubject(user, TO_UTF8(parameters[1]) + suffix, m_topicData, nick); + np->handleSubject(user, TO_UTF8(parameters[1].toLower()) + suffix, m_topicData, nick); break; case 352: { - channel = parameters[1]; + channel = parameters[1].toLower(); nick = TO_UTF8(parameters[5]); IRCBuddy &buddy = getIRCBuddy(TO_UTF8(channel), nick); @@ -249,7 +249,7 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { break; } case 353: - channel = parameters[2]; + channel = parameters[2].toLower(); members = parameters[3].split(" "); LOG4CXX_INFO(logger, user << ": Received members for " << TO_UTF8(channel) << suffix); @@ -265,7 +265,7 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) { break; case 366: // ask /who to get away states - channel = parameters[1]; + channel = parameters[1].toLower(); LOG4CXX_INFO(logger, user << "Asking /who for channel " << TO_UTF8(channel)); sendCommand(IrcCommand::createWho(channel)); break;