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