diff options
author | kh1 <karsten.heimrich@digia.com> | 2014-06-13 12:03:49 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@digia.com> | 2014-06-19 17:30:37 +0200 |
commit | b8c0d6d49b2eb65524e393baf0e15b70e447dcc3 (patch) | |
tree | 83f13f51dac79bd6ee8980271405bfc0ab25e974 /src/libs/installer/adminauthorization_mac.cpp | |
parent | 246e13d6920f1fd869267537d6ccde4149192898 (diff) |
Fix AdminAuthorization implementation.
- execute() does the magic of getting privileges and starting
the process
- hasAdminRights() simply returns if we started privileged..
Change-Id: I0940a02556fe240af0ee7dfb068f7f8009eb683e
Reviewed-by: Karsten Heimrich <karsten.heimrich@digia.com>
Diffstat (limited to 'src/libs/installer/adminauthorization_mac.cpp')
-rw-r--r-- | src/libs/installer/adminauthorization_mac.cpp | 76 |
1 files changed, 20 insertions, 56 deletions
diff --git a/src/libs/installer/adminauthorization_mac.cpp b/src/libs/installer/adminauthorization_mac.cpp index 8b2269181..ead0cbca8 100644 --- a/src/libs/installer/adminauthorization_mac.cpp +++ b/src/libs/installer/adminauthorization_mac.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2012-2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2012-2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Installer Framework. @@ -44,71 +44,31 @@ #include <Security/Authorization.h> #include <Security/AuthorizationTags.h> -#include <QtCore/QStringList> -#include <QtCore/QVector> +#include <QStringList> +#include <QVector> #include <unistd.h> +namespace QInstaller { -// -- AdminAuthorization::Private - -class AdminAuthorization::Private -{ -public: - Private() : auth(0) { } - - AuthorizationRef auth; -}; - - -// -- AdminAuthorization - -AdminAuthorization::AdminAuthorization() - : d(new Private) -{ - AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &d->auth); -} - -AdminAuthorization::~AdminAuthorization() -{ - AuthorizationFree(d->auth, kAuthorizationFlagDestroyRights); - delete d; -} - -bool AdminAuthorization::authorize() +bool AdminAuthorization::execute(QWidget *, const QString &program, const QStringList &arguments) { - if (geteuid() == 0) - setAuthorized(); - - if (isAuthorized()) - return true; - - AuthorizationItem item; - item.name = kAuthorizationRightExecute; - item.valueLength = 0; - item.value = NULL; - item.flags = 0; - - AuthorizationRights rights; - rights.count = 1; - rights.items = &item; + AuthorizationRef authorizationRef; + OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, + kAuthorizationFlagDefaults, &authorizationRef); + if (status != errAuthorizationSuccess) + return false; + AuthorizationItem item = { kAuthorizationRightExecute, 0, 0, 0 }; + AuthorizationRights rights = { 1, &item }; const AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; - const OSStatus result = AuthorizationCopyRights(d->auth, &rights, kAuthorizationEmptyEnvironment, + status = AuthorizationCopyRights(authorizationRef, &rights, kAuthorizationEmptyEnvironment, flags, 0); - if (result != errAuthorizationSuccess) + if (status != errAuthorizationSuccess) return false; - seteuid(0); - setAuthorized(); - emit authorized(); - return true; -} - -bool AdminAuthorization::execute(QWidget *, const QString &program, const QStringList &arguments) -{ QVector<char *> args; QVector<QByteArray> utf8Args; foreach (const QString &argument, arguments) { @@ -118,12 +78,16 @@ bool AdminAuthorization::execute(QWidget *, const QString &program, const QStrin args.push_back(0); const QByteArray utf8Program = program.toUtf8(); - const OSStatus result = AuthorizationExecuteWithPrivileges(d->auth, utf8Program.data(), + status = AuthorizationExecuteWithPrivileges(authorizationRef, utf8Program.data(), kAuthorizationFlagDefaults, args.data(), 0); - return result == errAuthorizationSuccess; + + AuthorizationFree(authorizationRef, kAuthorizationFlagDestroyRights); + return status == errAuthorizationSuccess; } bool AdminAuthorization::hasAdminRights() { return geteuid() == 0; } + +} // namespace QInstaller |