configuration_policy_handler_list_factory.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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 "chrome/browser/policy/configuration_policy_handler_list_factory.h"
6
7#include "base/basictypes.h"
8#include "base/bind.h"
9#include "base/memory/scoped_vector.h"
10#include "base/values.h"
11#include "chrome/browser/net/proxy_policy_handler.h"
12#include "chrome/browser/policy/managed_bookmarks_policy_handler.h"
13#include "chrome/browser/profiles/incognito_mode_policy_handler.h"
14#include "chrome/browser/search_engines/default_search_policy_handler.h"
15#include "chrome/common/pref_names.h"
16#include "components/password_manager/core/common/password_manager_pref_names.h"
17#include "components/policy/core/browser/autofill_policy_handler.h"
18#include "components/policy/core/browser/configuration_policy_handler.h"
19#include "components/policy/core/browser/configuration_policy_handler_list.h"
20#include "components/policy/core/browser/configuration_policy_handler_parameters.h"
21#include "components/policy/core/browser/url_blacklist_policy_handler.h"
22#include "components/policy/core/common/policy_details.h"
23#include "components/policy/core/common/policy_map.h"
24#include "components/policy/core/common/policy_pref_names.h"
25#include "components/policy/core/common/schema.h"
26#include "components/translate/core/common/translate_pref_names.h"
27#include "grit/components_strings.h"
28#include "policy/policy_constants.h"
29
30#if !defined(OS_IOS)
31#include "chrome/browser/extensions/api/messaging/native_messaging_policy_handler.h"
32#include "chrome/browser/extensions/policy_handlers.h"
33#include "chrome/browser/net/disk_cache_dir_policy_handler.h"
34#include "chrome/browser/policy/file_selection_dialogs_policy_handler.h"
35#include "chrome/browser/policy/javascript_policy_handler.h"
36#include "chrome/browser/sessions/restore_on_startup_policy_handler.h"
37#include "chrome/browser/sync/sync_policy_handler.h"
38#include "extensions/browser/pref_names.h"
39#include "extensions/common/manifest.h"
40#endif
41
42#if defined(OS_CHROMEOS)
43#include "ash/magnifier/magnifier_constants.h"
44#include "chrome/browser/chromeos/login/users/user.h"
45#include "chrome/browser/chromeos/login/users/user_manager.h"
46#include "chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.h"
47#include "chromeos/dbus/power_policy_controller.h"
48#endif
49
50#if !defined(OS_ANDROID) && !defined(OS_IOS)
51#include "chrome/browser/download/download_dir_policy_handler.h"
52#endif
53
54#if !defined(OS_MACOSX) && !defined(OS_IOS)
55#include "apps/pref_names.h"
56#endif
57
58namespace policy {
59
60namespace {
61
62// List of policy types to preference names. This is used for simple policies
63// that directly map to a single preference.
64const PolicyToPreferenceMapEntry kSimplePolicyMap[] = {
65  { key::kHomepageLocation,
66    prefs::kHomePage,
67    base::Value::TYPE_STRING },
68  { key::kHomepageIsNewTabPage,
69    prefs::kHomePageIsNewTabPage,
70    base::Value::TYPE_BOOLEAN },
71  { key::kRestoreOnStartupURLs,
72    prefs::kURLsToRestoreOnStartup,
73    base::Value::TYPE_LIST },
74  { key::kAlternateErrorPagesEnabled,
75    prefs::kAlternateErrorPagesEnabled,
76    base::Value::TYPE_BOOLEAN },
77  { key::kSearchSuggestEnabled,
78    prefs::kSearchSuggestEnabled,
79    base::Value::TYPE_BOOLEAN },
80  { key::kDnsPrefetchingEnabled,
81    prefs::kNetworkPredictionEnabled,
82    base::Value::TYPE_BOOLEAN },
83  { key::kBuiltInDnsClientEnabled,
84    prefs::kBuiltInDnsClientEnabled,
85    base::Value::TYPE_BOOLEAN },
86  { key::kWPADQuickCheckEnabled,
87    prefs::kQuickCheckEnabled,
88    base::Value::TYPE_BOOLEAN },
89  { key::kDisableSpdy,
90    prefs::kDisableSpdy,
91    base::Value::TYPE_BOOLEAN },
92  { key::kSafeBrowsingEnabled,
93    prefs::kSafeBrowsingEnabled,
94    base::Value::TYPE_BOOLEAN },
95  { key::kForceSafeSearch,
96    prefs::kForceSafeSearch,
97    base::Value::TYPE_BOOLEAN },
98  { key::kPasswordManagerEnabled,
99    password_manager::prefs::kPasswordManagerEnabled,
100    base::Value::TYPE_BOOLEAN },
101  { key::kPasswordManagerAllowShowPasswords,
102    password_manager::prefs::kPasswordManagerAllowShowPasswords,
103    base::Value::TYPE_BOOLEAN },
104  { key::kPrintingEnabled,
105    prefs::kPrintingEnabled,
106    base::Value::TYPE_BOOLEAN },
107  { key::kDisablePrintPreview,
108    prefs::kPrintPreviewDisabled,
109    base::Value::TYPE_BOOLEAN },
110  { key::kMetricsReportingEnabled,
111    prefs::kMetricsReportingEnabled,
112    base::Value::TYPE_BOOLEAN },
113  { key::kApplicationLocaleValue,
114    prefs::kApplicationLocale,
115    base::Value::TYPE_STRING },
116  { key::kDisabledPlugins,
117    prefs::kPluginsDisabledPlugins,
118    base::Value::TYPE_LIST },
119  { key::kDisabledPluginsExceptions,
120    prefs::kPluginsDisabledPluginsExceptions,
121    base::Value::TYPE_LIST },
122  { key::kEnabledPlugins,
123    prefs::kPluginsEnabledPlugins,
124    base::Value::TYPE_LIST },
125  { key::kShowHomeButton,
126    prefs::kShowHomeButton,
127    base::Value::TYPE_BOOLEAN },
128  { key::kSavingBrowserHistoryDisabled,
129    prefs::kSavingBrowserHistoryDisabled,
130    base::Value::TYPE_BOOLEAN },
131  { key::kAllowDeletingBrowserHistory,
132    prefs::kAllowDeletingBrowserHistory,
133    base::Value::TYPE_BOOLEAN },
134  { key::kDeveloperToolsDisabled,
135    prefs::kDevToolsDisabled,
136    base::Value::TYPE_BOOLEAN },
137  { key::kBlockThirdPartyCookies,
138    prefs::kBlockThirdPartyCookies,
139    base::Value::TYPE_BOOLEAN },
140  { key::kDefaultCookiesSetting,
141    prefs::kManagedDefaultCookiesSetting,
142    base::Value::TYPE_INTEGER },
143  { key::kDefaultImagesSetting,
144    prefs::kManagedDefaultImagesSetting,
145    base::Value::TYPE_INTEGER },
146  { key::kDefaultPluginsSetting,
147    prefs::kManagedDefaultPluginsSetting,
148    base::Value::TYPE_INTEGER },
149  { key::kDefaultPopupsSetting,
150    prefs::kManagedDefaultPopupsSetting,
151    base::Value::TYPE_INTEGER },
152  { key::kAutoSelectCertificateForUrls,
153    prefs::kManagedAutoSelectCertificateForUrls,
154    base::Value::TYPE_LIST },
155  { key::kCookiesAllowedForUrls,
156    prefs::kManagedCookiesAllowedForUrls,
157    base::Value::TYPE_LIST },
158  { key::kCookiesBlockedForUrls,
159    prefs::kManagedCookiesBlockedForUrls,
160    base::Value::TYPE_LIST },
161  { key::kCookiesSessionOnlyForUrls,
162    prefs::kManagedCookiesSessionOnlyForUrls,
163    base::Value::TYPE_LIST },
164  { key::kImagesAllowedForUrls,
165    prefs::kManagedImagesAllowedForUrls,
166    base::Value::TYPE_LIST },
167  { key::kImagesBlockedForUrls,
168    prefs::kManagedImagesBlockedForUrls,
169    base::Value::TYPE_LIST },
170  { key::kJavaScriptAllowedForUrls,
171    prefs::kManagedJavaScriptAllowedForUrls,
172    base::Value::TYPE_LIST },
173  { key::kJavaScriptBlockedForUrls,
174    prefs::kManagedJavaScriptBlockedForUrls,
175    base::Value::TYPE_LIST },
176  { key::kPluginsAllowedForUrls,
177    prefs::kManagedPluginsAllowedForUrls,
178    base::Value::TYPE_LIST },
179  { key::kPluginsBlockedForUrls,
180    prefs::kManagedPluginsBlockedForUrls,
181    base::Value::TYPE_LIST },
182  { key::kPopupsAllowedForUrls,
183    prefs::kManagedPopupsAllowedForUrls,
184    base::Value::TYPE_LIST },
185  { key::kPopupsBlockedForUrls,
186    prefs::kManagedPopupsBlockedForUrls,
187    base::Value::TYPE_LIST },
188  { key::kNotificationsAllowedForUrls,
189    prefs::kManagedNotificationsAllowedForUrls,
190    base::Value::TYPE_LIST },
191  { key::kNotificationsBlockedForUrls,
192    prefs::kManagedNotificationsBlockedForUrls,
193    base::Value::TYPE_LIST },
194  { key::kDefaultNotificationsSetting,
195    prefs::kManagedDefaultNotificationsSetting,
196    base::Value::TYPE_INTEGER },
197  { key::kDefaultGeolocationSetting,
198    prefs::kManagedDefaultGeolocationSetting,
199    base::Value::TYPE_INTEGER },
200  { key::kSigninAllowed,
201    prefs::kSigninAllowed,
202    base::Value::TYPE_BOOLEAN },
203  { key::kDisableSSLRecordSplitting,
204    prefs::kDisableSSLRecordSplitting,
205    base::Value::TYPE_BOOLEAN },
206  { key::kEnableOnlineRevocationChecks,
207    prefs::kCertRevocationCheckingEnabled,
208    base::Value::TYPE_BOOLEAN },
209  { key::kRequireOnlineRevocationChecksForLocalAnchors,
210    prefs::kCertRevocationCheckingRequiredLocalAnchors,
211    base::Value::TYPE_BOOLEAN },
212  { key::kAuthSchemes,
213    prefs::kAuthSchemes,
214    base::Value::TYPE_STRING },
215  { key::kDisableAuthNegotiateCnameLookup,
216    prefs::kDisableAuthNegotiateCnameLookup,
217    base::Value::TYPE_BOOLEAN },
218  { key::kEnableAuthNegotiatePort,
219    prefs::kEnableAuthNegotiatePort,
220    base::Value::TYPE_BOOLEAN },
221  { key::kAuthServerWhitelist,
222    prefs::kAuthServerWhitelist,
223    base::Value::TYPE_STRING },
224  { key::kAuthNegotiateDelegateWhitelist,
225    prefs::kAuthNegotiateDelegateWhitelist,
226    base::Value::TYPE_STRING },
227  { key::kGSSAPILibraryName,
228    prefs::kGSSAPILibraryName,
229    base::Value::TYPE_STRING },
230  { key::kAllowCrossOriginAuthPrompt,
231    prefs::kAllowCrossOriginAuthPrompt,
232    base::Value::TYPE_BOOLEAN },
233  { key::kDisable3DAPIs,
234    prefs::kDisable3DAPIs,
235    base::Value::TYPE_BOOLEAN },
236  { key::kDisablePluginFinder,
237    prefs::kDisablePluginFinder,
238    base::Value::TYPE_BOOLEAN },
239  { key::kDiskCacheSize,
240    prefs::kDiskCacheSize,
241    base::Value::TYPE_INTEGER },
242  { key::kMediaCacheSize,
243    prefs::kMediaCacheSize,
244    base::Value::TYPE_INTEGER },
245  { key::kPolicyRefreshRate,
246    policy_prefs::kUserPolicyRefreshRate,
247    base::Value::TYPE_INTEGER },
248  { key::kDevicePolicyRefreshRate,
249    prefs::kDevicePolicyRefreshRate,
250    base::Value::TYPE_INTEGER },
251  { key::kDefaultBrowserSettingEnabled,
252    prefs::kDefaultBrowserSettingEnabled,
253    base::Value::TYPE_BOOLEAN },
254  { key::kRemoteAccessHostFirewallTraversal,
255    prefs::kRemoteAccessHostFirewallTraversal,
256    base::Value::TYPE_BOOLEAN },
257  { key::kRemoteAccessHostRequireTwoFactor,
258    prefs::kRemoteAccessHostRequireTwoFactor,
259    base::Value::TYPE_BOOLEAN },
260  { key::kRemoteAccessHostDomain,
261    prefs::kRemoteAccessHostDomain,
262    base::Value::TYPE_STRING },
263  { key::kRemoteAccessHostTalkGadgetPrefix,
264    prefs::kRemoteAccessHostTalkGadgetPrefix,
265    base::Value::TYPE_STRING },
266  { key::kRemoteAccessHostRequireCurtain,
267    prefs::kRemoteAccessHostRequireCurtain,
268    base::Value::TYPE_BOOLEAN },
269  { key::kRemoteAccessHostAllowClientPairing,
270    prefs::kRemoteAccessHostAllowClientPairing,
271    base::Value::TYPE_BOOLEAN },
272  { key::kRemoteAccessHostAllowGnubbyAuth,
273    prefs::kRemoteAccessHostAllowGnubbyAuth,
274    base::Value::TYPE_BOOLEAN },
275  { key::kRemoteAccessHostAllowRelayedConnection,
276    prefs::kRemoteAccessHostAllowRelayedConnection,
277    base::Value::TYPE_BOOLEAN },
278  { key::kRemoteAccessHostUdpPortRange,
279    prefs::kRemoteAccessHostUdpPortRange,
280    base::Value::TYPE_STRING },
281  { key::kCloudPrintProxyEnabled,
282    prefs::kCloudPrintProxyEnabled,
283    base::Value::TYPE_BOOLEAN },
284  { key::kCloudPrintSubmitEnabled,
285    prefs::kCloudPrintSubmitEnabled,
286    base::Value::TYPE_BOOLEAN },
287  { key::kTranslateEnabled,
288    prefs::kEnableTranslate,
289    base::Value::TYPE_BOOLEAN },
290  { key::kAllowOutdatedPlugins,
291    prefs::kPluginsAllowOutdated,
292    base::Value::TYPE_BOOLEAN },
293  { key::kAlwaysAuthorizePlugins,
294    prefs::kPluginsAlwaysAuthorize,
295    base::Value::TYPE_BOOLEAN },
296  { key::kBookmarkBarEnabled,
297    prefs::kShowBookmarkBar,
298    base::Value::TYPE_BOOLEAN },
299  { key::kEditBookmarksEnabled,
300    prefs::kEditBookmarksEnabled,
301    base::Value::TYPE_BOOLEAN },
302  { key::kShowAppsShortcutInBookmarkBar,
303    prefs::kShowAppsShortcutInBookmarkBar,
304    base::Value::TYPE_BOOLEAN },
305  { key::kAllowFileSelectionDialogs,
306    prefs::kAllowFileSelectionDialogs,
307    base::Value::TYPE_BOOLEAN },
308  { key::kImportBookmarks,
309    prefs::kImportBookmarks,
310    base::Value::TYPE_BOOLEAN },
311  { key::kImportHistory,
312    prefs::kImportHistory,
313    base::Value::TYPE_BOOLEAN },
314  { key::kImportHomepage,
315    prefs::kImportHomepage,
316    base::Value::TYPE_BOOLEAN },
317  { key::kImportSearchEngine,
318    prefs::kImportSearchEngine,
319    base::Value::TYPE_BOOLEAN },
320  { key::kImportSavedPasswords,
321    prefs::kImportSavedPasswords,
322    base::Value::TYPE_BOOLEAN },
323  { key::kMaxConnectionsPerProxy,
324    prefs::kMaxConnectionsPerProxy,
325    base::Value::TYPE_INTEGER },
326  { key::kURLWhitelist,
327    policy_prefs::kUrlWhitelist,
328    base::Value::TYPE_LIST },
329  { key::kRestrictSigninToPattern,
330    prefs::kGoogleServicesUsernamePattern,
331    base::Value::TYPE_STRING },
332  { key::kDefaultMediaStreamSetting,
333    prefs::kManagedDefaultMediaStreamSetting,
334    base::Value::TYPE_INTEGER },
335  { key::kDisableSafeBrowsingProceedAnyway,
336    prefs::kSafeBrowsingProceedAnywayDisabled,
337    base::Value::TYPE_BOOLEAN },
338  { key::kSpellCheckServiceEnabled,
339    prefs::kSpellCheckUseSpellingService,
340    base::Value::TYPE_BOOLEAN },
341  { key::kDisableScreenshots,
342    prefs::kDisableScreenshots,
343    base::Value::TYPE_BOOLEAN },
344  { key::kAudioCaptureAllowed,
345    prefs::kAudioCaptureAllowed,
346    base::Value::TYPE_BOOLEAN },
347  { key::kVideoCaptureAllowed,
348    prefs::kVideoCaptureAllowed,
349    base::Value::TYPE_BOOLEAN },
350  { key::kAudioCaptureAllowedUrls,
351    prefs::kAudioCaptureAllowedUrls,
352    base::Value::TYPE_LIST },
353  { key::kVideoCaptureAllowedUrls,
354    prefs::kVideoCaptureAllowedUrls,
355    base::Value::TYPE_LIST },
356  { key::kHideWebStoreIcon,
357    prefs::kHideWebStoreIcon,
358    base::Value::TYPE_BOOLEAN },
359  { key::kVariationsRestrictParameter,
360    prefs::kVariationsRestrictParameter,
361    base::Value::TYPE_STRING },
362  { key::kSupervisedUserCreationEnabled,
363    prefs::kSupervisedUserCreationAllowed,
364    base::Value::TYPE_BOOLEAN },
365  { key::kForceEphemeralProfiles,
366    prefs::kForceEphemeralProfiles,
367    base::Value::TYPE_BOOLEAN },
368
369#if !defined(OS_MACOSX) && !defined(OS_IOS)
370  { key::kFullscreenAllowed,
371    prefs::kFullscreenAllowed,
372    base::Value::TYPE_BOOLEAN },
373#if defined(ENABLE_EXTENSIONS)
374  { key::kFullscreenAllowed,
375    apps::prefs::kAppFullscreenAllowed,
376    base::Value::TYPE_BOOLEAN },
377#endif  // defined(ENABLE_EXTENSIONS)
378#endif  // !defined(OS_MACOSX) && !defined(OS_IOS)
379
380#if defined(OS_CHROMEOS)
381  { key::kChromeOsLockOnIdleSuspend,
382    prefs::kEnableAutoScreenLock,
383    base::Value::TYPE_BOOLEAN },
384  { key::kChromeOsReleaseChannel,
385    prefs::kChromeOsReleaseChannel,
386    base::Value::TYPE_STRING },
387  { key::kDriveDisabled,
388    prefs::kDisableDrive,
389    base::Value::TYPE_BOOLEAN },
390  { key::kDriveDisabledOverCellular,
391    prefs::kDisableDriveOverCellular,
392    base::Value::TYPE_BOOLEAN },
393  { key::kExternalStorageDisabled,
394    prefs::kExternalStorageDisabled,
395    base::Value::TYPE_BOOLEAN },
396  { key::kAudioOutputAllowed,
397    prefs::kAudioOutputAllowed,
398    base::Value::TYPE_BOOLEAN },
399  { key::kShowLogoutButtonInTray,
400    prefs::kShowLogoutButtonInTray,
401    base::Value::TYPE_BOOLEAN },
402  { key::kShelfAutoHideBehavior,
403    prefs::kShelfAutoHideBehaviorLocal,
404    base::Value::TYPE_STRING },
405  { key::kSessionLengthLimit,
406    prefs::kSessionLengthLimit,
407    base::Value::TYPE_INTEGER },
408  { key::kWaitForInitialUserActivity,
409    prefs::kSessionWaitForInitialUserActivity,
410    base::Value::TYPE_BOOLEAN },
411  { key::kPowerManagementUsesAudioActivity,
412    prefs::kPowerUseAudioActivity,
413    base::Value::TYPE_BOOLEAN },
414  { key::kPowerManagementUsesVideoActivity,
415    prefs::kPowerUseVideoActivity,
416    base::Value::TYPE_BOOLEAN },
417  { key::kAllowScreenWakeLocks,
418    prefs::kPowerAllowScreenWakeLocks,
419    base::Value::TYPE_BOOLEAN },
420  { key::kWaitForInitialUserActivity,
421    prefs::kPowerWaitForInitialUserActivity,
422    base::Value::TYPE_BOOLEAN },
423  { key::kTermsOfServiceURL,
424    prefs::kTermsOfServiceURL,
425    base::Value::TYPE_STRING },
426  { key::kShowAccessibilityOptionsInSystemTrayMenu,
427    prefs::kShouldAlwaysShowAccessibilityMenu,
428    base::Value::TYPE_BOOLEAN },
429  { key::kLargeCursorEnabled,
430    prefs::kAccessibilityLargeCursorEnabled,
431    base::Value::TYPE_BOOLEAN },
432  { key::kSpokenFeedbackEnabled,
433    prefs::kAccessibilitySpokenFeedbackEnabled,
434    base::Value::TYPE_BOOLEAN },
435  { key::kHighContrastEnabled,
436    prefs::kAccessibilityHighContrastEnabled,
437    base::Value::TYPE_BOOLEAN },
438  { key::kVirtualKeyboardEnabled,
439    prefs::kAccessibilityVirtualKeyboardEnabled,
440    base::Value::TYPE_BOOLEAN },
441  { key::kDeviceLoginScreenDefaultLargeCursorEnabled,
442    NULL,
443    base::Value::TYPE_BOOLEAN },
444  { key::kDeviceLoginScreenDefaultSpokenFeedbackEnabled,
445    NULL,
446    base::Value::TYPE_BOOLEAN },
447  { key::kDeviceLoginScreenDefaultHighContrastEnabled,
448    NULL,
449    base::Value::TYPE_BOOLEAN },
450  { key::kDeviceLoginScreenDefaultVirtualKeyboardEnabled,
451    NULL,
452    base::Value::TYPE_BOOLEAN },
453  { key::kRebootAfterUpdate,
454    prefs::kRebootAfterUpdate,
455    base::Value::TYPE_BOOLEAN },
456  { key::kAttestationEnabledForUser,
457    prefs::kAttestationEnabled,
458    base::Value::TYPE_BOOLEAN },
459  { key::kChromeOsMultiProfileUserBehavior,
460    prefs::kMultiProfileUserBehavior,
461    base::Value::TYPE_STRING },
462  { key::kKeyboardDefaultToFunctionKeys,
463    prefs::kLanguageSendFunctionKeys,
464    base::Value::TYPE_BOOLEAN },
465#endif  // defined(OS_CHROMEOS)
466
467#if !defined(OS_MACOSX) && !defined(OS_CHROMEOS)
468  { key::kBackgroundModeEnabled,
469    prefs::kBackgroundModeEnabled,
470    base::Value::TYPE_BOOLEAN },
471#endif  // !defined(OS_MACOSX) && !defined(OS_CHROMEOS)
472
473#if defined(OS_ANDROID)
474  { key::kDataCompressionProxyEnabled,
475    data_reduction_proxy::prefs::kDataReductionProxyEnabled,
476    base::Value::TYPE_BOOLEAN },
477#endif  // defined(OS_ANDROID)
478
479#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
480  { key::kNativeMessagingUserLevelHosts,
481    extensions::pref_names::kNativeMessagingUserLevelHosts,
482    base::Value::TYPE_BOOLEAN },
483#endif  // !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
484};
485
486#if !defined(OS_IOS)
487void GetExtensionAllowedTypesMap(
488    ScopedVector<StringMappingListPolicyHandler::MappingEntry>* result) {
489  // Mapping from extension type names to Manifest::Type.
490  result->push_back(new StringMappingListPolicyHandler::MappingEntry(
491      "extension", scoped_ptr<base::Value>(base::Value::CreateIntegerValue(
492          extensions::Manifest::TYPE_EXTENSION))));
493  result->push_back(new StringMappingListPolicyHandler::MappingEntry(
494      "theme", scoped_ptr<base::Value>(base::Value::CreateIntegerValue(
495          extensions::Manifest::TYPE_THEME))));
496  result->push_back(new StringMappingListPolicyHandler::MappingEntry(
497      "user_script", scoped_ptr<base::Value>(base::Value::CreateIntegerValue(
498          extensions::Manifest::TYPE_USER_SCRIPT))));
499  result->push_back(new StringMappingListPolicyHandler::MappingEntry(
500      "hosted_app", scoped_ptr<base::Value>(base::Value::CreateIntegerValue(
501          extensions::Manifest::TYPE_HOSTED_APP))));
502  result->push_back(new StringMappingListPolicyHandler::MappingEntry(
503      "legacy_packaged_app", scoped_ptr<base::Value>(
504          base::Value::CreateIntegerValue(
505              extensions::Manifest::TYPE_LEGACY_PACKAGED_APP))));
506  result->push_back(new StringMappingListPolicyHandler::MappingEntry(
507      "platform_app", scoped_ptr<base::Value>(base::Value::CreateIntegerValue(
508          extensions::Manifest::TYPE_PLATFORM_APP))));
509}
510#endif  // !defined(OS_IOS)
511
512}  // namespace
513
514void PopulatePolicyHandlerParameters(PolicyHandlerParameters* parameters) {
515#if defined(OS_CHROMEOS)
516  if (chromeos::UserManager::IsInitialized()) {
517    const chromeos::User* user = chromeos::UserManager::Get()->GetActiveUser();
518    if (user)
519      parameters->user_id_hash = user->username_hash();
520  }
521#endif
522}
523
524scoped_ptr<ConfigurationPolicyHandlerList> BuildHandlerList(
525    const Schema& chrome_schema) {
526  scoped_ptr<ConfigurationPolicyHandlerList> handlers(
527      new ConfigurationPolicyHandlerList(
528          base::Bind(&PopulatePolicyHandlerParameters),
529          base::Bind(&GetChromePolicyDetails)));
530  for (size_t i = 0; i < arraysize(kSimplePolicyMap); ++i) {
531    handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
532        new SimplePolicyHandler(kSimplePolicyMap[i].policy_name,
533                                kSimplePolicyMap[i].preference_path,
534                                kSimplePolicyMap[i].value_type)));
535  }
536
537  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
538      new AutofillPolicyHandler()));
539  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
540      new DefaultSearchPolicyHandler()));
541  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
542      new IncognitoModePolicyHandler()));
543  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
544      new ManagedBookmarksPolicyHandler(chrome_schema)));
545  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
546      new ProxyPolicyHandler()));
547  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
548      new URLBlacklistPolicyHandler()));
549
550#if !defined(OS_IOS)
551  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
552      new FileSelectionDialogsPolicyHandler()));
553  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
554      new JavascriptPolicyHandler()));
555  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
556      new RestoreOnStartupPolicyHandler()));
557  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
558      new browser_sync::SyncPolicyHandler()));
559
560  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
561      new extensions::ExtensionListPolicyHandler(
562          key::kExtensionInstallWhitelist,
563          extensions::pref_names::kInstallAllowList,
564          false)));
565  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
566      new extensions::ExtensionListPolicyHandler(
567          key::kExtensionInstallBlacklist,
568          extensions::pref_names::kInstallDenyList,
569          true)));
570  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
571      new extensions::ExtensionInstallForcelistPolicyHandler()));
572  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
573      new extensions::ExtensionURLPatternListPolicyHandler(
574          key::kExtensionInstallSources,
575          extensions::pref_names::kAllowedInstallSites)));
576  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
577      new StringMappingListPolicyHandler(
578          key::kExtensionAllowedTypes,
579          extensions::pref_names::kAllowedTypes,
580          base::Bind(GetExtensionAllowedTypesMap))));
581#endif  // !defined(OS_IOS)
582
583#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
584  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
585      new DiskCacheDirPolicyHandler()));
586
587  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
588      new extensions::NativeMessagingHostListPolicyHandler(
589          key::kNativeMessagingWhitelist,
590          extensions::pref_names::kNativeMessagingWhitelist,
591          false)));
592  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
593      new extensions::NativeMessagingHostListPolicyHandler(
594          key::kNativeMessagingBlacklist,
595          extensions::pref_names::kNativeMessagingBlacklist,
596          true)));
597#endif  // !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
598
599#if !defined(OS_ANDROID) && !defined(OS_IOS)
600  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
601      new DownloadDirPolicyHandler));
602
603  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
604      new SimpleSchemaValidatingPolicyHandler(
605          key::kRegisteredProtocolHandlers,
606          prefs::kPolicyRegisteredProtocolHandlers,
607          chrome_schema,
608          SCHEMA_STRICT,
609          SimpleSchemaValidatingPolicyHandler::RECOMMENDED_ALLOWED,
610          SimpleSchemaValidatingPolicyHandler::MANDATORY_PROHIBITED)));
611#endif
612
613#if defined(OS_CHROMEOS)
614  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
615      new extensions::ExtensionListPolicyHandler(
616          key::kAttestationExtensionWhitelist,
617          prefs::kAttestationExtensionWhitelist,
618          false)));
619  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
620      NetworkConfigurationPolicyHandler::CreateForDevicePolicy()));
621  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
622      NetworkConfigurationPolicyHandler::CreateForUserPolicy()));
623  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
624      new PinnedLauncherAppsPolicyHandler()));
625  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
626      new ScreenMagnifierPolicyHandler()));
627  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
628      new LoginScreenPowerManagementPolicyHandler(chrome_schema)));
629
630  ScopedVector<ConfigurationPolicyHandler>
631      power_management_idle_legacy_policies;
632  power_management_idle_legacy_policies.push_back(
633      new IntRangePolicyHandler(key::kScreenDimDelayAC,
634                                prefs::kPowerAcScreenDimDelayMs,
635                                0,
636                                INT_MAX,
637                                true));
638  power_management_idle_legacy_policies.push_back(
639      new IntRangePolicyHandler(key::kScreenOffDelayAC,
640                                prefs::kPowerAcScreenOffDelayMs,
641                                0,
642                                INT_MAX,
643                                true));
644  power_management_idle_legacy_policies.push_back(
645      new IntRangePolicyHandler(key::kIdleWarningDelayAC,
646                                prefs::kPowerAcIdleWarningDelayMs,
647                                0,
648                                INT_MAX,
649                                true));
650  power_management_idle_legacy_policies.push_back(new IntRangePolicyHandler(
651      key::kIdleDelayAC, prefs::kPowerAcIdleDelayMs, 0, INT_MAX, true));
652  power_management_idle_legacy_policies.push_back(
653      new IntRangePolicyHandler(key::kScreenDimDelayBattery,
654                                prefs::kPowerBatteryScreenDimDelayMs,
655                                0,
656                                INT_MAX,
657                                true));
658  power_management_idle_legacy_policies.push_back(
659      new IntRangePolicyHandler(key::kScreenOffDelayBattery,
660                                prefs::kPowerBatteryScreenOffDelayMs,
661                                0,
662                                INT_MAX,
663                                true));
664  power_management_idle_legacy_policies.push_back(
665      new IntRangePolicyHandler(key::kIdleWarningDelayBattery,
666                                prefs::kPowerBatteryIdleWarningDelayMs,
667                                0,
668                                INT_MAX,
669                                true));
670  power_management_idle_legacy_policies.push_back(
671      new IntRangePolicyHandler(key::kIdleDelayBattery,
672                                prefs::kPowerBatteryIdleDelayMs,
673                                0,
674                                INT_MAX,
675                                true));
676  power_management_idle_legacy_policies.push_back(new IntRangePolicyHandler(
677      key::kIdleActionAC,
678      prefs::kPowerAcIdleAction,
679      chromeos::PowerPolicyController::ACTION_SUSPEND,
680      chromeos::PowerPolicyController::ACTION_DO_NOTHING,
681      false));
682  power_management_idle_legacy_policies.push_back(new IntRangePolicyHandler(
683      key::kIdleActionBattery,
684      prefs::kPowerBatteryIdleAction,
685      chromeos::PowerPolicyController::ACTION_SUSPEND,
686      chromeos::PowerPolicyController::ACTION_DO_NOTHING,
687      false));
688  power_management_idle_legacy_policies.push_back(
689      new DeprecatedIdleActionHandler());
690
691  ScopedVector<ConfigurationPolicyHandler> screen_lock_legacy_policies;
692  screen_lock_legacy_policies.push_back(
693      new IntRangePolicyHandler(key::kScreenLockDelayAC,
694                                prefs::kPowerAcScreenLockDelayMs,
695                                0,
696                                INT_MAX,
697                                true));
698  screen_lock_legacy_policies.push_back(
699      new IntRangePolicyHandler(key::kScreenLockDelayBattery,
700                                prefs::kPowerBatteryScreenLockDelayMs,
701                                0,
702                                INT_MAX,
703                                true));
704
705  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
706      new IntRangePolicyHandler(key::kSAMLOfflineSigninTimeLimit,
707                                prefs::kSAMLOfflineSigninTimeLimit,
708                                -1,
709                                INT_MAX,
710                                true)));
711  handlers->AddHandler(
712      make_scoped_ptr<ConfigurationPolicyHandler>(new IntRangePolicyHandler(
713          key::kLidCloseAction,
714          prefs::kPowerLidClosedAction,
715          chromeos::PowerPolicyController::ACTION_SUSPEND,
716          chromeos::PowerPolicyController::ACTION_DO_NOTHING,
717          false)));
718  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
719      new IntPercentageToDoublePolicyHandler(
720          key::kPresentationScreenDimDelayScale,
721          prefs::kPowerPresentationScreenDimDelayFactor,
722          100,
723          INT_MAX,
724          true)));
725  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
726      new IntPercentageToDoublePolicyHandler(
727          key::kUserActivityScreenDimDelayScale,
728          prefs::kPowerUserActivityScreenDimDelayFactor,
729          100,
730          INT_MAX,
731          true)));
732  handlers->AddHandler(
733      make_scoped_ptr<ConfigurationPolicyHandler>(new IntRangePolicyHandler(
734          key::kUptimeLimit, prefs::kUptimeLimit, 3600, INT_MAX, true)));
735  handlers->AddHandler(
736      make_scoped_ptr<ConfigurationPolicyHandler>(new IntRangePolicyHandler(
737          key::kDeviceLoginScreenDefaultScreenMagnifierType,
738          NULL,
739          0,
740          ash::MAGNIFIER_FULL,
741          false)));
742  // TODO(binjin): Remove LegacyPoliciesDeprecatingPolicyHandler for these two
743  // policies once deprecation of legacy power management policies is done.
744  // http://crbug.com/346229
745  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
746      new LegacyPoliciesDeprecatingPolicyHandler(
747          power_management_idle_legacy_policies.Pass(),
748          make_scoped_ptr<SchemaValidatingPolicyHandler>(
749              new PowerManagementIdleSettingsPolicyHandler(chrome_schema)))));
750  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
751      new LegacyPoliciesDeprecatingPolicyHandler(
752          screen_lock_legacy_policies.Pass(),
753          make_scoped_ptr<SchemaValidatingPolicyHandler>(
754              new ScreenLockDelayPolicyHandler(chrome_schema)))));
755  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
756      new ExternalDataPolicyHandler(key::kUserAvatarImage)));
757  handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
758      new ExternalDataPolicyHandler(key::kWallpaperImage)));
759#endif  // defined(OS_CHROMEOS)
760
761  return handlers.Pass();
762}
763
764}  // namespace policy
765