Mercurial > trustbridge
annotate ui/installwrapper.cpp @ 1071:fc4e1fe4e4d4
(issue116) Sign binaries with test certificate if RELESE_BUILD option is not used
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Wed, 10 Sep 2014 17:52:11 +0200 |
parents | 317ee9dc4684 |
children | a12e6172d82c |
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" |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
19 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
20 #define INSTALL_TIMEOUT 3600000 /* Wait up to an hour */ |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
21 |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
22 InstallWrapper::InstallWrapper(QObject* parent, |
364 | 23 const QString& path, const QStringList& choices): |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
24 QThread(parent), |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
25 mCertListFile(path), |
364 | 26 mChoices(choices) |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
27 { |
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 QFileInfo getCinstProcInfo() { |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
31 QFileInfo fi(QCoreApplication::applicationFilePath()); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
32 QDir myDir = fi.absoluteDir(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
33 QString instProcName = "cinst"; |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
34 if (!fi.suffix().isEmpty()) { |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
35 instProcName += "." + fi.suffix(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
36 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
37 return QFileInfo(myDir.absoluteFilePath(instProcName)); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
38 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
39 |
364 | 40 bool InstallWrapper::writeChoices(QTemporaryFile* choicesFile) const |
41 { | |
42 if (!choicesFile->open()) { | |
43 return false; | |
44 } | |
45 | |
46 foreach (const QString &b64data, mChoices) { | |
440
a7163018de2f
Fixed check on return value when trying to write temp file.
Raimund Renkert <rrenkert@intevation.de>
parents:
404
diff
changeset
|
47 if (choicesFile->write(b64data.toLatin1()) == -1) { |
364 | 48 return false; |
49 } | |
440
a7163018de2f
Fixed check on return value when trying to write temp file.
Raimund Renkert <rrenkert@intevation.de>
parents:
404
diff
changeset
|
50 if (choicesFile->write("\n") == -1) { |
364 | 51 return false; |
52 } | |
53 } | |
54 | |
55 choicesFile->close(); | |
56 | |
57 return true; | |
58 } | |
59 | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
60 void InstallWrapper::run() |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
61 { |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
62 /* 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
|
63 * cancled the UAC elevation */ |
364 | 64 QTemporaryFile choicesFile; |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
65 QFileInfo cinstProcInfo = getCinstProcInfo(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
66 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
67 QString cinstFileName = QDir::toNativeSeparators( |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
68 getCinstProcInfo().absoluteFilePath()); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
69 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
70 if (!cinstProcInfo.isExecutable()) { |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
71 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
|
72 return; |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
73 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
74 |
364 | 75 if (!writeChoices(&choicesFile)) { |
76 emit error(tr("Failed to write temporary file.")); | |
77 return; | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
78 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
79 |
364 | 80 #ifdef WIN32 |
81 /* QProcess on Windows uses CreateProcess but we have to | |
82 * use the runas shell command to get the UAC prompt if necessary. | |
83 * So we have to handle the process ourself. Starting with | |
84 * shell execute also means that we can not have stdout and stderr | |
85 * redirection. This is the reason we use command line parameters | |
86 * and not a pipe for communication. In debug mode the installer | |
87 * also makes use of output debug string. */ | |
88 DWORD retval = 0; | |
89 SHELLEXECUTEINFOW shExecInfo; | |
90 | |
91 memset (&shExecInfo, 0, sizeof(SHELLEXECUTEINFOW)); | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
92 |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
93 /* 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
|
94 QString parameters = "\"list=" + mCertListFile + |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
95 "\" \"choices=" + choicesFile.fileName() + "\""; |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
96 |
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
|
97 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
|
98 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
|
99 } |
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
100 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
101 shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
102 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
|
103 if (!is_system_install()) { |
511
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
104 shExecInfo.lpVerb = L"open"; |
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
105 } else { |
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
106 shExecInfo.lpVerb = L"runas"; |
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
107 } |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
108 shExecInfo.lpFile = reinterpret_cast<LPCWSTR> (cinstFileName.utf16()); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
109 shExecInfo.lpParameters = reinterpret_cast<LPCWSTR> (parameters.utf16()); |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
110 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
111 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters; |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
112 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
113 if (!ShellExecuteExW(&shExecInfo)) { |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
114 char* errmsg = getLastErrorMsg(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
115 QString qerrmsg = QString::fromUtf8(errmsg); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
116 free(errmsg); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
117 emit error(tr("Error executing process: %1").arg(qerrmsg)); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
118 return; |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
119 } |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
120 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
121 retval = WaitForSingleObject(shExecInfo.hProcess, INSTALL_TIMEOUT); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
122 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
123 if (retval != WAIT_OBJECT_0) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
124 if (retval == WAIT_FAILED) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
125 char* errmsg = getLastErrorMsg(); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
126 QString qerrmsg = QString::fromUtf8(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
127 free(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
128 emit error (tr("Error monitoring process: %1").arg(qerrmsg)); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
129 return; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
130 } else { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
131 emit error (tr("Certificate installation timed out.")); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
132 return; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
133 } |
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 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
136 if (GetExitCodeProcess(shExecInfo.hProcess, &retval)) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
137 if (retval == STILL_ACTIVE) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
138 qDebug() << "Process still running, huh.."; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
139 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
140 } else { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
141 char* errmsg = getLastErrorMsg(); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
142 QString qerrmsg = QString::fromUtf8(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
143 free(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
144 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
|
145 CloseHandle(shExecInfo.hProcess); |
32309299bec9
Always return after error
Andre Heinecke <andre.heinecke@intevation.de>
parents:
385
diff
changeset
|
146 return; |
285
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 CloseHandle(shExecInfo.hProcess); |
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 (retval != 0) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
151 /* TODO make this nicer */ |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
152 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
|
153 return; |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
154 } |
364 | 155 #else /* WIN32 */ |
156 QProcess installerProcess; | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
157 QStringList parameters; |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
158 |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
159 choicesFile.setAutoRemove(false); |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
160 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
|
161 |
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
|
162 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
|
163 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
|
164 } |
317ee9dc4684
(issue46) Make debug output optional in cinst and mozilla and propagate its setting.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
1003
diff
changeset
|
165 |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
166 bool sudo_started = false; |
841
216a65d7fc4b
(issue66) Implement is_system_install and use it
Andre Heinecke <andre.heinecke@intevation.de>
parents:
647
diff
changeset
|
167 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
|
168 if (use_sudo) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
169 QStringList sudoPrograms; |
987
b8ae69bcc540
Use pkexec instead of gksudo.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
841
diff
changeset
|
170 sudoPrograms << "pkexec" << "kdesudo" << "sudo"; |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
171 QStringList sudoParams; |
647
51830f4912c2
Minor style fix
Andre Heinecke <andre.heinecke@intevation.de>
parents:
646
diff
changeset
|
172 sudoParams << cinstProcInfo.absoluteFilePath() << parameters; |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
173 installerProcess.setArguments(sudoParams); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
174 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
175 foreach (const QString &sProg, sudoPrograms) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
176 installerProcess.setProgram(sProg); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
177 qDebug() << "Starting process " << sProg <<" params: " << sudoParams; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
178 installerProcess.start(); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
179 if (!installerProcess.waitForStarted() || |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
180 installerProcess.state() == QProcess::NotRunning) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
181 continue; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
182 } else { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
183 sudo_started = true; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
184 break; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
185 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
186 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
187 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
188 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
189 /* Fallback to start without sudo */ |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
190 if (!use_sudo || !sudo_started) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
191 installerProcess.setProgram(cinstProcInfo.absoluteFilePath()); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
192 installerProcess.setArguments(parameters); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
193 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
194 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
195 installerProcess.start(); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
196 if (!installerProcess.waitForStarted() || |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
197 installerProcess.state() == QProcess::NotRunning) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
198 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
|
199 return; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
200 } |
364 | 201 } |
202 | |
203 installerProcess.waitForFinished(); | |
204 | |
205 if (installerProcess.exitStatus() == QProcess::CrashExit) { | |
206 /* Woops */ | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
207 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
|
208 return; |
364 | 209 } else if (installerProcess.exitStatus() != QProcess::NormalExit) { |
210 /* Can not Happen. there are only those two values but maybe | |
211 * qt changed.. */ | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
212 emit error (tr("Failed to complete installation.")); |
364 | 213 return; |
214 } | |
215 | |
216 if (installerProcess.exitCode() == 0) { | |
217 qDebug() << "output: " << installerProcess.readAllStandardOutput(); | |
218 } else { | |
219 /* TODO handle errors defined by errorcodes.h */ | |
220 qDebug() << "Installer Process returned: " << installerProcess.exitCode(); | |
221 qDebug() << "output: " << installerProcess.readAllStandardOutput(); | |
222 return; | |
223 } | |
224 #endif | |
388
a507e5f1b999
Emit a signal if no errors happened during installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
387
diff
changeset
|
225 emit installationSuccessful(); |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
226 } |