From b8a5abc19f1ebbbf39473ee7fd14ecafb0d11341 Mon Sep 17 00:00:00 2001 From: Nick Bolton Date: Tue, 3 Mar 2015 11:42:26 +0000 Subject: [PATCH] Download and extract OpenSSL dependencies #4313 --- src/gui/src/PluginManager.cpp | 81 +++++++++++++++++++++++--------- src/gui/src/PluginManager.h | 12 +++-- src/gui/src/PluginWizardPage.cpp | 4 +- 3 files changed, 69 insertions(+), 28 deletions(-) diff --git a/src/gui/src/PluginManager.cpp b/src/gui/src/PluginManager.cpp index bfcea073..29df2b6f 100644 --- a/src/gui/src/PluginManager.cpp +++ b/src/gui/src/PluginManager.cpp @@ -42,7 +42,8 @@ static QString kUnixOpenSslCommand = "openssl"; #if defined(Q_OS_WIN) static const char kWinPluginExt[] = ".dll"; -static const char kWinOpenSslBinary[] = "openssl.exe"; +static const char kWinOpenSslSetup[] = "openssl-1.0.2-Windows-x86.exe"; +static const char kWinOpenSslBinary[] = "OpenSSL\\openssl.exe"; #elif defined(Q_OS_MAC) static const char kMacPluginPrefix[] = "lib"; @@ -100,7 +101,7 @@ void PluginManager::downloadPlugins() } } -void PluginManager::saveOpenSslBinary() +void PluginManager::saveOpenSslSetup() { QDir dir(m_ProfileDir); if (!dir.exists()) { @@ -109,7 +110,7 @@ void PluginManager::saveOpenSslBinary() QString filename = m_ProfileDir; #if defined(Q_OS_WIN) - filename.append("\\").append(kWinOpenSslBinary); + filename.append("\\").append(kWinOpenSslSetup); #endif @@ -124,6 +125,20 @@ void PluginManager::saveOpenSslBinary() file.write(m_DataDownloader.data()); file.close(); + QString openSslSetupFile = m_ProfileDir; + openSslSetupFile.append("\\").append(kWinOpenSslSetup); + + QStringList installArgs; + installArgs.append("-s"); + installArgs.append("-y"); + + if (!runProgram(openSslSetupFile, installArgs, QStringList())) { + return; + } + + // openssl installer no longer needed + QFile::remove(openSslSetupFile); + emit openSslBinaryReady(); } @@ -135,7 +150,7 @@ void PluginManager::generateCertificate() this, SLOT(doGenerateCertificate())); - downloadOpenSslBinary(); + downloadOpenSslSetup(); } void PluginManager::savePlugin() @@ -148,7 +163,7 @@ void PluginManager::savePlugin() QString filename = m_PluginDir; QString pluginName = m_PluginList.at(m_DownloadIndex); - pluginName = getPluginOSSpecificName(pluginName); + pluginName = getPluginOsSpecificName(pluginName); filename.append(QDir::separator()).append(pluginName); QFile file(filename); @@ -216,25 +231,25 @@ QString PluginManager::getPluginUrl(const QString& pluginName) result.append(pluginName).append("/1.0/"); result.append(archName); result.append("/"); - result.append(getPluginOSSpecificName(pluginName)); + result.append(getPluginOsSpecificName(pluginName)); return result; } -QString PluginManager::getOpenSslBinaryUrl() +QString PluginManager::getOpenSslSetupUrl() { QString result; #if defined(Q_OS_WIN) result = kBaseUrl; result.append("/tools/"); - result.append(kWinOpenSslBinary); + result.append(kWinOpenSslSetup); #endif return result; } -QString PluginManager::getPluginOSSpecificName(const QString& pluginName) +QString PluginManager::getPluginOsSpecificName(const QString& pluginName) { QString result = pluginName; #if defined(Q_OS_WIN) @@ -258,16 +273,17 @@ bool PluginManager::checkOpenSslBinary() #endif } -void PluginManager::downloadOpenSslBinary() +void PluginManager::downloadOpenSslSetup() { if (checkOpenSslBinary()) { emit openSslBinaryReady(); return; } + QString urlString = getOpenSslSetupUrl(); + QUrl url; - QString openSslUrl = getOpenSslBinaryUrl(); - url.setUrl(openSslUrl); + url.setUrl(urlString); disconnect( &m_DataDownloader, @@ -279,18 +295,20 @@ void PluginManager::downloadOpenSslBinary() &m_DataDownloader, SIGNAL(isComplete()), this, - SLOT(saveOpenSslBinary())); + SLOT(saveOpenSslSetup())); m_DataDownloader.download(url); } void PluginManager::doGenerateCertificate() { - QString openSslFilename = m_ProfileDir; + QString openSslProgramFile; + #if defined(Q_OS_WIN) - openSslFilename.append("\\").append(kWinOpenSslBinary); + openSslProgramFile = m_ProfileDir; + openSslProgramFile.append("\\").append(kWinOpenSslBinary); #else - openSslFilename = kUnixOpenSslCommand; + openSslProgramFile = kUnixOpenSslCommand; #endif QStringList arguments; @@ -324,8 +342,24 @@ void PluginManager::doGenerateCertificate() arguments.append("-out"); arguments.append(filename); + QStringList environment; + environment << QString("OPENSSL_CONF=%1\\OpenSSL\\synergy.conf") + .arg(m_ProfileDir); + + if (!runProgram(openSslProgramFile, arguments, environment)) { + return; + } + + emit generateCertificateFinished(); +} + +bool PluginManager::runProgram( + const QString& program, const QStringList& args, const QStringList& env) +{ QProcess process; - process.start(openSslFilename, arguments); + process.setEnvironment(env); + process.start(program, args); + bool success = process.waitForStarted(); QString standardOutput, standardError; @@ -336,14 +370,15 @@ void PluginManager::doGenerateCertificate() } int code = process.exitCode(); - if (!standardError.isEmpty() || !success || code != 0) + if (!success || code != 0) { emit error( - QString("Failed to generate certificate.\n\nCode: %1\nError: %2") - .arg(process.exitCode()) - .arg(standardError.isEmpty() ? "Unknown" : standardError)); - return; + QString("Program failed: %1\n\nCode: %2\nError: %3") + .arg(program) + .arg(process.exitCode()) + .arg(standardError.isEmpty() ? "Unknown" : standardError)); + return false; } - emit generateCertificateFinished(); + return true; } diff --git a/src/gui/src/PluginManager.h b/src/gui/src/PluginManager.h index 1fb6bf1e..31b987a9 100644 --- a/src/gui/src/PluginManager.h +++ b/src/gui/src/PluginManager.h @@ -37,17 +37,21 @@ public: public slots: void downloadPlugins(); - void saveOpenSslBinary(); + void saveOpenSslSetup(); void generateCertificate(); void doGenerateCertificate(); private: void savePlugin(); QString getPluginUrl(const QString& pluginName); - QString getOpenSslBinaryUrl(); - QString getPluginOSSpecificName(const QString& pluginName); + QString getOpenSslSetupUrl(); + QString getPluginOsSpecificName(const QString& pluginName); bool checkOpenSslBinary(); - void downloadOpenSslBinary(); + void downloadOpenSslSetup(); + bool runProgram( + const QString& program, + const QStringList& args, + const QStringList& env); signals: void error(QString e); diff --git a/src/gui/src/PluginWizardPage.cpp b/src/gui/src/PluginWizardPage.cpp index 1ac21bd2..0cc5d782 100644 --- a/src/gui/src/PluginWizardPage.cpp +++ b/src/gui/src/PluginWizardPage.cpp @@ -84,7 +84,7 @@ void PluginWizardPage::updateDownloadStatus() QStringList pluginList = m_pWebClient->getPluginList(); int index = m_pPluginManager->downloadIndex(); updateStatus( - tr("Downloading plugin: %1 (%2/%3)") + tr("Downloading '%1' plugin (%2/%3)...") .arg(pluginList.at(index + 1)) .arg(index + 2) .arg(pluginList.size())); @@ -111,6 +111,8 @@ void PluginWizardPage::generateCertificate() m_pPluginManagerThread, SLOT(quit())); + updateStatus(tr("Generating SSL certificate...")); + QMetaObject::invokeMethod( m_pPluginManager, "generateCertificate",