#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