Mercurial > trustbridge
annotate ui/installwrapper.cpp @ 1159:0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Thu, 18 Sep 2014 15:46:49 +0200 |
parents | a7a72353d6d2 |
children | 2a1206932f53 |
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; | |
1159
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
100 SHELLEXECUTEINFOA shExecInfo; |
364 | 101 |
1159
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
102 memset (&shExecInfo, 0, sizeof(SHELLEXECUTEINFOA)); |
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 |
1159
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
112 shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOA); |
285
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()) { |
1159
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
115 shExecInfo.lpVerb = "open"; |
511
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
116 } else { |
1159
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
117 shExecInfo.lpVerb = "runas"; |
511
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
118 } |
1159
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
119 shExecInfo.lpFile = strdup(cinstFileName.toLocal8Bit().constData()); |
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
120 shExecInfo.lpParameters = strdup(parameters.toUtf8().constData()); |
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 |
1159
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
124 if (!ShellExecuteExA(&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); |
1159
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
130 free((void*)shExecInfo.lpFile); |
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
131 free((void*)shExecInfo.lpParameters); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
132 return; |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
133 } |
285
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 retval = WaitForSingleObject(shExecInfo.hProcess, INSTALL_TIMEOUT); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
136 |
1159
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
137 free((void*)shExecInfo.lpFile); |
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
138 free((void*)shExecInfo.lpParameters); |
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
139 shExecInfo.lpFile = NULL; |
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
140 shExecInfo.lpParameters = NULL; |
0ddb173bcd8b
(issue36) Use 8 bit encoding for cinst process start
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1104
diff
changeset
|
141 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
142 if (retval != WAIT_OBJECT_0) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
143 if (retval == WAIT_FAILED) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
144 char* errmsg = getLastErrorMsg(); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
145 QString qerrmsg = QString::fromUtf8(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
146 free(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
147 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
|
148 fclose(vres.fptr); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
149 return; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
150 } else { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
151 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
|
152 fclose(vres.fptr); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
153 return; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
154 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
155 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
156 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
157 if (GetExitCodeProcess(shExecInfo.hProcess, &retval)) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
158 if (retval == STILL_ACTIVE) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
159 qDebug() << "Process still running, huh.."; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
160 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
161 } else { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
162 char* errmsg = getLastErrorMsg(); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
163 QString qerrmsg = QString::fromUtf8(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
164 free(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
165 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
|
166 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
|
167 fclose(vres.fptr); |
387
32309299bec9
Always return after error
Andre Heinecke <andre.heinecke@intevation.de>
parents:
385
diff
changeset
|
168 return; |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
169 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
170 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
|
171 fclose(vres.fptr); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
172 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
173 if (retval != 0) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
174 /* TODO make this nicer */ |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
175 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
|
176 return; |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
177 } |
364 | 178 #else /* WIN32 */ |
179 QProcess installerProcess; | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
180 QStringList parameters; |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
181 |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
182 choicesFile.setAutoRemove(false); |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
183 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
|
184 |
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
|
185 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
|
186 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
|
187 } |
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
188 |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
189 bool sudo_started = false; |
841
216a65d7fc4b
(issue66) Implement is_system_install and use it
Andre Heinecke <andre.heinecke@intevation.de>
parents:
647
diff
changeset
|
190 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
|
191 if (use_sudo) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
192 QStringList sudoPrograms; |
987
b8ae69bcc540
Use pkexec instead of gksudo.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
841
diff
changeset
|
193 sudoPrograms << "pkexec" << "kdesudo" << "sudo"; |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
194 QStringList sudoParams; |
647
51830f4912c2
Minor style fix
Andre Heinecke <andre.heinecke@intevation.de>
parents:
646
diff
changeset
|
195 sudoParams << cinstProcInfo.absoluteFilePath() << parameters; |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
196 installerProcess.setArguments(sudoParams); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
197 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
198 foreach (const QString &sProg, sudoPrograms) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
199 installerProcess.setProgram(sProg); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
200 qDebug() << "Starting process " << sProg <<" params: " << sudoParams; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
201 installerProcess.start(); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
202 if (!installerProcess.waitForStarted() || |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
203 installerProcess.state() == QProcess::NotRunning) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
204 continue; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
205 } else { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
206 sudo_started = true; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
207 break; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
208 } |
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 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
211 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
212 /* Fallback to start without sudo */ |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
213 if (!use_sudo || !sudo_started) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
214 installerProcess.setProgram(cinstProcInfo.absoluteFilePath()); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
215 installerProcess.setArguments(parameters); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
216 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
217 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
218 installerProcess.start(); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
219 if (!installerProcess.waitForStarted() || |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
220 installerProcess.state() == QProcess::NotRunning) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
221 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
|
222 return; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
223 } |
364 | 224 } |
225 | |
226 installerProcess.waitForFinished(); | |
227 | |
228 if (installerProcess.exitStatus() == QProcess::CrashExit) { | |
229 /* Woops */ | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
230 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
|
231 return; |
364 | 232 } else if (installerProcess.exitStatus() != QProcess::NormalExit) { |
233 /* Can not Happen. there are only those two values but maybe | |
234 * qt changed.. */ | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
235 emit error (tr("Failed to complete installation.")); |
364 | 236 return; |
237 } | |
238 | |
239 if (installerProcess.exitCode() == 0) { | |
240 qDebug() << "output: " << installerProcess.readAllStandardOutput(); | |
241 } else { | |
242 /* TODO handle errors defined by errorcodes.h */ | |
243 qDebug() << "Installer Process returned: " << installerProcess.exitCode(); | |
244 qDebug() << "output: " << installerProcess.readAllStandardOutput(); | |
245 return; | |
246 } | |
247 #endif | |
388
a507e5f1b999
Emit a signal if no errors happened during installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
387
diff
changeset
|
248 emit installationSuccessful(); |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
249 } |