blob: c54b7dded799641631e61bb0eabd9c4fbe34a909 [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
72 NSString* productID_;
73 NSString* appPath_;
74 NSString* url_;
75 NSString* version_;
Boris Vidolov86578012018-03-21 16:55:2576 std::string channel_; // Logically: dev, beta, or stable.
Robert Sesek621c3bed2018-05-31 18:25:5377 // Cached location of the brand file.
78 base::scoped_nsobject<NSString> brandFile_;
[email protected]7d791652010-12-01 16:34:4979
80 // And the Keystone registration itself, with the active timer
81 KSRegistration* registration_; // strong
82 NSTimer* timer_; // strong
bcwhitee9301292015-06-22 15:31:5883 BOOL registrationActive_;
mlerman1e9f61ce2015-03-23 18:14:0084 Class ksUnsignedReportingAttributeClass_;
[email protected]7d791652010-12-01 16:34:4985
86 // The most recent kAutoupdateStatusNotification notification posted.
[email protected]a8522032013-06-24 22:51:4687 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.
[email protected]ef12d1e62012-03-21 20:55:0591 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).
95 BOOL synchronousPromotion_;
96
97 // YES if an update was ever successfully installed by -installUpdate.
98 BOOL updateSuccessfullyInstalled_;
mlerman1e9f61ce2015-03-23 18:14:0099
100 // Profile count information.
101 uint32_t numProfiles_;
102 uint32_t numSignedInProfiles_;
[email protected]7d791652010-12-01 16:34:49103}
104
105// Return the default Keystone Glue object.
106+ (id)defaultKeystoneGlue;
107
108// Load KeystoneRegistration.framework if present, call into it to register
109// with Keystone, and set up periodic activity pings.
110- (void)registerWithKeystone;
bcwhitee9301292015-06-22 15:31:58111- (BOOL)isRegisteredAndActive;
[email protected]7d791652010-12-01 16:34:49112
113// -checkForUpdate launches a check for updates, and -installUpdate begins
114// installing an available update. For each, status will be communicated via
115// a kAutoupdateStatusNotification notification, and will also be available
116// through -recentNotification.
117- (void)checkForUpdate;
118- (void)installUpdate;
119
120// Accessor for recentNotification_. Returns an autoreleased NSNotification.
121- (NSNotification*)recentNotification;
122
123// Accessor for the kAutoupdateStatusStatus field of recentNotification_'s
124// userInfo dictionary.
125- (AutoupdateStatus)recentStatus;
126
127// Returns YES if an asynchronous operation is pending: if an update check or
128// installation attempt is currently in progress.
129- (BOOL)asyncOperationPending;
130
131// Returns YES if the application is running from a read-only filesystem,
132// such as a disk image.
133- (BOOL)isOnReadOnlyFilesystem;
134
135// -needsPromotion is YES if the application needs its ticket promoted to
136// a system ticket. This will be YES when the application is on a user
137// ticket and determines that the current user does not have sufficient
138// permission to perform the update.
139//
140// -wantsPromotion is YES if the application wants its ticket promoted to
141// a system ticket, even if it doesn't need it as determined by
142// -needsPromotion. -wantsPromotion will always be YES if -needsPromotion is,
143// and it will additionally be YES when the application is on a user ticket
144// and appears to be installed in a system-wide location such as
145// /Applications.
146//
147// Use -needsPromotion to decide whether to show any update UI at all. If
148// it's YES, there's no sense in asking the user to "update now" because it
149// will fail given the rights and permissions involved. On the other hand,
150// when -needsPromotion is YES, the application can encourage the user to
151// promote the ticket so that updates will work properly.
152//
153// Use -wantsPromotion to decide whether to allow the user to promote. The
154// user shouldn't be nagged about promotion on the basis of -wantsPromotion,
155// but if it's YES, the user should be allowed to promote the ticket.
156- (BOOL)needsPromotion;
157- (BOOL)wantsPromotion;
158
dbeam3109d3ea2016-12-18 07:23:43159// -isAutoupdateEnabledForAllUsers indicates whether or not autoupdate is
160// turned on for all users.
161- (BOOL)isAutoupdateEnabledForAllUsers;
162
[email protected]7d791652010-12-01 16:34:49163// Promotes the Keystone ticket into the system store. System Keystone will
164// be installed if necessary. If synchronous is NO, the promotion may occur
165// in the background. synchronous should be YES for promotion during
166// installation. The KeystoneGlue object assumes ownership of
167// authorization_arg.
168- (void)promoteTicketWithAuthorization:(AuthorizationRef)authorization_arg
169 synchronous:(BOOL)synchronous;
170
171// Requests authorization and calls -promoteTicketWithAuthorization: in
172// asynchronous mode.
173- (void)promoteTicket;
174
175// Sets a new value for appPath. Used during installation to point a ticket
176// at the installed copy.
177- (void)setAppPath:(NSString*)appPath;
178
mlerman1e9f61ce2015-03-23 18:14:00179// Sets the total number of profiles and the number of signed in profiles.
borisv957d52d2016-04-13 18:35:43180// Passing zeroes sets the application as active, but does not update
181// profile metrics.
mlerman1e9f61ce2015-03-23 18:14:00182- (void)updateProfileCountsWithNumProfiles:(uint32_t)profiles
183 numSignedInProfiles:(uint32_t)signedInProfiles;
184
[email protected]7d791652010-12-01 16:34:49185@end // @interface KeystoneGlue
186
187@interface KeystoneGlue(ExposedForTesting)
188
189// Load any params we need for configuring Keystone.
190- (void)loadParameters;
191
192// Load the Keystone registration object.
193// Return NO on failure.
194- (BOOL)loadKeystoneRegistration;
195
196- (void)stopTimer;
197
198// Called when a checkForUpdate: notification completes.
199- (void)checkForUpdateComplete:(NSNotification*)notification;
200
201// Called when an installUpdate: notification completes.
202- (void)installUpdateComplete:(NSNotification*)notification;
203
204@end // @interface KeystoneGlue(ExposedForTesting)
205
206#endif // __OBJC__
207
208// Functions that may be accessed from non-Objective-C C/C++ code.
209namespace keystone_glue {
210
[email protected]c9c15122011-08-30 14:24:01211// Returns the brand code of the installation. Note that beta, dev, and canary
212// channels, as well as some stable builds, may have an empty string as a brand
213// code.
214std::string BrandCode();
215
[email protected]7d791652010-12-01 16:34:49216// True if Keystone is enabled.
217bool KeystoneEnabled();
218
219// The version of the application currently installed on disk.
[email protected]6a72a632013-12-12 22:22:00220base::string16 CurrentlyInstalledVersion();
[email protected]7d791652010-12-01 16:34:49221
222} // namespace keystone_glue
223
[email protected]5950f5712011-06-20 22:15:52224#endif // CHROME_BROWSER_MAC_KEYSTONE_GLUE_H_