ff06118802f95d223b5021f4437f06e29d45c149
[platform/framework/web/crosswalk.git] / src / chrome / browser / policy / chrome_browser_policy_connector.cc
1 // Copyright 2014 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/chrome_browser_policy_connector.h"
6
7 #include <string>
8
9 #include "base/callback.h"
10 #include "base/command_line.h"
11 #include "base/files/file_path.h"
12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/path_service.h"
15 #include "base/strings/sys_string_conversions.h"
16 #include "chrome/browser/policy/configuration_policy_handler_list_factory.h"
17 #include "chrome/browser/policy/device_management_service_configuration.h"
18 #include "chrome/common/chrome_paths.h"
19 #include "components/policy/core/common/async_policy_provider.h"
20 #include "components/policy/core/common/cloud/device_management_service.h"
21 #include "components/policy/core/common/configuration_policy_provider.h"
22 #include "components/policy/core/common/policy_map.h"
23 #include "components/policy/core/common/policy_namespace.h"
24 #include "components/policy/core/common/policy_service.h"
25 #include "components/policy/core/common/policy_types.h"
26 #include "components/signin/core/common/signin_switches.h"
27 #include "content/public/browser/browser_thread.h"
28 #include "net/url_request/url_request_context_getter.h"
29 #include "policy/policy_constants.h"
30
31 #if defined(OS_WIN)
32 #include "components/policy/core/common/policy_loader_win.h"
33 #elif defined(OS_MACOSX)
34 #include <CoreFoundation/CoreFoundation.h>
35 #include "components/policy/core/common/policy_loader_mac.h"
36 #include "components/policy/core/common/preferences_mac.h"
37 #elif defined(OS_POSIX) && !defined(OS_ANDROID)
38 #include "components/policy/core/common/config_dir_policy_loader.h"
39 #elif defined(OS_ANDROID)
40 #include "components/policy/core/common/policy_provider_android.h"
41 #endif
42
43 using content::BrowserThread;
44
45 namespace policy {
46
47 namespace {
48
49 #if defined(OS_MACOSX)
50 base::FilePath GetManagedPolicyPath() {
51   // This constructs the path to the plist file in which Mac OS X stores the
52   // managed preference for the application. This is undocumented and therefore
53   // fragile, but if it doesn't work out, AsyncPolicyLoader has a task that
54   // polls periodically in order to reload managed preferences later even if we
55   // missed the change.
56   base::FilePath path;
57   if (!PathService::Get(chrome::DIR_MANAGED_PREFS, &path))
58     return base::FilePath();
59
60   CFBundleRef bundle(CFBundleGetMainBundle());
61   if (!bundle)
62     return base::FilePath();
63
64   CFStringRef bundle_id = CFBundleGetIdentifier(bundle);
65   if (!bundle_id)
66     return base::FilePath();
67
68   return path.Append(base::SysCFStringRefToUTF8(bundle_id) + ".plist");
69 }
70 #endif  // defined(OS_MACOSX)
71
72 }  // namespace
73
74 ChromeBrowserPolicyConnector::ChromeBrowserPolicyConnector()
75     : BrowserPolicyConnector(base::Bind(&BuildHandlerList)) {
76   ConfigurationPolicyProvider* platform_provider = CreatePlatformProvider();
77   if (platform_provider)
78     SetPlatformPolicyProvider(make_scoped_ptr(platform_provider));
79 }
80
81 ChromeBrowserPolicyConnector::~ChromeBrowserPolicyConnector() {}
82
83 void ChromeBrowserPolicyConnector::Init(
84     PrefService* local_state,
85     scoped_refptr<net::URLRequestContextGetter> request_context) {
86   // Initialization of some of the providers requires the FILE thread; make
87   // sure that threading is ready at this point.
88   DCHECK(BrowserThread::IsThreadInitialized(BrowserThread::FILE));
89
90   scoped_ptr<DeviceManagementService::Configuration> configuration(
91       new DeviceManagementServiceConfiguration(
92           BrowserPolicyConnector::GetDeviceManagementUrl()));
93   scoped_ptr<DeviceManagementService> device_management_service(
94       new DeviceManagementService(configuration.Pass()));
95   device_management_service->ScheduleInitialization(
96       kServiceInitializationStartupDelay);
97
98   BrowserPolicyConnector::Init(
99       local_state, request_context, device_management_service.Pass());
100
101   AppendExtraFlagPerPolicy();
102 }
103
104 ConfigurationPolicyProvider*
105     ChromeBrowserPolicyConnector::CreatePlatformProvider() {
106 #if defined(OS_WIN)
107   scoped_ptr<AsyncPolicyLoader> loader(PolicyLoaderWin::Create(
108       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE),
109       kRegistryChromePolicyKey));
110   return new AsyncPolicyProvider(GetSchemaRegistry(), loader.Pass());
111 #elif defined(OS_MACOSX)
112   scoped_ptr<AsyncPolicyLoader> loader(new PolicyLoaderMac(
113       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE),
114       GetManagedPolicyPath(),
115       new MacPreferences()));
116   return new AsyncPolicyProvider(GetSchemaRegistry(), loader.Pass());
117 #elif defined(OS_POSIX) && !defined(OS_ANDROID)
118   base::FilePath config_dir_path;
119   if (PathService::Get(chrome::DIR_POLICY_FILES, &config_dir_path)) {
120     scoped_ptr<AsyncPolicyLoader> loader(new ConfigDirPolicyLoader(
121         BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE),
122         config_dir_path,
123         POLICY_SCOPE_MACHINE));
124     return new AsyncPolicyProvider(GetSchemaRegistry(), loader.Pass());
125   } else {
126     return NULL;
127   }
128 #elif defined(OS_ANDROID)
129   return new PolicyProviderAndroid();
130 #else
131   return NULL;
132 #endif
133 }
134
135 void ChromeBrowserPolicyConnector::AppendExtraFlagPerPolicy() {
136   PolicyService* policy_service = GetPolicyService();
137   PolicyNamespace chrome_ns = PolicyNamespace(POLICY_DOMAIN_CHROME, "");
138   const PolicyMap& chrome_policy = policy_service->GetPolicies(chrome_ns);
139   const base::Value* policy_value =
140       chrome_policy.GetValue(key::kEnableWebBasedSignin);
141   bool enabled = false;
142   CommandLine* command_line = CommandLine::ForCurrentProcess();
143   if (policy_value && policy_value->GetAsBoolean(&enabled) && enabled &&
144       !command_line->HasSwitch(switches::kEnableWebBasedSignin)) {
145     command_line->AppendSwitch(switches::kEnableWebBasedSignin);
146   }
147 }
148
149 }  // namespace policy