OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/host/installer/mac/uninstaller/remoting_uninstaller.h" | 5 #include "remoting/host/installer/mac/uninstaller/remoting_uninstaller.h" |
6 | 6 |
7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
8 | 8 |
9 #include "base/mac/scoped_authorizationref.h" | 9 #include "base/mac/scoped_authorizationref.h" |
10 #include "remoting/host/constants_mac.h" | 10 #include "remoting/host/constants_mac.h" |
11 | 11 |
12 | 12 |
13 void logOutput(FILE* pipe) { | 13 void logOutput(FILE* pipe) { |
14 char readBuffer[128]; | 14 char readBuffer[128]; |
15 for (;;) { | 15 for (;;) { |
16 long bytesRead = read(fileno(pipe), readBuffer, sizeof(readBuffer) - 1); | 16 long bytesRead = read(fileno(pipe), readBuffer, sizeof(readBuffer) - 1); |
17 if (bytesRead < 1) | 17 if (bytesRead < 1) |
18 break; | 18 break; |
19 readBuffer[bytesRead] = '\0'; | 19 readBuffer[bytesRead] = '\0'; |
20 NSLog(@"%s", readBuffer); | 20 NSLog(@"%s", readBuffer); |
21 } | 21 } |
22 } | 22 } |
23 | 23 |
24 NSArray* convertToNSArray(const char** array) { | 24 NSArray* convertToNSArray(const char** array) { |
25 NSMutableArray* ns_array = [[[NSMutableArray alloc] init] autorelease]; | 25 NSMutableArray* ns_array = [[[NSMutableArray alloc] init] autorelease]; |
26 int i = 0; | 26 int i = 0; |
27 const char* element = array[i++]; | 27 const char* element = array[i++]; |
28 while (element != NULL) { | 28 while (element != nullptr) { |
29 [ns_array addObject:[NSString stringWithUTF8String:element]]; | 29 [ns_array addObject:[NSString stringWithUTF8String:element]]; |
30 element = array[i++]; | 30 element = array[i++]; |
31 } | 31 } |
32 return ns_array; | 32 return ns_array; |
33 } | 33 } |
34 | 34 |
35 @implementation RemotingUninstaller | 35 @implementation RemotingUninstaller |
36 | 36 |
37 // Keystone | 37 // Keystone |
38 const char kKeystoneAdmin[] = "/Library/Google/GoogleSoftwareUpdate/" | 38 const char kKeystoneAdmin[] = "/Library/Google/GoogleSoftwareUpdate/" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 NSLog(@"Exception %@ %@", [exception name], [exception reason]); | 78 NSLog(@"Exception %@ %@", [exception name], [exception reason]); |
79 } | 79 } |
80 } | 80 } |
81 | 81 |
82 - (void)sudoCommand:(const char*)cmd | 82 - (void)sudoCommand:(const char*)cmd |
83 withArguments:(const char**)args | 83 withArguments:(const char**)args |
84 usingAuth:(AuthorizationRef)authRef { | 84 usingAuth:(AuthorizationRef)authRef { |
85 NSArray* arg_array = convertToNSArray(args); | 85 NSArray* arg_array = convertToNSArray(args); |
86 NSLog(@"Executing (as Admin): %s %@", cmd, | 86 NSLog(@"Executing (as Admin): %s %@", cmd, |
87 [arg_array componentsJoinedByString:@" "]); | 87 [arg_array componentsJoinedByString:@" "]); |
88 FILE* pipe = NULL; | 88 FILE* pipe = nullptr; |
89 OSStatus status; | 89 OSStatus status; |
90 status = AuthorizationExecuteWithPrivileges(authRef, cmd, | 90 status = AuthorizationExecuteWithPrivileges(authRef, cmd, |
91 kAuthorizationFlagDefaults, | 91 kAuthorizationFlagDefaults, |
92 (char* const*)args, | 92 (char* const*)args, |
93 &pipe); | 93 &pipe); |
94 | 94 |
95 if (status == errAuthorizationToolExecuteFailure) { | 95 if (status == errAuthorizationToolExecuteFailure) { |
96 NSLog(@"Error errAuthorizationToolExecuteFailure"); | 96 NSLog(@"Error errAuthorizationToolExecuteFailure"); |
97 } else if (status != errAuthorizationSuccess) { | 97 } else if (status != errAuthorizationSuccess) { |
98 NSLog(@"Error while executing %s. Status=%d", | 98 NSLog(@"Error while executing %s. Status=%d", |
99 cmd, static_cast<int>(status)); | 99 cmd, static_cast<int>(status)); |
100 } else { | 100 } else { |
101 logOutput(pipe); | 101 logOutput(pipe); |
102 } | 102 } |
103 | 103 |
104 if (pipe != NULL) | 104 if (pipe != nullptr) |
105 fclose(pipe); | 105 fclose(pipe); |
106 } | 106 } |
107 | 107 |
108 - (void)sudoDelete:(const char*)filename | 108 - (void)sudoDelete:(const char*)filename |
109 usingAuth:(AuthorizationRef)authRef { | 109 usingAuth:(AuthorizationRef)authRef { |
110 const char* args[] = { "-rf", filename, NULL }; | 110 const char* args[] = { "-rf", filename, nullptr }; |
111 [self sudoCommand:"/bin/rm" withArguments:args usingAuth:authRef]; | 111 [self sudoCommand:"/bin/rm" withArguments:args usingAuth:authRef]; |
112 } | 112 } |
113 | 113 |
114 - (void)shutdownService { | 114 - (void)shutdownService { |
115 const char* launchCtl = "/bin/launchctl"; | 115 const char* launchCtl = "/bin/launchctl"; |
116 const char* argsStop[] = { "stop", remoting::kServiceName, NULL }; | 116 const char* argsStop[] = { "stop", remoting::kServiceName, nullptr }; |
117 [self runCommand:launchCtl withArguments:argsStop]; | 117 [self runCommand:launchCtl withArguments:argsStop]; |
118 | 118 |
119 if ([[NSFileManager defaultManager] fileExistsAtPath: | 119 if ([[NSFileManager defaultManager] fileExistsAtPath: |
120 [NSString stringWithUTF8String:remoting::kServicePlistPath]]) { | 120 [NSString stringWithUTF8String:remoting::kServicePlistPath]]) { |
121 const char* argsUnload[] = { "unload", "-w", "-S", "Aqua", | 121 const char* argsUnload[] = { "unload", "-w", "-S", "Aqua", |
122 remoting::kServicePlistPath, NULL }; | 122 remoting::kServicePlistPath, nullptr }; |
123 [self runCommand:launchCtl withArguments:argsUnload]; | 123 [self runCommand:launchCtl withArguments:argsUnload]; |
124 } | 124 } |
125 } | 125 } |
126 | 126 |
127 - (void)keystoneUnregisterUsingAuth:(AuthorizationRef)authRef { | 127 - (void)keystoneUnregisterUsingAuth:(AuthorizationRef)authRef { |
128 const char* args[] = { "--delete", "--productid", kKeystonePID, "-S", NULL }; | 128 const char* args[] = {"--delete", "--productid", kKeystonePID, "-S", nullptr}; |
129 [self sudoCommand:kKeystoneAdmin withArguments:args usingAuth:authRef]; | 129 [self sudoCommand:kKeystoneAdmin withArguments:args usingAuth:authRef]; |
130 } | 130 } |
131 | 131 |
132 - (void)remotingUninstallUsingAuth:(AuthorizationRef)authRef { | 132 - (void)remotingUninstallUsingAuth:(AuthorizationRef)authRef { |
133 // Remove the enabled file before shutting down the service or else it might | 133 // Remove the enabled file before shutting down the service or else it might |
134 // restart itself. | 134 // restart itself. |
135 [self sudoDelete:remoting::kHostEnabledPath usingAuth:authRef]; | 135 [self sudoDelete:remoting::kHostEnabledPath usingAuth:authRef]; |
136 | 136 |
137 [self shutdownService]; | 137 [self shutdownService]; |
138 | 138 |
139 [self sudoDelete:remoting::kServicePlistPath usingAuth:authRef]; | 139 [self sudoDelete:remoting::kServicePlistPath usingAuth:authRef]; |
140 [self sudoDelete:remoting::kHostBinaryPath usingAuth:authRef]; | 140 [self sudoDelete:remoting::kHostBinaryPath usingAuth:authRef]; |
141 [self sudoDelete:remoting::kHostHelperScriptPath usingAuth:authRef]; | 141 [self sudoDelete:remoting::kHostHelperScriptPath usingAuth:authRef]; |
142 [self sudoDelete:remoting::kHostConfigFilePath usingAuth:authRef]; | 142 [self sudoDelete:remoting::kHostConfigFilePath usingAuth:authRef]; |
143 [self sudoDelete:remoting::kPrefPaneFilePath usingAuth:authRef]; | 143 [self sudoDelete:remoting::kPrefPaneFilePath usingAuth:authRef]; |
144 [self sudoDelete:remoting::kLogFilePath usingAuth:authRef]; | 144 [self sudoDelete:remoting::kLogFilePath usingAuth:authRef]; |
145 [self sudoDelete:remoting::kLogFileConfigPath usingAuth:authRef]; | 145 [self sudoDelete:remoting::kLogFileConfigPath usingAuth:authRef]; |
146 [self sudoDelete:remoting::kNativeMessagingManifestPath usingAuth:authRef]; | 146 [self sudoDelete:remoting::kNativeMessagingManifestPath usingAuth:authRef]; |
147 [self sudoDelete:remoting::kBrandedUninstallerPath usingAuth:authRef]; | 147 [self sudoDelete:remoting::kBrandedUninstallerPath usingAuth:authRef]; |
148 [self sudoDelete:remoting::kUnbrandedUninstallerPath usingAuth:authRef]; | 148 [self sudoDelete:remoting::kUnbrandedUninstallerPath usingAuth:authRef]; |
149 | 149 |
150 [self keystoneUnregisterUsingAuth:authRef]; | 150 [self keystoneUnregisterUsingAuth:authRef]; |
151 } | 151 } |
152 | 152 |
153 - (OSStatus)remotingUninstall { | 153 - (OSStatus)remotingUninstall { |
154 base::mac::ScopedAuthorizationRef authRef; | 154 base::mac::ScopedAuthorizationRef authRef; |
155 OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, | 155 OSStatus status = AuthorizationCreate(nullptr, kAuthorizationEmptyEnvironment, |
156 kAuthorizationFlagDefaults, &authRef); | 156 kAuthorizationFlagDefaults, &authRef); |
157 if (status != errAuthorizationSuccess) { | 157 if (status != errAuthorizationSuccess) { |
158 [NSException raise:@"AuthorizationCreate Failure" | 158 [NSException raise:@"AuthorizationCreate Failure" |
159 format:@"Error during AuthorizationCreate status=%d", | 159 format:@"Error during AuthorizationCreate status=%d", |
160 static_cast<int>(status)]; | 160 static_cast<int>(status)]; |
161 } | 161 } |
162 | 162 |
163 AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; | 163 AuthorizationItem right = {kAuthorizationRightExecute, 0, nullptr, 0}; |
164 AuthorizationRights rights = {1, &right}; | 164 AuthorizationRights rights = {1, &right}; |
165 AuthorizationFlags flags = kAuthorizationFlagDefaults | | 165 AuthorizationFlags flags = kAuthorizationFlagDefaults | |
166 kAuthorizationFlagInteractionAllowed | | 166 kAuthorizationFlagInteractionAllowed | |
167 kAuthorizationFlagPreAuthorize | | 167 kAuthorizationFlagPreAuthorize | |
168 kAuthorizationFlagExtendRights; | 168 kAuthorizationFlagExtendRights; |
169 status = AuthorizationCopyRights(authRef, &rights, NULL, flags, NULL); | 169 status = AuthorizationCopyRights(authRef, &rights, nullptr, flags, nullptr); |
170 if (status == errAuthorizationSuccess) { | 170 if (status == errAuthorizationSuccess) { |
171 RemotingUninstaller* uninstaller = | 171 RemotingUninstaller* uninstaller = |
172 [[[RemotingUninstaller alloc] init] autorelease]; | 172 [[[RemotingUninstaller alloc] init] autorelease]; |
173 [uninstaller remotingUninstallUsingAuth:authRef]; | 173 [uninstaller remotingUninstallUsingAuth:authRef]; |
174 } | 174 } |
175 return status; | 175 return status; |
176 } | 176 } |
177 | 177 |
178 @end | 178 @end |
OLD | NEW |