From c4c0fc8a087458a69e9b413d9ef4d25f176555a3 Mon Sep 17 00:00:00 2001 From: XinyuHou Date: Thu, 12 Feb 2015 15:50:08 +0000 Subject: [PATCH] added enable crypto argument to synergys/c #4313 --- src/gui/src/AppConfig.cpp | 5 +++- src/gui/src/AppConfig.h | 4 ++++ src/gui/src/MainWindow.cpp | 30 +++++++++++++++++------- src/gui/src/MainWindow.h | 1 + src/gui/src/PluginWizardPage.cpp | 9 +++++-- src/gui/src/PluginWizardPage.h | 5 +++- src/gui/src/SettingsDialog.cpp | 11 +++++---- src/gui/src/SettingsDialog.h | 2 +- src/gui/src/SetupWizard.cpp | 2 +- src/lib/arch/IArchPlugin.h | 2 -- src/lib/arch/unix/ArchPluginUnix.cpp | 7 +----- src/lib/arch/win32/ArchPluginWindows.cpp | 20 +--------------- src/lib/arch/win32/ArchPluginWindows.h | 1 - src/lib/client/Client.cpp | 11 +++++++-- src/lib/client/Client.h | 3 ++- src/lib/plugin/ns/SecureListenSocket.cpp | 12 +++++++++- src/lib/server/ClientListener.cpp | 14 ++++++++--- src/lib/server/ClientListener.h | 3 ++- src/lib/synergy/ArgParser.cpp | 3 +++ src/lib/synergy/ArgsBase.cpp | 3 ++- src/lib/synergy/ArgsBase.h | 1 + src/lib/synergy/ClientApp.cpp | 3 ++- src/lib/synergy/ServerApp.cpp | 4 +++- src/test/integtests/net/NetworkTests.cpp | 16 ++++++------- 24 files changed, 106 insertions(+), 66 deletions(-) diff --git a/src/gui/src/AppConfig.cpp b/src/gui/src/AppConfig.cpp index 7cb04636..d3b0791f 100644 --- a/src/gui/src/AppConfig.cpp +++ b/src/gui/src/AppConfig.cpp @@ -56,7 +56,8 @@ AppConfig::AppConfig(QSettings* settings) : m_ProcessMode(DEFAULT_PROCESS_MODE), m_AutoConfig(true), m_ElevateMode(false), - m_AutoConfigPrompted(false) + m_AutoConfigPrompted(false), + m_CryptoEnabled(false) { Q_ASSERT(m_pSettings); @@ -128,6 +129,7 @@ void AppConfig::loadSettings() m_Edition = settings().value("edition", Unknown).toInt(); m_ActivateEmail = settings().value("activateEmail", "").toString(); m_UserToken = settings().value("userToken", "").toString(); + m_CryptoEnabled = settings().value("cryptoEnabled", false).toBool(); } void AppConfig::saveSettings() @@ -147,6 +149,7 @@ void AppConfig::saveSettings() settings().setValue("edition", m_Edition); settings().setValue("activateEmail", m_ActivateEmail); settings().setValue("userToken", m_UserToken); + settings().setValue("cryptoEnabled", m_CryptoEnabled); } void AppConfig::setAutoConfig(bool autoConfig) diff --git a/src/gui/src/AppConfig.h b/src/gui/src/AppConfig.h index 91f9a512..6d19f74b 100644 --- a/src/gui/src/AppConfig.h +++ b/src/gui/src/AppConfig.h @@ -85,6 +85,9 @@ class AppConfig void persistLogDir(); bool elevateMode(); + void setCryptoEnabled(bool e) { m_CryptoEnabled = e; } + bool getCryptoEnabled() { return m_CryptoEnabled; } + protected: QSettings& settings() { return *m_pSettings; } void setScreenName(const QString& s) { m_ScreenName = s; } @@ -119,6 +122,7 @@ class AppConfig int m_Edition; QString m_ActivateEmail; QString m_UserToken; + bool m_CryptoEnabled; static const char m_SynergysName[]; static const char m_SynergycName[]; diff --git a/src/gui/src/MainWindow.cpp b/src/gui/src/MainWindow.cpp index d65f0ded..8233eb1a 100644 --- a/src/gui/src/MainWindow.cpp +++ b/src/gui/src/MainWindow.cpp @@ -127,6 +127,8 @@ MainWindow::MainWindow(QSettings& settings, AppConfig& appConfig) : m_SuppressAutoConfigWarning = false; m_pComboServerList->hide(); + + updateEdition(); } MainWindow::~MainWindow() @@ -442,6 +444,10 @@ void MainWindow::startSynergy() #endif + if (m_AppConfig.getCryptoEnabled()) { + args << "--enable-crypto"; + } + if ((synergyType() == synergyClient && !clientArgs(args, app)) || (synergyType() == synergyServer && !serverArgs(args, app))) { @@ -814,15 +820,8 @@ void MainWindow::changeEvent(QEvent* event) retranslateUi(this); retranslateMenuBar(); - QString mac = getFirstMacAddress(); - QString hashSrc = m_AppConfig.activateEmail() + mac; - QString hashResult = hash(hashSrc); - if (hashResult == m_AppConfig.userToken()) { - setEdition(m_AppConfig.edition()); - } - else { - setEdition(Unknown); - } + updateEdition(); + break; } default: @@ -1149,6 +1148,19 @@ void MainWindow::promptAutoConfig() m_AppConfig.setAutoConfigPrompted(true); } +void MainWindow::updateEdition() +{ + QString mac = getFirstMacAddress(); + QString hashSrc = m_AppConfig.activateEmail() + mac; + QString hashResult = hash(hashSrc); + if (hashResult == m_AppConfig.userToken()) { + setEdition(m_AppConfig.edition()); + } + else { + setEdition(Unknown); + } +} + void MainWindow::on_m_pComboServerList_currentIndexChanged(QString ) { if (m_pComboServerList->count() != 0) { diff --git a/src/gui/src/MainWindow.h b/src/gui/src/MainWindow.h index 3aab49d0..79afecd2 100644 --- a/src/gui/src/MainWindow.h +++ b/src/gui/src/MainWindow.h @@ -160,6 +160,7 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase bool isBonjourRunning(); void downloadBonjour(); void promptAutoConfig(); + void updateEdition(); private: QSettings& m_Settings; diff --git a/src/gui/src/PluginWizardPage.cpp b/src/gui/src/PluginWizardPage.cpp index b3008894..8fa4b3fe 100644 --- a/src/gui/src/PluginWizardPage.cpp +++ b/src/gui/src/PluginWizardPage.cpp @@ -7,11 +7,12 @@ #include #include -PluginWizardPage::PluginWizardPage(QWidget *parent) : +PluginWizardPage::PluginWizardPage(AppConfig& appConfig, QWidget *parent) : QWizardPage(parent), m_Finished(false), m_pWebClient(NULL), - m_pPluginManager(NULL) + m_pPluginManager(NULL), + m_AppConfig(appConfig) { setupUi(this); @@ -79,6 +80,10 @@ void PluginWizardPage::finished() { updateStatus(tr("Plugins are ready.")); stopSpinning(); + + // ideally this should check if ns plugin is ready + m_AppConfig.setCryptoEnabled(true); + m_Finished = true; emit completeChanged(); } diff --git a/src/gui/src/PluginWizardPage.h b/src/gui/src/PluginWizardPage.h index 994679c5..e3b7949c 100644 --- a/src/gui/src/PluginWizardPage.h +++ b/src/gui/src/PluginWizardPage.h @@ -1,6 +1,8 @@ #ifndef PLUGINWIZARDPAGE_H #define PLUGINWIZARDPAGE_H +#include "AppConfig.h" + #include "ui_PluginWizardPageBase.h" #include @@ -12,7 +14,7 @@ class PluginWizardPage : public QWizardPage, public Ui::PluginWizardPage { Q_OBJECT public: - PluginWizardPage(QWidget *parent = 0); + PluginWizardPage(AppConfig& appConfig, QWidget *parent = 0); ~PluginWizardPage(); void setFinished(bool b) { m_Finished = b; } @@ -44,5 +46,6 @@ private: WebClient* m_pWebClient; PluginManager* m_pPluginManager; QThread* m_pPluginManagerThread; + AppConfig& m_AppConfig; }; #endif // PLUGINWIZARDPAGE_H diff --git a/src/gui/src/SettingsDialog.cpp b/src/gui/src/SettingsDialog.cpp index 8a99e96d..1fee9883 100644 --- a/src/gui/src/SettingsDialog.cpp +++ b/src/gui/src/SettingsDialog.cpp @@ -53,6 +53,8 @@ SettingsDialog::SettingsDialog(QWidget* parent, AppConfig& config) : // elevate checkbox is only useful on ms windows. m_pCheckBoxElevateMode->hide(); #endif + + m_pCheckBoxEnableCrypto->setChecked(m_AppConfig.getCryptoEnabled()); } void SettingsDialog::accept() @@ -120,10 +122,6 @@ void SettingsDialog::on_m_pButtonBrowseLog_clicked() } } -void SettingsDialog::on_m_pCheckBoxEnableCrypto_stateChanged(int ) -{ -} - void SettingsDialog::on_m_pComboLanguage_currentIndexChanged(int index) { QString ietfCode = m_pComboLanguage->itemData(index).toString(); @@ -147,3 +145,8 @@ void SettingsDialog::on_m_pCheckBoxElevateMode_toggled(bool checked) } } } + +void SettingsDialog::on_m_pCheckBoxEnableCrypto_toggled(bool checked) +{ + m_AppConfig.setCryptoEnabled(checked); +} diff --git a/src/gui/src/SettingsDialog.h b/src/gui/src/SettingsDialog.h index 3898e20d..f8bfb68d 100644 --- a/src/gui/src/SettingsDialog.h +++ b/src/gui/src/SettingsDialog.h @@ -47,8 +47,8 @@ class SettingsDialog : public QDialog, public Ui::SettingsDialogBase bool m_SuppressElevateWarning; private slots: + void on_m_pCheckBoxEnableCrypto_toggled(bool checked); void on_m_pCheckBoxElevateMode_toggled(bool checked); - void on_m_pCheckBoxEnableCrypto_stateChanged(int ); void on_m_pComboLanguage_currentIndexChanged(int index); void on_m_pCheckBoxLogToFile_stateChanged(int ); void on_m_pButtonBrowseLog_clicked(); diff --git a/src/gui/src/SetupWizard.cpp b/src/gui/src/SetupWizard.cpp index 2834a6c5..bc9d1ca3 100644 --- a/src/gui/src/SetupWizard.cpp +++ b/src/gui/src/SetupWizard.cpp @@ -30,7 +30,7 @@ SetupWizard::SetupWizard(MainWindow& mainWindow, bool startMain) : m_Edition(Unknown) { setupUi(this); - m_pPluginPage = new PluginWizardPage(); + m_pPluginPage = new PluginWizardPage(mainWindow.appConfig()); addPage(m_pPluginPage); #if defined(Q_OS_MAC) diff --git a/src/lib/arch/IArchPlugin.h b/src/lib/arch/IArchPlugin.h index f6bfd599..86a933f5 100644 --- a/src/lib/arch/IArchPlugin.h +++ b/src/lib/arch/IArchPlugin.h @@ -18,8 +18,6 @@ #pragma once -#define PLUGINS_DIR "plugins" - #include "common/IInterface.h" #include "common/stdmap.h" #include "base/String.h" diff --git a/src/lib/arch/unix/ArchPluginUnix.cpp b/src/lib/arch/unix/ArchPluginUnix.cpp index c4a87d41..adf705da 100644 --- a/src/lib/arch/unix/ArchPluginUnix.cpp +++ b/src/lib/arch/unix/ArchPluginUnix.cpp @@ -173,12 +173,7 @@ ArchPluginUnix::invoke( String ArchPluginUnix::getPluginsDir() { -#if WINAPI_XWINDOWS - return "/usr/lib/synergy/plugin"; -#else - // TODO: pluging should be in bundle in the final release - return "/Users/xinyu/Projects/synergy/bin/plugins"; -#endif + return ARCH->getPluginDirectory(); } void diff --git a/src/lib/arch/win32/ArchPluginWindows.cpp b/src/lib/arch/win32/ArchPluginWindows.cpp index 45408ee1..7bbbe1a6 100644 --- a/src/lib/arch/win32/ArchPluginWindows.cpp +++ b/src/lib/arch/win32/ArchPluginWindows.cpp @@ -163,24 +163,6 @@ ArchPluginWindows::invoke( } } -String -ArchPluginWindows::getModuleDir() -{ - TCHAR c_modulePath[MAX_PATH]; - if (GetModuleFileName(NULL, c_modulePath, MAX_PATH) == 0) { - throw XArch(new XArchEvalWindows); - } - - String modulePath(c_modulePath); - size_t lastSlash = modulePath.find_last_of("\\"); - - if (lastSlash != String::npos) { - return modulePath.substr(0, lastSlash); - } - - throw XArch("could not get module path."); -} - void ArchPluginWindows::getFilenames(const String& pattern, std::vector& filenames) { @@ -201,7 +183,7 @@ ArchPluginWindows::getFilenames(const String& pattern, std::vector& file String ArchPluginWindows::getPluginsDir() { - return getModuleDir().append("\\").append(PLUGINS_DIR); + return ARCH->getPluginDirectory(); } void diff --git a/src/lib/arch/win32/ArchPluginWindows.h b/src/lib/arch/win32/ArchPluginWindows.h index fdde9169..4a5e1257 100644 --- a/src/lib/arch/win32/ArchPluginWindows.h +++ b/src/lib/arch/win32/ArchPluginWindows.h @@ -44,7 +44,6 @@ public: void** args); private: - String getModuleDir(); void getFilenames(const String& pattern, std::vector& filenames); String getPluginsDir(); diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp index 59fae82c..456260f0 100644 --- a/src/lib/client/Client.cpp +++ b/src/lib/client/Client.cpp @@ -60,7 +60,8 @@ Client::Client( const String& name, const NetworkAddress& address, ISocketFactory* socketFactory, synergy::Screen* screen, - bool enableDragDrop) : + bool enableDragDrop, + bool enableCrypto) : m_mock(false), m_name(name), m_serverAddress(address), @@ -103,6 +104,13 @@ Client::Client( new TMethodEventJob(this, &Client::handleFileRecieveCompleted)); } + + if (enableCrypto) { + m_useSecureNetwork = ARCH->plugin().exists(s_networkSecurity); + if (m_useSecureNetwork == false) { + LOG((CLOG_NOTE "crypto disabled because of ns plugin not available")); + } + } } Client::~Client() @@ -152,7 +160,6 @@ Client::connect() } // create the socket - m_useSecureNetwork = ARCH->plugin().exists(s_networkSecurity); IDataSocket* socket = m_socketFactory->create(m_useSecureNetwork); m_socket = dynamic_cast(socket); diff --git a/src/lib/client/Client.h b/src/lib/client/Client.h index 786f301c..f869ef64 100644 --- a/src/lib/client/Client.h +++ b/src/lib/client/Client.h @@ -59,7 +59,8 @@ public: const String& name, const NetworkAddress& address, ISocketFactory* socketFactory, synergy::Screen* screen, - bool enableDragDrop); + bool enableDragDrop, + bool enableCrypto); ~Client(); #ifdef TEST_ENV diff --git a/src/lib/plugin/ns/SecureListenSocket.cpp b/src/lib/plugin/ns/SecureListenSocket.cpp index b7c1f382..a0df2519 100644 --- a/src/lib/plugin/ns/SecureListenSocket.cpp +++ b/src/lib/plugin/ns/SecureListenSocket.cpp @@ -23,6 +23,8 @@ #include "net/TSocketMultiplexerMethodJob.h" #include "arch/XArch.h" +static const char s_certificateFilename[] = { "Synergy.pem" }; + // // SecureListenSocket // @@ -57,7 +59,15 @@ SecureListenSocket::accept() socket->initSsl(true); // TODO: customized certificate path - socket->loadCertificates("C:\\Temp\\synergy.pem"); + String certificateFilename = ARCH->getProfileDirectory(); +#if SYSAPI_WIN32 + certificateFilename.append("\\"); +#elif SYSAPI_UNIX + certificateFilename.append("/"); +#endif + certificateFilename.append(s_certificateFilename); + + socket->loadCertificates(certificateFilename.c_str()); socket->secureAccept(); if (socket != NULL) { diff --git a/src/lib/server/ClientListener.cpp b/src/lib/server/ClientListener.cpp index 12018bc0..e566db47 100644 --- a/src/lib/server/ClientListener.cpp +++ b/src/lib/server/ClientListener.cpp @@ -41,16 +41,24 @@ static const char s_networkSecurity[] = { "libns" }; ClientListener::ClientListener(const NetworkAddress& address, ISocketFactory* socketFactory, - IEventQueue* events) : + IEventQueue* events, + bool enableCrypto) : m_socketFactory(socketFactory), m_server(NULL), - m_events(events) + m_events(events), + m_useSecureNetwork(false) { assert(m_socketFactory != NULL); try { // create listen socket - m_useSecureNetwork = ARCH->plugin().exists(s_networkSecurity); + if (enableCrypto) { + m_useSecureNetwork = ARCH->plugin().exists(s_networkSecurity); + if (m_useSecureNetwork == false) { + LOG((CLOG_NOTE "crypto disabled because of ns plugin not available")); + } + } + m_listen = m_socketFactory->createListen(m_useSecureNetwork); // bind listen address diff --git a/src/lib/server/ClientListener.h b/src/lib/server/ClientListener.h index a9cf0109..6eb68b8d 100644 --- a/src/lib/server/ClientListener.h +++ b/src/lib/server/ClientListener.h @@ -37,7 +37,8 @@ public: // The factories are adopted. ClientListener(const NetworkAddress&, ISocketFactory*, - IEventQueue* events); + IEventQueue* events, + bool enableCrypto); ~ClientListener(); //! @name manipulators diff --git a/src/lib/synergy/ArgParser.cpp b/src/lib/synergy/ArgParser.cpp index a1c6187e..c634cd26 100644 --- a/src/lib/synergy/ArgParser.cpp +++ b/src/lib/synergy/ArgParser.cpp @@ -276,6 +276,9 @@ ArgParser::parseGenericArgs(int argc, const char* const* argv, int& i) argsBase().m_enableDragDrop = true; } } + else if (isArg(i, argc, argv, NULL, "--enable-crypto")) { + argsBase().m_enableCrypto = true; + } else { // option not supported here return false; diff --git a/src/lib/synergy/ArgsBase.cpp b/src/lib/synergy/ArgsBase.cpp index f118ebc2..8dcfb2f9 100644 --- a/src/lib/synergy/ArgsBase.cpp +++ b/src/lib/synergy/ArgsBase.cpp @@ -41,7 +41,8 @@ m_disableTray(false), m_enableIpc(false), m_enableDragDrop(false), m_shouldExit(false), -m_synergyAddress() +m_synergyAddress(), +m_enableCrypto(false) { } diff --git a/src/lib/synergy/ArgsBase.h b/src/lib/synergy/ArgsBase.h index b8d2bd83..a2333a48 100644 --- a/src/lib/synergy/ArgsBase.h +++ b/src/lib/synergy/ArgsBase.h @@ -46,4 +46,5 @@ public: #endif bool m_shouldExit; String m_synergyAddress; + bool m_enableCrypto; }; diff --git a/src/lib/synergy/ClientApp.cpp b/src/lib/synergy/ClientApp.cpp index 0297a58d..b9c00414 100644 --- a/src/lib/synergy/ClientApp.cpp +++ b/src/lib/synergy/ClientApp.cpp @@ -342,7 +342,8 @@ ClientApp::openClient(const String& name, const NetworkAddress& address, address, new TCPSocketFactory(m_events, getSocketMultiplexer()), screen, - args().m_enableDragDrop); + args().m_enableDragDrop, + args().m_enableCrypto); try { m_events->adoptHandler( diff --git a/src/lib/synergy/ServerApp.cpp b/src/lib/synergy/ServerApp.cpp index 7127c273..358201e2 100644 --- a/src/lib/synergy/ServerApp.cpp +++ b/src/lib/synergy/ServerApp.cpp @@ -632,7 +632,9 @@ ServerApp::openClientListener(const NetworkAddress& address) { ClientListener* listen = new ClientListener( address, - new TCPSocketFactory(m_events, getSocketMultiplexer()), m_events); + new TCPSocketFactory(m_events, getSocketMultiplexer()), + m_events, + args().m_enableCrypto); m_events->adoptHandler( m_events->forClientListener().connected(), listen, diff --git a/src/test/integtests/net/NetworkTests.cpp b/src/test/integtests/net/NetworkTests.cpp index 11455d6c..7e3d3bd5 100644 --- a/src/test/integtests/net/NetworkTests.cpp +++ b/src/test/integtests/net/NetworkTests.cpp @@ -114,7 +114,7 @@ TEST_F(NetworkTests, sendToClient_mockData) // server SocketMultiplexer serverSocketMultiplexer; TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); - ClientListener listener(serverAddress, serverSocketFactory, &m_events); + ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); NiceMock serverScreen; NiceMock primaryClient; NiceMock serverConfig; @@ -140,7 +140,7 @@ TEST_F(NetworkTests, sendToClient_mockData) ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); - Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, true); + Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, true, false); m_events.adoptHandler( m_events.forIScreen().fileRecieveCompleted(), &client, @@ -166,7 +166,7 @@ TEST_F(NetworkTests, sendToClient_mockFile) // server SocketMultiplexer serverSocketMultiplexer; TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); - ClientListener listener(serverAddress, serverSocketFactory, &m_events); + ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); NiceMock serverScreen; NiceMock primaryClient; NiceMock serverConfig; @@ -192,7 +192,7 @@ TEST_F(NetworkTests, sendToClient_mockFile) ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); - Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, true); + Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, true, false); m_events.adoptHandler( m_events.forIScreen().fileRecieveCompleted(), &client, @@ -217,7 +217,7 @@ TEST_F(NetworkTests, sendToServer_mockData) // server SocketMultiplexer serverSocketMultiplexer; TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); - ClientListener listener(serverAddress, serverSocketFactory, &m_events); + ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); NiceMock serverScreen; NiceMock primaryClient; NiceMock serverConfig; @@ -238,7 +238,7 @@ TEST_F(NetworkTests, sendToServer_mockData) ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); - Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, true); + Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, true, false); m_events.adoptHandler( m_events.forClientListener().connected(), &listener, @@ -269,7 +269,7 @@ TEST_F(NetworkTests, sendToServer_mockFile) // server SocketMultiplexer serverSocketMultiplexer; TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); - ClientListener listener(serverAddress, serverSocketFactory, &m_events); + ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); NiceMock serverScreen; NiceMock primaryClient; NiceMock serverConfig; @@ -290,7 +290,7 @@ TEST_F(NetworkTests, sendToServer_mockFile) ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); - Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, true); + Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, true, false); m_events.adoptHandler( m_events.forClientListener().connected(), &listener,