Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3888)

Unified Diff: chrome/browser/mac/keystone_glue.mm

Issue 1769703002: Add viewing of error messages from Keystone upon self-update failure. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/mac/keystone_glue.mm
diff --git a/chrome/browser/mac/keystone_glue.mm b/chrome/browser/mac/keystone_glue.mm
index c6333e7c65031739873ab630349ace1d5f8c0f3d..254c1a546fe83ac4a1d1254276edff34db3aac8c 100644
--- a/chrome/browser/mac/keystone_glue.mm
+++ b/chrome/browser/mac/keystone_glue.mm
@@ -127,7 +127,9 @@ class PerformBridge : public base::RefCountedThreadSafe<PerformBridge> {
// Called when an update check or update installation is complete. Posts the
// kAutoupdateStatusNotification notification to the default notification
// center.
-- (void)updateStatus:(AutoupdateStatus)status version:(NSString*)version;
+- (void)updateStatus:(AutoupdateStatus)status
+ version:(NSString*)version
+ error:(NSString *)error;
Boris Vidolov 2016/03/08 22:32:51 Fix the spaces around NSString pointer type. I bel
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
// Returns the version of the currently-installed application on disk.
- (NSString*)currentlyInstalledVersion;
@@ -135,7 +137,7 @@ class PerformBridge : public base::RefCountedThreadSafe<PerformBridge> {
// These three methods are used to determine the version of the application
// currently installed on disk, compare that to the currently-running version,
// decide whether any updates have been installed, and call
-// -updateStatus:version:.
+// -updateStatus:version:error:.
//
// In order to check the version on disk, the installed application's
// Info.plist dictionary must be read; in order to see changes as updates are
@@ -153,8 +155,8 @@ class PerformBridge : public base::RefCountedThreadSafe<PerformBridge> {
// CFBundleShortVersionString key, and performs
// -determineUpdateStatusForVersion: on the main thread.
// -determineUpdateStatusForVersion: does the actual comparison of the version
-// on disk with the running version and calls -updateStatus:version: with the
-// results of its analysis.
+// on disk with the running version and calls -updateStatus:version:error: with
+// the results of its analysis.
- (void)determineUpdateStatusAsync;
- (void)determineUpdateStatus;
- (void)determineUpdateStatusForVersion:(NSString*)version;
@@ -208,6 +210,7 @@ class PerformBridge : public base::RefCountedThreadSafe<PerformBridge> {
NSString* const kAutoupdateStatusNotification = @"AutoupdateStatusNotification";
NSString* const kAutoupdateStatusStatus = @"status";
NSString* const kAutoupdateStatusVersion = @"version";
+NSString* const kAutoupdateStatusErrorMessages = @"errormessages";
namespace {
@@ -536,12 +539,14 @@ NSString* const kVersionKey = @"KSVersion";
}
- (void)registerWithKeystone {
- [self updateStatus:kAutoupdateRegistering version:nil];
+ [self updateStatus:kAutoupdateRegistering version:nil error:nil];
NSDictionary* parameters = [self keystoneParameters];
BOOL result = [registration_ registerWithParameters:parameters];
if (!result) {
- [self updateStatus:kAutoupdateRegisterFailed version:nil];
+ // TODO: If Keystone ever makes a variant of this API with a withError:
+ // parameter, include the error message here in the call to updateStatus:.
+ [self updateStatus:kAutoupdateRegisterFailed version:nil error:nil];
return;
}
@@ -562,15 +567,22 @@ NSString* const kVersionKey = @"KSVersion";
- (void)registrationComplete:(NSNotification*)notification {
NSDictionary* userInfo = [notification userInfo];
+
+ // Error messages may be included, depending on the version of Keystone.
Boris Vidolov 2016/03/08 22:32:51 I don't believe that this is correct. It depends o
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
+ NSString *errorMessages =
Boris Vidolov 2016/03/08 22:32:51 Fix the position of the '*': should be "NSString*
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
+ [userInfo objectForKey:ksr::KSRegistrationUpdateCheckRawErrorMessagesKey];
+
if ([[userInfo objectForKey:ksr::KSRegistrationStatusKey] boolValue]) {
if ([self isSystemTicketDoomed]) {
Boris Vidolov 2016/03/08 22:32:51 Even in the happy case there could be warnings, re
Ryan Myers (chromium) 2016/03/22 22:39:22 Done. (Passed them on to updateStatus; version_upd
- [self updateStatus:kAutoupdateNeedsPromotion version:nil];
+ [self updateStatus:kAutoupdateNeedsPromotion version:nil error:nil];
} else {
- [self updateStatus:kAutoupdateRegistered version:nil];
+ [self updateStatus:kAutoupdateRegistered version:nil error:nil];
}
} else {
// Dump registration_?
- [self updateStatus:kAutoupdateRegisterFailed version:nil];
+ [self updateStatus:kAutoupdateRegisterFailed
+ version:nil
+ error:errorMessages];
}
}
@@ -586,11 +598,13 @@ NSString* const kVersionKey = @"KSVersion";
DCHECK(![self asyncOperationPending]);
Boris Vidolov 2016/03/08 22:32:51 I believe that this should not be a debug check, b
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
if (!registration_) {
- [self updateStatus:kAutoupdateCheckFailed version:nil];
+ [self updateStatus:kAutoupdateCheckFailed
+ version:nil
+ error:@"keystone_glue: Keystone not available."];
Boris Vidolov 2016/03/08 22:32:52 This should happen only on debug builds and Chrome
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
return;
}
- [self updateStatus:kAutoupdateChecking version:nil];
+ [self updateStatus:kAutoupdateChecking version:nil error:nil];
// All checks from inside Chrome are considered user-initiated, because they
// only happen following a user action, such as visiting the about page.
@@ -605,14 +619,18 @@ NSString* const kVersionKey = @"KSVersion";
- (void)checkForUpdateComplete:(NSNotification*)notification {
NSDictionary* userInfo = [notification userInfo];
+ // Error messages may be included, depending on the version of Keystone.
Boris Vidolov 2016/03/08 22:32:51 Ditto for the version of Keystone in the comment
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
+ NSString *errorMessages =
+ [userInfo objectForKey:ksr::KSRegistrationUpdateCheckRawErrorMessagesKey];
+
if ([[userInfo objectForKey:ksr::KSRegistrationUpdateCheckErrorKey]
boolValue]) {
- [self updateStatus:kAutoupdateCheckFailed version:nil];
+ [self updateStatus:kAutoupdateCheckFailed version:nil error:errorMessages];
} else if ([[userInfo objectForKey:ksr::KSRegistrationStatusKey] boolValue]) {
// If an update is known to be available, go straight to
// -updateStatus:version:. It doesn't matter what's currently on disk.
NSString* version = [userInfo objectForKey:ksr::KSRegistrationVersionKey];
- [self updateStatus:kAutoupdateAvailable version:version];
+ [self updateStatus:kAutoupdateAvailable version:version error:nil];
Boris Vidolov 2016/03/08 22:32:52 Again, maybe we should log the reported errors? It
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
} else {
// If no updates are available, check what's on disk, because an update
// may have already been installed. This check happens on another thread,
@@ -625,11 +643,13 @@ NSString* const kVersionKey = @"KSVersion";
DCHECK(![self asyncOperationPending]);
if (!registration_) {
- [self updateStatus:kAutoupdateInstallFailed version:nil];
+ [self updateStatus:kAutoupdateInstallFailed
+ version:nil
+ error:@"keystone_glue: Keystone not available."];
Boris Vidolov 2016/03/08 22:32:52 Ditto
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
return;
}
- [self updateStatus:kAutoupdateInstalling version:nil];
+ [self updateStatus:kAutoupdateInstalling version:nil error:nil];
[registration_ startUpdate];
@@ -640,13 +660,17 @@ NSString* const kVersionKey = @"KSVersion";
- (void)installUpdateComplete:(NSNotification*)notification {
NSDictionary* userInfo = [notification userInfo];
+ // Error messages may be included, depending on the version of Keystone.
Boris Vidolov 2016/03/08 22:32:51 Ditto
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
Boris Vidolov 2016/03/23 00:24:13 Still here...
Ryan Myers (chromium) 2016/03/23 00:48:23 Done.
+ NSString *errorMsgs =
+ [userInfo objectForKey:ksr::KSRegistrationUpdateCheckRawErrorMessagesKey];
+
// http://crbug.com/160308 and b/7517358: when using system Keystone and on
// a user ticket, KSUpdateCheckSuccessfulKey will be NO even when an update
// was installed correctly, so don't check it. It should be redudnant when
// KSUpdateCheckSuccessfullyInstalledKey is checked.
if (![[userInfo objectForKey:ksr::KSUpdateCheckSuccessfullyInstalledKey]
intValue]) {
- [self updateStatus:kAutoupdateInstallFailed version:nil];
+ [self updateStatus:kAutoupdateInstallFailed version:nil error:errorMsgs];
} else {
updateSuccessfullyInstalled_ = YES;
Boris Vidolov 2016/03/08 22:32:52 Ditto for logging
Ryan Myers (chromium) 2016/03/22 22:39:22 Done.
@@ -709,10 +733,12 @@ NSString* const kVersionKey = @"KSVersion";
}
}
- [self updateStatus:status version:version];
+ [self updateStatus:status version:version error:nil];
}
-- (void)updateStatus:(AutoupdateStatus)status version:(NSString*)version {
+- (void)updateStatus:(AutoupdateStatus)status
+ version:(NSString*)version
+ error:(NSString *)error {
NSNumber* statusNumber = [NSNumber numberWithInt:status];
NSMutableDictionary* dictionary =
[NSMutableDictionary dictionaryWithObject:statusNumber
@@ -720,6 +746,9 @@ NSString* const kVersionKey = @"KSVersion";
if (version) {
[dictionary setObject:version forKey:kAutoupdateStatusVersion];
}
+ if (error) {
+ [dictionary setObject:version forKey:kAutoupdateStatusErrorMessages];
+ }
NSNotification* notification =
[NSNotification notificationWithName:kAutoupdateStatusNotification
@@ -873,7 +902,7 @@ NSString* const kVersionKey = @"KSVersion";
synchronousPromotion_ = synchronous;
- [self updateStatus:kAutoupdatePromoting version:nil];
+ [self updateStatus:kAutoupdatePromoting version:nil error:nil];
// TODO(mark): Remove when able!
//
@@ -922,12 +951,24 @@ NSString* const kVersionKey = @"KSVersion";
if (status != errAuthorizationSuccess) {
OSSTATUS_LOG(ERROR, status)
<< "AuthorizationExecuteWithPrivileges preflight";
- [self updateStatus:kAutoupdatePromoteFailed version:nil];
+
+ NSString *errorMessage =
+ [NSString stringWithFormat:@"Pre-flight script failed to launch: %ld",
+ (long)status];
+ [self updateStatus:kAutoupdatePromoteFailed
+ version:nil
+ error:errorMessage];
return;
}
if (exit_status != 0) {
LOG(ERROR) << "keystone_promote_preflight status " << exit_status;
- [self updateStatus:kAutoupdatePromoteFailed version:nil];
+
+ NSString *errorMessage =
+ [NSString stringWithFormat:@"Promotion pre-flight script failed: %d",
+ exit_status];
+ [self updateStatus:kAutoupdatePromoteFailed
+ version:nil
+ error:errorMessage];
return;
}
@@ -951,7 +992,9 @@ NSString* const kVersionKey = @"KSVersion";
if (![registration_ promoteWithParameters:parameters
authorization:authorization_]) {
- [self updateStatus:kAutoupdatePromoteFailed version:nil];
+ // TODO: If Keystone ever makes a variant of this API with a withError:
+ // parameter, include the error message here in the call to updateStatus:.
+ [self updateStatus:kAutoupdatePromoteFailed version:nil error:nil];
authorization_.reset();
return;
}
@@ -980,7 +1023,7 @@ NSString* const kVersionKey = @"KSVersion";
}
} else {
authorization_.reset();
- [self updateStatus:kAutoupdatePromoteFailed version:nil];
+ [self updateStatus:kAutoupdatePromoteFailed version:nil error:nil];
}
if (synchronousPromotion_) {
@@ -1036,7 +1079,7 @@ NSString* const kVersionKey = @"KSVersion";
- (void)changePermissionsForPromotionComplete {
authorization_.reset();
- [self updateStatus:kAutoupdatePromoted version:nil];
+ [self updateStatus:kAutoupdatePromoted version:nil error:nil];
}
- (void)setAppPath:(NSString*)appPath {

Powered by Google App Engine
This is Rietveld 408576698