12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <set>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/files/file_path.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/prefs/pref_service.h"
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/browser_process.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_data.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/app_mode/kiosk_app_external_loader.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_manager_observer.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/app_mode/kiosk_external_updater.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/policy/device_local_account.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/external_loader.h"
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/extensions/external_provider_impl.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chromeos/chromeos_paths.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/cryptohome/async_method_caller.h"
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/ownership/owner_key_util.h"
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Domain that is used for kiosk-app account IDs.
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kKioskAppAccountDomain[] = "kiosk-apps";
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)std::string GenerateKioskAppAccountId(const std::string& app_id) {
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return app_id + '@' + kKioskAppAccountDomain;
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OnRemoveAppCryptohomeComplete(const std::string& app,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool success,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   cryptohome::MountError return_code) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!success) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Remove cryptohome for " << app
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << " failed, return code: " << return_code;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Check for presence of machine owner public key file.
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void CheckOwnerFilePresence(bool *present) {
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<ownership::OwnerKeyUtil> util =
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      OwnerSettingsServiceChromeOSFactory::GetInstance()->GetOwnerKeyUtil();
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *present = util.get() && util->IsPublicKeyPresent();
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunner() {
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CHECK(pool);
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return pool->GetSequencedTaskRunnerWithShutdownBehavior(
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      pool->GetSequenceToken(), base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char KioskAppManager::kKioskDictionaryName[] = "kiosk";
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char KioskAppManager::kKeyApps[] = "apps";
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char KioskAppManager::kKeyAutoLoginState[] = "auto_login_state";
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char KioskAppManager::kIconCacheDir[] = "kiosk/icon";
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char KioskAppManager::kCrxCacheDir[] = "kiosk/crx";
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char KioskAppManager::kCrxUnpackDir[] = "kiosk_unpack";
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<KioskAppManager> instance = LAZY_INSTANCE_INITIALIZER;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KioskAppManager* KioskAppManager::Get() {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return instance.Pointer();
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void KioskAppManager::Shutdown() {
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (instance == NULL)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  instance.Pointer()->CleanUp();
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::RegisterPrefs(PrefRegistrySimple* registry) {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterDictionaryPref(kKioskDictionaryName);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)KioskAppManager::App::App(const KioskAppData& data, bool is_extension_pending)
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : app_id(data.app_id()),
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_id(data.user_id()),
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      name(data.name()),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      icon(data.icon()),
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      is_loading(data.IsLoading() || is_extension_pending) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KioskAppManager::App::App() : is_loading(false) {}
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KioskAppManager::App::~App() {}
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string KioskAppManager::GetAutoLaunchApp() const {
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return auto_launch_app_id_;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::SetAutoLaunchApp(const std::string& app_id) {
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetAutoLoginState(AUTOLOGIN_REQUESTED);
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Clean first, so the proper change callbacks are triggered even
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // if we are only changing AutoLoginState here.
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!auto_launch_app_id_.empty()) {
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CrosSettings::Get()->SetString(kAccountsPrefDeviceLocalAccountAutoLoginId,
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   std::string());
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrosSettings::Get()->SetString(
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kAccountsPrefDeviceLocalAccountAutoLoginId,
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      app_id.empty() ? std::string() : GenerateKioskAppAccountId(app_id));
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrosSettings::Get()->SetInteger(
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kAccountsPrefDeviceLocalAccountAutoLoginDelay, 0);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void KioskAppManager::EnableConsumerKioskAutoLaunch(
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const KioskAppManager::EnableKioskAutoLaunchCallback& callback) {
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connector->GetInstallAttributes()->LockDevice(
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::string(),  // user
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      policy::DEVICE_MODE_CONSUMER_KIOSK_AUTOLAUNCH,
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::string(),  // device_id
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &KioskAppManager::OnLockDevice, base::Unretained(this), callback));
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void KioskAppManager::GetConsumerKioskAutoLaunchStatus(
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const KioskAppManager::GetConsumerKioskAutoLaunchStatusCallback& callback) {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connector->GetInstallAttributes()->ReadImmutableAttributes(
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&KioskAppManager::OnReadImmutableAttributes,
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(this),
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 callback));
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool KioskAppManager::IsConsumerKioskDeviceWithAutoLaunch() {
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return connector->GetInstallAttributes() &&
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         connector->GetInstallAttributes()
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)             ->IsConsumerKioskDeviceWithAutoLaunch();
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void KioskAppManager::OnLockDevice(
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const KioskAppManager::EnableKioskAutoLaunchCallback& callback,
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    policy::EnterpriseInstallAttributes::LockResult result) {
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (callback.is_null())
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  callback.Run(result == policy::EnterpriseInstallAttributes::LOCK_SUCCESS);
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void KioskAppManager::OnOwnerFileChecked(
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const KioskAppManager::GetConsumerKioskAutoLaunchStatusCallback& callback,
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool* owner_present) {
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ownership_established_ = *owner_present;
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (callback.is_null())
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // If we have owner already established on the machine, don't let
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // consumer kiosk to be enabled.
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (ownership_established_)
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    callback.Run(CONSUMER_KIOSK_AUTO_LAUNCH_DISABLED);
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  else
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    callback.Run(CONSUMER_KIOSK_AUTO_LAUNCH_CONFIGURABLE);
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void KioskAppManager::OnReadImmutableAttributes(
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const KioskAppManager::GetConsumerKioskAutoLaunchStatusCallback&
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        callback) {
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (callback.is_null())
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ConsumerKioskAutoLaunchStatus status =
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CONSUMER_KIOSK_AUTO_LAUNCH_DISABLED;
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  policy::EnterpriseInstallAttributes* attributes =
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      connector->GetInstallAttributes();
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (attributes->GetMode()) {
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case policy::DEVICE_MODE_NOT_SET: {
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      if (!base::SysInfo::IsRunningOnChromeOS()) {
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        status = CONSUMER_KIOSK_AUTO_LAUNCH_CONFIGURABLE;
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      } else if (!ownership_established_) {
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        bool* owner_present = new bool(false);
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        content::BrowserThread::PostBlockingPoolTaskAndReply(
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            FROM_HERE,
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            base::Bind(&CheckOwnerFilePresence,
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       owner_present),
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            base::Bind(&KioskAppManager::OnOwnerFileChecked,
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       base::Unretained(this),
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       callback,
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       base::Owned(owner_present)));
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return;
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case policy::DEVICE_MODE_CONSUMER_KIOSK_AUTOLAUNCH:
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      status = CONSUMER_KIOSK_AUTO_LAUNCH_ENABLED;
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    default:
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  callback.Run(status);
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void KioskAppManager::SetEnableAutoLaunch(bool value) {
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetAutoLoginState(value ? AUTOLOGIN_APPROVED : AUTOLOGIN_REJECTED);
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool KioskAppManager::IsAutoLaunchRequested() const {
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (GetAutoLaunchApp().empty())
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apps that were installed by the policy don't require machine owner
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // consent through UI.
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (connector->IsEnterpriseManaged())
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return GetAutoLoginState() == AUTOLOGIN_REQUESTED;
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool KioskAppManager::IsAutoLaunchEnabled() const {
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (GetAutoLaunchApp().empty())
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apps that were installed by the policy don't require machine owner
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // consent through UI.
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (connector->IsEnterpriseManaged())
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return true;
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return GetAutoLoginState() == AUTOLOGIN_APPROVED;
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::AddApp(const std::string& app_id) {
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<policy::DeviceLocalAccount> device_local_accounts =
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      policy::GetDeviceLocalAccounts(CrosSettings::Get());
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Don't insert the app if it's already in the list.
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (std::vector<policy::DeviceLocalAccount>::const_iterator
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           it = device_local_accounts.begin();
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       it != device_local_accounts.end(); ++it) {
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (it->type == policy::DeviceLocalAccount::TYPE_KIOSK_APP &&
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        it->kiosk_app_id == app_id) {
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return;
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add the new account.
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  device_local_accounts.push_back(policy::DeviceLocalAccount(
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      policy::DeviceLocalAccount::TYPE_KIOSK_APP,
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GenerateKioskAppAccountId(app_id),
278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      app_id));
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  policy::SetDeviceLocalAccounts(CrosSettings::Get(), device_local_accounts);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::RemoveApp(const std::string& app_id) {
284d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Resets auto launch app if it is the removed app.
285d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (auto_launch_app_id_ == app_id)
286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    SetAutoLaunchApp(std::string());
287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<policy::DeviceLocalAccount> device_local_accounts =
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      policy::GetDeviceLocalAccounts(CrosSettings::Get());
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (device_local_accounts.empty())
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Remove entries that match |app_id|.
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (std::vector<policy::DeviceLocalAccount>::iterator
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           it = device_local_accounts.begin();
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       it != device_local_accounts.end(); ++it) {
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (it->type == policy::DeviceLocalAccount::TYPE_KIOSK_APP &&
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        it->kiosk_app_id == app_id) {
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_local_accounts.erase(it);
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  policy::SetDeviceLocalAccounts(CrosSettings::Get(), device_local_accounts);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::GetApps(Apps* apps) const {
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  apps->clear();
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  apps->reserve(apps_.size());
310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (size_t i = 0; i < apps_.size(); ++i) {
311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const KioskAppData& app_data = *apps_[i];
312effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (app_data.status() != KioskAppData::STATUS_ERROR)
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      apps->push_back(App(
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          app_data, external_cache_->IsExtensionPending(app_data.app_id())));
315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool KioskAppManager::GetApp(const std::string& app_id, App* app) const {
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KioskAppData* data = GetAppData(app_id);
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!data)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  *app = App(*data, external_cache_->IsExtensionPending(app_id));
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::RefCountedString* KioskAppManager::GetAppRawIcon(
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& app_id) const {
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KioskAppData* data = GetAppData(app_id);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!data)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return data->raw_icon();
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool KioskAppManager::GetDisableBailoutShortcut() const {
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool enable;
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (CrosSettings::Get()->GetBoolean(
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled, &enable)) {
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return !enable;
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return false;
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void KioskAppManager::ClearAppData(const std::string& app_id) {
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  KioskAppData* app_data = GetAppDataMutable(app_id);
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!app_data)
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  app_data->ClearCache();
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void KioskAppManager::UpdateAppDataFromProfile(
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& app_id,
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Profile* profile,
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::Extension* app) {
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  KioskAppData* app_data = GetAppDataMutable(app_id);
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!app_data)
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  app_data->LoadFromInstalledApp(profile, app);
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KioskAppManager::RetryFailedAppDataFetch() {
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < apps_.size(); ++i) {
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (apps_[i]->status() == KioskAppData::STATUS_ERROR)
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      apps_[i]->Load();
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool KioskAppManager::HasCachedCrx(const std::string& app_id) const {
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::FilePath crx_path;
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string version;
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetCachedCrx(app_id, &crx_path, &version);
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool KioskAppManager::GetCachedCrx(const std::string& app_id,
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   base::FilePath* file_path,
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   std::string* version) const {
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return external_cache_->GetExtension(app_id, file_path, version);
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::AddObserver(KioskAppManagerObserver* observer) {
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observers_.AddObserver(observer);
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::RemoveObserver(KioskAppManagerObserver* observer) {
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observers_.RemoveObserver(observer);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextensions::ExternalLoader* KioskAppManager::CreateExternalLoader() {
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (external_loader_created_) {
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NOTREACHED();
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return NULL;
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  external_loader_created_ = true;
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  KioskAppExternalLoader* loader = new KioskAppExternalLoader();
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  external_loader_ = loader->AsWeakPtr();
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return loader;
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KioskAppManager::InstallFromCache(const std::string& id) {
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::DictionaryValue* extension = NULL;
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (external_cache_->cached_extensions()->GetDictionary(id, &extension)) {
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<base::DictionaryValue> prefs(new base::DictionaryValue);
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::DictionaryValue* extension_copy = extension->DeepCopy();
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    prefs->Set(id, extension_copy);
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    external_loader_->SetCurrentAppExtensions(prefs.Pass());
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LOG(ERROR) << "Can't find app in the cached externsions"
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << " id = " << id;
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KioskAppManager::UpdateExternalCache() {
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UpdateAppData();
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid KioskAppManager::OnKioskAppCacheUpdated(const std::string& app_id) {
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FOR_EACH_OBSERVER(
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      KioskAppManagerObserver, observers_, OnKioskAppCacheUpdated(app_id));
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid KioskAppManager::OnKioskAppExternalUpdateComplete(bool success) {
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FOR_EACH_OBSERVER(KioskAppManagerObserver,
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    observers_,
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    OnKioskAppExternalUpdateComplete(success));
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid KioskAppManager::PutValidatedExternalExtension(
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& app_id,
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::FilePath& crx_path,
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& version,
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ExternalCache::PutExternalExtensionCallback& callback) {
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  external_cache_->PutExternalExtension(app_id, crx_path, version, callback);
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
440116680a4aac90f2aa7413d9095a592090648e557Ben MurdochKioskAppManager::KioskAppManager()
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : ownership_established_(false), external_loader_created_(false) {
442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::FilePath cache_dir;
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GetCrxCacheDir(&cache_dir);
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  external_cache_.reset(
445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new ExternalCache(cache_dir,
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        g_browser_process->system_request_context(),
447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        GetBackgroundTaskRunner(),
448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        this,
449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        true /* always_check_updates */,
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        false /* wait_for_cache_initialization */));
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateAppData();
45268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  local_accounts_subscription_ =
45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      CrosSettings::Get()->AddSettingsObserver(
45468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          kAccountsPrefDeviceLocalAccounts,
45568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          base::Bind(&KioskAppManager::UpdateAppData, base::Unretained(this)));
45668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  local_account_auto_login_id_subscription_ =
45768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      CrosSettings::Get()->AddSettingsObserver(
45868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          kAccountsPrefDeviceLocalAccountAutoLoginId,
45968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          base::Bind(&KioskAppManager::UpdateAppData, base::Unretained(this)));
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)KioskAppManager::~KioskAppManager() {}
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid KioskAppManager::MonitorKioskExternalUpdate() {
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::FilePath cache_dir;
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetCrxCacheDir(&cache_dir);
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::FilePath unpack_dir;
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetCrxUnpackDir(&unpack_dir);
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  usb_stick_updater_.reset(new KioskExternalUpdater(
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetBackgroundTaskRunner(), cache_dir, unpack_dir));
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void KioskAppManager::CleanUp() {
47468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  local_accounts_subscription_.reset();
47568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  local_account_auto_login_id_subscription_.reset();
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  apps_.clear();
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  usb_stick_updater_.reset();
478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  external_cache_.reset();
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const KioskAppData* KioskAppManager::GetAppData(
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& app_id) const {
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < apps_.size(); ++i) {
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const KioskAppData* data = apps_[i];
48590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (data->app_id() == app_id)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return data;
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)KioskAppData* KioskAppManager::GetAppDataMutable(const std::string& app_id) {
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return const_cast<KioskAppData*>(GetAppData(app_id));
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::UpdateAppData() {
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets app id to data mapping for existing apps.
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, KioskAppData*> old_apps;
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < apps_.size(); ++i)
50090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    old_apps[apps_[i]->app_id()] = apps_[i];
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  apps_.weak_clear();  // |old_apps| takes ownership
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  auto_launch_app_id_.clear();
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string auto_login_account_id;
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CrosSettings::Get()->GetString(kAccountsPrefDeviceLocalAccountAutoLoginId,
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 &auto_login_account_id);
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Re-populates |apps_| and reuses existing KioskAppData when possible.
50990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const std::vector<policy::DeviceLocalAccount> device_local_accounts =
51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      policy::GetDeviceLocalAccounts(CrosSettings::Get());
51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (std::vector<policy::DeviceLocalAccount>::const_iterator
51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           it = device_local_accounts.begin();
51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       it != device_local_accounts.end(); ++it) {
51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (it->type != policy::DeviceLocalAccount::TYPE_KIOSK_APP)
51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      continue;
51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
51790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (it->account_id == auto_login_account_id)
51890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      auto_launch_app_id_ = it->kiosk_app_id;
51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // TODO(mnissler): Support non-CWS update URLs.
52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
52290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    std::map<std::string, KioskAppData*>::iterator old_it =
52390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        old_apps.find(it->kiosk_app_id);
52490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (old_it != old_apps.end()) {
52590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      apps_.push_back(old_it->second);
52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      old_apps.erase(old_it);
52790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
52890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      KioskAppData* new_app =
52990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          new KioskAppData(this, it->kiosk_app_id, it->user_id);
53090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      apps_.push_back(new_app);  // Takes ownership of |new_app|.
53190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new_app->Load();
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clears cache and deletes the remaining old data.
536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::vector<std::string> apps_to_remove;
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::map<std::string, KioskAppData*>::iterator it = old_apps.begin();
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != old_apps.end(); ++it) {
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    it->second->ClearCache();
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cryptohome::AsyncMethodCaller::GetInstance()->AsyncRemove(
541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        it->second->user_id(),
542a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&OnRemoveAppCryptohomeComplete, it->first));
543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    apps_to_remove.push_back(it->second->app_id());
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  STLDeleteValues(&old_apps);
546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  external_cache_->RemoveExtensions(apps_to_remove);
547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Request external_cache_ to download new apps and update the existing
549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // apps.
550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> prefs(new base::DictionaryValue);
5511675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  for (size_t i = 0; i < apps_.size(); ++i) {
5521675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue);
5531675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    entry->SetBoolean(extensions::ExternalProviderImpl::kIsFromWebstore, true);
5541675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    prefs->Set(apps_[i]->app_id(), entry.release());
5551675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  }
556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  external_cache_->UpdateExtensionsList(prefs.Pass());
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RetryFailedAppDataFetch();
559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FOR_EACH_OBSERVER(KioskAppManagerObserver, observers_,
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    OnKioskAppsSettingsChanged());
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::GetKioskAppIconCacheDir(base::FilePath* cache_dir) {
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath user_data_dir;
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir));
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *cache_dir = user_data_dir.AppendASCII(kIconCacheDir);
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::OnKioskAppDataChanged(const std::string& app_id) {
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(KioskAppManagerObserver,
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    observers_,
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    OnKioskAppDataChanged(app_id));
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::OnKioskAppDataLoadFailure(const std::string& app_id) {
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(KioskAppManagerObserver,
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    observers_,
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    OnKioskAppDataLoadFailure(app_id));
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void KioskAppManager::OnExtensionListsUpdated(
583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::DictionaryValue* prefs) {
584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void KioskAppManager::OnExtensionLoadedInCache(const std::string& id) {
587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  KioskAppData* app_data = GetAppDataMutable(id);
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!app_data)
589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FOR_EACH_OBSERVER(KioskAppManagerObserver,
591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    observers_,
592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    OnKioskExtensionLoadedInCache(id));
593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void KioskAppManager::OnExtensionDownloadFailed(
597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& id,
598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    extensions::ExtensionDownloaderDelegate::Error error) {
599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  KioskAppData* app_data = GetAppDataMutable(id);
600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!app_data)
601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FOR_EACH_OBSERVER(KioskAppManagerObserver,
603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    observers_,
604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    OnKioskExtensionDownloadFailed(id));
605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)KioskAppManager::AutoLoginState KioskAppManager::GetAutoLoginState() const {
608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PrefService* prefs = g_browser_process->local_state();
609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const base::DictionaryValue* dict =
610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      prefs->GetDictionary(KioskAppManager::kKioskDictionaryName);
611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int value;
612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!dict->GetInteger(kKeyAutoLoginState, &value))
613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return AUTOLOGIN_NONE;
614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return static_cast<AutoLoginState>(value);
616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void KioskAppManager::SetAutoLoginState(AutoLoginState state) {
619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PrefService* prefs = g_browser_process->local_state();
620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DictionaryPrefUpdate dict_update(prefs,
621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   KioskAppManager::kKioskDictionaryName);
622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dict_update->SetInteger(kKeyAutoLoginState, state);
623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  prefs->CommitPendingWrite();
624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void KioskAppManager::GetCrxCacheDir(base::FilePath* cache_dir) {
627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::FilePath user_data_dir;
628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir));
629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  *cache_dir = user_data_dir.AppendASCII(kCrxCacheDir);
630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid KioskAppManager::GetCrxUnpackDir(base::FilePath* unpack_dir) {
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::FilePath temp_dir;
6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::GetTempDir(&temp_dir);
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *unpack_dir = temp_dir.AppendASCII(kCrxUnpackDir);
636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
639