kiosk_app_manager.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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); 551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < apps_.size(); ++i) 552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) prefs->Set(apps_[i]->app_id(), new base::DictionaryValue); 553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) external_cache_->UpdateExtensionsList(prefs.Pass()); 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RetryFailedAppDataFetch(); 556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FOR_EACH_OBSERVER(KioskAppManagerObserver, observers_, 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnKioskAppsSettingsChanged()); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::GetKioskAppIconCacheDir(base::FilePath* cache_dir) { 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_data_dir; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *cache_dir = user_data_dir.AppendASCII(kIconCacheDir); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::OnKioskAppDataChanged(const std::string& app_id) { 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(KioskAppManagerObserver, 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnKioskAppDataChanged(app_id)); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::OnKioskAppDataLoadFailure(const std::string& app_id) { 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(KioskAppManagerObserver, 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnKioskAppDataLoadFailure(app_id)); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void KioskAppManager::OnExtensionListsUpdated( 580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::DictionaryValue* prefs) { 581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void KioskAppManager::OnExtensionLoadedInCache(const std::string& id) { 584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) KioskAppData* app_data = GetAppDataMutable(id); 585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!app_data) 586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER(KioskAppManagerObserver, 588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnKioskExtensionLoadedInCache(id)); 590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void KioskAppManager::OnExtensionDownloadFailed( 594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& id, 595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extensions::ExtensionDownloaderDelegate::Error error) { 596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) KioskAppData* app_data = GetAppDataMutable(id); 597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!app_data) 598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER(KioskAppManagerObserver, 600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnKioskExtensionDownloadFailed(id)); 602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)KioskAppManager::AutoLoginState KioskAppManager::GetAutoLoginState() const { 605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrefService* prefs = g_browser_process->local_state(); 606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::DictionaryValue* dict = 607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) prefs->GetDictionary(KioskAppManager::kKioskDictionaryName); 608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int value; 609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!dict->GetInteger(kKeyAutoLoginState, &value)) 610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return AUTOLOGIN_NONE; 611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return static_cast<AutoLoginState>(value); 613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void KioskAppManager::SetAutoLoginState(AutoLoginState state) { 616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrefService* prefs = g_browser_process->local_state(); 617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DictionaryPrefUpdate dict_update(prefs, 618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) KioskAppManager::kKioskDictionaryName); 619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict_update->SetInteger(kKeyAutoLoginState, state); 620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) prefs->CommitPendingWrite(); 621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void KioskAppManager::GetCrxCacheDir(base::FilePath* cache_dir) { 624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath user_data_dir; 625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)); 626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *cache_dir = user_data_dir.AppendASCII(kCrxCacheDir); 627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid KioskAppManager::GetCrxUnpackDir(base::FilePath* unpack_dir) { 6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath temp_dir; 6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::GetTempDir(&temp_dir); 6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *unpack_dir = temp_dir.AppendASCII(kCrxUnpackDir); 633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 636