blob: 5decd7377a0ef479bd485c63a27dbccd1e4a5b94 [file] [log] [blame]
[email protected]ef12d1e62012-03-21 20:55:051// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]7d791652010-12-01 16:34:492// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]5950f5712011-06-20 22:15:525#ifndef CHROME_BROWSER_MAC_KEYSTONE_GLUE_H_
6#define CHROME_BROWSER_MAC_KEYSTONE_GLUE_H_
[email protected]7d791652010-12-01 16:34:497
[email protected]f9b294362013-06-10 20:22:318#include "base/strings/string16.h"
[email protected]7d791652010-12-01 16:34:499
10#if defined(__OBJC__)
11
12#import <Foundation/Foundation.h>
avi6846aef2015-12-26 01:09:3813#include <stdint.h>
[email protected]7d791652010-12-01 16:34:4914
[email protected]ef12d1e62012-03-21 20:55:0515#include "base/mac/scoped_authorizationref.h"
[email protected]a8522032013-06-24 22:51:4616#import "base/mac/scoped_nsobject.h"
[email protected]7d791652010-12-01 16:34:4917
18// Possible outcomes of various operations. A version may accompany some of
19// these, but beware: a version is never required. For statuses that can be
20// accompanied by a version, the comment indicates what version is referenced.
21// A notification posted containing an asynchronous status will always be
22// followed by a notification with a terminal status.
23enum AutoupdateStatus {
24 kAutoupdateNone = 0, // no version (initial state only)
25 kAutoupdateRegistering, // no version (asynchronous operation in progress)
26 kAutoupdateRegistered, // no version
27 kAutoupdateChecking, // no version (asynchronous operation in progress)
28 kAutoupdateCurrent, // version of the running application
29 kAutoupdateAvailable, // version of the update that is available
30 kAutoupdateInstalling, // no version (asynchronous operation in progress)
31 kAutoupdateInstalled, // version of the update that was installed
32 kAutoupdatePromoting, // no version (asynchronous operation in progress)
33 kAutoupdatePromoted, // no version
34 kAutoupdateRegisterFailed, // no version
35 kAutoupdateCheckFailed, // no version
36 kAutoupdateInstallFailed, // no version
37 kAutoupdatePromoteFailed, // no version
[email protected]a2d67742011-10-18 15:44:1038 kAutoupdateNeedsPromotion, // no version
[email protected]7d791652010-12-01 16:34:4939};
40
41// kAutoupdateStatusNotification is the name of the notification posted when
42// -checkForUpdate and -installUpdate complete. This notification will be
43// sent with with its sender object set to the KeystoneGlue instance sending
44// the notification. Its userInfo dictionary will contain an AutoupdateStatus
45// value as an intValue at key kAutoupdateStatusStatus. If a version is
46// available (see AutoupdateStatus), it will be present at key
ryanmyersfffe8c7402016-03-25 01:21:1647// kAutoupdateStatusVersion. If any error messages were supplied by Keystone,
48// they will be present at key kAutoupdateStatusErrorMessages.
[email protected]7d791652010-12-01 16:34:4949extern NSString* const kAutoupdateStatusNotification;
50extern NSString* const kAutoupdateStatusStatus;
51extern NSString* const kAutoupdateStatusVersion;
ryanmyersfffe8c7402016-03-25 01:21:1652extern NSString* const kAutoupdateStatusErrorMessages;
[email protected]7d791652010-12-01 16:34:4953
[email protected]7d791652010-12-01 16:34:4954// KeystoneGlue is an adapter around the KSRegistration class, allowing it to
55// be used without linking directly against its containing KeystoneRegistration
56// framework. This is used in an environment where most builds (such as
57// developer builds) don't want or need Keystone support and might not even
58// have the framework available. Enabling Keystone support in an application
59// that uses KeystoneGlue is as simple as dropping
60// KeystoneRegistration.framework in the application's Frameworks directory
61// and providing the relevant information in its Info.plist. KeystoneGlue
62// requires that the KSUpdateURL key be set in the application's Info.plist,
63// and that it contain a string identifying the update URL to be used by
64// Keystone.
65
66@class KSRegistration;
67
68@interface KeystoneGlue : NSObject {
69 @protected
70
71 // Data for Keystone registration
Robert Liao44d3ef12019-12-12 21:04:3372 base::scoped_nsobject<NSString> _productID;
73 base::scoped_nsobject<NSString> _appPath;
74 base::scoped_nsobject<NSString> _url;
75 base::scoped_nsobject<NSString> _version;
76 std::string _channel; // Logically: dev, beta, or stable.
Robert Sesek621c3bed2018-05-31 18:25:5377 // Cached location of the brand file.
Robert Liao44d3ef12019-12-12 21:04:3378 base::scoped_nsobject<NSString> _brandFile;
[email protected]7d791652010-12-01 16:34:4979
80 // And the Keystone registration itself, with the active timer
Robert Liao44d3ef12019-12-12 21:04:3381 base::scoped_nsobject<KSRegistration> _registration;
82 NSTimer* _timer; // strong
83 BOOL _registrationActive;
84 Class _ksUnsignedReportingAttributeClass;
[email protected]7d791652010-12-01 16:34:4985
86 // The most recent kAutoupdateStatusNotification notification posted.
Robert Liao44d3ef12019-12-12 21:04:3387 base::scoped_nsobject<NSNotification> _recentNotification;
[email protected]7d791652010-12-01 16:34:4988
89 // The authorization object, when it needs to persist because it's being
90 // carried across threads.
Robert Liao44d3ef12019-12-12 21:04:3391 base::mac::ScopedAuthorizationRef _authorization;
[email protected]7d791652010-12-01 16:34:4992
93 // YES if a synchronous promotion operation is in progress (promotion during
94 // installation).
Robert Liao44d3ef12019-12-12 21:04:3395 BOOL _synchronousPromotion;
[email protected]7d791652010-12-01 16:34:4996
97 // YES if an update was ever successfully installed by -installUpdate.
Robert Liao44d3ef12019-12-12 21:04:3398 BOOL _updateSuccessfullyInstalled;
[email protected]7d791652010-12-01 16:34:4999}
100
101// Return the default Keystone Glue object.
Leonard Grey7dd78aa2020-02-12 16:01:54102+ (KeystoneGlue*)defaultKeystoneGlue;
[email protected]7d791652010-12-01 16:34:49103
104// Load KeystoneRegistration.framework if present, call into it to register
105// with Keystone, and set up periodic activity pings.
106- (void)registerWithKeystone;
bcwhitee9301292015-06-22 15:31:58107- (BOOL)isRegisteredAndActive;
[email protected]7d791652010-12-01 16:34:49108
109// -checkForUpdate launches a check for updates, and -installUpdate begins
110// installing an available update. For each, status will be communicated via
111// a kAutoupdateStatusNotification notification, and will also be available
112// through -recentNotification.
113- (void)checkForUpdate;
114- (void)installUpdate;
115
116// Accessor for recentNotification_. Returns an autoreleased NSNotification.
117- (NSNotification*)recentNotification;
118
119// Accessor for the kAutoupdateStatusStatus field of recentNotification_'s
120// userInfo dictionary.
121- (AutoupdateStatus)recentStatus;
122
123// Returns YES if an asynchronous operation is pending: if an update check or
124// installation attempt is currently in progress.
125- (BOOL)asyncOperationPending;
126
127// Returns YES if the application is running from a read-only filesystem,
128// such as a disk image.
129- (BOOL)isOnReadOnlyFilesystem;
130
131// -needsPromotion is YES if the application needs its ticket promoted to
132// a system ticket. This will be YES when the application is on a user
133// ticket and determines that the current user does not have sufficient
134// permission to perform the update.
135//
136// -wantsPromotion is YES if the application wants its ticket promoted to
137// a system ticket, even if it doesn't need it as determined by
138// -needsPromotion. -wantsPromotion will always be YES if -needsPromotion is,
139// and it will additionally be YES when the application is on a user ticket
140// and appears to be installed in a system-wide location such as
141// /Applications.
142//
143// Use -needsPromotion to decide whether to show any update UI at all. If
144// it's YES, there's no sense in asking the user to "update now" because it
145// will fail given the rights and permissions involved. On the other hand,
146// when -needsPromotion is YES, the application can encourage the user to
147// promote the ticket so that updates will work properly.
148//
149// Use -wantsPromotion to decide whether to allow the user to promote. The
150// user shouldn't be nagged about promotion on the basis of -wantsPromotion,
151// but if it's YES, the user should be allowed to promote the ticket.
152- (BOOL)needsPromotion;
153- (BOOL)wantsPromotion;
154
dbeam3109d3ea2016-12-18 07:23:43155// -isAutoupdateEnabledForAllUsers indicates whether or not autoupdate is
156// turned on for all users.
157- (BOOL)isAutoupdateEnabledForAllUsers;
158
[email protected]7d791652010-12-01 16:34:49159// Promotes the Keystone ticket into the system store. System Keystone will
160// be installed if necessary. If synchronous is NO, the promotion may occur
161// in the background. synchronous should be YES for promotion during
162// installation. The KeystoneGlue object assumes ownership of
Robert Sesek4322a53d2018-06-12 01:40:06163// |anAuthorization|.
164- (void)promoteTicketWithAuthorization:(AuthorizationRef)anAuthorization
[email protected]7d791652010-12-01 16:34:49165 synchronous:(BOOL)synchronous;
166
167// Requests authorization and calls -promoteTicketWithAuthorization: in
168// asynchronous mode.
169- (void)promoteTicket;
170
Joshua Pawlicki9fbc8412019-03-20 16:05:12171// Set the registration active.
172- (void)setRegistrationActive;
173
[email protected]7d791652010-12-01 16:34:49174// Sets a new value for appPath. Used during installation to point a ticket
175// at the installed copy.
176- (void)setAppPath:(NSString*)appPath;
177
178@end // @interface KeystoneGlue
179
180@interface KeystoneGlue(ExposedForTesting)
181
182// Load any params we need for configuring Keystone.
183- (void)loadParameters;
184
185// Load the Keystone registration object.
186// Return NO on failure.
187- (BOOL)loadKeystoneRegistration;
188
189- (void)stopTimer;
190
191// Called when a checkForUpdate: notification completes.
192- (void)checkForUpdateComplete:(NSNotification*)notification;
193
194// Called when an installUpdate: notification completes.
195- (void)installUpdateComplete:(NSNotification*)notification;
196
197@end // @interface KeystoneGlue(ExposedForTesting)
198
199#endif // __OBJC__
200
201// Functions that may be accessed from non-Objective-C C/C++ code.
202namespace keystone_glue {
203
[email protected]c9c15122011-08-30 14:24:01204// Returns the brand code of the installation. Note that beta, dev, and canary
205// channels, as well as some stable builds, may have an empty string as a brand
206// code.
207std::string BrandCode();
208
[email protected]7d791652010-12-01 16:34:49209// True if Keystone is enabled.
210bool KeystoneEnabled();
211
212// The version of the application currently installed on disk.
[email protected]6a72a632013-12-12 22:22:00213base::string16 CurrentlyInstalledVersion();
[email protected]7d791652010-12-01 16:34:49214
215} // namespace keystone_glue
216
[email protected]5950f5712011-06-20 22:15:52217#endif // CHROME_BROWSER_MAC_KEYSTONE_GLUE_H_