1 // Copyright (c) 2011 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/browser_policy_connector.h"
6
7 #include "base/command_line.h"
8 #include "base/path_service.h"
9 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/policy/cloud_policy_subsystem.h"
11 #include "chrome/browser/policy/configuration_policy_pref_store.h"
12 #include "chrome/browser/policy/configuration_policy_provider.h"
13 #include "chrome/browser/policy/dummy_configuration_policy_provider.h"
14 #include "chrome/common/chrome_paths.h"
15 #include "chrome/common/chrome_switches.h"
16
17 #if defined(OS_WIN)
18 #include "chrome/browser/policy/configuration_policy_provider_win.h"
19 #elif defined(OS_MACOSX)
20 #include "chrome/browser/policy/configuration_policy_provider_mac.h"
21 #elif defined(OS_POSIX)
22 #include "chrome/browser/policy/config_dir_policy_provider.h"
23 #endif
24
25 #if defined(OS_CHROMEOS)
26 #include "chrome/browser/chromeos/cros/cros_library.h"
27 #include "chrome/browser/policy/device_policy_cache.h"
28 #include "chrome/browser/policy/device_policy_identity_strategy.h"
29 #include "chrome/browser/policy/enterprise_install_attributes.h"
30 #endif
31
32 namespace policy {
33
BrowserPolicyConnector()34 BrowserPolicyConnector::BrowserPolicyConnector()
35 : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
36 managed_platform_provider_.reset(CreateManagedPlatformProvider());
37 recommended_platform_provider_.reset(CreateRecommendedPlatformProvider());
38
39 #if defined(OS_CHROMEOS)
40 CommandLine* command_line = CommandLine::ForCurrentProcess();
41 if (command_line->HasSwitch(switches::kEnableDevicePolicy)) {
42 identity_strategy_.reset(new DevicePolicyIdentityStrategy());
43 install_attributes_.reset(new EnterpriseInstallAttributes(
44 chromeos::CrosLibrary::Get()->GetCryptohomeLibrary()));
45 cloud_policy_subsystem_.reset(new CloudPolicySubsystem(
46 identity_strategy_.get(),
47 new DevicePolicyCache(identity_strategy_.get(),
48 install_attributes_.get())));
49
50 // Initialize the subsystem once the message loops are spinning.
51 MessageLoop::current()->PostTask(
52 FROM_HERE,
53 method_factory_.NewRunnableMethod(&BrowserPolicyConnector::Initialize));
54 }
55 #endif
56 }
57
BrowserPolicyConnector(ConfigurationPolicyProvider * managed_platform_provider,ConfigurationPolicyProvider * recommended_platform_provider)58 BrowserPolicyConnector::BrowserPolicyConnector(
59 ConfigurationPolicyProvider* managed_platform_provider,
60 ConfigurationPolicyProvider* recommended_platform_provider)
61 : managed_platform_provider_(managed_platform_provider),
62 recommended_platform_provider_(recommended_platform_provider),
63 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {}
64
~BrowserPolicyConnector()65 BrowserPolicyConnector::~BrowserPolicyConnector() {
66 if (cloud_policy_subsystem_.get())
67 cloud_policy_subsystem_->Shutdown();
68 cloud_policy_subsystem_.reset();
69 #if defined(OS_CHROMEOS)
70 identity_strategy_.reset();
71 #endif
72 }
73
74 ConfigurationPolicyProvider*
GetManagedPlatformProvider() const75 BrowserPolicyConnector::GetManagedPlatformProvider() const {
76 return managed_platform_provider_.get();
77 }
78
79 ConfigurationPolicyProvider*
GetManagedCloudProvider() const80 BrowserPolicyConnector::GetManagedCloudProvider() const {
81 if (cloud_policy_subsystem_.get())
82 return cloud_policy_subsystem_->GetManagedPolicyProvider();
83
84 return NULL;
85 }
86
87 ConfigurationPolicyProvider*
GetRecommendedPlatformProvider() const88 BrowserPolicyConnector::GetRecommendedPlatformProvider() const {
89 return recommended_platform_provider_.get();
90 }
91
92 ConfigurationPolicyProvider*
GetRecommendedCloudProvider() const93 BrowserPolicyConnector::GetRecommendedCloudProvider() const {
94 if (cloud_policy_subsystem_.get())
95 return cloud_policy_subsystem_->GetRecommendedPolicyProvider();
96
97 return NULL;
98 }
99
100 ConfigurationPolicyProvider*
CreateManagedPlatformProvider()101 BrowserPolicyConnector::CreateManagedPlatformProvider() {
102 const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list =
103 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList();
104 #if defined(OS_WIN)
105 return new ConfigurationPolicyProviderWin(policy_list);
106 #elif defined(OS_MACOSX)
107 return new ConfigurationPolicyProviderMac(policy_list);
108 #elif defined(OS_POSIX)
109 FilePath config_dir_path;
110 if (PathService::Get(chrome::DIR_POLICY_FILES, &config_dir_path)) {
111 return new ConfigDirPolicyProvider(
112 policy_list,
113 config_dir_path.Append(FILE_PATH_LITERAL("managed")));
114 } else {
115 return new DummyConfigurationPolicyProvider(policy_list);
116 }
117 #else
118 return new DummyConfigurationPolicyProvider(policy_list);
119 #endif
120 }
121
122 ConfigurationPolicyProvider*
CreateRecommendedPlatformProvider()123 BrowserPolicyConnector::CreateRecommendedPlatformProvider() {
124 const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list =
125 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList();
126 #if defined(OS_POSIX) && !defined(OS_MACOSX)
127 FilePath config_dir_path;
128 if (PathService::Get(chrome::DIR_POLICY_FILES, &config_dir_path)) {
129 return new ConfigDirPolicyProvider(
130 policy_list,
131 config_dir_path.Append(FILE_PATH_LITERAL("recommended")));
132 } else {
133 return new DummyConfigurationPolicyProvider(policy_list);
134 }
135 #else
136 return new DummyConfigurationPolicyProvider(policy_list);
137 #endif
138 }
139
SetCredentials(const std::string & owner_email,const std::string & gaia_token)140 void BrowserPolicyConnector::SetCredentials(const std::string& owner_email,
141 const std::string& gaia_token) {
142 #if defined(OS_CHROMEOS)
143 if (identity_strategy_.get())
144 identity_strategy_->SetAuthCredentials(owner_email, gaia_token);
145 #endif
146 }
147
IsEnterpriseManaged()148 bool BrowserPolicyConnector::IsEnterpriseManaged() {
149 #if defined(OS_CHROMEOS)
150 return install_attributes_.get() && install_attributes_->IsEnterpriseDevice();
151 #else
152 return false;
153 #endif
154 }
155
156 EnterpriseInstallAttributes::LockResult
LockDevice(const std::string & user)157 BrowserPolicyConnector::LockDevice(const std::string& user) {
158 #if defined(OS_CHROMEOS)
159 if (install_attributes_.get())
160 return install_attributes_->LockDevice(user);
161 #endif
162
163 return EnterpriseInstallAttributes::LOCK_BACKEND_ERROR;
164 }
165
GetEnterpriseDomain()166 std::string BrowserPolicyConnector::GetEnterpriseDomain() {
167 #if defined(OS_CHROMEOS)
168 if (install_attributes_.get())
169 return install_attributes_->GetDomain();
170 #endif
171
172 return std::string();
173 }
174
StopAutoRetry()175 void BrowserPolicyConnector::StopAutoRetry() {
176 if (cloud_policy_subsystem_.get())
177 cloud_policy_subsystem_->StopAutoRetry();
178 }
179
FetchPolicy()180 void BrowserPolicyConnector::FetchPolicy() {
181 #if defined(OS_CHROMEOS)
182 if (identity_strategy_.get())
183 return identity_strategy_->FetchPolicy();
184 #endif
185 }
186
Initialize()187 void BrowserPolicyConnector::Initialize() {
188 // TODO(jkummerow, mnissler): Move this out of the browser startup path.
189 if (cloud_policy_subsystem_.get()) {
190 cloud_policy_subsystem_->Initialize(
191 g_browser_process->local_state(),
192 g_browser_process->system_request_context());
193 }
194 }
195
196 } // namespace
197