From deba434ac02ba44e64c8e1175e6326cb1a1b8580 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 24 Dec 2015 15:44:25 +0100 Subject: [PATCH] Fix handling of connection error to 3rd-party network from Slack and add test for that. --- spectrum/src/frontends/slack/SlackSession.cpp | 23 +++++-- spectrum/src/frontends/slack/SlackSession.h | 9 ++- spectrum/src/frontends/slack/SlackUser.cpp | 2 + .../src/frontends/slack/SlackUserManager.cpp | 8 +++ .../src/frontends/slack/SlackUserManager.h | 3 + tests/slack_jabber/bad_password.py | 66 +++++++++++++++++++ tests/start.py | 6 +- 7 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 tests/slack_jabber/bad_password.py diff --git a/spectrum/src/frontends/slack/SlackSession.cpp b/spectrum/src/frontends/slack/SlackSession.cpp index 76066c5d..a2a2a5a1 100644 --- a/spectrum/src/frontends/slack/SlackSession.cpp +++ b/spectrum/src/frontends/slack/SlackSession.cpp @@ -46,7 +46,7 @@ namespace Transport { DEFINE_LOGGER(logger, "SlackSession"); -SlackSession::SlackSession(Component *component, StorageBackend *storageBackend, UserInfo uinfo) : m_uinfo(uinfo), m_user(NULL) { +SlackSession::SlackSession(Component *component, StorageBackend *storageBackend, UserInfo uinfo) : m_uinfo(uinfo), m_user(NULL), m_disconnected(false) { m_component = component; m_storageBackend = storageBackend; @@ -355,6 +355,22 @@ void SlackSession::handleMessageReceived(const std::string &channel, const std:: } } +void SlackSession::handleDisconnected() { + m_disconnected = true; +} + +void SlackSession::setUser(User *user) { + m_user = user; +} + + +void SlackSession::handleConnected() { + if (m_disconnected) { + m_rtm->getAPI()->imOpen(m_ownerId, boost::bind(&SlackSession::handleImOpen, this, _1, _2, _3, _4)); + m_disconnected = false; + } +} + void SlackSession::handleImOpen(HTTPRequest *req, bool ok, rapidjson::Document &resp, const std::string &data) { m_ownerChannel = m_rtm->getAPI()->getChannelId(req, ok, resp, data); LOG4CXX_INFO(logger, "Opened channel with team owner: " << m_ownerChannel); @@ -418,17 +434,16 @@ void SlackSession::handleImOpen(HTTPRequest *req, bool ok, rapidjson::Document & } void SlackSession::handleRTMStarted() { - std::string ownerId; std::map &users = m_rtm->getUsers(); for (std::map::iterator it = users.begin(); it != users.end(); it++) { SlackUserInfo &info = it->second; if (info.isPrimaryOwner) { - ownerId = it->first; + m_ownerId = it->first; break; } } - m_rtm->getAPI()->imOpen(ownerId, boost::bind(&SlackSession::handleImOpen, this, _1, _2, _3, _4)); + m_rtm->getAPI()->imOpen(m_ownerId, boost::bind(&SlackSession::handleImOpen, this, _1, _2, _3, _4)); } diff --git a/spectrum/src/frontends/slack/SlackSession.h b/spectrum/src/frontends/slack/SlackSession.h index d8bfc8e2..608d2939 100644 --- a/spectrum/src/frontends/slack/SlackSession.h +++ b/spectrum/src/frontends/slack/SlackSession.h @@ -55,9 +55,10 @@ class SlackSession { void setPurpose(const std::string &purpose, const std::string &channel = ""); - void setUser(User *user) { - m_user = user; - } + void setUser(User *user); + + void handleDisconnected(); + void handleConnected(); private: void handleRTMStarted(); @@ -83,6 +84,8 @@ class SlackSession { User *m_user; Swift::Timer::ref m_onlineBuddiesTimer; std::map m_onlineBuddies; + bool m_disconnected; + std::string m_ownerId; }; } diff --git a/spectrum/src/frontends/slack/SlackUser.cpp b/spectrum/src/frontends/slack/SlackUser.cpp index ed45bf2e..72ae306c 100644 --- a/spectrum/src/frontends/slack/SlackUser.cpp +++ b/spectrum/src/frontends/slack/SlackUser.cpp @@ -65,6 +65,8 @@ void SlackUser::disconnectUser(const std::string &error, Swift::SpectrumErrorPay else { m_session->sendMessageToAll("Disconnected from 3rd-party network for unknown reason."); } + + m_session->handleDisconnected(); m_session->sendMessageToAll("Try using ```.spectrum2 reconnect``` to reconnect."); static_cast(m_userManager)->moveTempSession(m_jid.toString(), m_session); m_session = NULL; diff --git a/spectrum/src/frontends/slack/SlackUserManager.cpp b/spectrum/src/frontends/slack/SlackUserManager.cpp index 92024c45..414668a9 100644 --- a/spectrum/src/frontends/slack/SlackUserManager.cpp +++ b/spectrum/src/frontends/slack/SlackUserManager.cpp @@ -37,6 +37,8 @@ SlackUserManager::SlackUserManager(Component *component, UserRegistry *userRegis m_component = component; m_storageBackend = storageBackend; m_userRegistration = new SlackUserRegistration(component, this, storageBackend); + + onUserCreated.connect(boost::bind(&SlackUserManager::handleUserCreated, this, _1)); } SlackUserManager::~SlackUserManager() { @@ -79,6 +81,7 @@ SlackSession *SlackUserManager::moveTempSession(const std::string &user) { void SlackUserManager::moveTempSession(const std::string &user, SlackSession *session) { m_tempSessions[user] = session; + session->setUser(NULL); } @@ -94,5 +97,10 @@ std::string SlackUserManager::getOAuth2URL(const std::vector &args) return static_cast(m_userRegistration)->createOAuth2URL(args); } +void SlackUserManager::handleUserCreated(User *user) { + LOG4CXX_INFO(logger, "handleUserCreated"); + static_cast(user)->getSession()->handleConnected(); +} + } diff --git a/spectrum/src/frontends/slack/SlackUserManager.h b/spectrum/src/frontends/slack/SlackUserManager.h index 5705787f..103ae802 100644 --- a/spectrum/src/frontends/slack/SlackUserManager.h +++ b/spectrum/src/frontends/slack/SlackUserManager.h @@ -62,6 +62,9 @@ class SlackUserManager : public UserManager { SlackSession *moveTempSession(const std::string &user); void moveTempSession(const std::string &user, SlackSession *session); + private: + void handleUserCreated(User *user); + private: Component *m_component; UserRegistration *m_userRegistration; diff --git a/tests/slack_jabber/bad_password.py b/tests/slack_jabber/bad_password.py new file mode 100644 index 00000000..5fd8b62e --- /dev/null +++ b/tests/slack_jabber/bad_password.py @@ -0,0 +1,66 @@ +import optparse +import sys +import time +import subprocess +import os + +import sleekxmpp + + +class Responder(sleekxmpp.ClientXMPP): + def __init__(self, jid, password, room, room_password, nick): + sleekxmpp.ClientXMPP.__init__(self, jid, password) + self.room = room + self.room_password = room_password + self.nick = nick + self.finished = False + self.add_event_handler("session_start", self.start) + self.add_event_handler("message", self.message) + + self.tests = {} + self.tests["not_authorized"] = ["'Not Authorized' received", False] + self.tests["help_received"] = ["Help received", False] + self.tests["register_received"] = ["Password changed", False] + self.tests["abc_received"] = ["Test message received", False] + + def message(self, msg): + if msg['body'] == "Not Authorized": + self.tests["not_authorized"][1] = True + elif msg['body'].find("Try using") != -1: + self.send_message(mto="spectrum2@spectrum2tests.xmpp.slack.com", mbody=".spectrum2 register client@localhost password #spectrum2_contactlist") + self.tests["help_received"][1] = True + elif msg['body'] == "You have successfully registered 3rd-party account. Spectrum 2 is now connecting to the 3rd-party network.": + self.tests["register_received"][1] = True + elif msg['body'] == "abc": + self.tests["abc_received"][1] = True + self.finished = True + + def start(self, event): + self.plugin['xep_0045'].joinMUC(self.room, self.nick, password=self.room_password, wait=False) + +class Client(sleekxmpp.ClientXMPP): + def __init__(self, jid, password, room, nick): + sleekxmpp.ClientXMPP.__init__(self, jid, password) + self.room = room + self.nick = nick + self.add_event_handler("session_start", self.start) + self.add_event_handler("message", self.message) + self.finished = False + + self.tests = {} + + def message(self, msg): + pass + #print "client", msg['body'] + #if msg['body'] == "echo abc" and msg['from'] == self.room + "/responder": + #self.tests["echo1_received"][1] = True + #self.send_message(mto=self.room + "/responder", mbody="def", mtype='chat') + #elif msg['body'] == "echo def" and msg['from'] == self.room + "/responder": + #self.tests["echo2_received"][1] = True + #self.finished = True + + def start(self, event): + self.getRoster() + self.sendPresence() + self.plugin['xep_0045'].joinMUC(self.room, self.nick, wait=True) + self.send_message(mto=self.room, mbody="abc", mtype='groupchat') diff --git a/tests/start.py b/tests/start.py index 93c01f58..ca15b5e4 100644 --- a/tests/start.py +++ b/tests/start.py @@ -164,8 +164,10 @@ class JabberSlackServerModeConf(BaseTest): def skip_test(self, test): os.system("cp ../slack_jabber/slack.sql .") - if test in ["muc_whois.py", "muc_change_topic.py", "muc_join_leave.py", "muc_pm.py"]: - return True + if test.find("bad_password") != -1: + print "Changing password to 'badpassword'" + os.system("sqlite3 slack.sql \"UPDATE users SET password='badpassword' WHERE id=1\"") + #os.system("sqlite3 slack.sql \"SELECT * FROM users\"") return False def pre_test(self):