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