Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1082)

Side by Side Diff: chrome/browser/policy/browser_policy_connector.cc

Issue 11415094: Split UserCloudPolicyManager implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Bring back ProxyPolicyProvider, fix local_state policy provider, fix Joao's fine CloudPolicyTest. Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/policy/browser_policy_connector.h" 5 #include "chrome/browser/policy/browser_policy_connector.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/file_path.h" 10 #include "base/file_path.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 #elif defined(OS_MACOSX) 42 #elif defined(OS_MACOSX)
43 #include "chrome/browser/policy/policy_loader_mac.h" 43 #include "chrome/browser/policy/policy_loader_mac.h"
44 #include "chrome/browser/preferences_mac.h" 44 #include "chrome/browser/preferences_mac.h"
45 #elif defined(OS_POSIX) 45 #elif defined(OS_POSIX)
46 #include "chrome/browser/policy/config_dir_policy_loader.h" 46 #include "chrome/browser/policy/config_dir_policy_loader.h"
47 #endif 47 #endif
48 48
49 #if defined(OS_CHROMEOS) 49 #if defined(OS_CHROMEOS)
50 #include "base/utf_string_conversions.h" 50 #include "base/utf_string_conversions.h"
51 #include "chrome/browser/chromeos/cros/cros_library.h" 51 #include "chrome/browser/chromeos/cros/cros_library.h"
52 #include "chrome/browser/chromeos/login/user_manager.h" 52 #include "chrome/browser/chromeos/login/user_manager.h"
Joao da Silva 2012/11/21 17:06:34 nit: not used
Mattias Nissler (ping if slow) 2012/11/22 20:51:59 Done.
53 #include "chrome/browser/chromeos/settings/cros_settings.h" 53 #include "chrome/browser/chromeos/settings/cros_settings.h"
54 #include "chrome/browser/chromeos/settings/cros_settings_provider.h" 54 #include "chrome/browser/chromeos/settings/cros_settings_provider.h"
55 #include "chrome/browser/chromeos/settings/device_settings_service.h" 55 #include "chrome/browser/chromeos/settings/device_settings_service.h"
56 #include "chrome/browser/chromeos/system/statistics_provider.h" 56 #include "chrome/browser/chromeos/system/statistics_provider.h"
57 #include "chrome/browser/chromeos/system/timezone_settings.h" 57 #include "chrome/browser/chromeos/system/timezone_settings.h"
58 #include "chrome/browser/policy/app_pack_updater.h" 58 #include "chrome/browser/policy/app_pack_updater.h"
59 #include "chrome/browser/policy/cros_user_policy_cache.h" 59 #include "chrome/browser/policy/cros_user_policy_cache.h"
60 #include "chrome/browser/policy/device_cloud_policy_manager_chromeos.h" 60 #include "chrome/browser/policy/device_cloud_policy_manager_chromeos.h"
61 #include "chrome/browser/policy/device_cloud_policy_store_chromeos.h" 61 #include "chrome/browser/policy/device_cloud_policy_store_chromeos.h"
62 #include "chrome/browser/policy/device_policy_cache.h" 62 #include "chrome/browser/policy/device_policy_cache.h"
63 #include "chrome/browser/policy/network_configuration_updater.h" 63 #include "chrome/browser/policy/network_configuration_updater.h"
64 #include "chrome/browser/policy/user_cloud_policy_manager_chromeos.h"
65 #include "chrome/browser/policy/user_cloud_policy_store_chromeos.h"
64 #include "chromeos/dbus/dbus_thread_manager.h" 66 #include "chromeos/dbus/dbus_thread_manager.h"
65 #endif 67 #endif
66 68
67 using content::BrowserThread; 69 using content::BrowserThread;
68 70
69 namespace policy { 71 namespace policy {
70 72
71 namespace { 73 namespace {
72 74
73 // Subdirectory in the user's profile for storing user policies. 75 // Subdirectory in the user's profile for storing user policies.
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 g_testing_provider->Shutdown(); 152 g_testing_provider->Shutdown();
151 // Drop g_testing_provider so that tests executed with --single_process can 153 // Drop g_testing_provider so that tests executed with --single_process can
152 // call SetPolicyProviderForTesting() again. It is still owned by the test. 154 // call SetPolicyProviderForTesting() again. It is still owned by the test.
153 g_testing_provider = NULL; 155 g_testing_provider = NULL;
154 if (platform_provider_) 156 if (platform_provider_)
155 platform_provider_->Shutdown(); 157 platform_provider_->Shutdown();
156 // The |cloud_provider_| must be shut down before destroying the cloud 158 // The |cloud_provider_| must be shut down before destroying the cloud
157 // policy subsystems, which own the caches that |cloud_provider_| uses. 159 // policy subsystems, which own the caches that |cloud_provider_| uses.
158 if (cloud_provider_) 160 if (cloud_provider_)
159 cloud_provider_->Shutdown(); 161 cloud_provider_->Shutdown();
160 user_cloud_policy_provider_.Shutdown();
161 162
162 #if defined(OS_CHROMEOS) 163 #if defined(OS_CHROMEOS)
163 // Shutdown device cloud policy. 164 // Shutdown device cloud policy.
164 if (device_cloud_policy_subsystem_) 165 if (device_cloud_policy_subsystem_)
165 device_cloud_policy_subsystem_->Shutdown(); 166 device_cloud_policy_subsystem_->Shutdown();
166 // The AppPackUpdater may be observing the |device_cloud_policy_subsystem_|. 167 // The AppPackUpdater may be observing the |device_cloud_policy_subsystem_|.
167 // Delete it first. 168 // Delete it first.
168 app_pack_updater_.reset(); 169 app_pack_updater_.reset();
169 device_cloud_policy_subsystem_.reset(); 170 device_cloud_policy_subsystem_.reset();
170 device_data_store_.reset(); 171 device_data_store_.reset();
171 172
172 if (device_cloud_policy_manager_) 173 if (device_cloud_policy_manager_)
173 device_cloud_policy_manager_->Shutdown(); 174 device_cloud_policy_manager_->Shutdown();
175 if (user_cloud_policy_manager_)
176 user_cloud_policy_manager_->Shutdown();
177 global_user_cloud_policy_provider_.Shutdown();
174 #endif 178 #endif
175 179
176 // Shutdown user cloud policy. 180 // Shutdown user cloud policy.
177 if (user_cloud_policy_subsystem_) 181 if (user_cloud_policy_subsystem_)
178 user_cloud_policy_subsystem_->Shutdown(); 182 user_cloud_policy_subsystem_->Shutdown();
179 user_cloud_policy_subsystem_.reset(); 183 user_cloud_policy_subsystem_.reset();
180 user_policy_token_cache_.reset(); 184 user_policy_token_cache_.reset();
181 user_data_store_.reset(); 185 user_data_store_.reset();
182 186
183 device_management_service_.reset(); 187 device_management_service_.reset();
184 } 188 }
185 189
186 scoped_ptr<UserCloudPolicyManager>
187 BrowserPolicyConnector::CreateCloudPolicyManager(
188 Profile* profile,
189 bool force_immediate_policy_load) {
190 scoped_ptr<UserCloudPolicyManager> manager;
191 const CommandLine* command_line = CommandLine::ForCurrentProcess();
192 if (command_line->HasSwitch(switches::kEnableCloudPolicyService)) {
193 UserCloudPolicyManager::PolicyInit policy_init =
194 UserCloudPolicyManager::POLICY_INIT_IN_BACKGROUND;
195 #if defined(OS_CHROMEOS)
196 // TODO(mnissler): Revisit once Chrome OS gains multi-profiles support.
197 // Don't wait for a policy fetch if there's no logged in user.
198 if (chromeos::UserManager::Get()->IsUserLoggedIn()) {
199 std::string email =
200 chromeos::UserManager::Get()->GetLoggedInUser()->email();
201 if (GetUserAffiliation(email) == USER_AFFILIATION_MANAGED)
202 policy_init = UserCloudPolicyManager::POLICY_INIT_REFRESH_FROM_SERVER;
203 }
204 #else
205 // On desktop, there's no way to figure out if a user is logged in yet
206 // because prefs are not yet initialized, and further there's no way to know
207 // if the user is managed. So this code does not request a policy refresh
208 // from the server because that would inhibit startup for non-signed-in
209 // users. This code relies on the fact that a signed-in profile should
210 // already have policy downloaded. If no policy is available
211 // (due to a previous fetch failing), the normal policy refresh mechanism
212 // will cause it to get downloaded eventually.
213 if (force_immediate_policy_load) {
214 // On desktop, profile creation on startup requires that policies get
215 // loaded immediately (the normal asynchronous policy initialization
216 // does not happen because services are initialized before the
217 // MessageLoop runs). So load policy immediately if desired.
218 policy_init = UserCloudPolicyManager::POLICY_INIT_IMMEDIATELY;
219 }
220 #endif
221 manager = UserCloudPolicyManager::Create(profile, policy_init);
222 }
223 return manager.Pass();
224 }
225
226 scoped_ptr<PolicyService> BrowserPolicyConnector::CreatePolicyService( 190 scoped_ptr<PolicyService> BrowserPolicyConnector::CreatePolicyService(
227 Profile* profile) { 191 Profile* profile) {
228 DCHECK(profile); 192 DCHECK(profile);
229 return CreatePolicyServiceWithProviders( 193 return CreatePolicyServiceWithProviders(
230 profile->GetUserCloudPolicyManager(), 194 profile->GetUserCloudPolicyManager(),
231 profile->GetManagedModePolicyProvider()); 195 profile->GetManagedModePolicyProvider());
232 } 196 }
233 197
234 PolicyService* BrowserPolicyConnector::GetPolicyService() { 198 PolicyService* BrowserPolicyConnector::GetPolicyService() {
235 if (!policy_service_) { 199 if (!policy_service_)
236 policy_service_ = 200 policy_service_ = CreatePolicyServiceWithProviders(NULL, NULL);
237 CreatePolicyServiceWithProviders(&user_cloud_policy_provider_, NULL);
238 }
239 return policy_service_.get(); 201 return policy_service_.get();
240 } 202 }
241 203
242 void BrowserPolicyConnector::RegisterForDevicePolicy( 204 void BrowserPolicyConnector::RegisterForDevicePolicy(
243 const std::string& owner_email, 205 const std::string& owner_email,
244 const std::string& token, 206 const std::string& token,
245 bool known_machine_id, 207 bool known_machine_id,
246 bool reregister) { 208 bool reregister) {
247 #if defined(OS_CHROMEOS) 209 #if defined(OS_CHROMEOS)
248 if (device_data_store_.get()) { 210 if (device_data_store_.get()) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 301
340 void BrowserPolicyConnector::InitializeUserPolicy( 302 void BrowserPolicyConnector::InitializeUserPolicy(
341 const std::string& user_name, 303 const std::string& user_name,
342 bool wait_for_policy_fetch) { 304 bool wait_for_policy_fetch) {
343 #if defined(OS_CHROMEOS) 305 #if defined(OS_CHROMEOS)
344 // If the user is managed then importing certificates from ONC policy is 306 // If the user is managed then importing certificates from ONC policy is
345 // allowed, otherwise it's not. Update this flag once the user has signed in, 307 // allowed, otherwise it's not. Update this flag once the user has signed in,
346 // and before user policy is loaded. 308 // and before user policy is loaded.
347 GetNetworkConfigurationUpdater()->set_allow_web_trust( 309 GetNetworkConfigurationUpdater()->set_allow_web_trust(
348 GetUserAffiliation(user_name) == USER_AFFILIATION_MANAGED); 310 GetUserAffiliation(user_name) == USER_AFFILIATION_MANAGED);
311
312 if (user_cloud_policy_manager_.get()) {
313 global_user_cloud_policy_provider_.SetDelegate(NULL);
314 user_cloud_policy_manager_->Shutdown();
315 user_cloud_policy_manager_.reset();
316 }
349 #endif 317 #endif
350 318
351 // Throw away the old backend. 319 // Throw away the old backend.
352 user_cloud_policy_subsystem_.reset(); 320 user_cloud_policy_subsystem_.reset();
353 user_policy_token_cache_.reset(); 321 user_policy_token_cache_.reset();
354 user_data_store_.reset(); 322 user_data_store_.reset();
355 token_service_ = NULL; 323 token_service_ = NULL;
356 registrar_.RemoveAll(); 324 registrar_.RemoveAll();
357 325
358 CommandLine* command_line = CommandLine::ForCurrentProcess(); 326 CommandLine* command_line = CommandLine::ForCurrentProcess();
359 327
360 int64 startup_delay = 328 int64 startup_delay =
361 wait_for_policy_fetch ? 0 : kServiceInitializationStartupDelay; 329 wait_for_policy_fetch ? 0 : kServiceInitializationStartupDelay;
362 330
363 if (!command_line->HasSwitch(switches::kEnableCloudPolicyService)) { 331 FilePath profile_dir;
364 FilePath profile_dir; 332 PathService::Get(chrome::DIR_USER_DATA, &profile_dir);
365 PathService::Get(chrome::DIR_USER_DATA, &profile_dir);
366 #if defined(OS_CHROMEOS) 333 #if defined(OS_CHROMEOS)
367 profile_dir = profile_dir.Append( 334 profile_dir = profile_dir.Append(
368 command_line->GetSwitchValuePath(switches::kLoginProfile)); 335 command_line->GetSwitchValuePath(switches::kLoginProfile));
369 #endif 336 #endif
370 const FilePath policy_dir = profile_dir.Append(kPolicyDir); 337 const FilePath policy_dir = profile_dir.Append(kPolicyDir);
371 const FilePath policy_cache_file = policy_dir.Append(kPolicyCacheFile); 338 const FilePath policy_cache_file = policy_dir.Append(kPolicyCacheFile);
372 const FilePath token_cache_file = policy_dir.Append(kTokenCacheFile); 339 const FilePath token_cache_file = policy_dir.Append(kTokenCacheFile);
340
341 if (command_line->HasSwitch(switches::kEnableCloudPolicyService)) {
342 #if defined(OS_CHROMEOS)
343 scoped_ptr<CloudPolicyStore> store(
344 new UserCloudPolicyStoreChromeOS(
345 chromeos::DBusThreadManager::Get()->GetSessionManagerClient(),
346 policy_cache_file, token_cache_file));
347 user_cloud_policy_manager_.reset(
348 new UserCloudPolicyManagerChromeOS(store.Pass(),
349 wait_for_policy_fetch));
350 user_cloud_policy_manager_->Init();
351 user_cloud_policy_manager_->Initialize(g_browser_process->local_state(),
352 device_management_service_.get(),
353 GetUserAffiliation(user_name));
354 global_user_cloud_policy_provider_.SetDelegate(
355 user_cloud_policy_manager_.get());
356 #endif
357 } else {
373 CloudPolicyCacheBase* user_policy_cache = NULL; 358 CloudPolicyCacheBase* user_policy_cache = NULL;
374 359
375 user_data_store_.reset(CloudPolicyDataStore::CreateForUserPolicies()); 360 user_data_store_.reset(CloudPolicyDataStore::CreateForUserPolicies());
376 #if defined(OS_CHROMEOS) 361 #if defined(OS_CHROMEOS)
377 user_policy_cache = 362 user_policy_cache =
378 new CrosUserPolicyCache( 363 new CrosUserPolicyCache(
379 chromeos::DBusThreadManager::Get()->GetSessionManagerClient(), 364 chromeos::DBusThreadManager::Get()->GetSessionManagerClient(),
380 user_data_store_.get(), 365 user_data_store_.get(),
381 wait_for_policy_fetch, 366 wait_for_policy_fetch,
382 token_cache_file, 367 token_cache_file,
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 #endif 543 #endif
559 } 544 }
560 545
561 void BrowserPolicyConnector::CompleteInitialization() { 546 void BrowserPolicyConnector::CompleteInitialization() {
562 if (g_testing_provider) 547 if (g_testing_provider)
563 g_testing_provider->Init(); 548 g_testing_provider->Init();
564 if (platform_provider_) 549 if (platform_provider_)
565 platform_provider_->Init(); 550 platform_provider_->Init();
566 if (cloud_provider_) 551 if (cloud_provider_)
567 cloud_provider_->Init(); 552 cloud_provider_->Init();
568 user_cloud_policy_provider_.Init();
569 553
570 #if defined(OS_CHROMEOS) 554 #if defined(OS_CHROMEOS)
571 555
Joao da Silva 2012/11/21 17:06:34 global_user_cloud_policy_provider_.Init()
Mattias Nissler (ping if slow) 2012/11/22 20:51:59 Done, good catch.
572 // Create the AppPackUpdater to start updating the cache. It requires the 556 // Create the AppPackUpdater to start updating the cache. It requires the
573 // system request context, which isn't available in Init(); therefore it is 557 // system request context, which isn't available in Init(); therefore it is
574 // created only once the loops are running. 558 // created only once the loops are running.
575 GetAppPackUpdater(); 559 GetAppPackUpdater();
576 560
577 if (device_cloud_policy_subsystem_.get()) { 561 if (device_cloud_policy_subsystem_.get()) {
578 // Read serial number and machine model. This must be done before we call 562 // Read serial number and machine model. This must be done before we call
579 // CompleteInitialization() below such that the serial number is available 563 // CompleteInitialization() below such that the serial number is available
580 // for re-submission in case we're doing serial number recovery. 564 // for re-submission in case we're doing serial number recovery.
581 if (device_data_store_->machine_id().empty() || 565 if (device_data_store_->machine_id().empty() ||
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 if (g_testing_provider) 631 if (g_testing_provider)
648 providers.push_back(g_testing_provider); 632 providers.push_back(g_testing_provider);
649 if (platform_provider_) 633 if (platform_provider_)
650 providers.push_back(platform_provider_.get()); 634 providers.push_back(platform_provider_.get());
651 if (cloud_provider_) 635 if (cloud_provider_)
652 providers.push_back(cloud_provider_.get()); 636 providers.push_back(cloud_provider_.get());
653 637
654 #if defined(OS_CHROMEOS) 638 #if defined(OS_CHROMEOS)
655 if (device_cloud_policy_manager_.get()) 639 if (device_cloud_policy_manager_.get())
656 providers.push_back(device_cloud_policy_manager_.get()); 640 providers.push_back(device_cloud_policy_manager_.get());
641 if (!user_cloud_policy_provider)
642 user_cloud_policy_provider = &global_user_cloud_policy_provider_;
657 #endif 643 #endif
658 644
659 if (user_cloud_policy_provider) 645 if (user_cloud_policy_provider)
660 providers.push_back(user_cloud_policy_provider); 646 providers.push_back(user_cloud_policy_provider);
661 if (managed_mode_policy_provider) 647 if (managed_mode_policy_provider)
662 providers.push_back(managed_mode_policy_provider); 648 providers.push_back(managed_mode_policy_provider);
663 649
664 return scoped_ptr<PolicyService>(new PolicyServiceImpl(providers)); 650 return scoped_ptr<PolicyService>(new PolicyServiceImpl(providers));
665 } 651 }
666 652
(...skipping 16 matching lines...) Expand all
683 return new AsyncPolicyProvider(loader.Pass()); 669 return new AsyncPolicyProvider(loader.Pass());
684 } else { 670 } else {
685 return NULL; 671 return NULL;
686 } 672 }
687 #else 673 #else
688 return NULL; 674 return NULL;
689 #endif 675 #endif
690 } 676 }
691 677
692 } // namespace policy 678 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698