lundi 18 février 2008

Autorisation sur Mac Os X

Après avoir galéré un bon moment, voici comment faire pour autorisé votre application à s'exécuter en temps que root. On appel cela parfois du self-authorization. Je vous livre le code à ajouter dans votre objet principal.
Language : Objective-C

Commencer par ajouter le FrameWorks "Security.frameworks" qui se trouve dans "/System/Library/Frameworks/".
Les entêtes à ajouter dans le fichier .m de votre controleur principal :
#include <security/authorization.h>
#include <security/authorizationdb.h>
#include <security/authorizationtags.h>

#include <sys/types.h>
#include <unistd.h>


Les deux fonctions qui permettrons de demander le mot de passe à l'utilisateur :
- (int) preAuthorize
{
int err;
AuthorizationFlags authFlags;


NSLog (@"MyWindowController: preAuthorize");

if (_authRef)
return errAuthorizationSuccess;

NSLog (@"MyWindowController: preAuthorize: ** calling AuthorizationCreate...**\n");

authFlags = kAuthorizationFlagDefaults;
err = AuthorizationCreate (NULL, kAuthorizationEmptyEnvironment, authFlags, &_authRef);
if (err != errAuthorizationSuccess)
return err;

NSLog (@"MyWindowController: preAuthorize: ** calling AuthorizationCopyRights...**\n");

_authItem.name = kAuthorizationRightExecute;
_authItem.valueLength = 0;
_authItem.value = NULL;
_authItem.flags = 0;
_authRights.count = 1;
_authRights.items = (AuthorizationItem*) malloc (sizeof (_authItem));
memcpy (&_authRights.items[0], &_authItem, sizeof (_authItem));
authFlags = kAuthorizationFlagDefaults
| kAuthorizationFlagExtendRights
| kAuthorizationFlagInteractionAllowed
| kAuthorizationFlagPreAuthorize;
err = AuthorizationCopyRights (_authRef, &_authRights, kAuthorizationEmptyEnvironment, authFlags, NULL);

return err;
}

- (int) launchAuthPrgm
{
AuthorizationFlags authFlags;
int err;

// path
NSString * path = [[NSBundle mainBundle] executablePath];
if (![[NSFileManager defaultManager] isExecutableFileAtPath: path])
return -1;

// auth

if (!_authRef)
{
err = [self preAuthorize];
if (err != errAuthorizationSuccess)
return err;
}

// launch

NSLog (@"MyWindowController: launchWithPath: ** calling AuthorizationExecuteWithPrivileges...**\n");
authFlags = kAuthorizationFlagDefaults;
err = AuthorizationExecuteWithPrivileges (_authRef, [path cString], authFlags, NULL, NULL);
if(err==0) [NSApp terminate:self];

return err;
}
Ajouter ce code dans la fonction - (id) init
if(geteuid()!=0){
[self launchAuthPrgm];
}
Ce code lance l'authentification si l'utilisateur réel d'exécution du logiciel n'est pas Root.
Enfin, pour eviter les erreurs ou les avertissement lors de la compilation, il faut ajouter dans le fichier d'entête (.h) les lignes suivantes :

AuthorizationRef _authRef;
AuthorizationItem _authItem;
AuthorizationRights _authRights;

- (int) preAuthorize;
- (int) launchAuthPrgm;
Maintenant, à vous de développer !

1 commentaire:

crashdump a dit…

Merci beaucoup, ça fonctionne a merveille.. et ça met fin a une grosse prise de tête :)