Download and extract OpenSSL dependencies #4313

This commit is contained in:
Nick Bolton 2015-03-03 11:42:26 +00:00
parent c181d5f480
commit b8a5abc19f
3 changed files with 69 additions and 28 deletions

View File

@ -42,7 +42,8 @@ static QString kUnixOpenSslCommand = "openssl";
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
static const char kWinPluginExt[] = ".dll"; 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) #elif defined(Q_OS_MAC)
static const char kMacPluginPrefix[] = "lib"; static const char kMacPluginPrefix[] = "lib";
@ -100,7 +101,7 @@ void PluginManager::downloadPlugins()
} }
} }
void PluginManager::saveOpenSslBinary() void PluginManager::saveOpenSslSetup()
{ {
QDir dir(m_ProfileDir); QDir dir(m_ProfileDir);
if (!dir.exists()) { if (!dir.exists()) {
@ -109,7 +110,7 @@ void PluginManager::saveOpenSslBinary()
QString filename = m_ProfileDir; QString filename = m_ProfileDir;
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
filename.append("\\").append(kWinOpenSslBinary); filename.append("\\").append(kWinOpenSslSetup);
#endif #endif
@ -124,6 +125,20 @@ void PluginManager::saveOpenSslBinary()
file.write(m_DataDownloader.data()); file.write(m_DataDownloader.data());
file.close(); 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(); emit openSslBinaryReady();
} }
@ -135,7 +150,7 @@ void PluginManager::generateCertificate()
this, this,
SLOT(doGenerateCertificate())); SLOT(doGenerateCertificate()));
downloadOpenSslBinary(); downloadOpenSslSetup();
} }
void PluginManager::savePlugin() void PluginManager::savePlugin()
@ -148,7 +163,7 @@ void PluginManager::savePlugin()
QString filename = m_PluginDir; QString filename = m_PluginDir;
QString pluginName = m_PluginList.at(m_DownloadIndex); QString pluginName = m_PluginList.at(m_DownloadIndex);
pluginName = getPluginOSSpecificName(pluginName); pluginName = getPluginOsSpecificName(pluginName);
filename.append(QDir::separator()).append(pluginName); filename.append(QDir::separator()).append(pluginName);
QFile file(filename); QFile file(filename);
@ -216,25 +231,25 @@ QString PluginManager::getPluginUrl(const QString& pluginName)
result.append(pluginName).append("/1.0/"); result.append(pluginName).append("/1.0/");
result.append(archName); result.append(archName);
result.append("/"); result.append("/");
result.append(getPluginOSSpecificName(pluginName)); result.append(getPluginOsSpecificName(pluginName));
return result; return result;
} }
QString PluginManager::getOpenSslBinaryUrl() QString PluginManager::getOpenSslSetupUrl()
{ {
QString result; QString result;
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
result = kBaseUrl; result = kBaseUrl;
result.append("/tools/"); result.append("/tools/");
result.append(kWinOpenSslBinary); result.append(kWinOpenSslSetup);
#endif #endif
return result; return result;
} }
QString PluginManager::getPluginOSSpecificName(const QString& pluginName) QString PluginManager::getPluginOsSpecificName(const QString& pluginName)
{ {
QString result = pluginName; QString result = pluginName;
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
@ -258,16 +273,17 @@ bool PluginManager::checkOpenSslBinary()
#endif #endif
} }
void PluginManager::downloadOpenSslBinary() void PluginManager::downloadOpenSslSetup()
{ {
if (checkOpenSslBinary()) { if (checkOpenSslBinary()) {
emit openSslBinaryReady(); emit openSslBinaryReady();
return; return;
} }
QString urlString = getOpenSslSetupUrl();
QUrl url; QUrl url;
QString openSslUrl = getOpenSslBinaryUrl(); url.setUrl(urlString);
url.setUrl(openSslUrl);
disconnect( disconnect(
&m_DataDownloader, &m_DataDownloader,
@ -279,18 +295,20 @@ void PluginManager::downloadOpenSslBinary()
&m_DataDownloader, &m_DataDownloader,
SIGNAL(isComplete()), SIGNAL(isComplete()),
this, this,
SLOT(saveOpenSslBinary())); SLOT(saveOpenSslSetup()));
m_DataDownloader.download(url); m_DataDownloader.download(url);
} }
void PluginManager::doGenerateCertificate() void PluginManager::doGenerateCertificate()
{ {
QString openSslFilename = m_ProfileDir; QString openSslProgramFile;
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
openSslFilename.append("\\").append(kWinOpenSslBinary); openSslProgramFile = m_ProfileDir;
openSslProgramFile.append("\\").append(kWinOpenSslBinary);
#else #else
openSslFilename = kUnixOpenSslCommand; openSslProgramFile = kUnixOpenSslCommand;
#endif #endif
QStringList arguments; QStringList arguments;
@ -324,8 +342,24 @@ void PluginManager::doGenerateCertificate()
arguments.append("-out"); arguments.append("-out");
arguments.append(filename); 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; QProcess process;
process.start(openSslFilename, arguments); process.setEnvironment(env);
process.start(program, args);
bool success = process.waitForStarted(); bool success = process.waitForStarted();
QString standardOutput, standardError; QString standardOutput, standardError;
@ -336,14 +370,15 @@ void PluginManager::doGenerateCertificate()
} }
int code = process.exitCode(); int code = process.exitCode();
if (!standardError.isEmpty() || !success || code != 0) if (!success || code != 0)
{ {
emit error( emit error(
QString("Failed to generate certificate.\n\nCode: %1\nError: %2") QString("Program failed: %1\n\nCode: %2\nError: %3")
.arg(program)
.arg(process.exitCode()) .arg(process.exitCode())
.arg(standardError.isEmpty() ? "Unknown" : standardError)); .arg(standardError.isEmpty() ? "Unknown" : standardError));
return; return false;
} }
emit generateCertificateFinished(); return true;
} }

