X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fthecheat;a=blobdiff_plain;f=main.m;fp=main.m;h=7075d5dff800dfcd9b569558a32c3f2185b07d99;hp=68dd64f821bb9d8e6688ec68adf4e37e2278ce7e;hb=ad02580588e2ca41f15ba8f9bd084561d8d485c2;hpb=0a3d732da131b4505c0dbf2330c4667a29ce90e8 diff --git a/main.m b/main.m index 68dd64f..7075d5d 100644 --- a/main.m +++ b/main.m @@ -19,9 +19,71 @@ // #import +#import +#import +#import #include "ChazLog.h" -int main( int argc, const char *argv[] ) +void authMe(char * FullPathToMe) +{ + // get authorization as root + + OSStatus myStatus; + + // set up Authorization Item + AuthorizationItem myItems[1]; + myItems[0].name = kAuthorizationRightExecute; + myItems[0].valueLength = 0; + myItems[0].value = NULL; + myItems[0].flags = 0; + + // Set up Authorization Rights + AuthorizationRights myRights; + myRights.count = sizeof (myItems) / sizeof (myItems[0]); + myRights.items = myItems; + + // set up Authorization Flags + AuthorizationFlags myFlags; + myFlags = + kAuthorizationFlagDefaults | + kAuthorizationFlagInteractionAllowed | + kAuthorizationFlagExtendRights; + + // Create an Authorization Ref using Objects above. NOTE: Login bod comes up with this call. + AuthorizationRef myAuthorizationRef; + myStatus = AuthorizationCreate (&myRights, kAuthorizationEmptyEnvironment, myFlags, &myAuthorizationRef); + + if (myStatus == errAuthorizationSuccess) + { + // prepare communication path - used to signal that process is loaded + FILE *myCommunicationsPipe = NULL; + char myReadBuffer[] = " "; + + // run this app in GOD mode by passing authorization ref and comm pipe (asynchoronous call to external application) + myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef,FullPathToMe,kAuthorizationFlagDefaults,nil,&myCommunicationsPipe); + + // external app is running asynchronously - it will send to stdout when loaded + if (myStatus == errAuthorizationSuccess) + { + read (fileno (myCommunicationsPipe), myReadBuffer, sizeof (myReadBuffer)); + fclose(myCommunicationsPipe); + } + + // release authorization reference + myStatus = AuthorizationFree (myAuthorizationRef, kAuthorizationFlagDestroyRights); + } +} + +bool amIWorthy(void) +{ + // running as root? + AuthorizationRef myAuthRef; + OSStatus stat = AuthorizationCopyPrivilegedReference(&myAuthRef,kAuthorizationFlagDefaults); + + return stat == errAuthorizationSuccess; +} + +int main( int argc, char *argv[] ) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; @@ -32,7 +94,18 @@ int main( int argc, const char *argv[] ) [pool release]; - return NSApplicationMain( argc, (const char **) argv ); + if (amIWorthy()) + { + printf("Don't forget to flush! ;-) "); // signal back to close caller + fflush(stdout); + + return NSApplicationMain(argc, (const char **) argv); + } + else + { + authMe(argv[0]); + return 0; + } ChazDebugCleanup(); } \ No newline at end of file