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