X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fthecheat;a=blobdiff_plain;f=AppController.m;fp=AppController.m;h=1adfbaf6c222055befad09cfea81c8bc358dd6fd;hp=303b1eb9d96e9eeb86d36dec0af23639ce1a256c;hb=ad02580588e2ca41f15ba8f9bd084561d8d485c2;hpb=0a3d732da131b4505c0dbf2330c4667a29ce90e8 diff --git a/AppController.m b/AppController.m index 303b1eb..1adfbaf 100644 --- a/AppController.m +++ b/AppController.m @@ -25,13 +25,6 @@ #import "HelpController.h" #import "PreferenceController.h" -// Privilage elevation libs -#include -#include -#include -#include -#include - @implementation AppController @@ -71,90 +64,13 @@ - (id)init { - if ( self = [super init] ) - { - if( geteuid() != 0 ) - { - [self launchAuthPrgm]; - [self setDelegate:self]; - } + if ( self = [super init] ) { + [self setDelegate:self]; } - if( geteuid() != 0 ) - { - NSRunAlertPanel(@"The Cheat must be run as root,", - @"Due to a limitation of Leopard, the application needs elevated privileges to run.", - @"Exit", nil, nil ); - [self terminate: 0]; - } - return self; } -- (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; -} - (void)dealloc { @@ -163,14 +79,35 @@ [super dealloc]; } +// http://vgable.com/blog/2008/10/05/restarting-your-cocoa-application/ +- (void)restartOurselves +{ + NSString *killArg1AndOpenArg2Script = @"kill -9 $1 \n open \"$2\""; + NSString *ourPID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]]; + NSString *pathToUs = [[NSBundle mainBundle] bundlePath]; + + NSArray *shArgs = [NSArray arrayWithObjects:@"-c", killArg1AndOpenArg2Script, @"", ourPID, pathToUs, nil]; + NSTask *restartTask = [NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:shArgs]; + [restartTask waitUntilExit]; + NSLog(@"*** ERROR: %@ should have been terminated, but we are still running", pathToUs); + assert(!"We should not be running!"); +} + +- (BOOL) checkExecutablePermissions { + NSDictionary *applicationAttributes = [[NSFileManager defaultManager] fileAttributesAtPath:[[NSBundle mainBundle] executablePath] traverseLink: YES]; + + // We expect 2755 as octal (1517 as decimal, -rwxr-sr-x as extended notation) + return ([applicationAttributes filePosixPermissions] == 1517 && [[applicationAttributes fileGroupOwnerAccountName] isEqualToString: @"procmod"]); +} /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #pragma mark NSApplication Delegate /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + [NSApp activateIgnoringOtherApps:YES]; + // check if this is the first launch if ( ![[NSUserDefaults standardUserDefaults] boolForKey:TCFirstLaunchPref] ) { // FIRST LAUNCH @@ -183,7 +120,7 @@ ChazCheckForUpdate( TCUpdateCheckURL, NO ); } - // automaticall start the cheat server if the pref is set + // automatically start the cheat server if the pref is set if ( [[NSUserDefaults standardUserDefaults] boolForKey:TCRunServerPref] ) { if ( ![self startCheatServer] ) { // inform the user that the server won't start