View File

@ -37,17 +37,21 @@ public:
public slots: public slots:
void downloadPlugins(); void downloadPlugins();
void saveOpenSslBinary(); void saveOpenSslSetup();
void generateCertificate(); void generateCertificate();
void doGenerateCertificate(); void doGenerateCertificate();
private: private:
void savePlugin(); void savePlugin();
QString getPluginUrl(const QString& pluginName); QString getPluginUrl(const QString& pluginName);
QString getOpenSslBinaryUrl(); QString getOpenSslSetupUrl();
QString getPluginOSSpecificName(const QString& pluginName); QString getPluginOsSpecificName(const QString& pluginName);
bool checkOpenSslBinary(); bool checkOpenSslBinary();
void downloadOpenSslBinary(); void downloadOpenSslSetup();
bool runProgram(
const QString& program,
const QStringList& args,
const QStringList& env);
signals: signals:
void error(QString e); void error(QString e);

View File

@ -84,7 +84,7 @@ void PluginWizardPage::updateDownloadStatus()
QStringList pluginList = m_pWebClient->getPluginList(); QStringList pluginList = m_pWebClient->getPluginList();
int index = m_pPluginManager->downloadIndex(); int index = m_pPluginManager->downloadIndex();
updateStatus( updateStatus(
tr("Downloading plugin: %1 (%2/%3)") tr("Downloading '%1' plugin (%2/%3)...")
.arg(pluginList.at(index + 1)) .arg(pluginList.at(index + 1))
.arg(index + 2) .arg(index + 2)
.arg(pluginList.size())); .arg(pluginList.size()));
@ -111,6 +111,8 @@ void PluginWizardPage::generateCertificate()
m_pPluginManagerThread, m_pPluginManagerThread,
SLOT(quit())); SLOT(quit()));
updateStatus(tr("Generating SSL certificate..."));
QMetaObject::invokeMethod( QMetaObject::invokeMethod(
m_pPluginManager, m_pPluginManager,
"generateCertificate", "generateCertificate",