Mercurial > trustbridge
annotate ui/installwrapper.cpp @ 1119:5349e2354c48
(issue54) Merge branch runafterinstall
There is now an NSIS Plugin that executes the Software after
installation using COM in the shell of the current user.
With the way over the shell there is no inheritance /
token management required. As it is impossible to
drop all privileges of a token granted by UAC and
still be able to reelevate the Token again with another
RunAs call later this round trip over the Shell was
necessary.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Tue, 16 Sep 2014 19:48:22 +0200 |
parents | a7a72353d6d2 |
children | 0ddb173bcd8b |
rev | line source |
---|---|
404 | 1 /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik |
2 * Software engineering by Intevation GmbH | |
3 * | |
4 * This file is Free Software under the GNU GPL (v>=2) | |
5 * and comes with ABSOLUTELY NO WARRANTY! | |
6 * See LICENSE.txt for details. | |
7 */ | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
8 #include "installwrapper.h" |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
9 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
10 #include <QFileInfo> |
364 | 11 #include <QProcess> |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
12 #include <QTemporaryFile> |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
13 #include <QApplication> |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
14 #include <QDir> |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
15 #include <QDebug> |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
16 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
17 #include "logging.h" |
511
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
18 #include "util.h" |
1084
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
19 #include "binverify.h" |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
20 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
21 #define INSTALL_TIMEOUT 3600000 /* Wait up to an hour */ |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
22 |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
23 InstallWrapper::InstallWrapper(QObject* parent, |
364 | 24 const QString& path, const QStringList& choices): |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
25 QThread(parent), |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
26 mCertListFile(path), |
364 | 27 mChoices(choices) |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
28 { |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
29 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
30 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
31 QFileInfo getCinstProcInfo() { |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
32 QFileInfo fi(QCoreApplication::applicationFilePath()); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
33 QDir myDir = fi.absoluteDir(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
34 QString instProcName = "cinst"; |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
35 if (!fi.suffix().isEmpty()) { |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
36 instProcName += "." + fi.suffix(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
37 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
38 return QFileInfo(myDir.absoluteFilePath(instProcName)); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
39 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
40 |
364 | 41 bool InstallWrapper::writeChoices(QTemporaryFile* choicesFile) const |
42 { | |
43 if (!choicesFile->open()) { | |
44 return false; | |
45 } | |
46 | |
47 foreach (const QString &b64data, mChoices) { | |
1082
a12e6172d82c
Extend logging to all choices and SW updates.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1060
diff
changeset
|
48 syslog_info_printf ("Selected certificate: %s\n", b64data.toLatin1().constData()); |
a12e6172d82c
Extend logging to all choices and SW updates.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1060
diff
changeset
|
49 if (choicesFile->write(b64data.toLatin1()) == -1) { |
a12e6172d82c
Extend logging to all choices and SW updates.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1060
diff
changeset
|
50 return false; |
a12e6172d82c
Extend logging to all choices and SW updates.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1060
diff
changeset
|
51 } |
a12e6172d82c
Extend logging to all choices and SW updates.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1060
diff
changeset
|
52 if (choicesFile->write("\n") == -1) { |
a12e6172d82c
Extend logging to all choices and SW updates.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1060
diff
changeset
|
53 return false; |
a12e6172d82c
Extend logging to all choices and SW updates.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1060
diff
changeset
|
54 } |
364 | 55 } |
56 | |
57 choicesFile->close(); | |
58 | |
59 return true; | |
60 } | |
61 | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
62 void InstallWrapper::run() |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
63 { |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
64 /* TODO: We need errorcodes here so that we can see if a user |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
65 * cancled the UAC elevation */ |
364 | 66 QTemporaryFile choicesFile; |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
67 QFileInfo cinstProcInfo = getCinstProcInfo(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
68 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
69 QString cinstFileName = QDir::toNativeSeparators( |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
70 getCinstProcInfo().absoluteFilePath()); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
71 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
72 if (!cinstProcInfo.isExecutable()) { |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
73 emit error(tr("Could not find certificate installation process.")); |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
74 return; |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
75 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
76 |
364 | 77 if (!writeChoices(&choicesFile)) { |
78 emit error(tr("Failed to write temporary file.")); | |
79 return; | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
80 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
81 |
364 | 82 #ifdef WIN32 |
1084
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
83 bin_verify_result vres = verify_binary(cinstFileName.toUtf8().constData(), |
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
84 cinstFileName.toUtf8().size()); |
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
85 |
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
86 if (vres.result != VerifyValid) { |
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
87 emit error(tr("Integrity check of the certificate installation process failed. ") |
1104
a7a72353d6d2
(issue111) Wording and German translation.
Emanuel Schuetze <emanuel@intevation.de>
parents:
1084
diff
changeset
|
88 + "\n" + tr("Please reinstall the software.")); |
1084
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
89 return; |
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
90 } |
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
91 |
364 | 92 /* QProcess on Windows uses CreateProcess but we have to |
93 * use the runas shell command to get the UAC prompt if necessary. | |
94 * So we have to handle the process ourself. Starting with | |
95 * shell execute also means that we can not have stdout and stderr | |
96 * redirection. This is the reason we use command line parameters | |
97 * and not a pipe for communication. In debug mode the installer | |
98 * also makes use of output debug string. */ | |
99 DWORD retval = 0; | |
100 SHELLEXECUTEINFOW shExecInfo; | |
101 | |
102 memset (&shExecInfo, 0, sizeof(SHELLEXECUTEINFOW)); | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
103 |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
104 /* Windows needs each parameter packed in " */ |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
105 QString parameters = "\"list=" + mCertListFile + |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
106 "\" \"choices=" + choicesFile.fileName() + "\""; |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
107 |
1060
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
108 if (g_debug) { |
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
109 parameters += " --debug"; |
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
110 } |
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
111 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
112 shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
113 shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; |
1003
db7e7156c824
(issue66) Only depend on is_system_install on windows to decide privilege raise
Andre Heinecke <andre.heinecke@intevation.de>
parents:
987
diff
changeset
|
114 if (!is_system_install()) { |
511
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
115 shExecInfo.lpVerb = L"open"; |
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
116 } else { |
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
117 shExecInfo.lpVerb = L"runas"; |
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
118 } |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
119 shExecInfo.lpFile = reinterpret_cast<LPCWSTR> (cinstFileName.utf16()); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
120 shExecInfo.lpParameters = reinterpret_cast<LPCWSTR> (parameters.utf16()); |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
121 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
122 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters; |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
123 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
124 if (!ShellExecuteExW(&shExecInfo)) { |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
125 char* errmsg = getLastErrorMsg(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
126 QString qerrmsg = QString::fromUtf8(errmsg); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
127 free(errmsg); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
128 emit error(tr("Error executing process: %1").arg(qerrmsg)); |
1084
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
129 fclose(vres.fptr); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
130 return; |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
131 } |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
132 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
133 retval = WaitForSingleObject(shExecInfo.hProcess, INSTALL_TIMEOUT); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
134 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
135 if (retval != WAIT_OBJECT_0) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
136 if (retval == WAIT_FAILED) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
137 char* errmsg = getLastErrorMsg(); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
138 QString qerrmsg = QString::fromUtf8(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
139 free(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
140 emit error (tr("Error monitoring process: %1").arg(qerrmsg)); |
1084
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
141 fclose(vres.fptr); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
142 return; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
143 } else { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
144 emit error (tr("Certificate installation timed out.")); |
1084
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
145 fclose(vres.fptr); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
146 return; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
147 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
148 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
149 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
150 if (GetExitCodeProcess(shExecInfo.hProcess, &retval)) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
151 if (retval == STILL_ACTIVE) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
152 qDebug() << "Process still running, huh.."; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
153 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
154 } else { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
155 char* errmsg = getLastErrorMsg(); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
156 QString qerrmsg = QString::fromUtf8(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
157 free(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
158 emit error (tr("Failed to check process status: %1").arg(qerrmsg)); |
387
32309299bec9
Always return after error
Andre Heinecke <andre.heinecke@intevation.de>
parents:
385
diff
changeset
|
159 CloseHandle(shExecInfo.hProcess); |
1084
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
160 fclose(vres.fptr); |
387
32309299bec9
Always return after error
Andre Heinecke <andre.heinecke@intevation.de>
parents:
385
diff
changeset
|
161 return; |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
162 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
163 CloseHandle(shExecInfo.hProcess); |
1084
b8fb6bf7f980
(issue118) Add signature check for cinst.exe and mozilla.exe
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1082
diff
changeset
|
164 fclose(vres.fptr); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
165 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
166 if (retval != 0) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
167 /* TODO make this nicer */ |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
168 emit error (tr("The process failed with return code. %1").arg(retval)); |
388
a507e5f1b999
Emit a signal if no errors happened during installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
387
diff
changeset
|
169 return; |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
170 } |
364 | 171 #else /* WIN32 */ |
172 QProcess installerProcess; | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
173 QStringList parameters; |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
174 |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
175 choicesFile.setAutoRemove(false); |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
176 parameters << "list=" + mCertListFile << "choices=" + choicesFile.fileName(); |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
177 |
1060
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
178 if (g_debug) { |
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
179 parameters << "--debug"; |
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
180 } |
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
181 |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
182 bool sudo_started = false; |
841
216a65d7fc4b
(issue66) Implement is_system_install and use it
Andre Heinecke <andre.heinecke@intevation.de>
parents:
647
diff
changeset
|
183 bool use_sudo = is_admin() && is_system_install(); |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
184 if (use_sudo) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
185 QStringList sudoPrograms; |
987
b8ae69bcc540
Use pkexec instead of gksudo.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
841
diff
changeset
|
186 sudoPrograms << "pkexec" << "kdesudo" << "sudo"; |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
187 QStringList sudoParams; |
647
51830f4912c2
Minor style fix
Andre Heinecke <andre.heinecke@intevation.de>
parents:
646
diff
changeset
|
188 sudoParams << cinstProcInfo.absoluteFilePath() << parameters; |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
189 installerProcess.setArguments(sudoParams); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
190 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
191 foreach (const QString &sProg, sudoPrograms) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
192 installerProcess.setProgram(sProg); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
193 qDebug() << "Starting process " << sProg <<" params: " << sudoParams; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
194 installerProcess.start(); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
195 if (!installerProcess.waitForStarted() || |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
196 installerProcess.state() == QProcess::NotRunning) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
197 continue; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
198 } else { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
199 sudo_started = true; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
200 break; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
201 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
202 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
203 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
204 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
205 /* Fallback to start without sudo */ |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
206 if (!use_sudo || !sudo_started) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
207 installerProcess.setProgram(cinstProcInfo.absoluteFilePath()); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
208 installerProcess.setArguments(parameters); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
209 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
210 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
211 installerProcess.start(); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
212 if (!installerProcess.waitForStarted() || |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
213 installerProcess.state() == QProcess::NotRunning) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
214 emit error (tr("Failed to start installer process.")); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
215 return; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
216 } |
364 | 217 } |
218 | |
219 installerProcess.waitForFinished(); | |
220 | |
221 if (installerProcess.exitStatus() == QProcess::CrashExit) { | |
222 /* Woops */ | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
223 emit error (tr("Failed to complete installation.")); |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
224 return; |
364 | 225 } else if (installerProcess.exitStatus() != QProcess::NormalExit) { |
226 /* Can not Happen. there are only those two values but maybe | |
227 * qt changed.. */ | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
228 emit error (tr("Failed to complete installation.")); |
364 | 229 return; |
230 } | |
231 | |
232 if (installerProcess.exitCode() == 0) { | |
233 qDebug() << "output: " << installerProcess.readAllStandardOutput(); | |
234 } else { | |
235 /* TODO handle errors defined by errorcodes.h */ | |
236 qDebug() << "Installer Process returned: " << installerProcess.exitCode(); | |
237 qDebug() << "output: " << installerProcess.readAllStandardOutput(); | |
238 return; | |
239 } | |
240 #endif | |
388
a507e5f1b999
Emit a signal if no errors happened during installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
387
diff
changeset
|
241 emit installationSuccessful(); |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
242 } |