This commit is contained in:
Nick Bolton 2015-02-26 12:31:19 +00:00
commit 6971f4551d
19 changed files with 217 additions and 198 deletions

View File

@ -55,7 +55,7 @@ SOURCES += src/main.cpp \
src/WebClient.cpp \ src/WebClient.cpp \
src/PluginWizardPage.cpp \ src/PluginWizardPage.cpp \
src/PluginManager.cpp \ src/PluginManager.cpp \
src/DirectoryManager.cpp src/CoreInterface.cpp
HEADERS += src/MainWindow.h \ HEADERS += src/MainWindow.h \
src/AboutDialog.h \ src/AboutDialog.h \
src/ServerConfig.h \ src/ServerConfig.h \
@ -97,7 +97,7 @@ HEADERS += src/MainWindow.h \
src/PluginWizardPage.h \ src/PluginWizardPage.h \
src/ProcessorArch.h \ src/ProcessorArch.h \
src/PluginManager.h \ src/PluginManager.h \
src/DirectoryManager.h src/CoreInterface.h
RESOURCES += res/Synergy.qrc RESOURCES += res/Synergy.qrc
RC_FILE = res/win/Synergy.rc RC_FILE = res/win/Synergy.rc
macx { macx {

View File

@ -145,7 +145,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QCheckBox" name="m_pCheckBoxEnableCrypto"> <widget class="QCheckBox" name="m_pCheckBoxEnableCrypto">
<property name="text"> <property name="text">
<string>Enable OpenSSL (unique certificate)</string> <string>Use &amp;OpenSSL encryption (unique certificate)</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#include "CoreInterface.h"
#include <QCoreApplication>
#include <QProcess>
#include <stdexcept>
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;
}

View File

@ -1,36 +1,31 @@
/* /*
* synergy -- mouse and keyboard sharing utility * synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015 Synergy Si Ltd. * Copyright (C) 2015 Synergy Si Ltd.
* *
* This package is free software; you can redistribute it and/or * This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
* found in the file COPYING that should have accompanied this file. * found in the file COPYING that should have accompanied this file.
* *
* This package is distributed in the hope that it will be useful, * This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef DIRECTORYMANAGER_H #pragma once
#define DIRECTORYMANAGER_H
#include <QString>
#include <QString>
#include <QStringList> class CoreInterface
{
class DirectoryManager public:
{ CoreInterface();
public:
DirectoryManager(); QString getPluginDir();
QString getProfileDir();
static QString getPluginDir(); QString getArch();
static QString getProfileDir(); QString run(const QStringList& args, const QString& input = "");
};
private:
static QString getDirViaSyntool(QStringList& args);
};
#endif // DIRECTORYMANAGER_H

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#include "DirectoryManager.h"
#include <QCoreApplication>
#include <QProcess>
#include <QMessageBox>
#include <QObject>
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;
}

View File

@ -17,7 +17,7 @@
#include "PluginManager.h" #include "PluginManager.h"
#include "DirectoryManager.h" #include "CoreInterface.h"
#include "CommandProcess.h" #include "CommandProcess.h"
#include "DataDownloader.h" #include "DataDownloader.h"
#include "QUtility.h" #include "QUtility.h"
@ -57,12 +57,12 @@ PluginManager::PluginManager(QStringList pluginList) :
m_DownloadIndex(-1), m_DownloadIndex(-1),
m_pPluginDownloader(NULL) m_pPluginDownloader(NULL)
{ {
m_PluginDir = DirectoryManager::getPluginDir(); m_PluginDir = m_CoreInterface.getPluginDir();
if (m_PluginDir.isEmpty()) { if (m_PluginDir.isEmpty()) {
emit error(tr("Failed to get plugin directory.")); emit error(tr("Failed to get plugin directory."));
} }
m_ProfileDir = DirectoryManager::getProfileDir(); m_ProfileDir = m_CoreInterface.getProfileDir();
if (m_ProfileDir.isEmpty()) { if (m_ProfileDir.isEmpty()) {
emit error(tr("Failed to get profile directory.")); emit error(tr("Failed to get profile directory."));
} }
@ -173,37 +173,53 @@ void PluginManager::savePlugin()
QString PluginManager::getPluginUrl(const QString& pluginName) QString PluginManager::getPluginUrl(const QString& pluginName)
{ {
QString result; QString archName;
result = kPluginsBaseUrl.append(pluginName).append("/1.0/");
int arch = checkProcessorArch(); #if defined(Q_OS_WIN)
if (arch == Win_x86) {
result.append(kWinProcessorArch32); try {
QString coreArch = m_CoreInterface.getArch();
if (coreArch.startsWith("x86")) {
archName = kWinProcessorArch32;
}
else if (coreArch.startsWith("x64")) {
archName = kWinProcessorArch64;
}
} }
else if (arch == Win_x64) { catch (...) {
result.append(kWinProcessorArch64); emit error(tr("Could not get Windows architecture type."));
}
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));
return ""; 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("/");
result.append(getPluginOSSpecificName(pluginName)); result.append(getPluginOSSpecificName(pluginName));

View File

@ -22,9 +22,11 @@
#include <QStringList> #include <QStringList>
#include <QObject> #include <QObject>
#include "CoreInterface.h"
class DataDownloader; class DataDownloader;
class PluginManager: public QObject class PluginManager : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -61,6 +63,7 @@ private:
QString m_ProfileDir; QString m_ProfileDir;
int m_DownloadIndex; int m_DownloadIndex;
DataDownloader* m_pPluginDownloader; DataDownloader* m_pPluginDownloader;
CoreInterface m_CoreInterface;
}; };
#endif // PLUGINMANAGER_H #endif // PLUGINMANAGER_H

View File

@ -63,7 +63,7 @@ void PluginWizardPage::changeEvent(QEvent *e)
void PluginWizardPage::showError(QString error) void PluginWizardPage::showError(QString error)
{ {
updateStatus(error); updateStatus(tr("Error: %1").arg(error));
showFinished(); showFinished();
} }

View File

@ -18,7 +18,7 @@
#include "SettingsDialog.h" #include "SettingsDialog.h"
#include "DirectoryManager.h" #include "CoreInterface.h"
#include "SynergyLocale.h" #include "SynergyLocale.h"
#include "QSynergyApplication.h" #include "QSynergyApplication.h"
#include "QUtility.h" #include "QUtility.h"
@ -57,7 +57,7 @@ SettingsDialog::SettingsDialog(QWidget* parent, AppConfig& config) :
m_pCheckBoxElevateMode->hide(); m_pCheckBoxElevateMode->hide();
#endif #endif
QString pluginDir = DirectoryManager::getPluginDir(); QString pluginDir = m_CoreInterface.getPluginDir();
QDir dir(pluginDir); QDir dir(pluginDir);
int fileNum = dir.entryInfoList(QDir::NoDotAndDotDot|QDir::AllEntries).count(); int fileNum = dir.entryInfoList(QDir::NoDotAndDotDot|QDir::AllEntries).count();
if (fileNum == 0) { if (fileNum == 0) {

View File

@ -23,6 +23,7 @@
#include <QDialog> #include <QDialog>
#include "ui_SettingsDialogBase.h" #include "ui_SettingsDialogBase.h"
#include "SynergyLocale.h" #include "SynergyLocale.h"
#include "CoreInterface.h"
class AppConfig; class AppConfig;
@ -44,6 +45,7 @@ class SettingsDialog : public QDialog, public Ui::SettingsDialogBase
private: private:
AppConfig& m_AppConfig; AppConfig& m_AppConfig;
SynergyLocale m_Locale; SynergyLocale m_Locale;
CoreInterface m_CoreInterface;
bool m_SuppressElevateWarning; bool m_SuppressElevateWarning;
private slots: private slots:

View File

@ -140,44 +140,11 @@ void WebClient::queryPluginList()
} }
QString WebClient::request( QString WebClient::request(
const QString& email, const QString& email,
const QString& password, const QString& password,
QStringList& args) QStringList& args)
{ {
QString program(QCoreApplication::applicationDirPath() + "/syntool"); // hash password in case it contains interesting chars.
QString credentials(email + ":" + hash(password) + "\n");
QProcess process; return m_CoreInterface.run(args, credentials);
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;
} }

View File

@ -22,6 +22,8 @@
#include <QStringList> #include <QStringList>
#include <QObject> #include <QObject>
#include "CoreInterface.h"
class QMessageBox; class QMessageBox;
class QWidget; class QWidget;
class QStringList; class QStringList;
@ -55,6 +57,7 @@ private:
QString m_Email; QString m_Email;
QString m_Password; QString m_Password;
QStringList m_PluginList; QStringList m_PluginList;
CoreInterface m_CoreInterface;
}; };
#endif // WEBCLIENT_H #endif // WEBCLIENT_H

View File

@ -64,7 +64,6 @@ ArchPluginUnix::load()
while ((de = readdir(dir)) != NULL) { while ((de = readdir(dir)) != NULL) {
// ignore hidden files and diretories like .. and . // ignore hidden files and diretories like .. and .
if (de->d_name[0] != '.') { if (de->d_name[0] != '.') {
LOG((CLOG_DEBUG "load plugin %s", de->d_name));
plugins.push_back(de->d_name); plugins.push_back(de->d_name);
} }
} }
@ -77,11 +76,13 @@ ArchPluginUnix::load()
void* library = dlopen(path.c_str(), RTLD_LAZY); void* library = dlopen(path.c_str(), RTLD_LAZY);
if (library == NULL) { if (library == NULL) {
LOG((CLOG_ERR "failed to load plugin: %s", (*it).c_str()));
throw XArch(dlerror()); throw XArch(dlerror());
} }
String filename = synergy::string::removeFileExt(*it); String filename = synergy::string::removeFileExt(*it);
m_pluginTable.insert(std::make_pair(filename, library)); m_pluginTable.insert(std::make_pair(filename, library));
LOG((CLOG_ERR "loaded plugin: %s", (*it).c_str()));
} }
} }

View File

@ -56,16 +56,19 @@ ArchPluginWindows::load()
std::vector<String>::iterator it; std::vector<String>::iterator it;
for (it = plugins.begin(); it != plugins.end(); ++it) { for (it = plugins.begin(); it != plugins.end(); ++it) {
LOG((CLOG_DEBUG "loading plugin: %s", (*it).c_str())); 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()); HINSTANCE library = LoadLibrary(path.c_str());
if (library == NULL) { if (library == NULL) {
LOG((CLOG_ERR "failed to load plugin: %s %d", (*it).c_str(), GetLastError()));
throw XArch(new XArchEvalWindows); throw XArch(new XArchEvalWindows);
} }
void* lib = reinterpret_cast<void*>(library); void* lib = reinterpret_cast<void*>(library);
String filename = synergy::string::removeFileExt(*it); String filename = synergy::string::removeFileExt(*it);
m_pluginTable.insert(std::make_pair(filename, lib)); m_pluginTable.insert(std::make_pair(filename, lib));
LOG((CLOG_ERR "loaded plugin: %s", (*it).c_str()));
} }
} }

View File

@ -65,6 +65,20 @@ if (WIN32)
..\\..\\..\\..\\..\\lib\\${CMAKE_CFG_INTDIR}\\ns.dll ..\\..\\..\\..\\..\\lib\\${CMAKE_CFG_INTDIR}\\ns.dll
..\\..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}\\plugins\\ ..\\..\\..\\..\\..\\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() else()
if (APPLE) if (APPLE)
add_custom_command( add_custom_command(

View File

@ -169,18 +169,22 @@ ArgParser::parseToolArgs(ToolArgs& args, int argc, const char* const* argv)
args.m_loginAuthenticate = true; args.m_loginAuthenticate = true;
return 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; args.m_getPluginList = true;
return 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; args.m_getPluginDir = true;
return 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; args.m_getProfileDir = true;
return true; return true;
} }
else if (isArg(i, argc, argv, NULL, "--get-arch", 0)) {
args.m_getArch = true;
return true;
}
else { else {
return false; return false;
} }

View File

@ -79,6 +79,9 @@ ToolApp::run(int argc, char** argv)
else if (m_args.m_getProfileDir) { else if (m_args.m_getProfileDir) {
std::cout << ARCH->getProfileDirectory() << std::endl; std::cout << ARCH->getProfileDirectory() << std::endl;
} }
else if (m_args.m_getArch) {
std::cout << ARCH->getPlatformName() << std::endl;
}
else { else {
throw XSynergy("Nothing to do"); throw XSynergy("Nothing to do");
} }

View File

@ -29,4 +29,5 @@ public:
bool m_getPluginList; bool m_getPluginList;
bool m_getPluginDir; bool m_getPluginDir;
bool m_getProfileDir; bool m_getProfileDir;
bool m_getArch;
}; };

View File

@ -90,6 +90,8 @@
<File Source="$(var.BinPath)/synergyc.exe" /> <File Source="$(var.BinPath)/synergyc.exe" />
<File Source="$(var.BinPath)/syntool.exe" /> <File Source="$(var.BinPath)/syntool.exe" />
<File Source="$(var.BinPath)/synwinhk.dll" /> <File Source="$(var.BinPath)/synwinhk.dll" />
<File Source="$(var.BinPath)/libeay32.dll" />
<File Source="$(var.BinPath)/ssleay32.dll" />
</Component> </Component>