From d02ffbdbdb2ce5a0adc5066fe5ff5143114a55ed Mon Sep 17 00:00:00 2001 From: kh1 Date: Wed, 19 Jun 2013 14:00:33 +0200 Subject: Force admin rights (if needed) to be able to write the ini file. Task-number: QTIFW-291 Change-Id: I41089cd8a82b8b53e8ba3c4edd4441afae1d8055 Reviewed-by: Tim Jenssen --- src/libs/installer/packagemanagercore_p.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 652ecb88a..bf15f67bb 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -782,8 +782,17 @@ static QSet readRepositories(QXmlStreamReader &reader, bool isDefaul void PackageManagerCorePrivate::writeMaintenanceConfigFiles() { + bool gainedAdminRights = false; // write current state (variables) to the uninstaller ini file const QString iniPath = targetDir() + QLatin1Char('/') + m_data.settings().uninstallerIniFile(); + { + QFile tmp(iniPath); // force gaining admin rights in case we haven't done already and we need it + if (!tmp.open(QIODevice::ReadWrite) || !tmp.isWritable()) { + if (!m_FSEngineClientHandler->isActive()) // check if nobody did it before... + gainedAdminRights = m_core->gainAdminRights(); + } + tmp.close(); + } QVariantHash variables; QSettingsWrapper cfg(iniPath, QSettingsWrapper::IniFormat); @@ -800,6 +809,8 @@ void PackageManagerCorePrivate::writeMaintenanceConfigFiles() cfg.sync(); if (cfg.status() != QSettingsWrapper::NoError) { + if (gainedAdminRights) + m_core->dropAdminRights(); const QString reason = cfg.status() == QSettingsWrapper::AccessError ? tr("Access error") : tr("Format error"); throw Error(tr("Could not write installer configuration to %1: %2").arg(iniPath, reason)); @@ -841,6 +852,9 @@ void PackageManagerCorePrivate::writeMaintenanceConfigFiles() writer.writeEndElement(); writer.writeEndElement(); } + + if (gainedAdminRights) + m_core->dropAdminRights(); } void PackageManagerCorePrivate::readMaintenanceConfigFiles(const QString &targetDir) -- cgit v1.2.3