diff --git a/src/gui/gui.pro b/src/gui/gui.pro index 8561eb4e..7d826227 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -55,7 +55,7 @@ SOURCES += src/main.cpp \ src/WebClient.cpp \ src/PluginWizardPage.cpp \ src/PluginManager.cpp \ - src/DirectoryManager.cpp + src/CoreInterface.cpp HEADERS += src/MainWindow.h \ src/AboutDialog.h \ src/ServerConfig.h \ @@ -97,7 +97,7 @@ HEADERS += src/MainWindow.h \ src/PluginWizardPage.h \ src/ProcessorArch.h \ src/PluginManager.h \ - src/DirectoryManager.h + src/CoreInterface.h RESOURCES += res/Synergy.qrc RC_FILE = res/win/Synergy.rc macx { diff --git a/src/gui/res/SettingsDialogBase.ui b/src/gui/res/SettingsDialogBase.ui index db7161d4..837838a6 100644 --- a/src/gui/res/SettingsDialogBase.ui +++ b/src/gui/res/SettingsDialogBase.ui @@ -145,7 +145,7 @@ - Enable OpenSSL (unique certificate) + Use &OpenSSL encryption (unique certificate) diff --git a/src/gui/src/CoreInterface.cpp b/src/gui/src/CoreInterface.cpp new file mode 100644 index 00000000..6bec6bfa --- /dev/null +++ b/src/gui/src/CoreInterface.cpp @@ -0,0 +1,86 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2015 Synergy Si Ltd. + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * found in the file COPYING that should have accompanied this file. + * + * This package is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "CoreInterface.h" + +#include +#include +#include + +static const char kCoreBinary[] = "syntool"; + +CoreInterface::CoreInterface() +{ +} + +QString CoreInterface::getPluginDir() +{ + QStringList args("--get-plugin-dir"); + return run(args); +} + +QString CoreInterface::getProfileDir() +{ + QStringList args("--get-profile-dir"); + return run(args); +} + +QString CoreInterface::getArch() +{ + QStringList args("--get-arch"); + return run(args); +} + +QString CoreInterface::run(const QStringList& args, const QString& input) +{ + QString program( + QCoreApplication::applicationDirPath() + + "/" + kCoreBinary); + + QProcess process; + process.setReadChannel(QProcess::StandardOutput); + process.start(program, args); + bool success = process.waitForStarted(); + + QString output, error; + if (success) + { + if (!input.isEmpty()) { + process.write(input.toStdString().c_str()); + } + + if (process.waitForFinished()) { + output = process.readAllStandardOutput(); + error = process.readAllStandardError(); + } + } + + output = output.trimmed(); + error = error.trimmed(); + + int code = process.exitCode(); + if (!error.isEmpty() || !success || code != 0) + { + throw std::runtime_error( + QString("Code: %1\nError: %2") + .arg(process.exitCode()) + .arg(error.isEmpty() ? "Unknown" : error) + .toStdString()); + } + + return output; +} diff --git a/src/gui/src/DirectoryManager.h b/src/gui/src/CoreInterface.h similarity index 69% rename from src/gui/src/DirectoryManager.h rename to src/gui/src/CoreInterface.h index f07d64c9..8deb5480 100644 --- a/src/gui/src/DirectoryManager.h +++ b/src/gui/src/CoreInterface.h @@ -1,36 +1,31 @@ -/* - * synergy -- mouse and keyboard sharing utility - * Copyright (C) 2015 Synergy Si Ltd. - * - * This package is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * found in the file COPYING that should have accompanied this file. - * - * This package is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef DIRECTORYMANAGER_H -#define DIRECTORYMANAGER_H - -#include -#include - -class DirectoryManager -{ -public: - DirectoryManager(); - -static QString getPluginDir(); -static QString getProfileDir(); - -private: -static QString getDirViaSyntool(QStringList& args); -}; - -#endif // DIRECTORYMANAGER_H +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2015 Synergy Si Ltd. + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * found in the file COPYING that should have accompanied this file. + * + * This package is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +class CoreInterface +{ +public: + CoreInterface(); + + QString getPluginDir(); + QString getProfileDir(); + QString getArch(); + QString run(const QStringList& args, const QString& input = ""); +}; diff --git a/src/gui/src/DirectoryManager.cpp b/src/gui/src/DirectoryManager.cpp deleted file mode 100644 index b416ca9b..00000000 --- a/src/gui/src/DirectoryManager.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * synergy -- mouse and keyboard sharing utility - * Copyright (C) 2015 Synergy Si Ltd. - * - * This package is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * found in the file COPYING that should have accompanied this file. - * - * This package is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "DirectoryManager.h" - -#include -#include -#include -#include - -static const char kGetPluginDirArg[] = "--get-plugin-dir"; -static const char kGetProfileDirArg[] = "--get-profile-dir"; - -DirectoryManager::DirectoryManager() -{ -} - -QString DirectoryManager::getPluginDir() -{ - QStringList args(kGetPluginDirArg); - return getDirViaSyntool(args); -} - -QString DirectoryManager::getProfileDir() -{ - QStringList args(kGetProfileDirArg); - return getDirViaSyntool(args); -} - -QString DirectoryManager::getDirViaSyntool(QStringList& args) -{ - QString program(QCoreApplication::applicationDirPath() + "/syntool"); - - QProcess process; - process.setReadChannel(QProcess::StandardOutput); - process.start(program, args); - bool success = process.waitForStarted(); - - QString out, error; - if (success) - { - if (process.waitForFinished()) { - out = process.readAllStandardOutput(); - error = process.readAllStandardError(); - } - } - - out = out.trimmed(); - error = error.trimmed(); - - if (out.isEmpty() || - !error.isEmpty() || - !success || - process.exitCode() != 0) - { - QMessageBox::critical( - NULL, QObject::tr("Synergy"), - QObject::tr("An error occured while calling syntool " - "with the first arg %1. Code: %2\nError: %3") - .arg(args.at(0)) - .arg(process.exitCode()) - .arg(error.isEmpty() ? "Unknown" : error)); - return ""; - } - - return out; -} diff --git a/src/gui/src/PluginManager.cpp b/src/gui/src/PluginManager.cpp index 9da0dd9e..25903628 100644 --- a/src/gui/src/PluginManager.cpp +++ b/src/gui/src/PluginManager.cpp @@ -17,7 +17,7 @@ #include "PluginManager.h" -#include "DirectoryManager.h" +#include "CoreInterface.h" #include "CommandProcess.h" #include "DataDownloader.h" #include "QUtility.h" @@ -57,12 +57,12 @@ PluginManager::PluginManager(QStringList pluginList) : m_DownloadIndex(-1), m_pPluginDownloader(NULL) { - m_PluginDir = DirectoryManager::getPluginDir(); + m_PluginDir = m_CoreInterface.getPluginDir(); if (m_PluginDir.isEmpty()) { emit error(tr("Failed to get plugin directory.")); } - m_ProfileDir = DirectoryManager::getProfileDir(); + m_ProfileDir = m_CoreInterface.getProfileDir(); if (m_ProfileDir.isEmpty()) { emit error(tr("Failed to get profile directory.")); } @@ -173,37 +173,53 @@ void PluginManager::savePlugin() QString PluginManager::getPluginUrl(const QString& pluginName) { - QString result; - result = kPluginsBaseUrl.append(pluginName).append("/1.0/"); + QString archName; - int arch = checkProcessorArch(); - if (arch == Win_x86) { - result.append(kWinProcessorArch32); +#if defined(Q_OS_WIN) + + try { + QString coreArch = m_CoreInterface.getArch(); + if (coreArch.startsWith("x86")) { + archName = kWinProcessorArch32; + } + else if (coreArch.startsWith("x64")) { + archName = kWinProcessorArch64; + } } - else if (arch == Win_x64) { - result.append(kWinProcessorArch64); - } - else if (arch == Mac_i386) { - result.append(kMacProcessorArch); - } - else if (arch == Linux_rpm_i686) { - result.append(kLinuxProcessorArchRpm32); - } - else if (arch == Linux_rpm_x86_64) { - result.append(kLinuxProcessorArchRpm64); - } - else if (arch == Linux_deb_i686) { - result.append(kLinuxProcessorArchDeb32); - } - else if (arch == Linux_deb_x86_64) { - result.append(kLinuxProcessorArchDeb64); - } - else { - emit error( - tr("Failed to get the url of plugin %1 .") - .arg(pluginName)); + catch (...) { + emit error(tr("Could not get Windows architecture type.")); return ""; } + +#elif defined(Q_OS_MAC) + + archName = kMacProcessorArch; + +#else + + int arch = checkProcessorArch(); + if (arch == Linux_rpm_i686) { + archName = kLinuxProcessorArchRpm32; + } + else if (arch == Linux_rpm_x86_64) { + archName = kLinuxProcessorArchRpm64; + } + else if (arch == Linux_deb_i686) { + archName = kLinuxProcessorArchDeb32; + } + else if (arch == Linux_deb_x86_64) { + archName = kLinuxProcessorArchDeb64; + } + else { + emit error(tr("Could not get Linux architecture type.")); + return ""; + } + +#endif + + QString result; + result = kPluginsBaseUrl.append(pluginName).append("/1.0/"); + result.append(archName); result.append("/"); result.append(getPluginOSSpecificName(pluginName)); diff --git a/src/gui/src/PluginManager.h b/src/gui/src/PluginManager.h index 63c09aeb..1c93340f 100644 --- a/src/gui/src/PluginManager.h +++ b/src/gui/src/PluginManager.h @@ -22,9 +22,11 @@ #include #include +#include "CoreInterface.h" + class DataDownloader; -class PluginManager: public QObject +class PluginManager : public QObject { Q_OBJECT @@ -61,6 +63,7 @@ private: QString m_ProfileDir; int m_DownloadIndex; DataDownloader* m_pPluginDownloader; + CoreInterface m_CoreInterface; }; #endif // PLUGINMANAGER_H diff --git a/src/gui/src/PluginWizardPage.cpp b/src/gui/src/PluginWizardPage.cpp index 92160a7d..1ac21bd2 100644 --- a/src/gui/src/PluginWizardPage.cpp +++ b/src/gui/src/PluginWizardPage.cpp @@ -63,7 +63,7 @@ void PluginWizardPage::changeEvent(QEvent *e) void PluginWizardPage::showError(QString error) { - updateStatus(error); + updateStatus(tr("Error: %1").arg(error)); showFinished(); } diff --git a/src/gui/src/SettingsDialog.cpp b/src/gui/src/SettingsDialog.cpp index 5625457f..7f6318a5 100644 --- a/src/gui/src/SettingsDialog.cpp +++ b/src/gui/src/SettingsDialog.cpp @@ -18,7 +18,7 @@ #include "SettingsDialog.h" -#include "DirectoryManager.h" +#include "CoreInterface.h" #include "SynergyLocale.h" #include "QSynergyApplication.h" #include "QUtility.h" @@ -57,7 +57,7 @@ SettingsDialog::SettingsDialog(QWidget* parent, AppConfig& config) : m_pCheckBoxElevateMode->hide(); #endif - QString pluginDir = DirectoryManager::getPluginDir(); + QString pluginDir = m_CoreInterface.getPluginDir(); QDir dir(pluginDir); int fileNum = dir.entryInfoList(QDir::NoDotAndDotDot|QDir::AllEntries).count(); if (fileNum == 0) { diff --git a/src/gui/src/SettingsDialog.h b/src/gui/src/SettingsDialog.h index f8bfb68d..30fb5d5e 100644 --- a/src/gui/src/SettingsDialog.h +++ b/src/gui/src/SettingsDialog.h @@ -23,6 +23,7 @@ #include #include "ui_SettingsDialogBase.h" #include "SynergyLocale.h" +#include "CoreInterface.h" class AppConfig; @@ -44,6 +45,7 @@ class SettingsDialog : public QDialog, public Ui::SettingsDialogBase private: AppConfig& m_AppConfig; SynergyLocale m_Locale; + CoreInterface m_CoreInterface; bool m_SuppressElevateWarning; private slots: diff --git a/src/gui/src/WebClient.cpp b/src/gui/src/WebClient.cpp index e7325e28..e283372a 100644 --- a/src/gui/src/WebClient.cpp +++ b/src/gui/src/WebClient.cpp @@ -140,44 +140,11 @@ void WebClient::queryPluginList() } QString WebClient::request( - const QString& email, - const QString& password, - QStringList& args) + const QString& email, + const QString& password, + QStringList& args) { - QString program(QCoreApplication::applicationDirPath() + "/syntool"); - - QProcess process; - process.setReadChannel(QProcess::StandardOutput); - process.start(program, args); - bool success = process.waitForStarted(); - - QString out, error; - if (success) - { - // hash password in case it contains interesting chars. - QString credentials(email + ":" + hash(password) + "\n"); - process.write(credentials.toStdString().c_str()); - - if (process.waitForFinished()) { - out = process.readAllStandardOutput(); - error = process.readAllStandardError(); - } - } - - out = out.trimmed(); - error = error.trimmed(); - - if (out.isEmpty() || - !error.isEmpty() || - !success || - process.exitCode() != 0) - { - throw std::runtime_error( - QString("Code: %1\nError: %2") - .arg(process.exitCode()) - .arg(error.isEmpty() ? "Unknown" : error) - .toStdString()); - } - - return out; + // hash password in case it contains interesting chars. + QString credentials(email + ":" + hash(password) + "\n"); + return m_CoreInterface.run(args, credentials); } diff --git a/src/gui/src/WebClient.h b/src/gui/src/WebClient.h index e39fa552..c2775193 100644 --- a/src/gui/src/WebClient.h +++ b/src/gui/src/WebClient.h @@ -22,6 +22,8 @@ #include #include +#include "CoreInterface.h" + class QMessageBox; class QWidget; class QStringList; @@ -55,6 +57,7 @@ private: QString m_Email; QString m_Password; QStringList m_PluginList; + CoreInterface m_CoreInterface; }; #endif // WEBCLIENT_H diff --git a/src/lib/arch/unix/ArchPluginUnix.cpp b/src/lib/arch/unix/ArchPluginUnix.cpp index adf705da..f47f8079 100644 --- a/src/lib/arch/unix/ArchPluginUnix.cpp +++ b/src/lib/arch/unix/ArchPluginUnix.cpp @@ -64,7 +64,6 @@ ArchPluginUnix::load() while ((de = readdir(dir)) != NULL) { // ignore hidden files and diretories like .. and . if (de->d_name[0] != '.') { - LOG((CLOG_DEBUG "load plugin %s", de->d_name)); plugins.push_back(de->d_name); } } @@ -77,11 +76,13 @@ ArchPluginUnix::load() void* library = dlopen(path.c_str(), RTLD_LAZY); if (library == NULL) { + LOG((CLOG_ERR "failed to load plugin: %s", (*it).c_str())); throw XArch(dlerror()); } String filename = synergy::string::removeFileExt(*it); m_pluginTable.insert(std::make_pair(filename, library)); + LOG((CLOG_ERR "loaded plugin: %s", (*it).c_str())); } } diff --git a/src/lib/arch/win32/ArchPluginWindows.cpp b/src/lib/arch/win32/ArchPluginWindows.cpp index 7bbbe1a6..cb2abb90 100644 --- a/src/lib/arch/win32/ArchPluginWindows.cpp +++ b/src/lib/arch/win32/ArchPluginWindows.cpp @@ -56,16 +56,19 @@ ArchPluginWindows::load() std::vector::iterator it; for (it = plugins.begin(); it != plugins.end(); ++it) { LOG((CLOG_DEBUG "loading plugin: %s", (*it).c_str())); - String path = String(getPluginsDir()).append("\\").append(*it); + String path = String(dir).append("\\").append(*it); HINSTANCE library = LoadLibrary(path.c_str()); if (library == NULL) { + LOG((CLOG_ERR "failed to load plugin: %s %d", (*it).c_str(), GetLastError())); throw XArch(new XArchEvalWindows); } void* lib = reinterpret_cast(library); String filename = synergy::string::removeFileExt(*it); m_pluginTable.insert(std::make_pair(filename, lib)); + + LOG((CLOG_ERR "loaded plugin: %s", (*it).c_str())); } } diff --git a/src/lib/plugin/ns/CMakeLists.txt b/src/lib/plugin/ns/CMakeLists.txt index 06cd7d85..8a9baab4 100644 --- a/src/lib/plugin/ns/CMakeLists.txt +++ b/src/lib/plugin/ns/CMakeLists.txt @@ -65,6 +65,20 @@ if (WIN32) ..\\..\\..\\..\\..\\lib\\${CMAKE_CFG_INTDIR}\\ns.dll ..\\..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}\\plugins\\ ) + add_custom_command( + TARGET ns + POST_BUILD + COMMAND xcopy /Y /Q + ..\\..\\..\\..\\..\\ext\\openssl\\out32dll\\libeay32.dll + ..\\..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR} + ) + add_custom_command( + TARGET ns + POST_BUILD + COMMAND xcopy /Y /Q + ..\\..\\..\\..\\..\\ext\\openssl\\out32dll\\ssleay32.dll + ..\\..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR} + ) else() if (APPLE) add_custom_command( diff --git a/src/lib/synergy/ArgParser.cpp b/src/lib/synergy/ArgParser.cpp index c634cd26..c5830d54 100644 --- a/src/lib/synergy/ArgParser.cpp +++ b/src/lib/synergy/ArgParser.cpp @@ -169,18 +169,22 @@ ArgParser::parseToolArgs(ToolArgs& args, int argc, const char* const* argv) args.m_loginAuthenticate = true; return true; } - if (isArg(i, argc, argv, NULL, "--get-plugin-list", 0)) { + else if (isArg(i, argc, argv, NULL, "--get-plugin-list", 0)) { args.m_getPluginList = true; return true; } - if (isArg(i, argc, argv, NULL, "--get-plugin-dir", 0)) { + else if (isArg(i, argc, argv, NULL, "--get-plugin-dir", 0)) { args.m_getPluginDir = true; return true; } - if (isArg(i, argc, argv, NULL, "--get-profile-dir", 0)) { + else if (isArg(i, argc, argv, NULL, "--get-profile-dir", 0)) { args.m_getProfileDir = true; return true; } + else if (isArg(i, argc, argv, NULL, "--get-arch", 0)) { + args.m_getArch = true; + return true; + } else { return false; } diff --git a/src/lib/synergy/ToolApp.cpp b/src/lib/synergy/ToolApp.cpp index fac45e39..4fd9518f 100644 --- a/src/lib/synergy/ToolApp.cpp +++ b/src/lib/synergy/ToolApp.cpp @@ -79,6 +79,9 @@ ToolApp::run(int argc, char** argv) else if (m_args.m_getProfileDir) { std::cout << ARCH->getProfileDirectory() << std::endl; } + else if (m_args.m_getArch) { + std::cout << ARCH->getPlatformName() << std::endl; + } else { throw XSynergy("Nothing to do"); } diff --git a/src/lib/synergy/ToolArgs.h b/src/lib/synergy/ToolArgs.h index 1ad05513..695fe0a0 100644 --- a/src/lib/synergy/ToolArgs.h +++ b/src/lib/synergy/ToolArgs.h @@ -29,4 +29,5 @@ public: bool m_getPluginList; bool m_getPluginDir; bool m_getProfileDir; + bool m_getArch; }; diff --git a/src/setup/win32/Product.wxs b/src/setup/win32/Product.wxs index 1f4e9beb..df61f862 100644 --- a/src/setup/win32/Product.wxs +++ b/src/setup/win32/Product.wxs @@ -90,6 +90,8 @@ + +