1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/policy/profile_policy_connector_builder.h"
6 
7 #include <list>
8 #include <utility>
9 
10 #include "base/no_destructor.h"
11 #include "build/build_config.h"
12 #include "chrome/browser/policy/profile_policy_connector.h"
13 #include "chrome/browser/policy/schema_registry_service.h"
14 #include "chrome/browser/profiles/profile.h"
15 #include "components/policy/core/common/policy_service.h"
16 #include "components/policy/core/common/policy_service_impl.h"
17 
18 #if defined(OS_CHROMEOS)
19 #include "chrome/browser/chromeos/policy/active_directory_policy_manager.h"
20 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
21 #include "chrome/browser/chromeos/profiles/profile_helper.h"
22 #else  // Non-ChromeOS.
23 #include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
24 #endif
25 
26 namespace policy {
27 
28 namespace {
29 
GetTestProviders()30 std::list<ConfigurationPolicyProvider*>* GetTestProviders() {
31   static base::NoDestructor<std::list<ConfigurationPolicyProvider*>> instances;
32   return instances.get();
33 }
34 
35 }  // namespace
36 
37 std::unique_ptr<ProfilePolicyConnector>
CreateProfilePolicyConnectorForBrowserContext(SchemaRegistry * schema_registry,UserCloudPolicyManager * user_cloud_policy_manager,policy::ChromeBrowserPolicyConnector * browser_policy_connector,bool force_immediate_load,content::BrowserContext * context)38 CreateProfilePolicyConnectorForBrowserContext(
39     SchemaRegistry* schema_registry,
40     UserCloudPolicyManager* user_cloud_policy_manager,
41     policy::ChromeBrowserPolicyConnector* browser_policy_connector,
42     bool force_immediate_load,
43     content::BrowserContext* context) {
44   const user_manager::User* user = nullptr;
45   ConfigurationPolicyProvider* policy_provider = nullptr;
46   const CloudPolicyStore* policy_store = nullptr;
47 
48 #if defined(OS_CHROMEOS)
49   Profile* const profile = Profile::FromBrowserContext(context);
50   if (!chromeos::ProfileHelper::IsSigninProfile(profile) &&
51       !chromeos::ProfileHelper::IsLockScreenAppProfile(profile)) {
52     user = chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
53     CHECK(user);
54   }
55 
56   // On ChromeOS, we always pass nullptr for the |user_cloud_policy_manager|.
57   // This is because the |policy_provider| could be either a
58   // UserCloudPolicyManagerChromeOS or a ActiveDirectoryPolicyManager, both of
59   // which should be obtained via UserPolicyManagerFactoryChromeOS APIs.
60   CloudPolicyManager* cloud_policy_manager =
61       profile->GetUserCloudPolicyManagerChromeOS();
62   ActiveDirectoryPolicyManager* active_directory_manager =
63       profile->GetActiveDirectoryPolicyManager();
64   if (cloud_policy_manager) {
65     policy_provider = cloud_policy_manager;
66     policy_store = cloud_policy_manager->core()->store();
67   } else if (active_directory_manager) {
68     policy_provider = active_directory_manager;
69     policy_store = active_directory_manager->store();
70   }
71 #else
72   if (user_cloud_policy_manager) {
73     policy_provider = user_cloud_policy_manager;
74     policy_store = user_cloud_policy_manager->core()->store();
75   }
76 #endif  // defined(OS_CHROMEOS)
77 
78   return CreateAndInitProfilePolicyConnector(
79       schema_registry, browser_policy_connector, policy_provider, policy_store,
80       force_immediate_load, user);
81 }
82 
CreateAndInitProfilePolicyConnector(SchemaRegistry * schema_registry,policy::ChromeBrowserPolicyConnector * browser_policy_connector,ConfigurationPolicyProvider * policy_provider,const CloudPolicyStore * policy_store,bool force_immediate_load,const user_manager::User * user)83 std::unique_ptr<ProfilePolicyConnector> CreateAndInitProfilePolicyConnector(
84     SchemaRegistry* schema_registry,
85     policy::ChromeBrowserPolicyConnector* browser_policy_connector,
86     ConfigurationPolicyProvider* policy_provider,
87     const CloudPolicyStore* policy_store,
88     bool force_immediate_load,
89     const user_manager::User* user) {
90   auto connector = std::make_unique<ProfilePolicyConnector>();
91 
92   std::list<ConfigurationPolicyProvider*>* test_providers = GetTestProviders();
93   if (test_providers->empty()) {
94     connector->Init(user, schema_registry, policy_provider, policy_store,
95                     browser_policy_connector, force_immediate_load);
96   } else {
97     PolicyServiceImpl::Providers providers;
98     providers.push_back(test_providers->front());
99     test_providers->pop_front();
100     auto service = std::make_unique<PolicyServiceImpl>(std::move(providers));
101     connector->InitForTesting(std::move(service));
102   }
103 
104   return connector;
105 }
106 
PushProfilePolicyConnectorProviderForTesting(ConfigurationPolicyProvider * provider)107 void PushProfilePolicyConnectorProviderForTesting(
108     ConfigurationPolicyProvider* provider) {
109   std::list<ConfigurationPolicyProvider*>* test_providers = GetTestProviders();
110   test_providers->push_back(provider);
111 }
112 
113 }  // namespace policy
114