1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
|
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_MANAGER_H_
#define CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_MANAGER_H_
#include <string>
#include <vector>
#include "base/basictypes.h"
#include "base/callback_forward.h"
#include "base/lazy_instance.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "base/observer_list.h"
#include "chrome/browser/chromeos/app_mode/kiosk_app_data_delegate.h"
#include "chrome/browser/chromeos/extensions/external_cache.h"
#include "chrome/browser/chromeos/policy/enterprise_install_attributes.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "ui/gfx/image/image_skia.h"
class PrefRegistrySimple;
class Profile;
namespace base {
class RefCountedString;
}
namespace extensions {
class Extension;
class ExternalLoader;
}
namespace chromeos {
class KioskAppData;
class KioskAppExternalLoader;
class KioskAppManagerObserver;
class KioskExternalUpdater;
class OwnerSettingsServiceChromeOS;
// KioskAppManager manages cached app data.
class KioskAppManager : public KioskAppDataDelegate,
public ExternalCache::Delegate {
public:
enum ConsumerKioskAutoLaunchStatus {
// Consumer kiosk mode auto-launch feature can be enabled on this machine.
CONSUMER_KIOSK_AUTO_LAUNCH_CONFIGURABLE,
// Consumer kiosk auto-launch feature is enabled on this machine.
CONSUMER_KIOSK_AUTO_LAUNCH_ENABLED,
// Consumer kiosk mode auto-launch feature is disabled and cannot any longer
// be enabled on this machine.
CONSUMER_KIOSK_AUTO_LAUNCH_DISABLED,
};
typedef base::Callback<void(bool success)> EnableKioskAutoLaunchCallback;
typedef base::Callback<void(ConsumerKioskAutoLaunchStatus status)>
GetConsumerKioskAutoLaunchStatusCallback;
// Struct to hold app info returned from GetApps() call.
struct App {
App(const KioskAppData& data,
bool is_extension_pending,
bool was_auto_launched_with_zero_delay);
App();
~App();
std::string app_id;
std::string user_id;
std::string name;
gfx::ImageSkia icon;
bool is_loading;
bool was_auto_launched_with_zero_delay;
};
typedef std::vector<App> Apps;
// Name of a dictionary that holds kiosk app info in Local State.
// Sample layout:
// "kiosk": {
// "auto_login_enabled": true //
// }
static const char kKioskDictionaryName[];
static const char kKeyApps[];
static const char kKeyAutoLoginState[];
// Sub directory under DIR_USER_DATA to store cached icon files.
static const char kIconCacheDir[];
// Sub directory under DIR_USER_DATA to store cached crx files.
static const char kCrxCacheDir[];
// Sub directory under DIR_USER_DATA to store unpacked crx file for validating
// its signature.
static const char kCrxUnpackDir[];
// Gets the KioskAppManager instance, which is lazily created on first call..
static KioskAppManager* Get();
// Prepares for shutdown and calls CleanUp() if needed.
static void Shutdown();
// Registers kiosk app entries in local state.
static void RegisterPrefs(PrefRegistrySimple* registry);
// Removes cryptohomes which could not be removed during the previous session.
static void RemoveObsoleteCryptohomes();
// Initiates reading of consumer kiosk mode auto-launch status.
void GetConsumerKioskAutoLaunchStatus(
const GetConsumerKioskAutoLaunchStatusCallback& callback);
// Enables consumer kiosk mode app auto-launch feature. Upon completion,
// |callback| will be invoked with outcome of this operation.
void EnableConsumerKioskAutoLaunch(
const EnableKioskAutoLaunchCallback& callback);
// Returns true if this device is consumer kiosk auto launch enabled.
bool IsConsumerKioskDeviceWithAutoLaunch();
// Returns auto launcher app id or an empty string if there is none.
std::string GetAutoLaunchApp() const;
// Sets |app_id| as the app to auto launch at start up.
void SetAutoLaunchApp(const std::string& app_id,
OwnerSettingsServiceChromeOS* service);
// Returns true if there is a pending auto-launch request.
bool IsAutoLaunchRequested() const;
// Returns true if owner/policy enabled auto launch.
bool IsAutoLaunchEnabled() const;
// Enable auto launch setter.
void SetEnableAutoLaunch(bool value);
// Adds/removes a kiosk app by id. When removed, all locally cached data
// will be removed as well.
void AddApp(const std::string& app_id, OwnerSettingsServiceChromeOS* service);
void RemoveApp(const std::string& app_id,
OwnerSettingsServiceChromeOS* service);
// Gets info of all apps that have no meta data load error.
void GetApps(Apps* apps) const;
// Gets app data for the given app id. Returns true if |app_id| is known and
// |app| is populated. Otherwise, return false.
bool GetApp(const std::string& app_id, App* app) const;
// Gets whether the bailout shortcut is disabled.
bool GetDisableBailoutShortcut() const;
// Clears locally cached app data.
void ClearAppData(const std::string& app_id);
// Updates app data from the |app| in |profile|. |app| is provided to cover
// the case of app update case where |app| is the new version and is not
// finished installing (e.g. because old version is still running). Otherwise,
// |app| could be NULL and the current installed app in |profile| will be
// used.
void UpdateAppDataFromProfile(const std::string& app_id,
Profile* profile,
const extensions::Extension* app);
void RetryFailedAppDataFetch();
// Returns true if the app is found in cache.
bool HasCachedCrx(const std::string& app_id) const;
// Gets the path and version of the cached crx with |app_id|.
// Returns true if the app is found in cache.
bool GetCachedCrx(const std::string& app_id,
base::FilePath* file_path,
std::string* version) const;
void AddObserver(KioskAppManagerObserver* observer);
void RemoveObserver(KioskAppManagerObserver* observer);
// Creates extensions::ExternalLoader for installing kiosk apps during their
// first time launch.
extensions::ExternalLoader* CreateExternalLoader();
// Installs kiosk app with |id| from cache.
void InstallFromCache(const std::string& id);
void UpdateExternalCache();
// Monitors kiosk external update from usb stick.
void MonitorKioskExternalUpdate();
// Invoked when kiosk app cache has been updated.
void OnKioskAppCacheUpdated(const std::string& app_id);
// Invoked when kiosk app updating from usb stick has been completed.
// |success| indicates if all the updates are completed successfully.
void OnKioskAppExternalUpdateComplete(bool success);
// Installs the validated external extension into cache.
void PutValidatedExternalExtension(
const std::string& app_id,
const base::FilePath& crx_path,
const std::string& version,
const ExternalCache::PutExternalExtensionCallback& callback);
bool external_loader_created() const { return external_loader_created_; }
// Notifies the KioskAppManager that a given app was auto-launched
// automatically with no delay on startup. Certain privacy-sensitive
// kiosk-mode behavior (such as network reporting) is only enabled for
// kiosk apps that are immediately auto-launched on startup.
void SetAppWasAutoLaunchedWithZeroDelay(const std::string& app_id);
private:
friend struct base::DefaultLazyInstanceTraits<KioskAppManager>;
friend struct base::DefaultDeleter<KioskAppManager>;
friend class KioskAppManagerTest;
friend class KioskTest;
friend class KioskUpdateTest;
enum AutoLoginState {
AUTOLOGIN_NONE = 0,
AUTOLOGIN_REQUESTED = 1,
AUTOLOGIN_APPROVED = 2,
AUTOLOGIN_REJECTED = 3,
};
KioskAppManager();
~KioskAppManager() override;
// Stop all data loading and remove its dependency on CrosSettings.
void CleanUp();
// Gets KioskAppData for the given app id.
const KioskAppData* GetAppData(const std::string& app_id) const;
KioskAppData* GetAppDataMutable(const std::string& app_id);
// Updates app data |apps_| based on CrosSettings.
void UpdateAppData();
// KioskAppDataDelegate overrides:
void GetKioskAppIconCacheDir(base::FilePath* cache_dir) override;
void OnKioskAppDataChanged(const std::string& app_id) override;
void OnKioskAppDataLoadFailure(const std::string& app_id) override;
// ExternalCache::Delegate:
void OnExtensionListsUpdated(const base::DictionaryValue* prefs) override;
void OnExtensionLoadedInCache(const std::string& id) override;
void OnExtensionDownloadFailed(
const std::string& id,
extensions::ExtensionDownloaderDelegate::Error error) override;
// Callback for EnterpriseInstallAttributes::LockDevice() during
// EnableConsumerModeKiosk() call.
void OnLockDevice(
const EnableKioskAutoLaunchCallback& callback,
policy::EnterpriseInstallAttributes::LockResult result);
// Callback for EnterpriseInstallAttributes::ReadImmutableAttributes() during
// GetConsumerKioskModeStatus() call.
void OnReadImmutableAttributes(
const GetConsumerKioskAutoLaunchStatusCallback& callback);
// Callback for reading handling checks of the owner public.
void OnOwnerFileChecked(
const GetConsumerKioskAutoLaunchStatusCallback& callback,
bool* owner_present);
// Reads/writes auto login state from/to local state.
AutoLoginState GetAutoLoginState() const;
void SetAutoLoginState(AutoLoginState state);
void GetCrxCacheDir(base::FilePath* cache_dir);
void GetCrxUnpackDir(base::FilePath* unpack_dir);
// True if machine ownership is already established.
bool ownership_established_;
ScopedVector<KioskAppData> apps_;
std::string auto_launch_app_id_;
std::string currently_auto_launched_with_zero_delay_app_;
ObserverList<KioskAppManagerObserver, true> observers_;
scoped_ptr<CrosSettings::ObserverSubscription>
local_accounts_subscription_;
scoped_ptr<CrosSettings::ObserverSubscription>
local_account_auto_login_id_subscription_;
scoped_ptr<ExternalCache> external_cache_;
scoped_ptr<KioskExternalUpdater> usb_stick_updater_;
// The extension external loader for installing kiosk app.
bool external_loader_created_;
base::WeakPtr<KioskAppExternalLoader> external_loader_;
DISALLOW_COPY_AND_ASSIGN(KioskAppManager);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_APP_MODE_KIOSK_APP_MANAGER_H_
|