]> Dogcows Code - chaz/thecheat/blobdiff - AppController.m
The Cheat 1.2.3
[chaz/thecheat] / AppController.m
index 303b1eb9d96e9eeb86d36dec0af23639ce1a256c..1adfbaf6c222055befad09cfea81c8bc358dd6fd 100644 (file)
 #import "HelpController.h"
 #import "PreferenceController.h"
 
-// Privilage elevation libs
-#include <security/authorization.h>
-#include <security/authorizationdb.h>
-#include <security/authorizationtags.h>
-#include <sys/types.h>
-#include <unistd.h>
-
 @implementation AppController
 
 
 
 - (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
 {
        [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
                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
This page took 0.020575 seconds and 4 git commands to generate.