comparison ui/installwrapper.cpp @ 310:f758460ca437

Merged
author Sascha Wilde <wilde@intevation.de>
date Fri, 04 Apr 2014 09:54:19 +0200
parents f23e0ccd5d14
children dc4efb0a70cb
comparison
equal deleted inserted replaced
309:fa37384b86b6 310:f758460ca437
5 #include <QApplication> 5 #include <QApplication>
6 #include <QDir> 6 #include <QDir>
7 #include <QDebug> 7 #include <QDebug>
8 8
9 #include "logging.h" 9 #include "logging.h"
10
11 #define INSTALL_TIMEOUT 3600000 /* Wait up to an hour */
10 12
11 InstallWrapper::InstallWrapper(QObject* parent, 13 InstallWrapper::InstallWrapper(QObject* parent,
12 const QString& path, const QStringList& instructions): 14 const QString& path, const QStringList& instructions):
13 QThread(parent), 15 QThread(parent),
14 mCertListFile(path), 16 mCertListFile(path),
25 } 27 }
26 return QFileInfo(myDir.absoluteFilePath(instProcName)); 28 return QFileInfo(myDir.absoluteFilePath(instProcName));
27 } 29 }
28 30
29 #ifdef WIN32 31 #ifdef WIN32
30 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
31
32 void InstallWrapper::run() 32 void InstallWrapper::run()
33 { 33 {
34 /* TODO: We need errorcodes here so that we can see if a user
35 * cancled the UAC elevation */
34 QTemporaryFile instructionsFile; 36 QTemporaryFile instructionsFile;
35 QFileInfo cinstProcInfo = getCinstProcInfo(); 37 QFileInfo cinstProcInfo = getCinstProcInfo();
38 DWORD retval = 0;
39 SHELLEXECUTEINFOW shExecInfo;
40 memset (&shExecInfo, 0, sizeof(SHELLEXECUTEINFOW));
36 41
37 QString cinstFileName = QDir::toNativeSeparators( 42 QString cinstFileName = QDir::toNativeSeparators(
38 getCinstProcInfo().absoluteFilePath()); 43 getCinstProcInfo().absoluteFilePath());
39 44
40 if (!cinstProcInfo.isExecutable()) { 45 if (!cinstProcInfo.isExecutable()) {
41 emit error (tr("Could not find certificate installation process.")); 46 emit error(tr("Could not find certificate installation process."));
42 return; 47 return;
43 } 48 }
44 49
45 instructionsFile.open(); 50 instructionsFile.open();
46
47 qt_ntfs_permission_lookup++;
48 if (instructionsFile.permissions() ^ (
49 QFileDevice::ReadUser |
50 QFileDevice::WriteUser |
51 QFileDevice::ReadOwner |
52 QFileDevice::WriteOwner)) {
53 emit error (tr("Invalid permissions on temporary file."));
54 }
55 51
56 foreach (const QString &b64data, mInstructions) { 52 foreach (const QString &b64data, mInstructions) {
57 instructionsFile.write(b64data.toLatin1()); 53 instructionsFile.write(b64data.toLatin1());
58 instructionsFile.write("\n"); 54 instructionsFile.write("\n");
59 } 55 }
60 56
61 instructionsFile.close(); 57 instructionsFile.close();
62 58
63 QString parameters = "\"" + mCertListFile + "\" \"" +instructionsFile.fileName() + "\""; 59 QString parameters = "\"list=" + mCertListFile +
60 "\" \"instructions=" +instructionsFile.fileName() + "\"";
64 61
65 memset (&mExecInfo, 0, sizeof(SHELLEXECUTEINFOW)); 62 shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
66 mExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW); 63 shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
67 mExecInfo.fMask = SEE_MASK_FLAG_NO_UI | 64 shExecInfo.lpVerb = L"runas";
68 SEE_MASK_NOASYNC; 65 shExecInfo.lpFile = reinterpret_cast<LPCWSTR> (cinstFileName.utf16());
69 mExecInfo.lpVerb = L"runas"; 66 shExecInfo.lpParameters = reinterpret_cast<LPCWSTR> (parameters.utf16());
70 mExecInfo.lpFile = reinterpret_cast<LPCWSTR> (cinstFileName.utf16());
71 mExecInfo.lpParameters = reinterpret_cast<LPCWSTR> (parameters.utf16());
72 67
73 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters; 68 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters;
74 69
75 if (!ShellExecuteExW(&mExecInfo)) { 70 if (!ShellExecuteExW(&shExecInfo)) {
76 char* errmsg = getLastErrorMsg(); 71 char* errmsg = getLastErrorMsg();
77 QString qerrmsg = QString::fromUtf8(errmsg); 72 QString qerrmsg = QString::fromUtf8(errmsg);
78 free(errmsg); 73 free(errmsg);
79 emit(tr("Error executing process: %1").arg(qerrmsg)); 74 emit error(tr("Error executing process: %1").arg(qerrmsg));
75 return;
80 } 76 }
81 qt_ntfs_permission_lookup--; 77
78 retval = WaitForSingleObject(shExecInfo.hProcess, INSTALL_TIMEOUT);
79
80 if (retval != WAIT_OBJECT_0) {
81 if (retval == WAIT_FAILED) {
82 char* errmsg = getLastErrorMsg();
83 QString qerrmsg = QString::fromUtf8(errmsg);
84 free(errmsg);
85 emit error (tr("Error monitoring process: %1").arg(qerrmsg));
86 return;
87 } else {
88 emit error (tr("Certificate installation timed out."));
89 return;
90 }
91 }
92
93 if (GetExitCodeProcess(shExecInfo.hProcess, &retval)) {
94 if (retval == STILL_ACTIVE) {
95 qDebug() << "Process still running, huh..";
96 }
97 } else {
98 char* errmsg = getLastErrorMsg();
99 QString qerrmsg = QString::fromUtf8(errmsg);
100 free(errmsg);
101 emit error (tr("Failed to check process status: %1").arg(qerrmsg));
102 }
103 CloseHandle(shExecInfo.hProcess);
104
105 if (retval != 0) {
106 /* TODO make this nicer */
107 emit error (tr("The process failed with return code. %1").arg(retval));
108 }
82 } 109 }
83 #else 110 #else
84 void InstallWrapper::run() 111 void InstallWrapper::run()
85 { 112 {
86 } 113 }

http://wald.intevation.org/projects/trustbridge/