Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: chrome/browser/policy/configuration_policy_handler.cc

Issue 8139029: Make policy errors available to display in about:policy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix bad commit Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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/configuration_policy_handler.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/file_path.h"
11 #include "base/logging.h"
12 #include "base/stl_util.h"
13 #include "base/string16.h"
14 #include "base/string_number_conversions.h"
15 #include "base/string_util.h"
16 #include "base/utf_string_conversions.h"
17 #include "base/values.h"
18 #include "chrome/browser/download/download_util.h"
19 #include "chrome/browser/policy/configuration_policy_pref_store.h"
20 #include "chrome/browser/policy/policy_error_map.h"
21 #include "chrome/browser/policy/policy_map.h"
22 #include "chrome/browser/policy/policy_path_parser.h"
23 #include "chrome/browser/prefs/incognito_mode_prefs.h"
24 #include "chrome/browser/prefs/pref_value_map.h"
25 #include "chrome/browser/prefs/proxy_config_dictionary.h"
26 #include "chrome/browser/prefs/proxy_prefs.h"
27 #include "chrome/browser/search_engines/search_terms_data.h"
28 #include "chrome/browser/search_engines/template_url.h"
29 #include "chrome/common/pref_names.h"
30 #include "grit/generated_resources.h"
31 #include "policy/configuration_policy_type.h"
32
33 namespace policy {
34
35 namespace {
36
37
Mattias Nissler (ping if slow) 2011/10/11 11:10:57 remove some extra white space?
Joao da Silva 2011/10/11 15:09:23 Done.
38 // Implementations of ConfigurationPolicyHandler -------------------------------
39
40
41 // Abstract class derived from ConfigurationPolicyHandler that should be
42 // subclassed to handle a single policy (not a combination of policies).
43 class TypeCheckingPolicyHandler : public ConfigurationPolicyHandler {
44 public:
45 TypeCheckingPolicyHandler(ConfigurationPolicyType policy_type,
46 base::Value::Type value_type);
47
48 // ConfigurationPolicyHandler methods:
49 virtual bool CheckPolicySettings(const PolicyMap* policies,
50 PolicyErrorMap* errors) OVERRIDE;
51
52 protected:
53 virtual ~TypeCheckingPolicyHandler();
54
55 ConfigurationPolicyType policy_type() const;
56
57 private:
58 // The ConfigurationPolicyType of the policy.
59 ConfigurationPolicyType policy_type_;
60
61 // The type the value of the policy should have.
62 base::Value::Type value_type_;
63
64 DISALLOW_COPY_AND_ASSIGN(TypeCheckingPolicyHandler);
65 };
66
Mattias Nissler (ping if slow) 2011/10/11 11:10:57 nit: remove extra blank line? also below.
Joao da Silva 2011/10/11 15:09:23 Done.
67
68 // ConfigurationPolicyHandler for policies that map directly to a preference.
69 class SimplePolicyHandler : public TypeCheckingPolicyHandler {
70 public:
71 SimplePolicyHandler(ConfigurationPolicyType policy_type,
72 base::Value::Type value_type,
73 const char* pref_path);
74 virtual ~SimplePolicyHandler();
75
76 // ConfigurationPolicyHandler methods:
77 virtual void ApplyPolicySettings(const PolicyMap* policies,
78 PrefValueMap* prefs) OVERRIDE;
79
80 private:
81 // The DictionaryValue path of the preference the policy maps to.
82 const char* pref_path_;
83
84 DISALLOW_COPY_AND_ASSIGN(SimplePolicyHandler);
85 };
86
87
88 // ConfigurationPolicyHandler for the SyncDisabled policy.
89 class SyncPolicyHandler : public TypeCheckingPolicyHandler {
90 public:
91 SyncPolicyHandler();
92 virtual ~SyncPolicyHandler();
93
94 // ConfigurationPolicyHandler methods:
95 virtual void ApplyPolicySettings(const PolicyMap* policies,
96 PrefValueMap* prefs) OVERRIDE;
97
98 private:
99 DISALLOW_COPY_AND_ASSIGN(SyncPolicyHandler);
100 };
101
102
103 // ConfigurationPolicyHandler for the AutofillEnabled policy.
104 class AutofillPolicyHandler : public TypeCheckingPolicyHandler {
105 public:
106 AutofillPolicyHandler();
107 virtual ~AutofillPolicyHandler();
108
109 // ConfigurationPolicyHandler methods:
110 virtual void ApplyPolicySettings(const PolicyMap* policies,
111 PrefValueMap* prefs) OVERRIDE;
112
113 private:
114 DISALLOW_COPY_AND_ASSIGN(AutofillPolicyHandler);
115 };
116
117
118 // ConfigurationPolicyHandler for the DownloadDirectory policy.
119 class DownloadDirPolicyHandler : public TypeCheckingPolicyHandler {
120 public:
121 DownloadDirPolicyHandler();
122 virtual ~DownloadDirPolicyHandler();
123
124 // ConfigurationPolicyHandler methods:
125 virtual void ApplyPolicySettings(const PolicyMap* policies,
126 PrefValueMap* prefs) OVERRIDE;
127
128 private:
129 DISALLOW_COPY_AND_ASSIGN(DownloadDirPolicyHandler);
130 };
131
132
133 // ConfigurationPolicyHandler for the DiskCacheDir policy.
134 class DiskCacheDirPolicyHandler : public TypeCheckingPolicyHandler {
135 public:
136 explicit DiskCacheDirPolicyHandler();
137 virtual ~DiskCacheDirPolicyHandler();
138
139 // ConfigurationPolicyHandler methods:
140 virtual void ApplyPolicySettings(const PolicyMap* policies,
141 PrefValueMap* prefs) OVERRIDE;
142
143 private:
144 DISALLOW_COPY_AND_ASSIGN(DiskCacheDirPolicyHandler);
145 };
146
147
148 // ConfigurationPolicyHandler for the FileSelectionDialogsHandler policy.
149 class FileSelectionDialogsHandler : public TypeCheckingPolicyHandler {
150 public:
151 FileSelectionDialogsHandler();
152 virtual ~FileSelectionDialogsHandler();
153
154 // ConfigurationPolicyHandler methods:
155 virtual void ApplyPolicySettings(const PolicyMap* policies,
156 PrefValueMap* prefs) OVERRIDE;
157
158 private:
159 DISALLOW_COPY_AND_ASSIGN(FileSelectionDialogsHandler);
160 };
161
162
163 // ConfigurationPolicyHandler for the incognito mode policies.
164 class IncognitoModePolicyHandler : public ConfigurationPolicyHandler {
165 public:
166 IncognitoModePolicyHandler();
167 virtual ~IncognitoModePolicyHandler();
168
169 // ConfigurationPolicyHandler methods:
170 virtual bool CheckPolicySettings(const PolicyMap* policies,
171 PolicyErrorMap* errors) OVERRIDE;
172 virtual void ApplyPolicySettings(const PolicyMap* policies,
173 PrefValueMap* prefs) OVERRIDE;
174
175 private:
176 IncognitoModePrefs::Availability GetAvailabilityValueAsEnum(
177 const Value* availability);
178
179 DISALLOW_COPY_AND_ASSIGN(IncognitoModePolicyHandler);
180 };
181
182
183 // ConfigurationPolicyHandler for the DefaultSearchEncodings policy.
184 class DefaultSearchEncodingsPolicyHandler : public TypeCheckingPolicyHandler {
185 public:
186 DefaultSearchEncodingsPolicyHandler();
187 virtual ~DefaultSearchEncodingsPolicyHandler();
188
189 // ConfigurationPolicyHandler methods:
190 virtual void ApplyPolicySettings(const PolicyMap* policies,
191 PrefValueMap* prefs) OVERRIDE;
192
193 private:
194 DISALLOW_COPY_AND_ASSIGN(DefaultSearchEncodingsPolicyHandler);
195 };
196
197
198 // ConfigurationPolicyHandler for the default search policies.
199 class DefaultSearchPolicyHandler : public ConfigurationPolicyHandler {
200 public:
201 DefaultSearchPolicyHandler();
202 virtual ~DefaultSearchPolicyHandler();
203
204 // ConfigurationPolicyHandler methods:
205 virtual bool CheckPolicySettings(const PolicyMap* policies,
206 PolicyErrorMap* errors) OVERRIDE;
207 virtual void ApplyPolicySettings(const PolicyMap* policies,
208 PrefValueMap* prefs) OVERRIDE;
209
210 private:
211 // Calls |CheckPolicySettings()| on each of the handlers in |handlers_|
212 // and returns true if all of the calls return true and false otherwise.
213 bool CheckIndividualPolicies(const PolicyMap* policies,
214 PolicyErrorMap* errors);
215
216 // Returns true if there is a value for |policy_type| in |policies| and false
217 // otherwise.
218 bool HasDefaultSearchPolicy(const PolicyMap* policies,
219 ConfigurationPolicyType policy_type);
220
221 // Returns true if any default search policies are specified in |policies| and
222 // false otherwise.
223 bool AnyDefaultSearchPoliciesSpecified(const PolicyMap* policies);
224
225 // Returns true if the default search provider is disabled and false
226 // otherwise.
227 bool DefaultSearchProviderIsDisabled(const PolicyMap* policies);
228
229 // Returns true if the default search URL was set and is valid and false
230 // otherwise.
231 bool DefaultSearchURLIsValid(const PolicyMap* policies);
232
233 // Make sure that the |path| if present in |prefs_|. If not, set it to
234 // a blank string.
235 void EnsureStringPrefExists(PrefValueMap* prefs, const std::string& path);
236
237 // The ConfigurationPolicyHandler handlers for each default search policy.
238 HandlerList handlers_;
239
240 DISALLOW_COPY_AND_ASSIGN(DefaultSearchPolicyHandler);
241 };
242
243
244 // ConfigurationPolicyHandler for the proxy policies.
245 class ProxyPolicyHandler : public ConfigurationPolicyHandler {
246 public:
247 ProxyPolicyHandler();
248 virtual ~ProxyPolicyHandler();
249
250 // ConfigurationPolicyHandler methods:
251 virtual bool CheckPolicySettings(const PolicyMap* policies,
252 PolicyErrorMap* errors) OVERRIDE;
253 virtual void ApplyPolicySettings(const PolicyMap* policies,
254 PrefValueMap* prefs) OVERRIDE;
255
256 private:
257 const Value* GetProxyPolicyValue(const PolicyMap* policies,
258 ConfigurationPolicyType policy);
259
260 // Converts the deprecated ProxyServerMode policy value to a ProxyMode value
261 // and places the result in |mode_value|. Returns true if the conversion
262 // succeeded and false otherwise.
263 bool CheckProxyModeAndServerMode(const PolicyMap* policies,
264 PolicyErrorMap* errors,
265 std::string* mode_value);
266
267 DISALLOW_COPY_AND_ASSIGN(ProxyPolicyHandler);
268 };
269
270
271 // Helper classes --------------------------------------------------------------
272
273
274 // Implementation of SearchTermsData just for validation.
275 class SearchTermsDataForValidation : public SearchTermsData {
276 public:
277 SearchTermsDataForValidation() {}
278
279 // Implementation of SearchTermsData.
280 virtual std::string GoogleBaseURLValue() const {
281 return "http://www.google.com/";
282 }
283 virtual std::string GetApplicationLocale() const {
284 return "en";
285 }
286 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
287 virtual string16 GetRlzParameterValue() const {
288 return string16();
289 }
290 #endif
291 private:
292 DISALLOW_COPY_AND_ASSIGN(SearchTermsDataForValidation);
293 };
294
295
296 // This is used to check whether for a given ProxyMode value, the ProxyPacUrl,
297 // the ProxyBypassList and the ProxyServer policies are allowed to be specified.
298 // |error_message_id| is the message id of the localized error message to show
299 // when the policies are not specified as allowed. Each value of ProxyMode
300 // has a ProxyModeValidationEntry in the |kProxyModeValidationMap| below.
301 struct ProxyModeValidationEntry {
302 const char* mode_value;
303 bool pac_url_allowed;
304 bool bypass_list_allowed;
305 bool server_allowed;
306 int error_message_id;
307 };
308
309
310 // Maps a policy type to a preference path, and to the expected value type.
311 // This is the entry type of |kSimplePolicyMap| below.
312 struct PolicyToPreferenceMapEntry {
313 base::Value::Type value_type;
314 ConfigurationPolicyType policy_type;
315 const char* preference_path;
316 };
317
318
319 // Static data -----------------------------------------------------------------
320
321
322 // List of policy types to preference names. This is used for simple policies
323 // that directly map to a single preference.
324 const PolicyToPreferenceMapEntry kSimplePolicyMap[] = {
325 { Value::TYPE_STRING, kPolicyHomepageLocation, prefs::kHomePage },
326 { Value::TYPE_BOOLEAN, kPolicyHomepageIsNewTabPage,
327 prefs::kHomePageIsNewTabPage },
328 { Value::TYPE_INTEGER, kPolicyRestoreOnStartup,
329 prefs::kRestoreOnStartup},
330 { Value::TYPE_LIST, kPolicyRestoreOnStartupURLs,
331 prefs::kURLsToRestoreOnStartup },
332 { Value::TYPE_BOOLEAN, kPolicyAlternateErrorPagesEnabled,
333 prefs::kAlternateErrorPagesEnabled },
334 { Value::TYPE_BOOLEAN, kPolicySearchSuggestEnabled,
335 prefs::kSearchSuggestEnabled },
336 { Value::TYPE_BOOLEAN, kPolicyDnsPrefetchingEnabled,
337 prefs::kNetworkPredictionEnabled },
338 { Value::TYPE_BOOLEAN, kPolicyDisableSpdy,
339 prefs::kDisableSpdy },
340 { Value::TYPE_LIST, kPolicyDisabledSchemes,
341 prefs::kDisabledSchemes },
342 { Value::TYPE_BOOLEAN, kPolicySafeBrowsingEnabled,
343 prefs::kSafeBrowsingEnabled },
344 { Value::TYPE_BOOLEAN, kPolicyPasswordManagerEnabled,
345 prefs::kPasswordManagerEnabled },
346 { Value::TYPE_BOOLEAN, kPolicyPasswordManagerAllowShowPasswords,
347 prefs::kPasswordManagerAllowShowPasswords },
348 { Value::TYPE_BOOLEAN, kPolicyPrintingEnabled,
349 prefs::kPrintingEnabled },
350 { Value::TYPE_BOOLEAN, kPolicyMetricsReportingEnabled,
351 prefs::kMetricsReportingEnabled },
352 { Value::TYPE_STRING, kPolicyApplicationLocaleValue,
353 prefs::kApplicationLocale},
354 { Value::TYPE_LIST, kPolicyExtensionInstallWhitelist,
355 prefs::kExtensionInstallAllowList},
356 { Value::TYPE_LIST, kPolicyExtensionInstallBlacklist,
357 prefs::kExtensionInstallDenyList},
358 { Value::TYPE_LIST, kPolicyExtensionInstallForcelist,
359 prefs::kExtensionInstallForceList},
360 { Value::TYPE_LIST, kPolicyDisabledPlugins,
361 prefs::kPluginsDisabledPlugins},
362 { Value::TYPE_LIST, kPolicyDisabledPluginsExceptions,
363 prefs::kPluginsDisabledPluginsExceptions},
364 { Value::TYPE_LIST, kPolicyEnabledPlugins,
365 prefs::kPluginsEnabledPlugins},
366 { Value::TYPE_BOOLEAN, kPolicyShowHomeButton,
367 prefs::kShowHomeButton },
368 { Value::TYPE_BOOLEAN, kPolicyJavascriptEnabled,
369 prefs::kWebKitJavascriptEnabled },
370 { Value::TYPE_BOOLEAN, kPolicySavingBrowserHistoryDisabled,
371 prefs::kSavingBrowserHistoryDisabled },
372 { Value::TYPE_BOOLEAN, kPolicyClearSiteDataOnExit,
373 prefs::kClearSiteDataOnExit },
374 { Value::TYPE_BOOLEAN, kPolicyDeveloperToolsDisabled,
375 prefs::kDevToolsDisabled },
376 { Value::TYPE_BOOLEAN, kPolicyBlockThirdPartyCookies,
377 prefs::kBlockThirdPartyCookies },
378 { Value::TYPE_INTEGER, kPolicyDefaultCookiesSetting,
379 prefs::kManagedDefaultCookiesSetting },
380 { Value::TYPE_INTEGER, kPolicyDefaultImagesSetting,
381 prefs::kManagedDefaultImagesSetting },
382 { Value::TYPE_INTEGER, kPolicyDefaultJavaScriptSetting,
383 prefs::kManagedDefaultJavaScriptSetting },
384 { Value::TYPE_INTEGER, kPolicyDefaultPluginsSetting,
385 prefs::kManagedDefaultPluginsSetting },
386 { Value::TYPE_INTEGER, kPolicyDefaultPopupsSetting,
387 prefs::kManagedDefaultPopupsSetting },
388 { Value::TYPE_LIST, kPolicyAutoSelectCertificateForUrls,
389 prefs::kManagedAutoSelectCertificateForUrls},
390 { Value::TYPE_LIST, kPolicyCookiesAllowedForUrls,
391 prefs::kManagedCookiesAllowedForUrls },
392 { Value::TYPE_LIST, kPolicyCookiesBlockedForUrls,
393 prefs::kManagedCookiesBlockedForUrls },
394 { Value::TYPE_LIST, kPolicyCookiesSessionOnlyForUrls,
395 prefs::kManagedCookiesSessionOnlyForUrls },
396 { Value::TYPE_LIST, kPolicyImagesAllowedForUrls,
397 prefs::kManagedImagesAllowedForUrls },
398 { Value::TYPE_LIST, kPolicyImagesBlockedForUrls,
399 prefs::kManagedImagesBlockedForUrls },
400 { Value::TYPE_LIST, kPolicyJavaScriptAllowedForUrls,
401 prefs::kManagedJavaScriptAllowedForUrls },
402 { Value::TYPE_LIST, kPolicyJavaScriptBlockedForUrls,
403 prefs::kManagedJavaScriptBlockedForUrls },
404 { Value::TYPE_LIST, kPolicyPluginsAllowedForUrls,
405 prefs::kManagedPluginsAllowedForUrls },
406 { Value::TYPE_LIST, kPolicyPluginsBlockedForUrls,
407 prefs::kManagedPluginsBlockedForUrls },
408 { Value::TYPE_LIST, kPolicyPopupsAllowedForUrls,
409 prefs::kManagedPopupsAllowedForUrls },
410 { Value::TYPE_LIST, kPolicyPopupsBlockedForUrls,
411 prefs::kManagedPopupsBlockedForUrls },
412 { Value::TYPE_LIST, kPolicyNotificationsAllowedForUrls,
413 prefs::kManagedNotificationsAllowedForUrls },
414 { Value::TYPE_LIST, kPolicyNotificationsBlockedForUrls,
415 prefs::kManagedNotificationsBlockedForUrls },
416 { Value::TYPE_INTEGER, kPolicyDefaultNotificationsSetting,
417 prefs::kManagedDefaultNotificationsSetting },
418 { Value::TYPE_INTEGER, kPolicyDefaultGeolocationSetting,
419 prefs::kManagedDefaultGeolocationSetting },
420 { Value::TYPE_STRING, kPolicyAuthSchemes,
421 prefs::kAuthSchemes },
422 { Value::TYPE_BOOLEAN, kPolicyDisableAuthNegotiateCnameLookup,
423 prefs::kDisableAuthNegotiateCnameLookup },
424 { Value::TYPE_BOOLEAN, kPolicyEnableAuthNegotiatePort,
425 prefs::kEnableAuthNegotiatePort },
426 { Value::TYPE_STRING, kPolicyAuthServerWhitelist,
427 prefs::kAuthServerWhitelist },
428 { Value::TYPE_STRING, kPolicyAuthNegotiateDelegateWhitelist,
429 prefs::kAuthNegotiateDelegateWhitelist },
430 { Value::TYPE_STRING, kPolicyGSSAPILibraryName,
431 prefs::kGSSAPILibraryName },
432 { Value::TYPE_BOOLEAN, kPolicyAllowCrossOriginAuthPrompt,
433 prefs::kAllowCrossOriginAuthPrompt },
434 { Value::TYPE_BOOLEAN, kPolicyDisable3DAPIs,
435 prefs::kDisable3DAPIs },
436 { Value::TYPE_BOOLEAN, kPolicyDisablePluginFinder,
437 prefs::kDisablePluginFinder },
438 { Value::TYPE_INTEGER, kPolicyPolicyRefreshRate,
439 prefs::kUserPolicyRefreshRate },
440 { Value::TYPE_INTEGER, kPolicyDevicePolicyRefreshRate,
441 prefs::kDevicePolicyRefreshRate },
442 { Value::TYPE_BOOLEAN, kPolicyInstantEnabled, prefs::kInstantEnabled },
443 { Value::TYPE_BOOLEAN, kPolicyDefaultBrowserSettingEnabled,
444 prefs::kDefaultBrowserSettingEnabled },
445 { Value::TYPE_BOOLEAN, kPolicyRemoteAccessClientFirewallTraversal,
446 prefs::kRemoteAccessClientFirewallTraversal },
447 { Value::TYPE_BOOLEAN, kPolicyRemoteAccessHostFirewallTraversal,
448 prefs::kRemoteAccessHostFirewallTraversal },
449 { Value::TYPE_BOOLEAN, kPolicyCloudPrintProxyEnabled,
450 prefs::kCloudPrintProxyEnabled },
451 { Value::TYPE_BOOLEAN, kPolicyTranslateEnabled, prefs::kEnableTranslate },
452 { Value::TYPE_BOOLEAN, kPolicyAllowOutdatedPlugins,
453 prefs::kPluginsAllowOutdated },
454 { Value::TYPE_BOOLEAN, kPolicyAlwaysAuthorizePlugins,
455 prefs::kPluginsAlwaysAuthorize },
456 { Value::TYPE_BOOLEAN, kPolicyBookmarkBarEnabled,
457 prefs::kShowBookmarkBar },
458 { Value::TYPE_BOOLEAN, kPolicyEditBookmarksEnabled,
459 prefs::kEditBookmarksEnabled },
460 { Value::TYPE_BOOLEAN, kPolicyAllowFileSelectionDialogs,
461 prefs::kAllowFileSelectionDialogs },
462 { Value::TYPE_BOOLEAN, kPolicyImportBookmarks,
463 prefs::kImportBookmarks},
464 { Value::TYPE_BOOLEAN, kPolicyImportHistory,
465 prefs::kImportHistory},
466 { Value::TYPE_BOOLEAN, kPolicyImportHomepage,
467 prefs::kImportHomepage},
468 { Value::TYPE_BOOLEAN, kPolicyImportSearchEngine,
469 prefs::kImportSearchEngine },
470 { Value::TYPE_BOOLEAN, kPolicyImportSavedPasswords,
471 prefs::kImportSavedPasswords },
472 { Value::TYPE_INTEGER, kPolicyMaxConnectionsPerProxy,
473 prefs::kMaxConnectionsPerProxy },
474 { Value::TYPE_BOOLEAN, kPolicyHideWebStorePromo,
475 prefs::kNTPHideWebStorePromo },
476 { Value::TYPE_LIST, kPolicyURLBlacklist,
477 prefs::kUrlBlacklist },
478 { Value::TYPE_LIST, kPolicyURLWhitelist,
479 prefs::kUrlWhitelist },
480
481 #if defined(OS_CHROMEOS)
482 { Value::TYPE_BOOLEAN, kPolicyChromeOsLockOnIdleSuspend,
483 prefs::kEnableScreenLock },
484 { Value::TYPE_STRING, kPolicyChromeOsReleaseChannel,
485 prefs::kChromeOsReleaseChannel },
486 #endif
487 };
488
489 // List of policy types to preference names, for policies affecting the default
490 // search provider.
491 const PolicyToPreferenceMapEntry kDefaultSearchPolicyMap[] = {
492 { Value::TYPE_BOOLEAN, kPolicyDefaultSearchProviderEnabled,
493 prefs::kDefaultSearchProviderEnabled },
494 { Value::TYPE_STRING, kPolicyDefaultSearchProviderName,
495 prefs::kDefaultSearchProviderName },
496 { Value::TYPE_STRING, kPolicyDefaultSearchProviderKeyword,
497 prefs::kDefaultSearchProviderKeyword },
498 { Value::TYPE_STRING, kPolicyDefaultSearchProviderSearchURL,
499 prefs::kDefaultSearchProviderSearchURL },
500 { Value::TYPE_STRING, kPolicyDefaultSearchProviderSuggestURL,
501 prefs::kDefaultSearchProviderSuggestURL },
502 { Value::TYPE_STRING, kPolicyDefaultSearchProviderInstantURL,
503 prefs::kDefaultSearchProviderInstantURL },
504 { Value::TYPE_STRING, kPolicyDefaultSearchProviderIconURL,
505 prefs::kDefaultSearchProviderIconURL },
506 { Value::TYPE_LIST, kPolicyDefaultSearchProviderEncodings,
507 prefs::kDefaultSearchProviderEncodings },
508 };
509
510 // List of entries determining which proxy policies can be specified, depending
511 // on the ProxyMode.
512 const ProxyModeValidationEntry kProxyModeValidationMap[] = {
513 { ProxyPrefs::kDirectProxyModeName,
514 false, false, false, IDS_POLICY_PROXY_MODE_DISABLED_ERROR },
515 { ProxyPrefs::kAutoDetectProxyModeName,
516 false, false, false, IDS_POLICY_PROXY_MODE_AUTO_DETECT_ERROR },
517 { ProxyPrefs::kPacScriptProxyModeName,
518 true, false, false, IDS_POLICY_PROXY_MODE_PAC_URL_ERROR },
519 { ProxyPrefs::kFixedServersProxyModeName,
520 false, true, true, IDS_POLICY_PROXY_MODE_FIXED_SERVERS_ERROR },
521 { ProxyPrefs::kSystemProxyModeName,
522 false, false, false, IDS_POLICY_PROXY_MODE_SYSTEM_ERROR },
523 };
524
525
526 // Helper functions ------------------------------------------------------------
527
528
529 std::string ValueTypeToString(Value::Type type) {
530 static const char* strings[] = {
531 "null",
532 "boolean",
533 "integer",
534 "double",
535 "string",
536 "binary",
537 "dictionary",
538 "list"
539 };
540 DCHECK(static_cast<size_t>(type) < arraysize(strings));
541 return std::string(strings[type]);
542 }
543
544
545 // TypeCheckingPolicyHandler implementation ------------------------------------
546
547
548 TypeCheckingPolicyHandler::TypeCheckingPolicyHandler(
549 ConfigurationPolicyType policy_type,
550 Value::Type value_type)
551 : policy_type_(policy_type),
552 value_type_(value_type) {
553 }
554
555 TypeCheckingPolicyHandler::~TypeCheckingPolicyHandler() {
556 }
557
558 ConfigurationPolicyType TypeCheckingPolicyHandler::policy_type() const {
559 return policy_type_;
560 }
561
562 bool TypeCheckingPolicyHandler::CheckPolicySettings(const PolicyMap* policies,
563 PolicyErrorMap* errors) {
564 const Value* value = policies->Get(policy_type_);
565 if (value && value_type_ != value->GetType()) {
566 errors->AddError(policy_type_,
567 IDS_POLICY_TYPE_ERROR, ValueTypeToString(value_type_));
568 return false;
569 }
570 return true;
571 }
572
573
574 // SimplePolicyHandler implementation ------------------------------------------
575
576
577 SimplePolicyHandler::SimplePolicyHandler(
578 ConfigurationPolicyType policy_type,
579 Value::Type value_type,
580 const char* pref_path)
581 : TypeCheckingPolicyHandler(policy_type, value_type),
582 pref_path_(pref_path) {
583 }
584
585 SimplePolicyHandler::~SimplePolicyHandler() {
586 }
587
588 void SimplePolicyHandler::ApplyPolicySettings(const PolicyMap* policies,
589 PrefValueMap* prefs) {
590 const Value* value = policies->Get(policy_type());
591 if (value)
592 prefs->SetValue(pref_path_, value->DeepCopy());
593 }
594
595
596 // SyncPolicyHandler implementation --------------------------------------------
597
598
599 SyncPolicyHandler::SyncPolicyHandler()
600 : TypeCheckingPolicyHandler(kPolicySyncDisabled,
601 Value::TYPE_BOOLEAN) {
602 }
603
604 SyncPolicyHandler::~SyncPolicyHandler() {
605 }
606
607 void SyncPolicyHandler::ApplyPolicySettings(const PolicyMap* policies,
608 PrefValueMap* prefs) {
609 const Value* value = policies->Get(policy_type());
610 bool disable_sync;
611 if (value && value->GetAsBoolean(&disable_sync) && disable_sync)
612 prefs->SetValue(prefs::kSyncManaged, value->DeepCopy());
613 }
614
615
616 // AutofillPolicyHandler implementation ----------------------------------------
617
618
619 AutofillPolicyHandler::AutofillPolicyHandler()
620 : TypeCheckingPolicyHandler(kPolicyAutoFillEnabled,
621 Value::TYPE_BOOLEAN) {
622 }
623
624 AutofillPolicyHandler::~AutofillPolicyHandler() {
625 }
626
627 void AutofillPolicyHandler::ApplyPolicySettings(const PolicyMap* policies,
628 PrefValueMap* prefs) {
629 const Value* value = policies->Get(policy_type());
630 bool auto_fill_enabled;
631 if (value && value->GetAsBoolean(&auto_fill_enabled) && !auto_fill_enabled) {
632 prefs->SetValue(prefs::kAutofillEnabled,
633 Value::CreateBooleanValue(false));
634 }
635 }
636
637
638 // DownloadDirPolicyHandler implementation -------------------------------------
639
640
641 DownloadDirPolicyHandler::DownloadDirPolicyHandler()
642 : TypeCheckingPolicyHandler(kPolicyDownloadDirectory,
643 Value::TYPE_STRING) {
644 }
645
646 DownloadDirPolicyHandler::~DownloadDirPolicyHandler() {
647 }
648
649 void DownloadDirPolicyHandler::ApplyPolicySettings(const PolicyMap* policies,
650 PrefValueMap* prefs) {
651 const Value* value = policies->Get(policy_type());
652 FilePath::StringType string_value;
653 if (!value || !value->GetAsString(&string_value))
654 return;
655
656 FilePath::StringType expanded_value =
657 policy::path_parser::ExpandPathVariables(string_value);
658 // Make sure the path isn't empty, since that will point to an undefined
659 // location; the default location is used instead in that case.
660 // This is checked after path expansion because a non-empty policy value can
661 // lead to an empty path value after expansion (e.g. "\"\"").
662 if (expanded_value.empty())
663 expanded_value = download_util::GetDefaultDownloadDirectory().value();
664 prefs->SetValue(prefs::kDownloadDefaultDirectory,
665 Value::CreateStringValue(expanded_value));
666 prefs->SetValue(prefs::kPromptForDownload,
667 Value::CreateBooleanValue(false));
668 }
669
670
671 // DiskCacheDirPolicyHandler implementation ------------------------------------
672
673
674 DiskCacheDirPolicyHandler::DiskCacheDirPolicyHandler()
675 : TypeCheckingPolicyHandler(kPolicyDiskCacheDir,
676 Value::TYPE_STRING) {
677 }
678
679 DiskCacheDirPolicyHandler::~DiskCacheDirPolicyHandler() {
680 }
681
682 void DiskCacheDirPolicyHandler::ApplyPolicySettings(const PolicyMap* policies,
683 PrefValueMap* prefs) {
684 const Value* value = policies->Get(policy_type());
685 FilePath::StringType string_value;
686 if (value && value->GetAsString(&string_value)) {
687 FilePath::StringType expanded_value =
688 policy::path_parser::ExpandPathVariables(string_value);
689 prefs->SetValue(prefs::kDiskCacheDir,
690 Value::CreateStringValue(expanded_value));
691 }
692 }
693
694
695 // FileSelectionDialogsHandler implementation ----------------------------------
696
697
698 FileSelectionDialogsHandler::FileSelectionDialogsHandler()
699 : TypeCheckingPolicyHandler(kPolicyAllowFileSelectionDialogs,
700 Value::TYPE_BOOLEAN) {
701 }
702
703 FileSelectionDialogsHandler::~FileSelectionDialogsHandler() {
704 }
705
706 void FileSelectionDialogsHandler::ApplyPolicySettings(const PolicyMap* policies,
707 PrefValueMap* prefs) {
708 bool allow_dialogs;
709 const Value* value = policies->Get(policy_type());
710 if (value && value->GetAsBoolean(&allow_dialogs)) {
711 prefs->SetValue(prefs::kAllowFileSelectionDialogs,
712 Value::CreateBooleanValue(allow_dialogs));
713 // Disallow selecting the download location if file dialogs are disabled.
714 if (!allow_dialogs) {
715 prefs->SetValue(prefs::kPromptForDownload,
716 Value::CreateBooleanValue(false));
717 }
718 }
719 }
720
721
722 // IncognitoModePolicyHandler implementation -----------------------------------
723
724
725 IncognitoModePolicyHandler::IncognitoModePolicyHandler() {
726 }
727
728 IncognitoModePolicyHandler::~IncognitoModePolicyHandler() {
729 }
730
731 bool IncognitoModePolicyHandler::CheckPolicySettings(const PolicyMap* policies,
732 PolicyErrorMap* errors) {
733 int int_value = IncognitoModePrefs::ENABLED;
734 const Value* availability = policies->Get(kPolicyIncognitoModeAvailability);
735
736 if (availability) {
737 if (availability->GetAsInteger(&int_value)) {
738 IncognitoModePrefs::Availability availability_enum_value;
739 if (!IncognitoModePrefs::IntToAvailability(int_value,
740 &availability_enum_value)) {
741 errors->AddError(kPolicyIncognitoModeAvailability,
742 IDS_POLICY_OUT_OF_RANGE_ERROR,
743 base::IntToString(int_value));
744 return false;
745 }
746 } else {
747 errors->AddError(kPolicyIncognitoModeAvailability,
748 IDS_POLICY_TYPE_ERROR,
749 ValueTypeToString(Value::TYPE_INTEGER));
750 return false;
751 }
752 } else {
753 const Value* deprecated_enabled = policies->Get(kPolicyIncognitoEnabled);
754 if (deprecated_enabled &&
755 !deprecated_enabled->IsType(Value::TYPE_BOOLEAN)) {
756 errors->AddError(kPolicyIncognitoEnabled,
757 IDS_POLICY_TYPE_ERROR,
758 ValueTypeToString(Value::TYPE_BOOLEAN));
759 return false;
760 }
761 }
762 return true;
763 }
764
765 void IncognitoModePolicyHandler::ApplyPolicySettings(const PolicyMap* policies,
766 PrefValueMap* prefs) {
767 const Value* availability = policies->Get(kPolicyIncognitoModeAvailability);
768 const Value* deprecated_enabled = policies->Get(kPolicyIncognitoEnabled);
769 if (availability) {
770 int int_value = IncognitoModePrefs::ENABLED;
771 IncognitoModePrefs::Availability availability_enum_value;
772 if (availability->GetAsInteger(&int_value) &&
773 IncognitoModePrefs::IntToAvailability(int_value,
774 &availability_enum_value)) {
775 prefs->SetValue(prefs::kIncognitoModeAvailability,
776 Value::CreateIntegerValue(availability_enum_value));
777 } else {
778 NOTREACHED();
779 }
780 } else if (deprecated_enabled) {
781 // If kPolicyIncognitoModeAvailability is not specified, check the obsolete
782 // kPolicyIncognitoEnabled.
783 bool enabled = true;
784 if (deprecated_enabled->GetAsBoolean(&enabled)) {
785 prefs->SetInteger(prefs::kIncognitoModeAvailability,
786 enabled ? IncognitoModePrefs::ENABLED :
787 IncognitoModePrefs::DISABLED);
788 } else {
789 NOTREACHED();
790 }
791 }
792 }
793
794
795 // DefaultSearchEncodingsPolicyHandler implementation --------------------------
796
797
798 DefaultSearchEncodingsPolicyHandler::DefaultSearchEncodingsPolicyHandler()
799 : TypeCheckingPolicyHandler(kPolicyDefaultSearchProviderEncodings,
800 Value::TYPE_LIST) {
801 }
802
803 DefaultSearchEncodingsPolicyHandler::~DefaultSearchEncodingsPolicyHandler() {
804 }
805
806 void DefaultSearchEncodingsPolicyHandler::ApplyPolicySettings(
807 const PolicyMap* policies, PrefValueMap* prefs) {
808 // The DefaultSearchProviderEncodings policy has type list, but the related
809 // preference has type string. Convert one into the other here, using
810 // ';' as a separator.
811 const Value* value = policies->Get(policy_type());
812 const ListValue* list;
813 if (!value || !value->GetAsList(&list))
814 return;
815
816 ListValue::const_iterator iter(list->begin());
817 ListValue::const_iterator end(list->end());
818 std::vector<std::string> string_parts;
819 for (; iter != end; ++iter) {
820 std::string s;
821 if ((*iter)->GetAsString(&s)) {
822 string_parts.push_back(s);
823 }
824 }
825 std::string encodings = JoinString(string_parts, ';');
826 prefs->SetValue(prefs::kDefaultSearchProviderEncodings,
827 Value::CreateStringValue(encodings));
828 }
829
830
831 // DefaultSearchPolicyHandler implementation -----------------------------------
832
833
834 DefaultSearchPolicyHandler::DefaultSearchPolicyHandler() {
835 for (size_t i = 0; i < arraysize(kDefaultSearchPolicyMap); ++i) {
836 ConfigurationPolicyType policy_type =
837 kDefaultSearchPolicyMap[i].policy_type;
838 if (policy_type == kPolicyDefaultSearchProviderEncodings) {
839 handlers_.push_back(new DefaultSearchEncodingsPolicyHandler());
840 } else {
841 handlers_.push_back(
842 new SimplePolicyHandler(policy_type,
843 kDefaultSearchPolicyMap[i].value_type,
844 kDefaultSearchPolicyMap[i].preference_path));
845 }
846 }
847 }
848
849 DefaultSearchPolicyHandler::~DefaultSearchPolicyHandler() {
850 STLDeleteElements(&handlers_);
851 }
852
853 bool DefaultSearchPolicyHandler::CheckPolicySettings(const PolicyMap* policies,
854 PolicyErrorMap* errors) {
855 if (!CheckIndividualPolicies(policies, errors))
856 return false;
857
858 if (DefaultSearchProviderIsDisabled(policies)) {
859 // Add an error for all specified default search policies except
860 // DefaultSearchProviderEnabled.
861 for (size_t i = 0; i < arraysize(kDefaultSearchPolicyMap); ++i) {
862 ConfigurationPolicyType policy_type =
863 kDefaultSearchPolicyMap[i].policy_type;
864 if (policy_type != kPolicyDefaultSearchProviderEnabled &&
865 HasDefaultSearchPolicy(policies, policy_type)) {
866 errors->AddError(policy_type, IDS_POLICY_DEFAULT_SEARCH_DISABLED);
867 }
868 }
869 return true;
870 }
871
872 const Value* search_url =
873 policies->Get(kPolicyDefaultSearchProviderSearchURL);
874 if (!search_url && AnyDefaultSearchPoliciesSpecified(policies)) {
875 errors->AddError(kPolicyDefaultSearchProviderSearchURL,
876 IDS_POLICY_NOT_SPECIFIED_ERROR);
877 return false;
878 }
879
880 if (search_url && !DefaultSearchURLIsValid(policies)) {
881 errors->AddError(kPolicyDefaultSearchProviderSearchURL,
882 IDS_POLICY_INVALID_SEARCH_URL_ERROR);
883 return false;
884 }
885 return true;
886 }
887
888 void DefaultSearchPolicyHandler::ApplyPolicySettings(const PolicyMap* policies,
889 PrefValueMap* prefs) {
890 if (DefaultSearchProviderIsDisabled(policies)) {
891 // If default search is disabled, the other fields are ignored.
892 prefs->SetString(prefs::kDefaultSearchProviderName, std::string());
893 prefs->SetString(prefs::kDefaultSearchProviderSearchURL, std::string());
894 prefs->SetString(prefs::kDefaultSearchProviderSuggestURL, std::string());
895 prefs->SetString(prefs::kDefaultSearchProviderIconURL, std::string());
896 prefs->SetString(prefs::kDefaultSearchProviderEncodings, std::string());
897 prefs->SetString(prefs::kDefaultSearchProviderKeyword, std::string());
898 prefs->SetString(prefs::kDefaultSearchProviderInstantURL, std::string());
899 return;
900 }
901
902 const Value* search_url =
903 policies->Get(kPolicyDefaultSearchProviderSearchURL);
904 // The search URL is required.
905 if (!search_url)
906 return;
907
908 // The other entries are optional. Just make sure that they are all
909 // specified via policy, so that the regular prefs aren't used.
910 if (DefaultSearchURLIsValid(policies)) {
911 PrefValueMap tmp_prefs;
Mattias Nissler (ping if slow) 2011/10/11 11:10:57 Since we don't bail out here, we can just fill in
Joao da Silva 2011/10/11 15:09:23 Done.
912 HandlerList::const_iterator handler = handlers_.begin();
913 for ( ; handler != handlers_.end(); ++handler)
914 (*handler)->ApplyPolicySettings(policies, &tmp_prefs);
915
916 EnsureStringPrefExists(&tmp_prefs, prefs::kDefaultSearchProviderSuggestURL);
917 EnsureStringPrefExists(&tmp_prefs, prefs::kDefaultSearchProviderIconURL);
918 EnsureStringPrefExists(&tmp_prefs, prefs::kDefaultSearchProviderEncodings);
919 EnsureStringPrefExists(&tmp_prefs, prefs::kDefaultSearchProviderKeyword);
920 EnsureStringPrefExists(&tmp_prefs, prefs::kDefaultSearchProviderInstantURL);
921
922 // For the name, default to the host if not specified.
923 std::string name;
924 if (!tmp_prefs.GetString(prefs::kDefaultSearchProviderName, &name) ||
925 name.empty()) {
926 std::string search_url_string;
927 if (search_url->GetAsString(&search_url_string)) {
928 tmp_prefs.SetString(prefs::kDefaultSearchProviderName,
929 GURL(search_url_string).host());
930 }
931 }
932
933 // And clear the IDs since these are not specified via policy.
934 tmp_prefs.SetString(prefs::kDefaultSearchProviderID, std::string());
935 tmp_prefs.SetString(prefs::kDefaultSearchProviderPrepopulateID,
936 std::string());
Mattias Nissler (ping if slow) 2011/10/11 11:10:57 indentation.
Joao da Silva 2011/10/11 15:09:23 Done.
937 prefs->MergeFrom(&tmp_prefs);
938 }
939 }
940
941 bool DefaultSearchPolicyHandler::CheckIndividualPolicies(
942 const PolicyMap* policies, PolicyErrorMap* errors) {
Mattias Nissler (ping if slow) 2011/10/11 11:10:57 break after comma.
Joao da Silva 2011/10/11 15:09:23 Done.
943 HandlerList::const_iterator handler = handlers_.begin();
944 for ( ; handler != handlers_.end(); ++handler) {
945 if (!(*handler)->CheckPolicySettings(policies, errors))
946 return false;
947 }
948 return true;
949 }
950
951 bool DefaultSearchPolicyHandler::HasDefaultSearchPolicy(
952 const PolicyMap* policies, ConfigurationPolicyType policy_type) {
Mattias Nissler (ping if slow) 2011/10/11 11:10:57 break after comma
Joao da Silva 2011/10/11 15:09:23 Done.
953 return policies->Get(policy_type) != NULL;
954 }
955
956 bool DefaultSearchPolicyHandler::AnyDefaultSearchPoliciesSpecified(
957 const PolicyMap* policies) {
958 for (size_t i = 0; i < arraysize(kDefaultSearchPolicyMap); ++i) {
959 if (policies->Get(kDefaultSearchPolicyMap[i].policy_type))
960 return true;
961 }
962 return false;
963 }
964
965 bool DefaultSearchPolicyHandler::DefaultSearchProviderIsDisabled(
966 const PolicyMap* policies) {
967 const Value* provider_enabled =
968 policies->Get(kPolicyDefaultSearchProviderEnabled);
969 bool enabled = true;
970 return provider_enabled &&
971 provider_enabled->GetAsBoolean(&enabled) &&
972 !enabled;
973 }
974
975 bool DefaultSearchPolicyHandler::DefaultSearchURLIsValid(
976 const PolicyMap* policies) {
977 const Value* search_url =
978 policies->Get(kPolicyDefaultSearchProviderSearchURL);
979 if (!search_url)
980 return false;
981
982 std::string search_url_string;
983 if (search_url->GetAsString(&search_url_string)) {
984 SearchTermsDataForValidation search_terms_data;
985 const TemplateURLRef search_url_ref(search_url_string, 0, 0);
986 // It must support replacement (which implies it is valid).
987 return search_url_ref.SupportsReplacementUsingTermsData(search_terms_data);
988 }
989 return false;
990 }
991
992 void DefaultSearchPolicyHandler::EnsureStringPrefExists(
993 PrefValueMap* prefs, const std::string& path) {
Mattias Nissler (ping if slow) 2011/10/11 11:10:57 break after comma
Joao da Silva 2011/10/11 15:09:23 Done.
994 std::string value;
995 if (!prefs->GetString(path, &value))
996 prefs->SetString(path, value);
997 }
998
999
1000 // ProxyPolicyHandler implementation -------------------------------------------
1001
1002
1003 ProxyPolicyHandler::ProxyPolicyHandler() {
1004 }
1005
1006 ProxyPolicyHandler::~ProxyPolicyHandler() {
1007 }
1008
1009 bool ProxyPolicyHandler::CheckPolicySettings(const PolicyMap* policies,
1010 PolicyErrorMap* errors) {
1011 const Value* mode = GetProxyPolicyValue(policies, kPolicyProxyMode);
1012 const Value* server = GetProxyPolicyValue(policies, kPolicyProxyServer);
1013 const Value* server_mode =
1014 GetProxyPolicyValue(policies, kPolicyProxyServerMode);
1015 const Value* pac_url = GetProxyPolicyValue(policies, kPolicyProxyPacUrl);
1016 const Value* bypass_list =
1017 GetProxyPolicyValue(policies, kPolicyProxyBypassList);
1018
1019 if ((server || pac_url || bypass_list) && !(mode || server_mode)) {
1020 errors->AddError(kPolicyProxyMode,
1021 IDS_POLICY_NOT_SPECIFIED_ERROR);
1022 return false;
1023 }
1024
1025 std::string mode_value;
1026 if (!CheckProxyModeAndServerMode(policies, errors, &mode_value))
1027 return false;
1028
1029 // If neither ProxyMode nor ProxyServerMode are specified, mode_value will be
1030 // empty and the proxy shouldn't be configured at all.
Mattias Nissler (ping if slow) 2011/10/11 11:10:57 Maybe we should check other proxy policies and add
Joao da Silva 2011/10/11 15:09:23 Line 1019 above checks and reports that.
Mattias Nissler (ping if slow) 2011/10/12 17:10:00 I see.
1031 if (mode_value.empty())
1032 return true;
1033
1034 bool is_valid_mode = false;
1035 for (size_t i = 0; i != arraysize(kProxyModeValidationMap); ++i) {
1036 const ProxyModeValidationEntry& entry = kProxyModeValidationMap[i];
1037 if (entry.mode_value != mode_value)
1038 continue;
1039
1040 is_valid_mode = true;
1041
1042 if (!entry.pac_url_allowed && pac_url)
1043 errors->AddError(kPolicyProxyPacUrl, entry.error_message_id);
1044 if (!entry.bypass_list_allowed && bypass_list)
1045 errors->AddError(kPolicyProxyPacUrl, entry.error_message_id);
1046 if (!entry.server_allowed && server)
1047 errors->AddError(kPolicyProxyPacUrl, entry.error_message_id);
1048
1049 if ((!entry.pac_url_allowed && pac_url) ||
1050 (!entry.bypass_list_allowed && bypass_list) ||
1051 (!entry.server_allowed && server)) {
1052 return false;
1053 }
1054 }
1055
1056 if (!is_valid_mode) {
1057 errors->AddError(mode ? kPolicyProxyMode : kPolicyProxyServerMode,
1058 IDS_POLICY_OUT_OF_RANGE_ERROR, mode_value);
1059 return false;
1060 }
1061 return true;
1062 }
1063
1064 void ProxyPolicyHandler::ApplyPolicySettings(const PolicyMap* policies,
1065 PrefValueMap* prefs) {
1066 const Value* mode = GetProxyPolicyValue(policies, kPolicyProxyMode);
1067 const Value* server = GetProxyPolicyValue(policies, kPolicyProxyServer);
1068 const Value* server_mode =
1069 GetProxyPolicyValue(policies, kPolicyProxyServerMode);
1070 const Value* pac_url = GetProxyPolicyValue(policies, kPolicyProxyPacUrl);
1071 const Value* bypass_list =
1072 GetProxyPolicyValue(policies, kPolicyProxyBypassList);
1073
1074 ProxyPrefs::ProxyMode proxy_mode;
1075 if (mode) {
1076 std::string string_mode;
1077 CHECK(mode->GetAsString(&string_mode));
1078 CHECK(ProxyPrefs::StringToProxyMode(string_mode, &proxy_mode));
1079 } else if (server_mode) {
1080 int int_mode = 0;
1081 CHECK(server_mode->GetAsInteger(&int_mode));
1082
1083 switch (int_mode) {
1084 case kPolicyNoProxyServerMode:
1085 proxy_mode = ProxyPrefs::MODE_DIRECT;
1086 break;
1087 case kPolicyAutoDetectProxyServerMode:
1088 proxy_mode = ProxyPrefs::MODE_AUTO_DETECT;
1089 break;
1090 case kPolicyManuallyConfiguredProxyServerMode:
1091 proxy_mode = ProxyPrefs::MODE_FIXED_SERVERS;
1092 if (pac_url)
1093 proxy_mode = ProxyPrefs::MODE_PAC_SCRIPT;
1094 break;
1095 case kPolicyUseSystemProxyServerMode:
1096 proxy_mode = ProxyPrefs::MODE_SYSTEM;
1097 break;
1098 default:
1099 proxy_mode = ProxyPrefs::MODE_DIRECT;
1100 NOTREACHED();
1101 }
1102 } else {
1103 return;
1104 }
1105
1106 switch (proxy_mode) {
1107 case ProxyPrefs::MODE_DIRECT:
1108 prefs->SetValue(prefs::kProxy, ProxyConfigDictionary::CreateDirect());
1109 break;
1110 case ProxyPrefs::MODE_AUTO_DETECT:
1111 prefs->SetValue(prefs::kProxy, ProxyConfigDictionary::CreateAutoDetect());
1112 break;
1113 case ProxyPrefs::MODE_PAC_SCRIPT: {
1114 std::string pac_url_string;
1115 if (pac_url->GetAsString(&pac_url_string)) {
1116 prefs->SetValue(prefs::kProxy,
1117 ProxyConfigDictionary::CreatePacScript(pac_url_string, false));
1118 } else {
1119 NOTREACHED();
1120 }
1121 break;
1122 }
1123 case ProxyPrefs::MODE_FIXED_SERVERS: {
1124 std::string proxy_server;
1125 std::string bypass_list_string;
1126 if (server->GetAsString(&proxy_server)) {
1127 if (bypass_list)
1128 bypass_list->GetAsString(&bypass_list_string);
1129 prefs->SetValue(prefs::kProxy,
1130 ProxyConfigDictionary::CreateFixedServers(
1131 proxy_server, bypass_list_string));
1132 }
1133 break;
1134 }
1135 case ProxyPrefs::MODE_SYSTEM:
1136 prefs->SetValue(prefs::kProxy,
1137 ProxyConfigDictionary::CreateSystem());
1138 break;
1139 case ProxyPrefs::kModeCount:
1140 NOTREACHED();
1141 }
1142 }
1143
1144 const Value* ProxyPolicyHandler::GetProxyPolicyValue(
1145 const PolicyMap* policies, ConfigurationPolicyType policy) {
1146 const Value* value = policies->Get(policy);
1147 std::string tmp;
1148 if (!value ||
1149 value->IsType(Value::TYPE_NULL) ||
1150 (value->IsType(Value::TYPE_STRING) &&
1151 value->GetAsString(&tmp) &&
1152 tmp.empty())) {
1153 return NULL;
1154 }
1155 return value;
1156 }
1157
1158 bool ProxyPolicyHandler::CheckProxyModeAndServerMode(const PolicyMap* policies,
1159 PolicyErrorMap* errors,
1160 std::string* mode_value) {
1161 const Value* mode = GetProxyPolicyValue(policies, kPolicyProxyMode);
1162 const Value* server = GetProxyPolicyValue(policies, kPolicyProxyServer);
1163 const Value* server_mode =
1164 GetProxyPolicyValue(policies, kPolicyProxyServerMode);
1165 const Value* pac_url = GetProxyPolicyValue(policies, kPolicyProxyPacUrl);
1166
1167 // If there's a server mode, convert it into a mode.
1168 // When both are specified, the mode takes precedence.
1169 if (mode) {
1170 if (server_mode) {
1171 errors->AddError(kPolicyProxyServerMode,
1172 IDS_POLICY_PROXY_SERVER_MODE_IGNORED);
1173 }
1174 if (!mode->GetAsString(mode_value)) {
1175 errors->AddError(kPolicyProxyMode, IDS_POLICY_TYPE_ERROR,
1176 ValueTypeToString(Value::TYPE_BOOLEAN));
1177 return false;
1178 }
1179
1180 ProxyPrefs::ProxyMode mode;
1181 if (!ProxyPrefs::StringToProxyMode(*mode_value, &mode)) {
1182 errors->AddError(kPolicyProxyMode, IDS_POLICY_INVALID_PROXY_MODE_ERROR);
1183 return false;
1184 }
1185
1186 if (mode == ProxyPrefs::MODE_PAC_SCRIPT && !pac_url) {
1187 errors->AddError(kPolicyProxyPacUrl, IDS_POLICY_NOT_SPECIFIED_ERROR);
1188 return false;
1189 } else if (mode == ProxyPrefs::MODE_FIXED_SERVERS && !server) {
1190 errors->AddError(kPolicyProxyServer, IDS_POLICY_NOT_SPECIFIED_ERROR);
1191 return false;
1192 }
1193 } else if (server_mode) {
1194 int server_mode_value;
1195 if (!server_mode->GetAsInteger(&server_mode_value)) {
1196 errors->AddError(kPolicyProxyServerMode, IDS_POLICY_TYPE_ERROR,
1197 ValueTypeToString(Value::TYPE_INTEGER));
1198 return false;
1199 }
1200
1201 switch (server_mode_value) {
1202 case kPolicyNoProxyServerMode:
1203 *mode_value = ProxyPrefs::kDirectProxyModeName;
1204 break;
1205 case kPolicyAutoDetectProxyServerMode:
1206 *mode_value = ProxyPrefs::kAutoDetectProxyModeName;
1207 break;
1208 case kPolicyManuallyConfiguredProxyServerMode:
1209 if (server && pac_url) {
1210 int message_id = IDS_POLICY_PROXY_BOTH_SPECIFIED_ERROR;
1211 errors->AddError(kPolicyProxyServer, message_id);
1212 errors->AddError(kPolicyProxyPacUrl, message_id);
1213 return false;
1214 }
1215 if (!server && !pac_url) {
1216 int message_id = IDS_POLICY_PROXY_NEITHER_SPECIFIED_ERROR;
1217 errors->AddError(kPolicyProxyServer, message_id);
1218 errors->AddError(kPolicyProxyPacUrl, message_id);
1219 return false;
1220 }
1221 if (pac_url)
1222 *mode_value = ProxyPrefs::kPacScriptProxyModeName;
1223 else
1224 *mode_value = ProxyPrefs::kFixedServersProxyModeName;
1225 break;
1226 case kPolicyUseSystemProxyServerMode:
1227 *mode_value = ProxyPrefs::kSystemProxyModeName;
1228 break;
1229 default:
1230 errors->AddError(kPolicyProxyServerMode, IDS_POLICY_OUT_OF_RANGE_ERROR,
1231 base::IntToString(server_mode_value));
1232 return false;
1233 }
1234 }
1235 return true;
1236 }
1237
1238
1239 } // namespace
1240
1241
1242 // ConfigurationPolicyHandler implementation -----------------------------------
1243
1244
1245 // static
1246 ConfigurationPolicyHandler::HandlerList*
1247 ConfigurationPolicyHandler::CreateHandlerList() {
1248 HandlerList* list = new HandlerList;
1249
1250 for (size_t i = 0; i < arraysize(kSimplePolicyMap); ++i) {
1251 list->push_back(
1252 new SimplePolicyHandler(kSimplePolicyMap[i].policy_type,
1253 kSimplePolicyMap[i].value_type,
1254 kSimplePolicyMap[i].preference_path));
1255 }
1256 list->push_back(new SyncPolicyHandler());
1257 list->push_back(new AutofillPolicyHandler());
1258
1259 #if !defined(OS_CHROMEOS)
1260 list->push_back(new DownloadDirPolicyHandler());
1261 #endif // !defined(OS_CHROME0S)
1262
1263 list->push_back(new DiskCacheDirPolicyHandler());
1264 list->push_back(new FileSelectionDialogsHandler());
1265 list->push_back(new ProxyPolicyHandler());
1266 list->push_back(new IncognitoModePolicyHandler());
1267 list->push_back(new DefaultSearchPolicyHandler());
1268
1269 return list;
1270 }
1271
1272 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698