[email protected] | ef12d1e6 | 2012-03-21 20:55:05 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
[email protected] | 5950f571 | 2011-06-20 22:15:52 | [diff] [blame] | 5 | #ifndef CHROME_BROWSER_MAC_KEYSTONE_GLUE_H_ |
| 6 | #define CHROME_BROWSER_MAC_KEYSTONE_GLUE_H_ |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 7 | |
[email protected] | f9b29436 | 2013-06-10 20:22:31 | [diff] [blame] | 8 | #include "base/strings/string16.h" |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 9 | |
| 10 | #if defined(__OBJC__) |
| 11 | |
| 12 | #import <Foundation/Foundation.h> |
avi | 6846aef | 2015-12-26 01:09:38 | [diff] [blame] | 13 | #include <stdint.h> |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 14 | |
[email protected] | ef12d1e6 | 2012-03-21 20:55:05 | [diff] [blame] | 15 | #include "base/mac/scoped_authorizationref.h" |
[email protected] | a852203 | 2013-06-24 22:51:46 | [diff] [blame] | 16 | #import "base/mac/scoped_nsobject.h" |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 17 | |
| 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. |
| 23 | enum 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] | a2d6774 | 2011-10-18 15:44:10 | [diff] [blame] | 38 | kAutoupdateNeedsPromotion, // no version |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 39 | }; |
| 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 |
ryanmyers | fffe8c740 | 2016-03-25 01:21:16 | [diff] [blame] | 47 | // kAutoupdateStatusVersion. If any error messages were supplied by Keystone, |
| 48 | // they will be present at key kAutoupdateStatusErrorMessages. |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 49 | extern NSString* const kAutoupdateStatusNotification; |
| 50 | extern NSString* const kAutoupdateStatusStatus; |
| 51 | extern NSString* const kAutoupdateStatusVersion; |
ryanmyers | fffe8c740 | 2016-03-25 01:21:16 | [diff] [blame] | 52 | extern NSString* const kAutoupdateStatusErrorMessages; |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 53 | |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 54 | // 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 Vidolov | 8657801 | 2018-03-21 16:55:25 | [diff] [blame] | 76 | std::string channel_; // Logically: dev, beta, or stable. |
Robert Sesek | 621c3bed | 2018-05-31 18:25:53 | [diff] [blame^] | 77 | // Cached location of the brand file. |
| 78 | base::scoped_nsobject<NSString> brandFile_; |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 79 | |
| 80 | // And the Keystone registration itself, with the active timer |
| 81 | KSRegistration* registration_; // strong |
| 82 | NSTimer* timer_; // strong |
bcwhite | e930129 | 2015-06-22 15:31:58 | [diff] [blame] | 83 | BOOL registrationActive_; |
mlerman | 1e9f61ce | 2015-03-23 18:14:00 | [diff] [blame] | 84 | Class ksUnsignedReportingAttributeClass_; |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 85 | |
| 86 | // The most recent kAutoupdateStatusNotification notification posted. |
[email protected] | a852203 | 2013-06-24 22:51:46 | [diff] [blame] | 87 | base::scoped_nsobject<NSNotification> recentNotification_; |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 88 | |
| 89 | // The authorization object, when it needs to persist because it's being |
| 90 | // carried across threads. |
[email protected] | ef12d1e6 | 2012-03-21 20:55:05 | [diff] [blame] | 91 | base::mac::ScopedAuthorizationRef authorization_; |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 92 | |
| 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_; |
mlerman | 1e9f61ce | 2015-03-23 18:14:00 | [diff] [blame] | 99 | |
| 100 | // Profile count information. |
| 101 | uint32_t numProfiles_; |
| 102 | uint32_t numSignedInProfiles_; |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 103 | } |
| 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; |
bcwhite | e930129 | 2015-06-22 15:31:58 | [diff] [blame] | 111 | - (BOOL)isRegisteredAndActive; |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 112 | |
| 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 | |
dbeam | 3109d3ea | 2016-12-18 07:23:43 | [diff] [blame] | 159 | // -isAutoupdateEnabledForAllUsers indicates whether or not autoupdate is |
| 160 | // turned on for all users. |
| 161 | - (BOOL)isAutoupdateEnabledForAllUsers; |
| 162 | |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 163 | // 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 | |
mlerman | 1e9f61ce | 2015-03-23 18:14:00 | [diff] [blame] | 179 | // Sets the total number of profiles and the number of signed in profiles. |
borisv | 957d52d | 2016-04-13 18:35:43 | [diff] [blame] | 180 | // Passing zeroes sets the application as active, but does not update |
| 181 | // profile metrics. |
mlerman | 1e9f61ce | 2015-03-23 18:14:00 | [diff] [blame] | 182 | - (void)updateProfileCountsWithNumProfiles:(uint32_t)profiles |
| 183 | numSignedInProfiles:(uint32_t)signedInProfiles; |
| 184 | |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 185 | @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. |
| 209 | namespace keystone_glue { |
| 210 | |
[email protected] | c9c1512 | 2011-08-30 14:24:01 | [diff] [blame] | 211 | // 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. |
| 214 | std::string BrandCode(); |
| 215 | |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 216 | // True if Keystone is enabled. |
| 217 | bool KeystoneEnabled(); |
| 218 | |
| 219 | // The version of the application currently installed on disk. |
[email protected] | 6a72a63 | 2013-12-12 22:22:00 | [diff] [blame] | 220 | base::string16 CurrentlyInstalledVersion(); |
[email protected] | 7d79165 | 2010-12-01 16:34:49 | [diff] [blame] | 221 | |
| 222 | } // namespace keystone_glue |
| 223 | |
[email protected] | 5950f571 | 2011-06-20 22:15:52 | [diff] [blame] | 224 | #endif // CHROME_BROWSER_MAC_KEYSTONE_GLUE_H_ |