kiosk_app_manager.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_data.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_manager_observer.h" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/policy/device_local_account.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings_names.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/cryptohome/async_method_caller.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Domain that is used for kiosk-app account IDs. 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kKioskAppAccountDomain[] = "kiosk-apps"; 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)std::string GenerateKioskAppAccountId(const std::string& app_id) { 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return app_id + '@' + kKioskAppAccountDomain; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OnRemoveAppCryptohomeComplete(const std::string& app, 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cryptohome::MountError return_code) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!success) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Remove cryptohome for " << app 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " failed, return code: " << return_code; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char KioskAppManager::kKioskDictionaryName[] = "kiosk"; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char KioskAppManager::kKeyApps[] = "apps"; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char KioskAppManager::kIconCacheDir[] = "kiosk"; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<KioskAppManager> instance = LAZY_INSTANCE_INITIALIZER; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KioskAppManager* KioskAppManager::Get() { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return instance.Pointer(); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void KioskAppManager::Shutdown() { 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (instance == NULL) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) instance.Pointer()->CleanUp(); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::RegisterPrefs(PrefRegistrySimple* registry) { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterDictionaryPref(kKioskDictionaryName); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KioskAppManager::App::App(const KioskAppData& data) 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : app_id(data.app_id()), 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_id(data.user_id()), 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name(data.name()), 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon(data.icon()), 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_loading(data.IsLoading()) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KioskAppManager::App::App() : is_loading(false) {} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KioskAppManager::App::~App() {} 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string KioskAppManager::GetAutoLaunchApp() const { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return auto_launch_app_id_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::SetAutoLaunchApp(const std::string& app_id) { 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrosSettings::Get()->SetString( 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAccountsPrefDeviceLocalAccountAutoLoginId, 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) app_id.empty() ? std::string() : GenerateKioskAppAccountId(app_id)); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrosSettings::Get()->SetInteger( 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAccountsPrefDeviceLocalAccountAutoLoginDelay, 0); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::AddApp(const std::string& app_id) { 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<policy::DeviceLocalAccount> device_local_accounts = 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) policy::GetDeviceLocalAccounts(CrosSettings::Get()); 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Don't insert the app if it's already in the list. 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::vector<policy::DeviceLocalAccount>::const_iterator 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it = device_local_accounts.begin(); 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != device_local_accounts.end(); ++it) { 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (it->type == policy::DeviceLocalAccount::TYPE_KIOSK_APP && 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it->kiosk_app_id == app_id) { 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add the new account. 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) device_local_accounts.push_back(policy::DeviceLocalAccount( 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) policy::DeviceLocalAccount::TYPE_KIOSK_APP, 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GenerateKioskAppAccountId(app_id), 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) app_id, 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string())); 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) policy::SetDeviceLocalAccounts(CrosSettings::Get(), device_local_accounts); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::RemoveApp(const std::string& app_id) { 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<policy::DeviceLocalAccount> device_local_accounts = 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) policy::GetDeviceLocalAccounts(CrosSettings::Get()); 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (device_local_accounts.empty()) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Remove entries that match |app_id|. 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::vector<policy::DeviceLocalAccount>::iterator 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it = device_local_accounts.begin(); 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != device_local_accounts.end(); ++it) { 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (it->type == policy::DeviceLocalAccount::TYPE_KIOSK_APP && 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it->kiosk_app_id == app_id) { 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) device_local_accounts.erase(it); 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) policy::SetDeviceLocalAccounts(CrosSettings::Get(), device_local_accounts); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::GetApps(Apps* apps) const { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps->reserve(apps_.size()); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < apps_.size(); ++i) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps->push_back(App(*apps_[i])); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool KioskAppManager::GetApp(const std::string& app_id, App* app) const { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const KioskAppData* data = GetAppData(app_id); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!data) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *app = App(*data); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::RefCountedString* KioskAppManager::GetAppRawIcon( 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& app_id) const { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const KioskAppData* data = GetAppData(app_id); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!data) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return data->raw_icon(); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool KioskAppManager::GetDisableBailoutShortcut() const { 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool enable; 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CrosSettings::Get()->GetBoolean( 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled, &enable)) { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !enable; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::AddObserver(KioskAppManagerObserver* observer) { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_.AddObserver(observer); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::RemoveObserver(KioskAppManagerObserver* observer) { 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_.RemoveObserver(observer); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)KioskAppManager::KioskAppManager() { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateAppData(); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrosSettings::Get()->AddSettingsObserver( 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAccountsPrefDeviceLocalAccounts, this); 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrosSettings::Get()->AddSettingsObserver( 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAccountsPrefDeviceLocalAccountAutoLoginId, this); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)KioskAppManager::~KioskAppManager() {} 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void KioskAppManager::CleanUp() { 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrosSettings::Get()->RemoveSettingsObserver( 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAccountsPrefDeviceLocalAccounts, this); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrosSettings::Get()->RemoveSettingsObserver( 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAccountsPrefDeviceLocalAccountAutoLoginId, this); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) apps_.clear(); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const KioskAppData* KioskAppManager::GetAppData( 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& app_id) const { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < apps_.size(); ++i) { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const KioskAppData* data = apps_[i]; 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (data->app_id() == app_id) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return data; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::UpdateAppData() { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets app id to data mapping for existing apps. 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, KioskAppData*> old_apps; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < apps_.size(); ++i) 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) old_apps[apps_[i]->app_id()] = apps_[i]; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_.weak_clear(); // |old_apps| takes ownership 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) auto_launch_app_id_.clear(); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string auto_login_account_id; 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrosSettings::Get()->GetString(kAccountsPrefDeviceLocalAccountAutoLoginId, 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &auto_login_account_id); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Re-populates |apps_| and reuses existing KioskAppData when possible. 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<policy::DeviceLocalAccount> device_local_accounts = 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) policy::GetDeviceLocalAccounts(CrosSettings::Get()); 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::vector<policy::DeviceLocalAccount>::const_iterator 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it = device_local_accounts.begin(); 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != device_local_accounts.end(); ++it) { 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (it->type != policy::DeviceLocalAccount::TYPE_KIOSK_APP) 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (it->account_id == auto_login_account_id) 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) auto_launch_app_id_ = it->kiosk_app_id; 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(mnissler): Support non-CWS update URLs. 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::map<std::string, KioskAppData*>::iterator old_it = 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) old_apps.find(it->kiosk_app_id); 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (old_it != old_apps.end()) { 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) apps_.push_back(old_it->second); 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) old_apps.erase(old_it); 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) KioskAppData* new_app = 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new KioskAppData(this, it->kiosk_app_id, it->user_id); 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) apps_.push_back(new_app); // Takes ownership of |new_app|. 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new_app->Load(); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clears cache and deletes the remaining old data. 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::map<std::string, KioskAppData*>::iterator it = old_apps.begin(); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != old_apps.end(); ++it) { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->second->ClearCache(); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cryptohome::AsyncMethodCaller::GetInstance()->AsyncRemove( 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->first, base::Bind(&OnRemoveAppCryptohomeComplete, it->first)); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STLDeleteValues(&old_apps); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FOR_EACH_OBSERVER(KioskAppManagerObserver, observers_, 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnKioskAppsSettingsChanged()); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void KioskAppManager::Observe(int type, 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationSource& source, 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationDetails& details) { 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(chrome::NOTIFICATION_SYSTEM_SETTING_CHANGED, type); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateAppData(); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::GetKioskAppIconCacheDir(base::FilePath* cache_dir) { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_data_dir; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *cache_dir = user_data_dir.AppendASCII(kIconCacheDir); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::OnKioskAppDataChanged(const std::string& app_id) { 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(KioskAppManagerObserver, 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnKioskAppDataChanged(app_id)); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppManager::OnKioskAppDataLoadFailure(const std::string& app_id) { 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(KioskAppManagerObserver, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnKioskAppDataLoadFailure(app_id)); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveApp(app_id); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 287