OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" | 5 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/barrier_closure.h" | 10 #include "base/barrier_closure.h" |
(...skipping 20 matching lines...) Expand all Loading... | |
31 #include "chrome/browser/extensions/external_loader.h" | 31 #include "chrome/browser/extensions/external_loader.h" |
32 #include "chrome/browser/extensions/external_provider_impl.h" | 32 #include "chrome/browser/extensions/external_provider_impl.h" |
33 #include "chrome/browser/lifetime/application_lifetime.h" | 33 #include "chrome/browser/lifetime/application_lifetime.h" |
34 #include "chrome/common/chrome_paths.h" | 34 #include "chrome/common/chrome_paths.h" |
35 #include "chrome/common/extensions/extension_constants.h" | 35 #include "chrome/common/extensions/extension_constants.h" |
36 #include "chromeos/chromeos_paths.h" | 36 #include "chromeos/chromeos_paths.h" |
37 #include "chromeos/cryptohome/async_method_caller.h" | 37 #include "chromeos/cryptohome/async_method_caller.h" |
38 #include "chromeos/dbus/dbus_thread_manager.h" | 38 #include "chromeos/dbus/dbus_thread_manager.h" |
39 #include "chromeos/settings/cros_settings_names.h" | 39 #include "chromeos/settings/cros_settings_names.h" |
40 #include "components/ownership/owner_key_util.h" | 40 #include "components/ownership/owner_key_util.h" |
41 #include "components/user_manager/user_id.h" | |
41 #include "components/user_manager/user_manager.h" | 42 #include "components/user_manager/user_manager.h" |
42 #include "content/public/browser/browser_thread.h" | 43 #include "content/public/browser/browser_thread.h" |
43 #include "extensions/common/extension_urls.h" | 44 #include "extensions/common/extension_urls.h" |
44 | 45 |
45 namespace chromeos { | 46 namespace chromeos { |
46 | 47 |
47 namespace { | 48 namespace { |
48 | 49 |
49 // Domain that is used for kiosk-app account IDs. | 50 // Domain that is used for kiosk-app account IDs. |
50 const char kKioskAppAccountDomain[] = "kiosk-apps"; | 51 const char kKioskAppAccountDomain[] = "kiosk-apps"; |
51 | 52 |
52 // Preference for the dictionary of user ids for which cryptohomes have to be | 53 // Preference for the dictionary of user ids for which cryptohomes have to be |
53 // removed upon browser restart. | 54 // removed upon browser restart. |
54 const char kKioskUsersToRemove[] = "kiosk-users-to-remove"; | 55 const char kKioskUsersToRemove[] = "kiosk-users-to-remove"; |
55 | 56 |
56 std::string GenerateKioskAppAccountId(const std::string& app_id) { | 57 std::string GenerateKioskAppAccountId(const std::string& app_id) { |
57 return app_id + '@' + kKioskAppAccountDomain; | 58 return app_id + '@' + kKioskAppAccountDomain; |
58 } | 59 } |
59 | 60 |
60 void ScheduleDelayedCryptohomeRemoval(const std::string& user_id, | 61 void ScheduleDelayedCryptohomeRemoval(const user_manager::UserID& user_id, |
61 const std::string& app_id) { | 62 const std::string& app_id) { |
62 PrefService* local_state = g_browser_process->local_state(); | 63 PrefService* local_state = g_browser_process->local_state(); |
63 DictionaryPrefUpdate dict_update(local_state, kKioskUsersToRemove); | 64 DictionaryPrefUpdate dict_update(local_state, kKioskUsersToRemove); |
64 dict_update->SetStringWithoutPathExpansion(user_id, app_id); | 65 dict_update->SetStringWithoutPathExpansion(user_id.GetUserEmail(), app_id); |
65 local_state->CommitPendingWrite(); | 66 local_state->CommitPendingWrite(); |
66 } | 67 } |
67 | 68 |
68 void CancelDelayedCryptohomeRemoval(const std::string& user_id) { | 69 void CancelDelayedCryptohomeRemoval(const user_manager::UserID& user_id) { |
69 PrefService* local_state = g_browser_process->local_state(); | 70 PrefService* local_state = g_browser_process->local_state(); |
70 DictionaryPrefUpdate dict_update(local_state, kKioskUsersToRemove); | 71 DictionaryPrefUpdate dict_update(local_state, kKioskUsersToRemove); |
71 dict_update->RemoveWithoutPathExpansion(user_id, NULL); | 72 dict_update->RemoveWithoutPathExpansion(user_id.GetUserEmail(), NULL); |
72 local_state->CommitPendingWrite(); | 73 local_state->CommitPendingWrite(); |
73 } | 74 } |
74 | 75 |
75 void OnRemoveAppCryptohomeComplete(const std::string& user_id, | 76 void OnRemoveAppCryptohomeComplete(const user_manager::UserID& user_id, |
76 const std::string& app, | 77 const std::string& app, |
77 const base::Closure& callback, | 78 const base::Closure& callback, |
78 bool success, | 79 bool success, |
79 cryptohome::MountError return_code) { | 80 cryptohome::MountError return_code) { |
80 if (success) { | 81 if (success) { |
81 CancelDelayedCryptohomeRemoval(user_id); | 82 CancelDelayedCryptohomeRemoval(user_id); |
82 } else { | 83 } else { |
83 ScheduleDelayedCryptohomeRemoval(user_id, app); | 84 ScheduleDelayedCryptohomeRemoval(user_id, app); |
84 LOG(ERROR) << "Remove cryptohome for " << app | 85 LOG(ERROR) << "Remove cryptohome for " << app |
85 << " failed, return code: " << return_code; | 86 << " failed, return code: " << return_code; |
86 } | 87 } |
87 if (!callback.is_null()) | 88 if (!callback.is_null()) |
88 callback.Run(); | 89 callback.Run(); |
89 } | 90 } |
90 | 91 |
91 void PerformDelayedCryptohomeRemovals(bool service_is_available) { | 92 void PerformDelayedCryptohomeRemovals(bool service_is_available) { |
92 if (!service_is_available) { | 93 if (!service_is_available) { |
93 LOG(ERROR) << "Crypthomed is not available."; | 94 LOG(ERROR) << "Crypthomed is not available."; |
94 return; | 95 return; |
95 } | 96 } |
96 | 97 |
97 PrefService* local_state = g_browser_process->local_state(); | 98 PrefService* local_state = g_browser_process->local_state(); |
98 const base::DictionaryValue* dict = | 99 const base::DictionaryValue* dict = |
99 local_state->GetDictionary(kKioskUsersToRemove); | 100 local_state->GetDictionary(kKioskUsersToRemove); |
100 for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { | 101 for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { |
101 std::string user_id = it.key(); | 102 const user_manager::UserID user_id(std::string() /* gaia_id */, it.key()); |
Denis Kuznetsov (DE-MUC)
2015/06/10 16:50:46
FromUserEmail()
| |
102 std::string app_id; | 103 std::string app_id; |
103 it.value().GetAsString(&app_id); | 104 it.value().GetAsString(&app_id); |
104 VLOG(1) << "Removing obsolete crypthome for " << app_id; | 105 VLOG(1) << "Removing obsolete crypthome for " << app_id; |
105 cryptohome::AsyncMethodCaller::GetInstance()->AsyncRemove( | 106 cryptohome::AsyncMethodCaller::GetInstance()->AsyncRemove( |
106 user_id, | 107 user_id, |
107 base::Bind(&OnRemoveAppCryptohomeComplete, | 108 base::Bind(&OnRemoveAppCryptohomeComplete, |
108 user_id, | 109 user_id, |
109 app_id, | 110 app_id, |
110 base::Closure())); | 111 base::Closure())); |
111 } | 112 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
168 bool is_extension_pending, | 169 bool is_extension_pending, |
169 bool auto_launched_with_zero_delay) | 170 bool auto_launched_with_zero_delay) |
170 : app_id(data.app_id()), | 171 : app_id(data.app_id()), |
171 user_id(data.user_id()), | 172 user_id(data.user_id()), |
172 name(data.name()), | 173 name(data.name()), |
173 icon(data.icon()), | 174 icon(data.icon()), |
174 is_loading(data.IsLoading() || is_extension_pending), | 175 is_loading(data.IsLoading() || is_extension_pending), |
175 was_auto_launched_with_zero_delay(auto_launched_with_zero_delay) { | 176 was_auto_launched_with_zero_delay(auto_launched_with_zero_delay) { |
176 } | 177 } |
177 | 178 |
178 KioskAppManager::App::App() : is_loading(false), | 179 KioskAppManager::App::App() : user_id(std::string(), std::string()), |
Denis Kuznetsov (DE-MUC)
2015/06/10 16:50:46
EmptyUserId() ?
| |
180 is_loading(false), | |
179 was_auto_launched_with_zero_delay(false) {} | 181 was_auto_launched_with_zero_delay(false) {} |
180 | 182 |
181 KioskAppManager::App::~App() {} | 183 KioskAppManager::App::~App() {} |
182 | 184 |
183 std::string KioskAppManager::GetAutoLaunchApp() const { | 185 std::string KioskAppManager::GetAutoLaunchApp() const { |
184 return auto_launch_app_id_; | 186 return auto_launch_app_id_; |
185 } | 187 } |
186 | 188 |
187 void KioskAppManager::SetAutoLaunchApp(const std::string& app_id, | 189 void KioskAppManager::SetAutoLaunchApp(const std::string& app_id, |
188 OwnerSettingsServiceChromeOS* service) { | 190 OwnerSettingsServiceChromeOS* service) { |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
602 new_app->Load(); | 604 new_app->Load(); |
603 } | 605 } |
604 CancelDelayedCryptohomeRemoval(it->user_id); | 606 CancelDelayedCryptohomeRemoval(it->user_id); |
605 } | 607 } |
606 | 608 |
607 base::Closure cryptohomes_barrier_closure; | 609 base::Closure cryptohomes_barrier_closure; |
608 | 610 |
609 const user_manager::User* active_user = | 611 const user_manager::User* active_user = |
610 user_manager::UserManager::Get()->GetActiveUser(); | 612 user_manager::UserManager::Get()->GetActiveUser(); |
611 if (active_user) { | 613 if (active_user) { |
612 std::string active_user_id = active_user->GetUserID(); | 614 user_manager::UserID active_user_id = active_user->GetUserID(); |
Denis Kuznetsov (DE-MUC)
2015/06/10 16:50:46
auto?
| |
613 for (const auto& it : old_apps) { | 615 for (const auto& it : old_apps) { |
614 if (it.second->user_id() == active_user_id) { | 616 if (it.second->user_id() == active_user_id) { |
615 VLOG(1) << "Currently running kiosk app removed from policy, exiting"; | 617 VLOG(1) << "Currently running kiosk app removed from policy, exiting"; |
616 cryptohomes_barrier_closure = BarrierClosure( | 618 cryptohomes_barrier_closure = BarrierClosure( |
617 old_apps.size(), base::Bind(&chrome::AttemptUserExit)); | 619 old_apps.size(), base::Bind(&chrome::AttemptUserExit)); |
618 break; | 620 break; |
619 } | 621 } |
620 } | 622 } |
621 } | 623 } |
622 | 624 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
734 *cache_dir = user_data_dir.AppendASCII(kCrxCacheDir); | 736 *cache_dir = user_data_dir.AppendASCII(kCrxCacheDir); |
735 } | 737 } |
736 | 738 |
737 void KioskAppManager::GetCrxUnpackDir(base::FilePath* unpack_dir) { | 739 void KioskAppManager::GetCrxUnpackDir(base::FilePath* unpack_dir) { |
738 base::FilePath temp_dir; | 740 base::FilePath temp_dir; |
739 base::GetTempDir(&temp_dir); | 741 base::GetTempDir(&temp_dir); |
740 *unpack_dir = temp_dir.AppendASCII(kCrxUnpackDir); | 742 *unpack_dir = temp_dir.AppendASCII(kCrxUnpackDir); |
741 } | 743 } |
742 | 744 |
743 } // namespace chromeos | 745 } // namespace chromeos |
OLD | NEW |