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