1 // Copyright 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 "components/policy/core/common/cloud/user_cloud_policy_manager.h"
6
7 #include <string>
8 #include <utility>
9
10 #include "base/bind.h"
11 #include "base/callback_helpers.h"
12 #include "base/sequenced_task_runner.h"
13 #include "build/build_config.h"
14 #include "components/account_id/account_id.h"
15 #include "components/policy/core/common/cloud/cloud_external_data_manager.h"
16 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
17 #include "components/policy/core/common/cloud/cloud_policy_service.h"
18 #include "components/policy/core/common/cloud/user_cloud_policy_store.h"
19 #include "components/policy/core/common/policy_pref_names.h"
20 #include "components/policy/core/common/policy_types.h"
21 #include "components/policy/policy_constants.h"
22 #include "services/network/public/cpp/shared_url_loader_factory.h"
23
24 namespace em = enterprise_management;
25
26 namespace policy {
27
UserCloudPolicyManager(std::unique_ptr<UserCloudPolicyStore> store,const base::FilePath & component_policy_cache_path,std::unique_ptr<CloudExternalDataManager> external_data_manager,const scoped_refptr<base::SequencedTaskRunner> & task_runner,network::NetworkConnectionTrackerGetter network_connection_tracker_getter)28 UserCloudPolicyManager::UserCloudPolicyManager(
29 std::unique_ptr<UserCloudPolicyStore> store,
30 const base::FilePath& component_policy_cache_path,
31 std::unique_ptr<CloudExternalDataManager> external_data_manager,
32 const scoped_refptr<base::SequencedTaskRunner>& task_runner,
33 network::NetworkConnectionTrackerGetter network_connection_tracker_getter)
34 : CloudPolicyManager(dm_protocol::kChromeUserPolicyType,
35 std::string(),
36 store.get(),
37 task_runner,
38 network_connection_tracker_getter),
39 store_(std::move(store)),
40 component_policy_cache_path_(component_policy_cache_path),
41 external_data_manager_(std::move(external_data_manager)) {}
42
~UserCloudPolicyManager()43 UserCloudPolicyManager::~UserCloudPolicyManager() {}
44
Shutdown()45 void UserCloudPolicyManager::Shutdown() {
46 if (external_data_manager_)
47 external_data_manager_->Disconnect();
48 CloudPolicyManager::Shutdown();
49 }
50
SetSigninAccountId(const AccountId & account_id)51 void UserCloudPolicyManager::SetSigninAccountId(const AccountId& account_id) {
52 store_->SetSigninAccountId(account_id);
53 }
54
SetPoliciesRequired(bool required)55 void UserCloudPolicyManager::SetPoliciesRequired(bool required) {
56 policies_required_ = required;
57 RefreshPolicies();
58 }
59
Connect(PrefService * local_state,std::unique_ptr<CloudPolicyClient> client)60 void UserCloudPolicyManager::Connect(
61 PrefService* local_state,
62 std::unique_ptr<CloudPolicyClient> client) {
63 CHECK(!core()->client());
64
65 scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory =
66 client->GetURLLoaderFactory();
67
68 CreateComponentCloudPolicyService(
69 dm_protocol::kChromeExtensionPolicyType, component_policy_cache_path_,
70 POLICY_SOURCE_CLOUD, client.get(), schema_registry());
71 core()->Connect(std::move(client));
72 core()->StartRefreshScheduler();
73 core()->TrackRefreshDelayPref(local_state,
74 policy_prefs::kUserPolicyRefreshRate);
75 if (external_data_manager_)
76 external_data_manager_->Connect(std::move(url_loader_factory));
77 }
78
79 // static
80 std::unique_ptr<CloudPolicyClient>
CreateCloudPolicyClient(DeviceManagementService * device_management_service,scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)81 UserCloudPolicyManager::CreateCloudPolicyClient(
82 DeviceManagementService* device_management_service,
83 scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
84 return std::make_unique<CloudPolicyClient>(
85 device_management_service, std::move(url_loader_factory),
86 CloudPolicyClient::DeviceDMTokenCallback());
87 }
88
DisconnectAndRemovePolicy()89 void UserCloudPolicyManager::DisconnectAndRemovePolicy() {
90 if (external_data_manager_)
91 external_data_manager_->Disconnect();
92 core()->Disconnect();
93
94 // store_->Clear() will publish the updated, empty policy. The component
95 // policy service must be cleared before OnStoreLoaded() is issued, so that
96 // component policies are also empty at CheckAndPublishPolicy().
97 ClearAndDestroyComponentCloudPolicyService();
98
99 // When the |store_| is cleared, it informs the |external_data_manager_| that
100 // all external data references have been removed, causing the
101 // |external_data_manager_| to clear its cache as well.
102 store_->Clear();
103 SetPoliciesRequired(false);
104 }
105
IsClientRegistered() const106 bool UserCloudPolicyManager::IsClientRegistered() const {
107 return client() && client()->is_registered();
108 }
109
GetChromePolicy(PolicyMap * policy_map)110 void UserCloudPolicyManager::GetChromePolicy(PolicyMap* policy_map) {
111 CloudPolicyManager::GetChromePolicy(policy_map);
112
113 // If the store has a verified policy blob received from the server then apply
114 // the defaults for policies that haven't been configured by the administrator
115 // given that this is an enterprise user.
116 // TODO(crbug.com/640950): We should just call SetEnterpriseUsersDefaults
117 // here.
118 #if defined(OS_ANDROID)
119 if (store()->has_policy() &&
120 !policy_map->Get(key::kNTPContentSuggestionsEnabled)) {
121 policy_map->Set(key::kNTPContentSuggestionsEnabled, POLICY_LEVEL_MANDATORY,
122 POLICY_SCOPE_USER, POLICY_SOURCE_ENTERPRISE_DEFAULT,
123 base::Value(false), nullptr /* external_data_fetcher */);
124 }
125 #endif
126 }
127
IsFirstPolicyLoadComplete(PolicyDomain domain) const128 bool UserCloudPolicyManager::IsFirstPolicyLoadComplete(
129 PolicyDomain domain) const {
130 return !policies_required_ ||
131 CloudPolicyManager::IsFirstPolicyLoadComplete(domain);
132 }
133
134 } // namespace policy
135