| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #import "chrome/browser/cocoa/keystone_glue.h" | 5 #import "chrome/browser/cocoa/keystone_glue.h" |
| 6 | 6 |
| 7 #include <sys/param.h> | 7 #include <sys/param.h> |
| 8 #include <sys/mount.h> | 8 #include <sys/mount.h> |
| 9 | 9 |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 NSString* const KSRegistrationExistenceCheckerTypeKey = @"ExistenceCheckerType"; | 42 NSString* const KSRegistrationExistenceCheckerTypeKey = @"ExistenceCheckerType"; |
| 43 NSString* const KSRegistrationExistenceCheckerStringKey = | 43 NSString* const KSRegistrationExistenceCheckerStringKey = |
| 44 @"ExistenceCheckerString"; | 44 @"ExistenceCheckerString"; |
| 45 NSString* const KSRegistrationServerURLStringKey = @"URLString"; | 45 NSString* const KSRegistrationServerURLStringKey = @"URLString"; |
| 46 NSString* const KSRegistrationPreserveTrustedTesterTokenKey = @"PreserveTTT"; | 46 NSString* const KSRegistrationPreserveTrustedTesterTokenKey = @"PreserveTTT"; |
| 47 NSString* const KSRegistrationTagKey = @"Tag"; | 47 NSString* const KSRegistrationTagKey = @"Tag"; |
| 48 NSString* const KSRegistrationTagPathKey = @"TagPath"; | 48 NSString* const KSRegistrationTagPathKey = @"TagPath"; |
| 49 NSString* const KSRegistrationTagKeyKey = @"TagKey"; | 49 NSString* const KSRegistrationTagKeyKey = @"TagKey"; |
| 50 NSString* const KSRegistrationBrandPathKey = @"BrandPath"; | 50 NSString* const KSRegistrationBrandPathKey = @"BrandPath"; |
| 51 NSString* const KSRegistrationBrandKeyKey = @"BrandKey"; | 51 NSString* const KSRegistrationBrandKeyKey = @"BrandKey"; |
| 52 NSString* const KSRegistrationVersionPathKey = @"VersionPath"; |
| 53 NSString* const KSRegistrationVersionKeyKey = @"VersionKey"; |
| 52 | 54 |
| 53 NSString* const KSRegistrationDidCompleteNotification = | 55 NSString* const KSRegistrationDidCompleteNotification = |
| 54 @"KSRegistrationDidCompleteNotification"; | 56 @"KSRegistrationDidCompleteNotification"; |
| 55 NSString* const KSRegistrationPromotionDidCompleteNotification = | 57 NSString* const KSRegistrationPromotionDidCompleteNotification = |
| 56 @"KSRegistrationPromotionDidCompleteNotification"; | 58 @"KSRegistrationPromotionDidCompleteNotification"; |
| 57 | 59 |
| 58 NSString* const KSRegistrationCheckForUpdateNotification = | 60 NSString* const KSRegistrationCheckForUpdateNotification = |
| 59 @"KSRegistrationCheckForUpdateNotification"; | 61 @"KSRegistrationCheckForUpdateNotification"; |
| 60 NSString* KSRegistrationStatusKey = @"Status"; | 62 NSString* KSRegistrationStatusKey = @"Status"; |
| 61 NSString* KSRegistrationUpdateCheckErrorKey = @"Error"; | 63 NSString* KSRegistrationUpdateCheckErrorKey = @"Error"; |
| 62 | 64 |
| 63 NSString* const KSRegistrationStartUpdateNotification = | 65 NSString* const KSRegistrationStartUpdateNotification = |
| 64 @"KSRegistrationStartUpdateNotification"; | 66 @"KSRegistrationStartUpdateNotification"; |
| 65 NSString* const KSUpdateCheckSuccessfulKey = @"CheckSuccessful"; | 67 NSString* const KSUpdateCheckSuccessfulKey = @"CheckSuccessful"; |
| 66 NSString* const KSUpdateCheckSuccessfullyInstalledKey = | 68 NSString* const KSUpdateCheckSuccessfullyInstalledKey = |
| 67 @"SuccessfullyInstalled"; | 69 @"SuccessfullyInstalled"; |
| 68 | 70 |
| 69 NSString* const KSRegistrationRemoveExistingTag = @""; | 71 NSString* const KSRegistrationRemoveExistingTag = @""; |
| 70 #define KSRegistrationPreserveExistingTag nil | 72 #define KSRegistrationPreserveExistingTag nil |
| 71 | 73 |
| 72 // Constants for the brand file (uses an external file so it can survive updates | 74 // Constants for the brand file (uses an external file so it can survive |
| 73 // to Chrome. | 75 // updates to Chrome.) |
| 74 | 76 |
| 75 #if defined(GOOGLE_CHROME_BUILD) | 77 #if defined(GOOGLE_CHROME_BUILD) |
| 76 #define kBrandFileName @"Google Chrome Brand.plist"; | 78 #define kBrandFileName @"Google Chrome Brand.plist"; |
| 77 #elif defined(CHROMIUM_BUILD) | 79 #elif defined(CHROMIUM_BUILD) |
| 78 #define kBrandFileName @"Chromium Brand.plist"; | 80 #define kBrandFileName @"Chromium Brand.plist"; |
| 79 #else | 81 #else |
| 80 #error Unknown branding | 82 #error Unknown branding |
| 81 #endif | 83 #endif |
| 82 | 84 |
| 83 // These directories are hardcoded in Keystone promotion preflight and the | 85 // These directories are hardcoded in Keystone promotion preflight and the |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 - (BOOL)promoteWithParameters:(NSDictionary*)args | 150 - (BOOL)promoteWithParameters:(NSDictionary*)args |
| 149 authorization:(AuthorizationRef)authorization; | 151 authorization:(AuthorizationRef)authorization; |
| 150 | 152 |
| 151 - (void)setActive; | 153 - (void)setActive; |
| 152 - (void)checkForUpdate; | 154 - (void)checkForUpdate; |
| 153 - (void)startUpdate; | 155 - (void)startUpdate; |
| 154 - (KSRegistrationTicketType)ticketType; | 156 - (KSRegistrationTicketType)ticketType; |
| 155 | 157 |
| 156 @end // @interface KSRegistration | 158 @end // @interface KSRegistration |
| 157 | 159 |
| 158 @interface KeystoneGlue(Private) | 160 @interface KeystoneGlue (Private) |
| 159 | 161 |
| 160 // Returns the path to the application's Info.plist file. This returns the | 162 // Returns the path to the application's Info.plist file. This returns the |
| 161 // outer application bundle's Info.plist, not the framework's Info.plist. | 163 // outer application bundle's Info.plist, not the framework's Info.plist. |
| 162 - (NSString*)appInfoPlistPath; | 164 - (NSString*)appInfoPlistPath; |
| 163 | 165 |
| 164 // Returns a dictionary containing parameters to be used for a KSRegistration | 166 // Returns a dictionary containing parameters to be used for a KSRegistration |
| 165 // -registerWithParameters: or -promoteWithParameters:authorization: call. | 167 // -registerWithParameters: or -promoteWithParameters:authorization: call. |
| 166 - (NSDictionary*)keystoneParameters; | 168 - (NSDictionary*)keystoneParameters; |
| 167 | 169 |
| 168 // Called when Keystone registration completes. | 170 // Called when Keystone registration completes. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 // -promotionComplete. That routine calls | 223 // -promotionComplete. That routine calls |
| 222 // -changePermissionsForPromotionWithTool: on a work queue thread. When done, | 224 // -changePermissionsForPromotionWithTool: on a work queue thread. When done, |
| 223 // -changePermissionsForPromotionComplete is called on the main thread. | 225 // -changePermissionsForPromotionComplete is called on the main thread. |
| 224 - (void)changePermissionsForPromotionAsync; | 226 - (void)changePermissionsForPromotionAsync; |
| 225 - (void)changePermissionsForPromotionWithTool:(NSString*)toolPath; | 227 - (void)changePermissionsForPromotionWithTool:(NSString*)toolPath; |
| 226 - (void)changePermissionsForPromotionComplete; | 228 - (void)changePermissionsForPromotionComplete; |
| 227 | 229 |
| 228 // Returns the brand file path to use for Keystone. | 230 // Returns the brand file path to use for Keystone. |
| 229 - (NSString*)brandFilePath; | 231 - (NSString*)brandFilePath; |
| 230 | 232 |
| 231 @end // @interface KeystoneGlue(Private) | 233 @end // @interface KeystoneGlue (Private) |
| 232 | 234 |
| 233 NSString* const kAutoupdateStatusNotification = @"AutoupdateStatusNotification"; | 235 NSString* const kAutoupdateStatusNotification = @"AutoupdateStatusNotification"; |
| 234 NSString* const kAutoupdateStatusStatus = @"status"; | 236 NSString* const kAutoupdateStatusStatus = @"status"; |
| 235 NSString* const kAutoupdateStatusVersion = @"version"; | 237 NSString* const kAutoupdateStatusVersion = @"version"; |
| 236 | 238 |
| 237 namespace { | 239 namespace { |
| 238 | 240 |
| 239 NSString* const kChannelKey = @"KSChannelID"; | 241 NSString* const kChannelKey = @"KSChannelID"; |
| 240 NSString* const kBrandKey = @"KSBrandID"; | 242 NSString* const kBrandKey = @"KSBrandID"; |
| 243 NSString* const kVersionKey = @"KSVersion"; |
| 241 | 244 |
| 242 } // namespace | 245 } // namespace |
| 243 | 246 |
| 244 @implementation KeystoneGlue | 247 @implementation KeystoneGlue |
| 245 | 248 |
| 246 + (id)defaultKeystoneGlue { | 249 + (id)defaultKeystoneGlue { |
| 247 static bool sTriedCreatingDefaultKeystoneGlue = false; | 250 static bool sTriedCreatingDefaultKeystoneGlue = false; |
| 248 // TODO(jrg): use base::SingletonObjC<KeystoneGlue> | 251 // TODO(jrg): use base::SingletonObjC<KeystoneGlue> |
| 249 static KeystoneGlue* sDefaultKeystoneGlue = nil; // leaked | 252 static KeystoneGlue* sDefaultKeystoneGlue = nil; // leaked |
| 250 | 253 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 NSBundle* appBundle = [NSBundle mainBundle]; | 316 NSBundle* appBundle = [NSBundle mainBundle]; |
| 314 NSDictionary* infoDictionary = [self infoDictionary]; | 317 NSDictionary* infoDictionary = [self infoDictionary]; |
| 315 | 318 |
| 316 NSString* productID = [infoDictionary objectForKey:@"KSProductID"]; | 319 NSString* productID = [infoDictionary objectForKey:@"KSProductID"]; |
| 317 if (productID == nil) { | 320 if (productID == nil) { |
| 318 productID = [appBundle bundleIdentifier]; | 321 productID = [appBundle bundleIdentifier]; |
| 319 } | 322 } |
| 320 | 323 |
| 321 NSString* appPath = [appBundle bundlePath]; | 324 NSString* appPath = [appBundle bundlePath]; |
| 322 NSString* url = [infoDictionary objectForKey:@"KSUpdateURL"]; | 325 NSString* url = [infoDictionary objectForKey:@"KSUpdateURL"]; |
| 323 NSString* version = [infoDictionary objectForKey:@"KSVersion"]; | 326 NSString* version = [infoDictionary objectForKey:kVersionKey]; |
| 324 | 327 |
| 325 if (!productID || !appPath || !url || !version) { | 328 if (!productID || !appPath || !url || !version) { |
| 326 // If parameters required for Keystone are missing, don't use it. | 329 // If parameters required for Keystone are missing, don't use it. |
| 327 return; | 330 return; |
| 328 } | 331 } |
| 329 | 332 |
| 330 NSString* channel = [infoDictionary objectForKey:kChannelKey]; | 333 NSString* channel = [infoDictionary objectForKey:kChannelKey]; |
| 331 // The stable channel has no tag. If updating to stable, remove the | 334 // The stable channel has no tag. If updating to stable, remove the |
| 332 // dev and beta tags since we've been "promoted". | 335 // dev and beta tags since we've been "promoted". |
| 333 if (channel == nil) | 336 if (channel == nil) |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 - (NSString*)appInfoPlistPath { | 478 - (NSString*)appInfoPlistPath { |
| 476 // NSBundle ought to have a way to access this path directly, but it | 479 // NSBundle ought to have a way to access this path directly, but it |
| 477 // doesn't. | 480 // doesn't. |
| 478 return [[appPath_ stringByAppendingPathComponent:@"Contents"] | 481 return [[appPath_ stringByAppendingPathComponent:@"Contents"] |
| 479 stringByAppendingPathComponent:@"Info.plist"]; | 482 stringByAppendingPathComponent:@"Info.plist"]; |
| 480 } | 483 } |
| 481 | 484 |
| 482 - (NSDictionary*)keystoneParameters { | 485 - (NSDictionary*)keystoneParameters { |
| 483 NSNumber* xcType = [NSNumber numberWithInt:kKSPathExistenceChecker]; | 486 NSNumber* xcType = [NSNumber numberWithInt:kKSPathExistenceChecker]; |
| 484 NSNumber* preserveTTToken = [NSNumber numberWithBool:YES]; | 487 NSNumber* preserveTTToken = [NSNumber numberWithBool:YES]; |
| 485 NSString* tagPath = [self appInfoPlistPath]; | 488 NSString* appInfoPlistPath = [self appInfoPlistPath]; |
| 486 | |
| 487 NSString* brandKey = kBrandKey; | 489 NSString* brandKey = kBrandKey; |
| 488 NSString* brandPath = [self brandFilePath]; | 490 NSString* brandPath = [self brandFilePath]; |
| 489 | 491 |
| 490 if ([brandPath length] == 0) { | 492 if ([brandPath length] == 0) { |
| 491 // Brand path and brand key must be cleared together or ksadmin seems | 493 // Brand path and brand key must be cleared together or ksadmin seems |
| 492 // to throw an error. | 494 // to throw an error. |
| 493 brandKey = @""; | 495 brandKey = @""; |
| 494 } | 496 } |
| 495 | 497 |
| 496 return [NSDictionary dictionaryWithObjectsAndKeys: | 498 return [NSDictionary dictionaryWithObjectsAndKeys: |
| 497 version_, KSRegistrationVersionKey, | 499 version_, KSRegistrationVersionKey, |
| 500 appInfoPlistPath, KSRegistrationVersionPathKey, |
| 501 kVersionKey, KSRegistrationVersionKeyKey, |
| 498 xcType, KSRegistrationExistenceCheckerTypeKey, | 502 xcType, KSRegistrationExistenceCheckerTypeKey, |
| 499 appPath_, KSRegistrationExistenceCheckerStringKey, | 503 appPath_, KSRegistrationExistenceCheckerStringKey, |
| 500 url_, KSRegistrationServerURLStringKey, | 504 url_, KSRegistrationServerURLStringKey, |
| 501 preserveTTToken, KSRegistrationPreserveTrustedTesterTokenKey, | 505 preserveTTToken, KSRegistrationPreserveTrustedTesterTokenKey, |
| 502 channel_, KSRegistrationTagKey, | 506 channel_, KSRegistrationTagKey, |
| 503 tagPath, KSRegistrationTagPathKey, | 507 appInfoPlistPath, KSRegistrationTagPathKey, |
| 504 kChannelKey, KSRegistrationTagKeyKey, | 508 kChannelKey, KSRegistrationTagKeyKey, |
| 505 brandPath, KSRegistrationBrandPathKey, | 509 brandPath, KSRegistrationBrandPathKey, |
| 506 brandKey, KSRegistrationBrandKeyKey, | 510 brandKey, KSRegistrationBrandKeyKey, |
| 507 nil]; | 511 nil]; |
| 508 } | 512 } |
| 509 | 513 |
| 510 - (void)registerWithKeystone { | 514 - (void)registerWithKeystone { |
| 511 [self updateStatus:kAutoupdateRegistering version:nil]; | 515 [self updateStatus:kAutoupdateRegistering version:nil]; |
| 512 | 516 |
| 513 NSDictionary* parameters = [self keystoneParameters]; | 517 NSDictionary* parameters = [self keystoneParameters]; |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 // synchronous too, and this operation needs to happen before that one. | 824 // synchronous too, and this operation needs to happen before that one. |
| 821 // | 825 // |
| 822 // TODO(mark): Make asynchronous. That only makes sense if the promotion | 826 // TODO(mark): Make asynchronous. That only makes sense if the promotion |
| 823 // operation itself is asynchronous too. http://b/2290009. Hopefully, | 827 // operation itself is asynchronous too. http://b/2290009. Hopefully, |
| 824 // the Keystone promotion code will just be changed to do what preflight | 828 // the Keystone promotion code will just be changed to do what preflight |
| 825 // now does, and then the preflight script can be removed instead. | 829 // now does, and then the preflight script can be removed instead. |
| 826 // However, preflight operation (and promotion) should only be asynchronous | 830 // However, preflight operation (and promotion) should only be asynchronous |
| 827 // if the synchronous parameter is NO. | 831 // if the synchronous parameter is NO. |
| 828 NSString* preflightPath = | 832 NSString* preflightPath = |
| 829 [base::mac::MainAppBundle() pathForResource:@"keystone_promote_preflight" | 833 [base::mac::MainAppBundle() pathForResource:@"keystone_promote_preflight" |
| 830 ofType:@"sh"]; | 834 ofType:@"sh"]; |
| 831 const char* preflightPathC = [preflightPath fileSystemRepresentation]; | 835 const char* preflightPathC = [preflightPath fileSystemRepresentation]; |
| 832 const char* userBrandFile = NULL; | 836 const char* userBrandFile = NULL; |
| 833 const char* systemBrandFile = NULL; | 837 const char* systemBrandFile = NULL; |
| 834 if (brandFileType_ == kBrandFileTypeUser) { | 838 if (brandFileType_ == kBrandFileTypeUser) { |
| 835 // Running with user level brand file, promote to the system level. | 839 // Running with user level brand file, promote to the system level. |
| 836 userBrandFile = [UserBrandFilePath() fileSystemRepresentation]; | 840 userBrandFile = [UserBrandFilePath() fileSystemRepresentation]; |
| 837 systemBrandFile = [SystemBrandFilePath() fileSystemRepresentation]; | 841 systemBrandFile = [SystemBrandFilePath() fileSystemRepresentation]; |
| 838 } | 842 } |
| 839 const char* arguments[] = {userBrandFile, systemBrandFile, NULL}; | 843 const char* arguments[] = {userBrandFile, systemBrandFile, NULL}; |
| 840 | 844 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 906 | 910 |
| 907 - (void)changePermissionsForPromotionAsync { | 911 - (void)changePermissionsForPromotionAsync { |
| 908 // NSBundle is not documented as being thread-safe. Do NSBundle operations | 912 // NSBundle is not documented as being thread-safe. Do NSBundle operations |
| 909 // on the main thread before jumping over to a WorkerPool-managed | 913 // on the main thread before jumping over to a WorkerPool-managed |
| 910 // thread to run the tool. | 914 // thread to run the tool. |
| 911 DCHECK([NSThread isMainThread]); | 915 DCHECK([NSThread isMainThread]); |
| 912 | 916 |
| 913 SEL selector = @selector(changePermissionsForPromotionWithTool:); | 917 SEL selector = @selector(changePermissionsForPromotionWithTool:); |
| 914 NSString* toolPath = | 918 NSString* toolPath = |
| 915 [base::mac::MainAppBundle() pathForResource:@"keystone_promote_postflight" | 919 [base::mac::MainAppBundle() pathForResource:@"keystone_promote_postflight" |
| 916 ofType:@"sh"]; | 920 ofType:@"sh"]; |
| 917 | 921 |
| 918 PerformBridge::PostPerform(self, selector, toolPath); | 922 PerformBridge::PostPerform(self, selector, toolPath); |
| 919 } | 923 } |
| 920 | 924 |
| 921 - (void)changePermissionsForPromotionWithTool:(NSString*)toolPath { | 925 - (void)changePermissionsForPromotionWithTool:(NSString*)toolPath { |
| 922 const char* toolPathC = [toolPath fileSystemRepresentation]; | 926 const char* toolPathC = [toolPath fileSystemRepresentation]; |
| 923 | 927 |
| 924 const char* appPathC = [appPath_ fileSystemRepresentation]; | 928 const char* appPathC = [appPath_ fileSystemRepresentation]; |
| 925 const char* arguments[] = {appPathC, NULL}; | 929 const char* arguments[] = {appPathC, NULL}; |
| 926 | 930 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 965 return [KeystoneGlue defaultKeystoneGlue] != nil; | 969 return [KeystoneGlue defaultKeystoneGlue] != nil; |
| 966 } | 970 } |
| 967 | 971 |
| 968 string16 CurrentlyInstalledVersion() { | 972 string16 CurrentlyInstalledVersion() { |
| 969 KeystoneGlue* keystoneGlue = [KeystoneGlue defaultKeystoneGlue]; | 973 KeystoneGlue* keystoneGlue = [KeystoneGlue defaultKeystoneGlue]; |
| 970 NSString* version = [keystoneGlue currentlyInstalledVersion]; | 974 NSString* version = [keystoneGlue currentlyInstalledVersion]; |
| 971 return base::SysNSStringToUTF16(version); | 975 return base::SysNSStringToUTF16(version); |
| 972 } | 976 } |
| 973 | 977 |
| 974 } // namespace keystone_glue | 978 } // namespace keystone_glue |
| OLD | NEW |