Index: remoting/host/installer/mac/uninstaller/remoting_uninstaller.mm |
=================================================================== |
--- remoting/host/installer/mac/uninstaller/remoting_uninstaller.mm (revision 148248) |
+++ remoting/host/installer/mac/uninstaller/remoting_uninstaller.mm (working copy) |
@@ -7,34 +7,10 @@ |
#import <Cocoa/Cocoa.h> |
#include "base/mac/scoped_authorizationref.h" |
-#include "base/mac/scoped_cftyperef.h" |
#include "remoting/host/constants_mac.h" |
-@implementation RemotingUninstallerAppDelegate |
-NSString* const kLaunchAgentsDir = @"/Library/LaunchAgents"; |
-NSString* const kPrefPaneDir = @"/Library/PreferencePanes"; |
-NSString* const kHelperToolsDir = @"/Library/PrivilegedHelperTools"; |
-NSString* const kApplicationDir = @"/Applications"; |
- |
-NSString* const kPrefPaneName = @kServiceName ".prefPane"; |
-NSString* const kUninstallerName = |
- @"Chrome Remote Desktop Host Uninstaller.app"; |
- |
-// Keystone |
-const char kKeystoneAdmin[] = "/Library/Google/GoogleSoftwareUpdate/" |
- "GoogleSoftwareUpdate.bundle/Contents/MacOS/" |
- "ksadmin"; |
-const char kKeystonePID[] = "com.google.chrome_remote_desktop"; |
- |
-- (void)dealloc { |
- [super dealloc]; |
-} |
- |
-- (void)applicationDidFinishLaunching:(NSNotification*)aNotification { |
-} |
- |
-- (void)logOutput:(FILE*) pipe { |
+void logOutput(FILE* pipe) { |
char readBuffer[128]; |
for (;;) { |
long bytesRead = read(fileno(pipe), readBuffer, sizeof(readBuffer) - 1); |
@@ -45,28 +21,38 @@ |
} |
} |
-- (void)messageBox:(const char*)message { |
- base::mac::ScopedCFTypeRef<CFStringRef> message_ref( |
- CFStringCreateWithCString(NULL, message, (int)strlen(message))); |
- CFOptionFlags result; |
- CFUserNotificationDisplayAlert(0, kCFUserNotificationNoteAlertLevel, |
- NULL, NULL, NULL, |
- CFSTR("Chrome Remote Desktop Uninstaller"), |
- message_ref, NULL, NULL, NULL, &result); |
+NSArray* convertToNSArray(const char** array) { |
+ NSMutableArray* ns_array = [[[NSMutableArray alloc] init] autorelease]; |
+ int i = 0; |
+ const char* element = array[i++]; |
+ while (element != NULL) { |
+ [ns_array addObject:[NSString stringWithUTF8String:element]]; |
+ element = array[i++]; |
+ } |
+ return ns_array; |
} |
--(void)runCommand:(NSString*)cmd |
- withArguments:(NSArray*)args { |
+@implementation RemotingUninstaller |
+ |
+// Keystone |
+const char kKeystoneAdmin[] = "/Library/Google/GoogleSoftwareUpdate/" |
+ "GoogleSoftwareUpdate.bundle/Contents/MacOS/" |
+ "ksadmin"; |
+const char kKeystonePID[] = "com.google.chrome_remote_desktop"; |
+ |
+- (void)runCommand:(const char*)cmd |
+ withArguments:(const char**)args { |
NSTask* task; |
NSPipe* output = [NSPipe pipe]; |
NSString* result; |
- NSLog(@"Executing: %@ %@", cmd, [args componentsJoinedByString:@" "]); |
+ NSArray* arg_array = convertToNSArray(args); |
+ NSLog(@"Executing: %s %@", cmd, [arg_array componentsJoinedByString:@" "]); |
@try { |
task = [[[NSTask alloc] init] autorelease]; |
- [task setLaunchPath:cmd]; |
- [task setArguments:args]; |
+ [task setLaunchPath:[NSString stringWithUTF8String:cmd]]; |
+ [task setArguments:arg_array]; |
[task setStandardInput:[NSPipe pipe]]; |
[task setStandardOutput:output]; |
[task launch]; |
@@ -96,14 +82,7 @@ |
- (void)sudoCommand:(const char*)cmd |
withArguments:(const char**)args |
usingAuth:(AuthorizationRef)authRef { |
- |
- NSMutableArray* arg_array = [[[NSMutableArray alloc] init] autorelease]; |
- int i = 0; |
- const char* arg = args[i++]; |
- while (arg != NULL) { |
- [arg_array addObject:[NSString stringWithUTF8String:arg]]; |
- arg = args[i++]; |
- } |
+ NSArray* arg_array = convertToNSArray(args); |
NSLog(@"Executing (as Admin): %s %@", cmd, |
[arg_array componentsJoinedByString:@" "]); |
FILE* pipe = NULL; |
@@ -118,7 +97,7 @@ |
} else if (status != errAuthorizationSuccess) { |
NSLog(@"Error while executing %s. Status=%lx", cmd, status); |
} else { |
- [self logOutput:pipe]; |
+ logOutput(pipe); |
} |
if (pipe != NULL) |
@@ -131,119 +110,64 @@ |
[self sudoCommand:"/bin/rm" withArguments:args usingAuth:authRef]; |
} |
--(void)shutdownService { |
- NSString* launchCtl = @"/bin/launchctl"; |
- NSArray* argsStop = [NSArray arrayWithObjects:@"stop", |
- @kServiceName, nil]; |
+- (void)shutdownService { |
+ const char* launchCtl = "/bin/launchctl"; |
+ const char* argsStop[] = { "stop", remoting::kServiceName, NULL }; |
[self runCommand:launchCtl withArguments:argsStop]; |
- NSString* plist = [NSString stringWithFormat:@"%@/%@.plist", |
- kLaunchAgentsDir, @kServiceName]; |
- if ([[NSFileManager defaultManager] fileExistsAtPath:plist]) { |
- NSArray* argsUnload = [NSArray arrayWithObjects:@"unload", |
- @"-w", @"-S", @"Aqua", plist, nil]; |
+ if ([[NSFileManager defaultManager] fileExistsAtPath: |
+ [NSString stringWithUTF8String:remoting::kServicePlistPath]]) { |
+ const char* argsUnload[] = { "unload", "-w", "-S", "Aqua", |
+ remoting::kServicePlistPath, NULL }; |
[self runCommand:launchCtl withArguments:argsUnload]; |
} |
} |
--(void)keystoneUnregisterUsingAuth:(AuthorizationRef)authRef { |
+- (void)keystoneUnregisterUsingAuth:(AuthorizationRef)authRef { |
const char* args[] = { "--delete", "--productid", kKeystonePID, "-S", NULL }; |
[self sudoCommand:kKeystoneAdmin withArguments:args usingAuth:authRef]; |
} |
--(void)remotingUninstallUsingAuth:(AuthorizationRef)authRef { |
- NSString* host_enabled = [NSString stringWithFormat:@"%@/%@.me2me_enabled", |
- kHelperToolsDir, @kServiceName]; |
- [self sudoDelete:[host_enabled UTF8String] usingAuth:authRef]; |
+- (void)remotingUninstallUsingAuth:(AuthorizationRef)authRef { |
+ // Remove the enabled file before shutting down the service or else it might |
+ // restart itself. |
+ [self sudoDelete:remoting::kHostEnabledPath usingAuth:authRef]; |
[self shutdownService]; |
- NSString* plist = [NSString stringWithFormat:@"%@/%@.plist", |
- kLaunchAgentsDir, @kServiceName]; |
- [self sudoDelete:[plist UTF8String] usingAuth:authRef]; |
+ [self sudoDelete:remoting::kServicePlistPath usingAuth:authRef]; |
+ [self sudoDelete:remoting::kHostBinaryPath usingAuth:authRef]; |
+ [self sudoDelete:remoting::kHostHelperScriptPath usingAuth:authRef]; |
+ [self sudoDelete:remoting::kHostConfigFilePath usingAuth:authRef]; |
+ [self sudoDelete:remoting::kPrefPaneFilePath usingAuth:authRef]; |
+ [self sudoDelete:remoting::kBrandedUninstallerPath usingAuth:authRef]; |
+ [self sudoDelete:remoting::kUnbrandedUninstallerPath usingAuth:authRef]; |
- NSString* host_binary = [NSString stringWithFormat:@"%@/%@.me2me_host.app", |
- kHelperToolsDir, @kServiceName]; |
- [self sudoDelete:[host_binary UTF8String] usingAuth:authRef]; |
- |
- NSString* host_script = [NSString stringWithFormat:@"%@/%@.me2me.sh", |
- kHelperToolsDir, @kServiceName]; |
- [self sudoDelete:[host_script UTF8String] usingAuth:authRef]; |
- |
- NSString* auth = [NSString stringWithFormat:@"%@/%@.json", |
- kHelperToolsDir, @kServiceName]; |
- [self sudoDelete:[auth UTF8String] usingAuth:authRef]; |
- |
- NSString* prefpane = [NSString stringWithFormat:@"%@/%@", |
- kPrefPaneDir, kPrefPaneName]; |
- [self sudoDelete:[prefpane UTF8String] usingAuth:authRef]; |
- |
- NSString* uninstaller = [NSString stringWithFormat:@"%@/%@", |
- kApplicationDir, kUninstallerName]; |
- [self sudoDelete:[uninstaller UTF8String] usingAuth:authRef]; |
- |
[self keystoneUnregisterUsingAuth:authRef]; |
} |
-- (IBAction)uninstall:(NSButton*)sender { |
+- (OSStatus)remotingUninstall { |
base::mac::ScopedAuthorizationRef authRef; |
+ OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, |
+ kAuthorizationFlagDefaults, &authRef); |
+ if (status != errAuthorizationSuccess) { |
+ [NSException raise:@"AuthorizationCreate Failure" |
+ format:@"Error during AuthorizationCreate status=%ld", status]; |
+ } |
- NSLog(@"Chrome Remote Desktop uninstall starting."); |
- |
- @try { |
- OSStatus status; |
- status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, |
- kAuthorizationFlagDefaults, &authRef); |
- if (status != errAuthorizationSuccess) { |
- [NSException raise:@"AuthorizationCreate Failure" |
- format:@"Error during AuthorizationCreate status=%ld", status]; |
- } |
- |
- AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; |
- AuthorizationRights rights = {1, &right}; |
- AuthorizationFlags flags = kAuthorizationFlagDefaults | |
- kAuthorizationFlagInteractionAllowed | |
- kAuthorizationFlagPreAuthorize | |
- kAuthorizationFlagExtendRights; |
- status = AuthorizationCopyRights(authRef, &rights, NULL, flags, NULL); |
- if (status == errAuthorizationCanceled) { |
- NSLog(@"Chrome Remote Desktop Host uninstall canceled."); |
- const char* message = "Chrome Remote Desktop Host uninstall canceled."; |
- [self messageBox:message]; |
- } else if (status == errAuthorizationSuccess) { |
- [self remotingUninstallUsingAuth:authRef]; |
- |
- NSLog(@"Chrome Remote Desktop Host uninstall complete."); |
- const char* message = |
- "Chrome Remote Desktop Host was successfully uninstalled."; |
- [self messageBox:message]; |
- } else { |
- [NSException raise:@"AuthorizationCopyRights Failure" |
- format:@"Error during AuthorizationCopyRights status=%ld", status]; |
- } |
+ AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; |
+ AuthorizationRights rights = {1, &right}; |
+ AuthorizationFlags flags = kAuthorizationFlagDefaults | |
+ kAuthorizationFlagInteractionAllowed | |
+ kAuthorizationFlagPreAuthorize | |
+ kAuthorizationFlagExtendRights; |
+ status = AuthorizationCopyRights(authRef, &rights, NULL, flags, NULL); |
+ if (status == errAuthorizationSuccess) { |
+ RemotingUninstaller* uninstaller = |
+ [[[RemotingUninstaller alloc] init] autorelease]; |
+ [uninstaller remotingUninstallUsingAuth:authRef]; |
} |
- @catch (NSException* exception) { |
- NSLog(@"Exception %@ %@", [exception name], [exception reason]); |
- const char* message = |
- "Error! Unable to uninstall Chrome Remote Desktop Host."; |
- [self messageBox:message]; |
- } |
- |
- [NSApp terminate:self]; |
+ return status; |
} |
-- (IBAction)cancel:(id)sender { |
- [NSApp terminate:self]; |
-} |
- |
-- (IBAction)handleMenuClose:(NSMenuItem*)sender { |
- [NSApp terminate:self]; |
-} |
- |
@end |
- |
-int main(int argc, char* argv[]) |
-{ |
- return NSApplicationMain(argc, (const char**)argv); |
-} |
- |