| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/policy/device_local_account_policy_service.h" | 5 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/files/file_enumerator.h" | 12 #include "base/files/file_enumerator.h" |
| 13 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
| 16 #include "base/message_loop/message_loop_proxy.h" | 16 #include "base/message_loop/message_loop_proxy.h" |
| 17 #include "base/path_service.h" | 17 #include "base/path_service.h" |
| 18 #include "base/sequenced_task_runner.h" | 18 #include "base/sequenced_task_runner.h" |
| 19 #include "base/stl_util.h" | 19 #include "base/stl_util.h" |
| 20 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
| 21 #include "base/thread_task_runner_handle.h" |
| 22 #include "base/time/default_clock.h" |
| 21 #include "chrome/browser/browser_process.h" | 23 #include "chrome/browser/browser_process.h" |
| 22 #include "chrome/browser/chromeos/policy/device_local_account.h" | 24 #include "chrome/browser/chromeos/policy/device_local_account.h" |
| 23 #include "chrome/browser/chromeos/policy/device_local_account_external_data_serv
ice.h" | 25 #include "chrome/browser/chromeos/policy/device_local_account_external_data_serv
ice.h" |
| 24 #include "chrome/browser/chromeos/policy/device_local_account_policy_store.h" | 26 #include "chrome/browser/chromeos/policy/device_local_account_policy_store.h" |
| 25 #include "chrome/browser/chromeos/settings/device_settings_service.h" | 27 #include "chrome/browser/chromeos/settings/device_settings_service.h" |
| 28 #include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" |
| 26 #include "chrome/common/chrome_content_client.h" | 29 #include "chrome/common/chrome_content_client.h" |
| 27 #include "chromeos/chromeos_paths.h" | 30 #include "chromeos/chromeos_paths.h" |
| 28 #include "chromeos/dbus/session_manager_client.h" | 31 #include "chromeos/dbus/session_manager_client.h" |
| 29 #include "chromeos/settings/cros_settings_names.h" | 32 #include "chromeos/settings/cros_settings_names.h" |
| 30 #include "chromeos/settings/cros_settings_provider.h" | 33 #include "chromeos/settings/cros_settings_provider.h" |
| 31 #include "components/policy/core/browser/browser_policy_connector.h" | 34 #include "components/policy/core/browser/browser_policy_connector.h" |
| 32 #include "components/policy/core/common/cloud/cloud_policy_client.h" | 35 #include "components/policy/core/common/cloud/cloud_policy_client.h" |
| 33 #include "components/policy/core/common/cloud/cloud_policy_constants.h" | 36 #include "components/policy/core/common/cloud/cloud_policy_constants.h" |
| 34 #include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h" | 37 #include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h" |
| 35 #include "components/policy/core/common/cloud/device_management_service.h" | 38 #include "components/policy/core/common/cloud/device_management_service.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 &cache_root_dir)); | 111 &cache_root_dir)); |
| 109 const base::FilePath path = cache_root_dir.Append( | 112 const base::FilePath path = cache_root_dir.Append( |
| 110 GetCacheSubdirectoryForAccountID(account_id_to_delete)); | 113 GetCacheSubdirectoryForAccountID(account_id_to_delete)); |
| 111 if (base::DirectoryExists(path)) | 114 if (base::DirectoryExists(path)) |
| 112 base::DeleteFile(path, true); | 115 base::DeleteFile(path, true); |
| 113 } | 116 } |
| 114 | 117 |
| 115 } // namespace | 118 } // namespace |
| 116 | 119 |
| 117 DeviceLocalAccountPolicyBroker::DeviceLocalAccountPolicyBroker( | 120 DeviceLocalAccountPolicyBroker::DeviceLocalAccountPolicyBroker( |
| 121 AffiliatedInvalidationServiceProvider* invalidation_service_provider, |
| 118 const DeviceLocalAccount& account, | 122 const DeviceLocalAccount& account, |
| 119 const base::FilePath& component_policy_cache_path, | 123 const base::FilePath& component_policy_cache_path, |
| 120 scoped_ptr<DeviceLocalAccountPolicyStore> store, | 124 scoped_ptr<DeviceLocalAccountPolicyStore> store, |
| 121 scoped_refptr<DeviceLocalAccountExternalDataManager> external_data_manager, | 125 scoped_refptr<DeviceLocalAccountExternalDataManager> external_data_manager, |
| 122 const base::Closure& policy_update_callback, | 126 const base::Closure& policy_update_callback, |
| 123 const scoped_refptr<base::SequencedTaskRunner>& task_runner) | 127 const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
| 124 : account_id_(account.account_id), | 128 : invalidation_service_provider_(invalidation_service_provider), |
| 129 account_id_(account.account_id), |
| 125 user_id_(account.user_id), | 130 user_id_(account.user_id), |
| 126 component_policy_cache_path_(component_policy_cache_path), | 131 component_policy_cache_path_(component_policy_cache_path), |
| 127 store_(store.Pass()), | 132 store_(store.Pass()), |
| 128 extension_tracker_(account, store_.get(), &schema_registry_), | 133 extension_tracker_(account, store_.get(), &schema_registry_), |
| 129 external_data_manager_(external_data_manager), | 134 external_data_manager_(external_data_manager), |
| 130 core_(dm_protocol::kChromePublicAccountPolicyType, | 135 core_(dm_protocol::kChromePublicAccountPolicyType, |
| 131 store_->account_id(), | 136 store_->account_id(), |
| 132 store_.get(), | 137 store_.get(), |
| 133 task_runner), | 138 task_runner), |
| 134 policy_update_callback_(policy_update_callback) { | 139 policy_update_callback_(policy_update_callback), |
| 140 highest_handled_invalidation_version_(0), |
| 141 invalidation_service_(nullptr) { |
| 135 base::FilePath cache_root_dir; | 142 base::FilePath cache_root_dir; |
| 136 CHECK(PathService::Get(chromeos::DIR_DEVICE_LOCAL_ACCOUNT_EXTENSIONS, | 143 CHECK(PathService::Get(chromeos::DIR_DEVICE_LOCAL_ACCOUNT_EXTENSIONS, |
| 137 &cache_root_dir)); | 144 &cache_root_dir)); |
| 138 extension_loader_ = new chromeos::DeviceLocalAccountExternalPolicyLoader( | 145 extension_loader_ = new chromeos::DeviceLocalAccountExternalPolicyLoader( |
| 139 store_.get(), | 146 store_.get(), |
| 140 cache_root_dir.Append( | 147 cache_root_dir.Append( |
| 141 GetCacheSubdirectoryForAccountID(account.account_id))); | 148 GetCacheSubdirectoryForAccountID(account.account_id))); |
| 142 store_->AddObserver(this); | 149 store_->AddObserver(this); |
| 143 | 150 |
| 144 // Unblock the |schema_registry_| so that the |component_policy_service_| | 151 // Unblock the |schema_registry_| so that the |component_policy_service_| |
| 145 // starts using it. | 152 // starts using it. |
| 146 schema_registry_.RegisterComponent( | 153 schema_registry_.RegisterComponent( |
| 147 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), | 154 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), |
| 148 g_browser_process->browser_policy_connector()->GetChromeSchema()); | 155 g_browser_process->browser_policy_connector()->GetChromeSchema()); |
| 149 schema_registry_.SetReady(POLICY_DOMAIN_CHROME); | 156 schema_registry_.SetReady(POLICY_DOMAIN_CHROME); |
| 150 schema_registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); | 157 schema_registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); |
| 158 |
| 159 invalidation_service_provider_->RegisterConsumer(this); |
| 151 } | 160 } |
| 152 | 161 |
| 153 DeviceLocalAccountPolicyBroker::~DeviceLocalAccountPolicyBroker() { | 162 DeviceLocalAccountPolicyBroker::~DeviceLocalAccountPolicyBroker() { |
| 163 DestroyInvalidator(); |
| 164 invalidation_service_provider_->UnregisterConsumer(this); |
| 154 store_->RemoveObserver(this); | 165 store_->RemoveObserver(this); |
| 155 external_data_manager_->SetPolicyStore(nullptr); | 166 external_data_manager_->SetPolicyStore(nullptr); |
| 156 external_data_manager_->Disconnect(); | 167 external_data_manager_->Disconnect(); |
| 157 } | 168 } |
| 158 | 169 |
| 159 void DeviceLocalAccountPolicyBroker::Initialize() { | 170 void DeviceLocalAccountPolicyBroker::Initialize() { |
| 160 store_->Load(); | 171 store_->Load(); |
| 161 } | 172 } |
| 162 | 173 |
| 163 void DeviceLocalAccountPolicyBroker::ConnectIfPossible( | 174 void DeviceLocalAccountPolicyBroker::ConnectIfPossible( |
| 164 chromeos::DeviceSettingsService* device_settings_service, | 175 chromeos::DeviceSettingsService* device_settings_service, |
| 165 DeviceManagementService* device_management_service, | 176 DeviceManagementService* device_management_service, |
| 166 scoped_refptr<net::URLRequestContextGetter> request_context) { | 177 scoped_refptr<net::URLRequestContextGetter> request_context) { |
| 167 if (core_.client()) | 178 if (IsConnected()) |
| 168 return; | 179 return; |
| 169 | 180 |
| 170 scoped_ptr<CloudPolicyClient> client(CreateClient(device_settings_service, | 181 scoped_ptr<CloudPolicyClient> client(CreateClient(device_settings_service, |
| 171 device_management_service, | 182 device_management_service, |
| 172 request_context)); | 183 request_context)); |
| 173 if (!client) | 184 if (!client) |
| 174 return; | 185 return; |
| 175 | 186 |
| 176 CreateComponentCloudPolicyService(request_context, client.get()); | 187 CreateComponentCloudPolicyService(request_context, client.get()); |
| 177 core_.Connect(client.Pass()); | 188 core_.Connect(client.Pass()); |
| 178 external_data_manager_->Connect(request_context); | 189 external_data_manager_->Connect(request_context); |
| 179 core_.StartRefreshScheduler(); | 190 core_.StartRefreshScheduler(); |
| 180 UpdateRefreshDelay(); | 191 UpdateRefreshDelay(); |
| 192 CreateInvalidatorIfPossible(); |
| 181 } | 193 } |
| 182 | 194 |
| 183 void DeviceLocalAccountPolicyBroker::UpdateRefreshDelay() { | 195 void DeviceLocalAccountPolicyBroker::UpdateRefreshDelay() { |
| 184 if (core_.refresh_scheduler()) { | 196 if (core_.refresh_scheduler()) { |
| 185 const base::Value* policy_value = | 197 const base::Value* policy_value = |
| 186 store_->policy_map().GetValue(key::kPolicyRefreshRate); | 198 store_->policy_map().GetValue(key::kPolicyRefreshRate); |
| 187 int delay = 0; | 199 int delay = 0; |
| 188 if (policy_value && policy_value->GetAsInteger(&delay)) | 200 if (policy_value && policy_value->GetAsInteger(&delay)) |
| 189 core_.refresh_scheduler()->SetRefreshDelay(delay); | 201 core_.refresh_scheduler()->SetRefreshDelay(delay); |
| 190 } | 202 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 205 } | 217 } |
| 206 | 218 |
| 207 void DeviceLocalAccountPolicyBroker::OnStoreError(CloudPolicyStore* store) { | 219 void DeviceLocalAccountPolicyBroker::OnStoreError(CloudPolicyStore* store) { |
| 208 policy_update_callback_.Run(); | 220 policy_update_callback_.Run(); |
| 209 } | 221 } |
| 210 | 222 |
| 211 void DeviceLocalAccountPolicyBroker::OnComponentCloudPolicyUpdated() { | 223 void DeviceLocalAccountPolicyBroker::OnComponentCloudPolicyUpdated() { |
| 212 policy_update_callback_.Run(); | 224 policy_update_callback_.Run(); |
| 213 } | 225 } |
| 214 | 226 |
| 227 void DeviceLocalAccountPolicyBroker::OnInvalidationServiceSet( |
| 228 invalidation::InvalidationService* invalidation_service) { |
| 229 DestroyInvalidator(); |
| 230 |
| 231 invalidation_service_ = invalidation_service; |
| 232 if (invalidation_service_) |
| 233 CreateInvalidatorIfPossible(); |
| 234 } |
| 235 |
| 236 CloudPolicyInvalidator* |
| 237 DeviceLocalAccountPolicyBroker::GetInvalidatorForTest() const { |
| 238 return invalidator_.get(); |
| 239 } |
| 240 |
| 241 bool DeviceLocalAccountPolicyBroker::IsConnected() { |
| 242 return core_.client(); |
| 243 } |
| 244 |
| 215 void DeviceLocalAccountPolicyBroker::CreateComponentCloudPolicyService( | 245 void DeviceLocalAccountPolicyBroker::CreateComponentCloudPolicyService( |
| 216 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 246 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 217 CloudPolicyClient* client) { | 247 CloudPolicyClient* client) { |
| 218 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 248 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 219 switches::kDisableComponentCloudPolicy)) { | 249 switches::kDisableComponentCloudPolicy)) { |
| 220 // Disabled via the command line. | 250 // Disabled via the command line. |
| 221 return; | 251 return; |
| 222 } | 252 } |
| 223 | 253 |
| 224 scoped_ptr<ResourceCache> resource_cache( | 254 scoped_ptr<ResourceCache> resource_cache( |
| 225 new ResourceCache(component_policy_cache_path_, | 255 new ResourceCache(component_policy_cache_path_, |
| 226 content::BrowserThread::GetMessageLoopProxyForThread( | 256 content::BrowserThread::GetMessageLoopProxyForThread( |
| 227 content::BrowserThread::FILE))); | 257 content::BrowserThread::FILE))); |
| 228 | 258 |
| 229 component_policy_service_.reset(new ComponentCloudPolicyService( | 259 component_policy_service_.reset(new ComponentCloudPolicyService( |
| 230 this, | 260 this, |
| 231 &schema_registry_, | 261 &schema_registry_, |
| 232 core(), | 262 core(), |
| 233 client, | 263 client, |
| 234 resource_cache.Pass(), | 264 resource_cache.Pass(), |
| 235 request_context, | 265 request_context, |
| 236 content::BrowserThread::GetMessageLoopProxyForThread( | 266 content::BrowserThread::GetMessageLoopProxyForThread( |
| 237 content::BrowserThread::FILE), | 267 content::BrowserThread::FILE), |
| 238 content::BrowserThread::GetMessageLoopProxyForThread( | 268 content::BrowserThread::GetMessageLoopProxyForThread( |
| 239 content::BrowserThread::IO))); | 269 content::BrowserThread::IO))); |
| 240 } | 270 } |
| 241 | 271 |
| 272 void DeviceLocalAccountPolicyBroker::CreateInvalidatorIfPossible() { |
| 273 DCHECK(!invalidator_); |
| 274 |
| 275 if (!invalidation_service_ || !IsConnected()) |
| 276 return; |
| 277 |
| 278 invalidator_.reset(new CloudPolicyInvalidator( |
| 279 enterprise_management::DeviceRegisterRequest::USER, |
| 280 core(), |
| 281 base::ThreadTaskRunnerHandle::Get(), |
| 282 make_scoped_ptr(new base::DefaultClock), |
| 283 highest_handled_invalidation_version_)); |
| 284 invalidator_->Initialize(invalidation_service_); |
| 285 } |
| 286 |
| 287 void DeviceLocalAccountPolicyBroker::DestroyInvalidator() { |
| 288 if (!invalidator_) |
| 289 return; |
| 290 |
| 291 highest_handled_invalidation_version_ = |
| 292 invalidator_->highest_handled_invalidation_version(); |
| 293 invalidator_->Shutdown(); |
| 294 invalidator_.reset(); |
| 295 } |
| 296 |
| 242 DeviceLocalAccountPolicyService::DeviceLocalAccountPolicyService( | 297 DeviceLocalAccountPolicyService::DeviceLocalAccountPolicyService( |
| 243 chromeos::SessionManagerClient* session_manager_client, | 298 chromeos::SessionManagerClient* session_manager_client, |
| 244 chromeos::DeviceSettingsService* device_settings_service, | 299 chromeos::DeviceSettingsService* device_settings_service, |
| 245 chromeos::CrosSettings* cros_settings, | 300 chromeos::CrosSettings* cros_settings, |
| 301 AffiliatedInvalidationServiceProvider* invalidation_service_provider, |
| 246 scoped_refptr<base::SequencedTaskRunner> store_background_task_runner, | 302 scoped_refptr<base::SequencedTaskRunner> store_background_task_runner, |
| 247 scoped_refptr<base::SequencedTaskRunner> extension_cache_task_runner, | 303 scoped_refptr<base::SequencedTaskRunner> extension_cache_task_runner, |
| 248 scoped_refptr<base::SequencedTaskRunner> | 304 scoped_refptr<base::SequencedTaskRunner> |
| 249 external_data_service_backend_task_runner, | 305 external_data_service_backend_task_runner, |
| 250 scoped_refptr<base::SequencedTaskRunner> io_task_runner, | 306 scoped_refptr<base::SequencedTaskRunner> io_task_runner, |
| 251 scoped_refptr<net::URLRequestContextGetter> request_context) | 307 scoped_refptr<net::URLRequestContextGetter> request_context) |
| 252 : session_manager_client_(session_manager_client), | 308 : session_manager_client_(session_manager_client), |
| 253 device_settings_service_(device_settings_service), | 309 device_settings_service_(device_settings_service), |
| 254 cros_settings_(cros_settings), | 310 cros_settings_(cros_settings), |
| 311 invalidation_service_provider_(invalidation_service_provider), |
| 255 device_management_service_(nullptr), | 312 device_management_service_(nullptr), |
| 256 waiting_for_cros_settings_(false), | 313 waiting_for_cros_settings_(false), |
| 257 orphan_extension_cache_deletion_state_(NOT_STARTED), | 314 orphan_extension_cache_deletion_state_(NOT_STARTED), |
| 258 store_background_task_runner_(store_background_task_runner), | 315 store_background_task_runner_(store_background_task_runner), |
| 259 extension_cache_task_runner_(extension_cache_task_runner), | 316 extension_cache_task_runner_(extension_cache_task_runner), |
| 260 request_context_(request_context), | 317 request_context_(request_context), |
| 261 local_accounts_subscription_(cros_settings_->AddSettingsObserver( | 318 local_accounts_subscription_(cros_settings_->AddSettingsObserver( |
| 262 chromeos::kAccountsPrefDeviceLocalAccounts, | 319 chromeos::kAccountsPrefDeviceLocalAccounts, |
| 263 base::Bind(&DeviceLocalAccountPolicyService:: | 320 base::Bind(&DeviceLocalAccountPolicyService:: |
| 264 UpdateAccountListIfNonePending, | 321 UpdateAccountListIfNonePending, |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 scoped_ptr<DeviceLocalAccountPolicyStore> store( | 504 scoped_ptr<DeviceLocalAccountPolicyStore> store( |
| 448 new DeviceLocalAccountPolicyStore(it->account_id, | 505 new DeviceLocalAccountPolicyStore(it->account_id, |
| 449 session_manager_client_, | 506 session_manager_client_, |
| 450 device_settings_service_, | 507 device_settings_service_, |
| 451 store_background_task_runner_)); | 508 store_background_task_runner_)); |
| 452 scoped_refptr<DeviceLocalAccountExternalDataManager> | 509 scoped_refptr<DeviceLocalAccountExternalDataManager> |
| 453 external_data_manager = | 510 external_data_manager = |
| 454 external_data_service_->GetExternalDataManager(it->account_id, | 511 external_data_service_->GetExternalDataManager(it->account_id, |
| 455 store.get()); | 512 store.get()); |
| 456 broker.reset(new DeviceLocalAccountPolicyBroker( | 513 broker.reset(new DeviceLocalAccountPolicyBroker( |
| 514 invalidation_service_provider_, |
| 457 *it, | 515 *it, |
| 458 component_policy_cache_root_.Append( | 516 component_policy_cache_root_.Append( |
| 459 GetCacheSubdirectoryForAccountID(it->account_id)), | 517 GetCacheSubdirectoryForAccountID(it->account_id)), |
| 460 store.Pass(), | 518 store.Pass(), |
| 461 external_data_manager, | 519 external_data_manager, |
| 462 base::Bind(&DeviceLocalAccountPolicyService::NotifyPolicyUpdated, | 520 base::Bind(&DeviceLocalAccountPolicyService::NotifyPolicyUpdated, |
| 463 base::Unretained(this), | 521 base::Unretained(this), |
| 464 it->user_id), | 522 it->user_id), |
| 465 base::MessageLoopProxy::current())); | 523 base::MessageLoopProxy::current())); |
| 466 } | 524 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 } | 618 } |
| 561 return nullptr; | 619 return nullptr; |
| 562 } | 620 } |
| 563 | 621 |
| 564 void DeviceLocalAccountPolicyService::NotifyPolicyUpdated( | 622 void DeviceLocalAccountPolicyService::NotifyPolicyUpdated( |
| 565 const std::string& user_id) { | 623 const std::string& user_id) { |
| 566 FOR_EACH_OBSERVER(Observer, observers_, OnPolicyUpdated(user_id)); | 624 FOR_EACH_OBSERVER(Observer, observers_, OnPolicyUpdated(user_id)); |
| 567 } | 625 } |
| 568 | 626 |
| 569 } // namespace policy | 627 } // namespace policy |
| OLD | NEW |