annotate ui/installwrapper.cpp @ 856:797aa8d9c785

(issue48) Fallback to HKEY_USERS on hive load failure If the hive can not be loaded it might mean that the user is currently logged on. In that case we can access his registry via HKEY_USERS.
author Andre Heinecke <andre.heinecke@intevation.de>
date Thu, 31 Jul 2014 12:56:26 +0200
parents 216a65d7fc4b
children b8ae69bcc540
rev   line source
404
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 388
diff changeset
1 /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 388
diff changeset
2 * Software engineering by Intevation GmbH
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 388
diff changeset
3 *
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 388
diff changeset
4 * This file is Free Software under the GNU GPL (v>=2)
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 388
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY!
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 388
diff changeset
6 * See LICENSE.txt for details.
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 388
diff changeset
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
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
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
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
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
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
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
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
40 bool InstallWrapper::writeChoices(QTemporaryFile* choicesFile) const
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
41 {
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
42 if (!choicesFile->open()) {
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
43 return false;
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
44 }
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
45
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
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
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
48 return false;
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
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
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
51 return false;
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
52 }
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
53 }
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
54
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
55 choicesFile->close();
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
56
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
57 return true;
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
58 }
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
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
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
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
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
75 if (!writeChoices(&choicesFile)) {
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
76 emit error(tr("Failed to write temporary file."));
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
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
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
80 #ifdef WIN32
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
81 /* QProcess on Windows uses CreateProcess but we have to
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
82 * use the runas shell command to get the UAC prompt if necessary.
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
83 * So we have to handle the process ourself. Starting with
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
84 * shell execute also means that we can not have stdout and stderr
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
85 * redirection. This is the reason we use command line parameters
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
86 * and not a pipe for communication. In debug mode the installer
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
87 * also makes use of output debug string. */
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
88 DWORD retval = 0;
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
89 SHELLEXECUTEINFOW shExecInfo;
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
90
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
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
285
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
97 shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
98 shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
841
216a65d7fc4b (issue66) Implement is_system_install and use it
Andre Heinecke <andre.heinecke@intevation.de>
parents: 647
diff changeset
99 if (!is_admin() || !is_system_install()) {
511
cef732072774 Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents: 440
diff changeset
100 shExecInfo.lpVerb = L"open";
cef732072774 Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents: 440
diff changeset
101 } else {
cef732072774 Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents: 440
diff changeset
102 shExecInfo.lpVerb = L"runas";
cef732072774 Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents: 440
diff changeset
103 }
285
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
104 shExecInfo.lpFile = reinterpret_cast<LPCWSTR> (cinstFileName.utf16());
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
105 shExecInfo.lpParameters = reinterpret_cast<LPCWSTR> (parameters.utf16());
256
84ae353688e0 Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
106
84ae353688e0 Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
107 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters;
84ae353688e0 Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
108
285
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
109 if (!ShellExecuteExW(&shExecInfo)) {
256
84ae353688e0 Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
110 char* errmsg = getLastErrorMsg();
84ae353688e0 Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
111 QString qerrmsg = QString::fromUtf8(errmsg);
84ae353688e0 Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
112 free(errmsg);
285
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
113 emit error(tr("Error executing process: %1").arg(qerrmsg));
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
114 return;
256
84ae353688e0 Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
115 }
285
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
116
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
117 retval = WaitForSingleObject(shExecInfo.hProcess, INSTALL_TIMEOUT);
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
118
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
119 if (retval != WAIT_OBJECT_0) {
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
120 if (retval == WAIT_FAILED) {
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
121 char* errmsg = getLastErrorMsg();
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
122 QString qerrmsg = QString::fromUtf8(errmsg);
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
123 free(errmsg);
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
124 emit error (tr("Error monitoring process: %1").arg(qerrmsg));
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
125 return;
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
126 } else {
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
127 emit error (tr("Certificate installation timed out."));
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
128 return;
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
129 }
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
130 }
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
131
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
132 if (GetExitCodeProcess(shExecInfo.hProcess, &retval)) {
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
133 if (retval == STILL_ACTIVE) {
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
134 qDebug() << "Process still running, huh..";
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 } else {
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("Failed to check process status: %1").arg(qerrmsg));
387
32309299bec9 Always return after error
Andre Heinecke <andre.heinecke@intevation.de>
parents: 385
diff changeset
141 CloseHandle(shExecInfo.hProcess);
32309299bec9 Always return after error
Andre Heinecke <andre.heinecke@intevation.de>
parents: 385
diff changeset
142 return;
285
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
143 }
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
144 CloseHandle(shExecInfo.hProcess);
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
145
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
146 if (retval != 0) {
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
147 /* TODO make this nicer */
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
148 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
149 return;
285
f23e0ccd5d14 Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents: 256
diff changeset
150 }
364
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
151 #else /* WIN32 */
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
152 QProcess installerProcess;
385
72487438a180 More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 364
diff changeset
153 QStringList parameters;
72487438a180 More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 364
diff changeset
154
72487438a180 More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 364
diff changeset
155 choicesFile.setAutoRemove(false);
72487438a180 More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 364
diff changeset
156 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
157
646
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
158 bool sudo_started = false;
841
216a65d7fc4b (issue66) Implement is_system_install and use it
Andre Heinecke <andre.heinecke@intevation.de>
parents: 647
diff changeset
159 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
160 if (use_sudo) {
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
161 QStringList sudoPrograms;
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
162 sudoPrograms << "gksudo" << "kdesudo" << "sudo";
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
163 QStringList sudoParams;
647
51830f4912c2 Minor style fix
Andre Heinecke <andre.heinecke@intevation.de>
parents: 646
diff changeset
164 sudoParams << cinstProcInfo.absoluteFilePath() << parameters;
646
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
165 installerProcess.setArguments(sudoParams);
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
166
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
167 foreach (const QString &sProg, sudoPrograms) {
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
168 installerProcess.setProgram(sProg);
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
169 qDebug() << "Starting process " << sProg <<" params: " << sudoParams;
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
170 installerProcess.start();
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
171 if (!installerProcess.waitForStarted() ||
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
172 installerProcess.state() == QProcess::NotRunning) {
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
173 continue;
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
174 } else {
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
175 sudo_started = true;
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
176 break;
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
177 }
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
178 }
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
179 }
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
180
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
181 /* Fallback to start without sudo */
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
182 if (!use_sudo || !sudo_started) {
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
183 installerProcess.setProgram(cinstProcInfo.absoluteFilePath());
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
184 installerProcess.setArguments(parameters);
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 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters;
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
187 installerProcess.start();
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
188 if (!installerProcess.waitForStarted() ||
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
189 installerProcess.state() == QProcess::NotRunning) {
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
190 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
191 return;
a9a57dc1eb2f Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 511
diff changeset
192 }
364
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
193 }
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
194
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
195 installerProcess.waitForFinished();
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
196
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
197 if (installerProcess.exitStatus() == QProcess::CrashExit) {
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
198 /* Woops */
385
72487438a180 More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 364
diff changeset
199 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
200 return;
364
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
201 } else if (installerProcess.exitStatus() != QProcess::NormalExit) {
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
202 /* Can not Happen. there are only those two values but maybe
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
203 * qt changed.. */
385
72487438a180 More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 364
diff changeset
204 emit error (tr("Failed to complete installation."));
364
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
205 return;
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
206 }
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
207
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
208 if (installerProcess.exitCode() == 0) {
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
209 qDebug() << "output: " << installerProcess.readAllStandardOutput();
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
210 } else {
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
211 /* TODO handle errors defined by errorcodes.h */
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
212 qDebug() << "Installer Process returned: " << installerProcess.exitCode();
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
213 qDebug() << "output: " << installerProcess.readAllStandardOutput();
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
214 return;
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
215 }
dc4efb0a70cb Add Linux support
Andre Heinecke <aheinecke@intevation.de>
parents: 285
diff changeset
216 #endif
388
a507e5f1b999 Emit a signal if no errors happened during installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 387
diff changeset
217 emit installationSuccessful();
256
84ae353688e0 Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
218 }

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