Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 "base/file_path.h" | |
| 8 #include "base/logging.h" | |
| 9 #include "base/stl_util.h" | |
| 10 #include "base/string16.h" | |
| 11 #include "base/utf_string_conversions.h" | |
| 12 #include "chrome/browser/download/download_util.h" | |
| 13 #include "chrome/browser/policy/configuration_policy_handler_list.h" | |
| 14 #include "chrome/browser/policy/configuration_policy_pref_store.h" | |
| 15 #include "chrome/browser/policy/configuration_policy_reader.h" | |
| 16 #include "chrome/browser/policy/policy_path_parser.h" | |
| 17 #include "chrome/browser/prefs/proxy_config_dictionary.h" | |
| 18 #include "chrome/browser/prefs/proxy_prefs.h" | |
| 19 #include "chrome/browser/search_engines/search_terms_data.h" | |
| 20 #include "chrome/browser/search_engines/template_url.h" | |
| 21 #include "chrome/common/pref_names.h" | |
| 22 #include "grit/generated_resources.h" | |
| 23 | |
| 24 namespace policy { | |
| 25 | |
| 26 // TypeCheckingPolicyHandler | |
| 27 TypeCheckingPolicyHandler::TypeCheckingPolicyHandler( | |
| 28 ConfigurationPolicyType policy, | |
| 29 Value::Type value_type) | |
| 30 : policy_type_(policy), | |
| 31 value_type_(value_type) { | |
| 32 } | |
| 33 | |
| 34 TypeCheckingPolicyHandler::~TypeCheckingPolicyHandler() { | |
| 35 } | |
| 36 | |
| 37 ConfigurationPolicyType TypeCheckingPolicyHandler::policy_type() const { | |
| 38 return policy_type_; | |
| 39 } | |
| 40 | |
| 41 bool TypeCheckingPolicyHandler::CheckPolicySettings(const PolicyMap* policies, | |
| 42 PolicyErrorMap* errors) { | |
| 43 const Value* value = policies->Get(policy_type_); | |
| 44 if (value && value_type_ != value->GetType()) { | |
| 45 errors->AddError(policy_type_, | |
| 46 IDS_POLICY_TYPE_ERROR, ValueTypeToString(value_type_)); | |
| 47 return false; | |
| 48 } | |
| 49 return true; | |
| 50 } | |
| 51 | |
| 52 void TypeCheckingPolicyHandler::ApplyPolicySettings(const PolicyMap* policies, | |
| 53 PrefValueMap* prefs) { | |
| 54 PolicyErrorMap errors; | |
| 55 const Value* value = policies->Get(policy_type()); | |
| 56 if (value) { | |
| 57 if (CheckPolicySettings(policies, &errors)) { | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
so you now have the Check-and-report-errors-before
| |
| 58 ApplyPolicyValue(prefs, value); | |
| 59 } else { | |
| 60 LOG(WARNING) << "Policy: Mismatch in provided and expected policy value " | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
Why not just GenerateLogMessages(&errors)
simo
2011/09/29 09:33:08
Because the message in |errors| doesn't contain th
Mattias Nissler (ping if slow)
2011/09/30 09:01:33
I'm all for GenerateLogMessages then :)
| |
| 61 << "for " << PolicyStatus::GetPolicyName(policy_type_) | |
| 62 << ". expected = " << value_type_ << ", actual = " | |
| 63 << value->GetType(); | |
| 64 } | |
| 65 } | |
| 66 } | |
| 67 | |
| 68 std::string TypeCheckingPolicyHandler::ValueTypeToString(Value::Type type) { | |
| 69 static const char* strings[] = { "null", | |
| 70 "boolean", | |
| 71 "integer", | |
| 72 "double", | |
| 73 "string", | |
| 74 "binary", | |
| 75 "dictionary", | |
| 76 "list" }; | |
| 77 DCHECK(static_cast<size_t>(type) < arraysize(strings)); | |
| 78 return std::string(strings[type]); | |
| 79 } | |
| 80 | |
| 81 // SimplePolicyHandler | |
| 82 SimplePolicyHandler::SimplePolicyHandler( | |
| 83 ConfigurationPolicyType policy, | |
| 84 Value::Type value_type, | |
| 85 const char* pref_path) | |
| 86 : TypeCheckingPolicyHandler(policy, value_type), | |
| 87 pref_path_(pref_path) { | |
| 88 } | |
| 89 | |
| 90 SimplePolicyHandler::~SimplePolicyHandler() { | |
| 91 } | |
| 92 | |
| 93 void SimplePolicyHandler::ApplyPolicyValue(PrefValueMap* prefs, | |
| 94 const Value* value) { | |
| 95 prefs->SetValue(pref_path_, value->DeepCopy()); | |
| 96 } | |
| 97 | |
| 98 // SyncPolicyHandler | |
| 99 SyncPolicyHandler::SyncPolicyHandler() | |
| 100 : TypeCheckingPolicyHandler(kPolicySyncDisabled, | |
| 101 Value::TYPE_BOOLEAN) { | |
| 102 } | |
| 103 | |
| 104 SyncPolicyHandler::~SyncPolicyHandler() { | |
| 105 } | |
| 106 | |
| 107 void SyncPolicyHandler::ApplyPolicyValue(PrefValueMap* prefs, | |
| 108 const Value* value) { | |
| 109 bool disable_sync; | |
| 110 DCHECK(value->GetAsBoolean(&disable_sync)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
DCHECK compiles to nothing in release builds, so y
simo
2011/09/29 09:33:08
Done.
| |
| 111 if (disable_sync) | |
| 112 prefs->SetValue(prefs::kSyncManaged, value->DeepCopy()); | |
| 113 } | |
| 114 | |
| 115 // AutofillPolicyHandler | |
| 116 AutofillPolicyHandler::AutofillPolicyHandler() | |
| 117 : TypeCheckingPolicyHandler(kPolicyAutoFillEnabled, | |
| 118 Value::TYPE_BOOLEAN) { | |
| 119 } | |
| 120 | |
| 121 AutofillPolicyHandler::~AutofillPolicyHandler() { | |
| 122 } | |
| 123 | |
| 124 void AutofillPolicyHandler::ApplyPolicyValue(PrefValueMap* prefs, | |
| 125 const Value* value) { | |
| 126 bool auto_fill_enabled; | |
| 127 DCHECK(value->GetAsBoolean(&auto_fill_enabled)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
same as above
simo
2011/09/29 09:33:08
Done.
| |
| 128 if (!auto_fill_enabled) { | |
| 129 prefs->SetValue(prefs::kAutofillEnabled, | |
| 130 Value::CreateBooleanValue(false)); | |
| 131 } | |
| 132 } | |
| 133 | |
| 134 // DownloadDirPolicyHandler | |
| 135 DownloadDirPolicyHandler::DownloadDirPolicyHandler() | |
| 136 : TypeCheckingPolicyHandler(kPolicyDownloadDirectory, | |
| 137 Value::TYPE_STRING) { | |
| 138 } | |
| 139 | |
| 140 DownloadDirPolicyHandler::~DownloadDirPolicyHandler() { | |
| 141 } | |
| 142 | |
| 143 bool DownloadDirPolicyHandler::CheckPolicySettings(const PolicyMap* policies, | |
| 144 PolicyErrorMap* errors) { | |
| 145 // This policy is ignored on ChromeOS because the download path there is fixed | |
| 146 // and can not be configured by the user. | |
| 147 #if !defined(OS_CHROMEOS) | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
It seems like this handler is only useful if we're
simo
2011/09/29 09:33:08
Done.
| |
| 148 return TypeCheckingPolicyHandler::CheckPolicySettings(policies, errors); | |
| 149 #endif // defined(OS_CHROMEOS) | |
| 150 return true; | |
| 151 } | |
| 152 | |
| 153 void DownloadDirPolicyHandler::ApplyPolicyValue(PrefValueMap* prefs, | |
| 154 const Value* value) { | |
| 155 #if !defined(OS_CHROMEOS) | |
| 156 FilePath::StringType string_value; | |
| 157 DCHECK(value->GetAsString(&string_value)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
ditto
simo
2011/09/29 09:33:08
Done.
| |
| 158 FilePath::StringType expanded_value = | |
| 159 policy::path_parser::ExpandPathVariables(string_value); | |
| 160 // Leaving the policy empty would revert to the default download location | |
| 161 // else we would point in an undefined location. We do this after the | |
| 162 // path expansion because it might lead to an empty string(e.g. for "\"\""). | |
| 163 if (expanded_value.empty()) | |
| 164 expanded_value = download_util::GetDefaultDownloadDirectory().value(); | |
| 165 prefs->SetValue(prefs::kDownloadDefaultDirectory, | |
| 166 Value::CreateStringValue(expanded_value)); | |
| 167 prefs->SetValue(prefs::kPromptForDownload, | |
| 168 Value::CreateBooleanValue(false)); | |
| 169 #endif // !defined(OS_CHROMEOS) | |
| 170 } | |
| 171 | |
| 172 // DiskCacheDirPolicyHandler | |
| 173 DiskCacheDirPolicyHandler::DiskCacheDirPolicyHandler() | |
| 174 : TypeCheckingPolicyHandler(kPolicyDiskCacheDir, | |
| 175 Value::TYPE_STRING) { | |
| 176 } | |
| 177 | |
| 178 DiskCacheDirPolicyHandler::~DiskCacheDirPolicyHandler() { | |
| 179 } | |
| 180 | |
| 181 void DiskCacheDirPolicyHandler::ApplyPolicyValue(PrefValueMap* prefs, | |
| 182 const Value* value) { | |
| 183 FilePath::StringType string_value; | |
| 184 DCHECK(value->GetAsString(&string_value)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
ditto
simo
2011/09/29 09:33:08
Done.
| |
| 185 FilePath::StringType expanded_value = | |
| 186 policy::path_parser::ExpandPathVariables(string_value); | |
| 187 prefs->SetValue(prefs::kDiskCacheDir, | |
| 188 Value::CreateStringValue(expanded_value)); | |
| 189 } | |
| 190 | |
| 191 // FileSelectionDialogsHandler | |
| 192 FileSelectionDialogsHandler::FileSelectionDialogsHandler() | |
| 193 : TypeCheckingPolicyHandler(kPolicyAllowFileSelectionDialogs, | |
| 194 Value::TYPE_BOOLEAN) { | |
| 195 } | |
| 196 | |
| 197 FileSelectionDialogsHandler::~FileSelectionDialogsHandler() { | |
| 198 } | |
| 199 | |
| 200 void FileSelectionDialogsHandler::ApplyPolicyValue(PrefValueMap* prefs, | |
| 201 const Value* value) { | |
| 202 prefs->SetValue(prefs::kAllowFileSelectionDialogs, value->DeepCopy()); | |
| 203 // If file-selection dialogs are not allowed we forbid the user to be | |
| 204 // prompted for the download location, since this would end up in an Infobar | |
| 205 // explaining that file-selection dialogs are forbidden anyways. | |
| 206 bool allow_file_selection_dialogs = true; | |
| 207 DCHECK(value->GetAsBoolean(&allow_file_selection_dialogs)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
ditto
simo
2011/09/29 09:33:08
Done.
| |
| 208 if (!allow_file_selection_dialogs) { | |
| 209 prefs->SetValue(prefs::kPromptForDownload, | |
| 210 Value::CreateBooleanValue(false)); | |
| 211 } | |
| 212 } | |
| 213 | |
| 214 // BookmarksPolicyHandler | |
| 215 BookmarksPolicyHandler::BookmarksPolicyHandler() | |
| 216 : TypeCheckingPolicyHandler(kPolicyBookmarkBarEnabled, | |
| 217 Value::TYPE_BOOLEAN) { | |
| 218 } | |
| 219 | |
| 220 BookmarksPolicyHandler::~BookmarksPolicyHandler() { | |
| 221 } | |
| 222 | |
| 223 void BookmarksPolicyHandler::ApplyPolicyValue(PrefValueMap* prefs, | |
| 224 const Value* value) { | |
| 225 prefs->SetValue(prefs::kEnableBookmarkBar, value->DeepCopy()); | |
| 226 // kShowBookmarkBar is not managed directly by a policy, but when | |
| 227 // kEnableBookmarkBar is managed, kShowBookmarkBar should be false so that | |
| 228 // the bookmarks bar either is completely disabled or only shows on the NTP. | |
| 229 // This also disables the checkbox for this preference in the prefs UI. | |
| 230 prefs->SetValue(prefs::kShowBookmarkBar, Value::CreateBooleanValue(false)); | |
| 231 } | |
| 232 | |
| 233 namespace { | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
anonymous namespace should go to the top of the fi
simo
2011/09/29 09:33:08
Done.
| |
| 234 | |
| 235 void GenerateLogMessages(PolicyErrorMap* errors) { | |
| 236 for (PolicyErrorMap::const_iterator it = errors->begin(); | |
| 237 it != errors->end(); ++it) { | |
| 238 string16 policy = PolicyStatus::GetPolicyName(it->first); | |
| 239 LOG(WARNING) << ASCIIToUTF16("Policy (") + policy + ASCIIToUTF16("): ") | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
no need to convert to UTF16
simo
2011/09/29 09:33:08
I can't get it to compile if I don't because |poli
| |
| 240 + it->second; | |
| 241 } | |
| 242 } | |
| 243 | |
| 244 const PolicyToPreferenceMapEntry kDefaultSearchPolicyMap[] = { | |
| 245 { Value::TYPE_BOOLEAN, kPolicyDefaultSearchProviderEnabled, | |
| 246 prefs::kDefaultSearchProviderEnabled }, | |
| 247 { Value::TYPE_STRING, kPolicyDefaultSearchProviderName, | |
| 248 prefs::kDefaultSearchProviderName }, | |
| 249 { Value::TYPE_STRING, kPolicyDefaultSearchProviderKeyword, | |
| 250 prefs::kDefaultSearchProviderKeyword }, | |
| 251 { Value::TYPE_STRING, kPolicyDefaultSearchProviderSearchURL, | |
| 252 prefs::kDefaultSearchProviderSearchURL }, | |
| 253 { Value::TYPE_STRING, kPolicyDefaultSearchProviderSuggestURL, | |
| 254 prefs::kDefaultSearchProviderSuggestURL }, | |
| 255 { Value::TYPE_STRING, kPolicyDefaultSearchProviderInstantURL, | |
| 256 prefs::kDefaultSearchProviderInstantURL }, | |
| 257 { Value::TYPE_STRING, kPolicyDefaultSearchProviderIconURL, | |
| 258 prefs::kDefaultSearchProviderIconURL }, | |
| 259 { Value::TYPE_LIST, kPolicyDefaultSearchProviderEncodings, | |
| 260 prefs::kDefaultSearchProviderEncodings }, | |
| 261 }; | |
| 262 | |
| 263 // Implementation of SearchTermsData just for validation. | |
| 264 class SearchTermsDataForValidation : public SearchTermsData { | |
| 265 public: | |
| 266 SearchTermsDataForValidation() {} | |
| 267 | |
| 268 // Implementation of SearchTermsData. | |
| 269 virtual std::string GoogleBaseURLValue() const { | |
| 270 return "http://www.google.com/"; | |
| 271 } | |
| 272 virtual std::string GetApplicationLocale() const { | |
| 273 return "en"; | |
| 274 } | |
| 275 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) | |
| 276 virtual string16 GetRlzParameterValue() const { | |
| 277 return string16(); | |
| 278 } | |
| 279 #endif | |
| 280 private: | |
| 281 DISALLOW_COPY_AND_ASSIGN(SearchTermsDataForValidation); | |
| 282 }; | |
| 283 | |
| 284 } // namespace | |
| 285 | |
| 286 // IncognitoModePolicyHandler | |
| 287 IncognitoModePolicyHandler::IncognitoModePolicyHandler() { | |
| 288 } | |
| 289 | |
| 290 IncognitoModePolicyHandler::~IncognitoModePolicyHandler() { | |
| 291 } | |
| 292 | |
| 293 bool IncognitoModePolicyHandler::CheckPolicySettings(const PolicyMap* policies, | |
| 294 PolicyErrorMap* errors) { | |
| 295 int int_value = IncognitoModePrefs::ENABLED; | |
| 296 std::string message; | |
| 297 const Value* availability = policies->Get(kPolicyIncognitoModeAvailability); | |
| 298 if (availability) { | |
| 299 if (availability->GetAsInteger(&int_value)) { | |
| 300 IncognitoModePrefs::Availability availability_enum_value; | |
| 301 if (!IncognitoModePrefs::IntToAvailability(int_value, | |
| 302 &availability_enum_value)) { | |
| 303 std::string string_value; | |
| 304 std::stringstream out; | |
| 305 out << int_value; | |
| 306 string_value = out.str(); | |
| 307 errors->AddError(kPolicyIncognitoModeAvailability, | |
| 308 IDS_POLICY_OUT_OF_RANGE_ERROR, "" + int_value); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
Wow. I guess you're not aware of base/string_numbe
simo
2011/09/29 09:33:08
No I guess I wasn't.
| |
| 309 return false; | |
| 310 } | |
| 311 } else { | |
| 312 errors->AddError(kPolicyIncognitoModeAvailability, | |
| 313 IDS_POLICY_PARSE_ERROR); | |
| 314 return false; | |
| 315 } | |
| 316 } else { | |
| 317 const Value* deprecated_enabled = policies->Get(kPolicyIncognitoEnabled); | |
| 318 // If kPolicyIncognitoModeAvailability is not specified, check the obsolete | |
| 319 // kPolicyIncognitoEnabled. | |
| 320 if (deprecated_enabled && | |
| 321 !deprecated_enabled->IsType(Value::TYPE_BOOLEAN)) { | |
| 322 errors->AddError(kPolicyIncognitoEnabled, IDS_POLICY_PARSE_ERROR); | |
| 323 return false; | |
| 324 } | |
| 325 } | |
| 326 return true; | |
| 327 } | |
| 328 | |
| 329 void IncognitoModePolicyHandler::ApplyPolicySettings(const PolicyMap* policies, | |
| 330 PrefValueMap* prefs) { | |
| 331 PolicyErrorMap errors; | |
| 332 const Value* availability = policies->Get(kPolicyIncognitoModeAvailability); | |
| 333 const Value* deprecated_enabled = policies->Get(kPolicyIncognitoEnabled); | |
| 334 if (CheckPolicySettings(policies, &errors)) { | |
| 335 if (availability) { | |
| 336 int int_value = IncognitoModePrefs::ENABLED; | |
| 337 IncognitoModePrefs::Availability availability_enum_value; | |
| 338 DCHECK(availability->GetAsInteger(&int_value)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
DCHECK compiles away
simo
2011/09/29 09:33:08
Done.
| |
| 339 DCHECK(IncognitoModePrefs::IntToAvailability(int_value, | |
| 340 &availability_enum_value)); | |
| 341 prefs->SetValue(prefs::kIncognitoModeAvailability, | |
| 342 Value::CreateIntegerValue(availability_enum_value)); | |
| 343 } else if (deprecated_enabled) { | |
| 344 bool enabled = true; | |
| 345 DCHECK(deprecated_enabled->GetAsBoolean(&enabled)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
ditto
simo
2011/09/29 09:33:08
Done.
| |
| 346 prefs->SetInteger(prefs::kIncognitoModeAvailability, | |
| 347 enabled ? IncognitoModePrefs::ENABLED : | |
| 348 IncognitoModePrefs::DISABLED); | |
| 349 } | |
| 350 } else { | |
| 351 GenerateLogMessages(&errors); | |
| 352 } | |
| 353 } | |
| 354 | |
| 355 // DefaultSearchEncodingsPolicyHandler | |
| 356 DefaultSearchEncodingsPolicyHandler::DefaultSearchEncodingsPolicyHandler() | |
| 357 : TypeCheckingPolicyHandler(kPolicyDefaultSearchProviderEncodings, | |
| 358 Value::TYPE_LIST) { | |
| 359 } | |
| 360 | |
| 361 DefaultSearchEncodingsPolicyHandler::~DefaultSearchEncodingsPolicyHandler() { | |
| 362 } | |
| 363 | |
| 364 void DefaultSearchEncodingsPolicyHandler::ApplyPolicyValue( | |
| 365 PrefValueMap* prefs, const Value* value) { | |
| 366 const ListValue* list; | |
| 367 DCHECK(value->GetAsList(&list)); | |
| 368 ListValue::const_iterator iter(list->begin()); | |
| 369 ListValue::const_iterator end(list->end()); | |
| 370 std::string encodings; | |
| 371 for (; iter != end; ++iter) { | |
| 372 std::string s; | |
| 373 if ((*iter)->GetAsString(&s)) { | |
| 374 if (!encodings.empty()) | |
| 375 encodings.push_back(';'); | |
| 376 encodings.append(s); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
base/string_util.h JoinString()?
simo
2011/09/29 09:33:08
Done.
| |
| 377 } else { | |
| 378 NOTREACHED(); | |
| 379 } | |
| 380 } | |
| 381 prefs->SetValue(prefs::kDefaultSearchProviderEncodings, | |
| 382 Value::CreateStringValue(encodings)); | |
| 383 } | |
| 384 | |
| 385 // DefaultSearchPolicyHandler | |
| 386 DefaultSearchPolicyHandler::DefaultSearchPolicyHandler() { | |
| 387 for (unsigned int current = 0; | |
| 388 current < arraysize(kDefaultSearchPolicyMap); ++current) { | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
identation
simo
2011/09/29 09:33:08
Done.
| |
| 389 ConfigurationPolicyType policy_type = | |
| 390 kDefaultSearchPolicyMap[current].policy_type; | |
| 391 if (policy_type != kPolicyDefaultSearchProviderEncodings) { | |
| 392 handlers_.push_back(new SimplePolicyHandler( | |
| 393 policy_type, | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
indentation
simo
2011/09/29 09:33:08
Done.
| |
| 394 kDefaultSearchPolicyMap[current].value_type, | |
| 395 kDefaultSearchPolicyMap[current].preference_path)); | |
| 396 } else { | |
| 397 handlers_.push_back(new DefaultSearchEncodingsPolicyHandler()); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
if you need to special-case this anyway, why not j
simo
2011/09/29 09:33:08
Because I need it to be in the map in other method
| |
| 398 } | |
| 399 } | |
| 400 } | |
| 401 | |
| 402 DefaultSearchPolicyHandler::~DefaultSearchPolicyHandler() { | |
| 403 STLDeleteContainerPointers(handlers_.begin(), handlers_.end()); | |
| 404 handlers_.clear(); | |
| 405 } | |
| 406 | |
| 407 bool DefaultSearchPolicyHandler::CheckPolicySettings(const PolicyMap* policies, | |
| 408 PolicyErrorMap* errors) { | |
| 409 if (!CheckIndividualPolicies(policies, errors)) | |
| 410 return false; | |
| 411 | |
| 412 if (DefaultSearchProviderIsDisabled(policies)) { | |
| 413 int message_id = IDS_POLICY_DEFAULT_SEARCH_DISABLED; | |
| 414 errors->AddError(kPolicyDefaultSearchProviderName, message_id); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
Is it OK to add errors about these policy settings
simo
2011/09/29 09:33:08
Ah I didn't notice that. I don't think it is!
| |
| 415 errors->AddError(kPolicyDefaultSearchProviderSearchURL, message_id); | |
| 416 errors->AddError(kPolicyDefaultSearchProviderSuggestURL, message_id); | |
| 417 errors->AddError(kPolicyDefaultSearchProviderIconURL, message_id); | |
| 418 errors->AddError(kPolicyDefaultSearchProviderEncodings, message_id); | |
| 419 errors->AddError(kPolicyDefaultSearchProviderKeyword, message_id); | |
| 420 errors->AddError(kPolicyDefaultSearchProviderInstantURL, message_id); | |
| 421 return false; | |
| 422 } | |
| 423 | |
| 424 const Value* search_url = | |
| 425 policies->Get(kPolicyDefaultSearchProviderSearchURL); | |
| 426 if (!search_url) { | |
| 427 errors->AddError(kPolicyDefaultSearchProviderSearchURL, | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
Am I missing something or are we adding this error
simo
2011/09/29 09:33:08
Oh right, I should check whether any other default
| |
| 428 IDS_POLICY_NOT_SPECIFIED_ERROR); | |
| 429 return false; | |
| 430 } | |
| 431 if (DefaultSearchURLIsPresentAndValid(policies)) { | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
We're adding an error if the URL is present and va
simo
2011/09/29 09:33:08
Oh, that was a mistake.
| |
| 432 errors->AddError(kPolicyDefaultSearchProviderSearchURL, | |
| 433 IDS_POLICY_INVALID_ERROR); | |
| 434 return false; | |
| 435 } | |
| 436 return true; | |
| 437 } | |
| 438 | |
| 439 void DefaultSearchPolicyHandler::ApplyPolicySettings(const PolicyMap* policies, | |
| 440 PrefValueMap* prefs) { | |
| 441 if (DefaultSearchProviderIsDisabled(policies)) { | |
| 442 // If default search is disabled, we ignore the other fields. | |
| 443 prefs->SetString(prefs::kDefaultSearchProviderName, std::string()); | |
| 444 prefs->SetString(prefs::kDefaultSearchProviderSearchURL, std::string()); | |
| 445 prefs->SetString(prefs::kDefaultSearchProviderSuggestURL, std::string()); | |
| 446 prefs->SetString(prefs::kDefaultSearchProviderIconURL, std::string()); | |
| 447 prefs->SetString(prefs::kDefaultSearchProviderEncodings, std::string()); | |
| 448 prefs->SetString(prefs::kDefaultSearchProviderKeyword, std::string()); | |
| 449 prefs->SetString(prefs::kDefaultSearchProviderInstantURL, std::string()); | |
| 450 return; | |
| 451 } | |
| 452 | |
| 453 const Value* search_url = | |
| 454 policies->Get(kPolicyDefaultSearchProviderSearchURL); | |
| 455 // The search URL is required. | |
| 456 if (!search_url) | |
| 457 return; | |
| 458 | |
| 459 // Apply all default search policies. | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
Shouldn't this block be moved into the if-block st
simo
2011/09/29 09:33:08
Done.
| |
| 460 PolicyErrorMap errors; | |
| 461 PrefValueMap temp_prefs; | |
| 462 HandlerList::const_iterator handler = handlers_.begin(); | |
| 463 for ( ; handler != handlers_.end(); ++handler) { | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
No curlies required.
simo
2011/09/29 09:33:08
Done.
| |
| 464 (*handler)->ApplyPolicySettings(policies, &temp_prefs); | |
| 465 } | |
| 466 | |
| 467 // The other entries are optional. Just make sure that they are all | |
| 468 // specified via policy, so that we don't use regular prefs. | |
| 469 if (DefaultSearchURLIsPresentAndValid(policies)) { | |
| 470 EnsureStringPrefExists( | |
| 471 &temp_prefs, prefs::kDefaultSearchProviderSuggestURL); | |
| 472 EnsureStringPrefExists(&temp_prefs, prefs::kDefaultSearchProviderIconURL); | |
| 473 EnsureStringPrefExists(&temp_prefs, prefs::kDefaultSearchProviderEncodings); | |
| 474 EnsureStringPrefExists(&temp_prefs, prefs::kDefaultSearchProviderKeyword); | |
| 475 EnsureStringPrefExists( | |
| 476 &temp_prefs, prefs::kDefaultSearchProviderInstantURL); | |
| 477 | |
| 478 // For the name, default to the host if not specified. | |
| 479 std::string name; | |
| 480 if (!temp_prefs.GetString(prefs::kDefaultSearchProviderName, &name) || | |
| 481 name.empty()) { | |
| 482 const Value* search_url = | |
| 483 policies->Get(kPolicyDefaultSearchProviderSearchURL); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
search_url is already read above. reuse?
simo
2011/09/29 09:33:08
Done.
| |
| 484 std::string search_url_string; | |
| 485 DCHECK(search_url->GetAsString(&search_url_string)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
DCHECK compiles away.
simo
2011/09/29 09:33:08
Done.
| |
| 486 temp_prefs.SetString(prefs::kDefaultSearchProviderName, | |
| 487 GURL(search_url_string).host()); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
indentation
simo
2011/09/29 09:33:08
Done.
| |
| 488 } | |
| 489 | |
| 490 // And clear the IDs since these are not specified via policy. | |
| 491 temp_prefs.SetString(prefs::kDefaultSearchProviderID, std::string()); | |
| 492 temp_prefs.SetString(prefs::kDefaultSearchProviderPrepopulateID, | |
| 493 std::string()); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
indentation
simo
2011/09/29 09:33:08
Done.
| |
| 494 CopyTempPrefsToRealPrefs(&temp_prefs, prefs); | |
| 495 return; | |
| 496 } | |
| 497 | |
| 498 // Required entries are not there. Remove any related entries. | |
| 499 ClearDefaultSearchPreferences(&temp_prefs); | |
| 500 CopyTempPrefsToRealPrefs(&temp_prefs, prefs); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
Wait. clear-then-copy? Am I missing something or
simo
2011/09/29 09:33:08
Oh right, of course. I obviously wasn't thinking.
| |
| 501 } | |
| 502 | |
| 503 bool DefaultSearchPolicyHandler::CheckIndividualPolicies( | |
| 504 const PolicyMap* policies, PolicyErrorMap* errors) { | |
| 505 HandlerList::const_iterator handler = handlers_.begin(); | |
| 506 for ( ; handler != handlers_.end(); ++handler) { | |
| 507 if (!(*handler)->CheckPolicySettings(policies, errors)) | |
| 508 return false; | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
I think we shouldn't abort here, since we want to
simo
2011/09/29 09:33:08
Done.
| |
| 509 } | |
| 510 return true; | |
| 511 } | |
| 512 | |
| 513 bool DefaultSearchPolicyHandler::DefaultSearchProviderIsDisabled( | |
| 514 const PolicyMap* policies) { | |
| 515 const Value* provider_enabled = | |
| 516 policies->Get(kPolicyDefaultSearchProviderEnabled); | |
| 517 bool enabled = true; | |
| 518 return provider_enabled && | |
| 519 provider_enabled->GetAsBoolean(&enabled) && | |
| 520 !enabled; | |
| 521 } | |
| 522 | |
| 523 bool DefaultSearchPolicyHandler::DefaultSearchURLIsPresentAndValid( | |
| 524 const PolicyMap* policies) { | |
| 525 const Value* search_url = | |
| 526 policies->Get(kPolicyDefaultSearchProviderSearchURL); | |
| 527 std::string search_url_string; | |
| 528 if (search_url) { | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
you can as well invert the checks and put early re
simo
2011/09/29 09:33:08
Done.
| |
| 529 std::string search_url_string; | |
| 530 if (search_url->GetAsString(&search_url_string)) { | |
| 531 SearchTermsDataForValidation search_terms_data; | |
| 532 const TemplateURLRef search_url_ref(search_url_string, 0, 0); | |
| 533 // It must support replacement (which implies it is valid). | |
| 534 return | |
| 535 search_url_ref.SupportsReplacementUsingTermsData(search_terms_data); | |
| 536 } | |
| 537 } | |
| 538 return false; | |
| 539 } | |
| 540 | |
| 541 void DefaultSearchPolicyHandler::EnsureStringPrefExists(PrefValueMap* prefs, | |
| 542 const std::string& path) { | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
function parameters must line up
simo
2011/09/29 09:33:08
Done.
| |
| 543 std::string value; | |
| 544 if (!prefs->GetString(path, &value)) | |
| 545 prefs->SetString(path, value); | |
| 546 } | |
| 547 | |
| 548 void DefaultSearchPolicyHandler::CopyTempPrefsToRealPrefs( | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
Can't we just implement a MergeFrom() in PrefValue
simo
2011/09/29 09:33:08
Done.
| |
| 549 PrefValueMap* temp_prefs, PrefValueMap* prefs) { | |
| 550 | |
| 551 for (unsigned int current = 0; | |
| 552 current < arraysize(kDefaultSearchPolicyMap); ++current) { | |
| 553 Value* value; | |
| 554 const char* pref_path = kDefaultSearchPolicyMap[current].preference_path; | |
| 555 if (temp_prefs->GetValue(pref_path, &value)) | |
| 556 prefs->SetValue(pref_path, value->DeepCopy()); | |
| 557 } | |
| 558 } | |
| 559 | |
| 560 void DefaultSearchPolicyHandler::ClearDefaultSearchPreferences( | |
| 561 PrefValueMap* prefs) { | |
| 562 | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
remove extra newline
simo
2011/09/29 09:33:08
Done.
| |
| 563 for (unsigned int current = 0; | |
| 564 current < arraysize(kDefaultSearchPolicyMap); ++current) { | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
+1 space indentation
simo
2011/09/29 09:33:08
Done.
| |
| 565 prefs->RemoveValue(kDefaultSearchPolicyMap[current].preference_path); | |
| 566 } | |
| 567 } | |
| 568 | |
| 569 // ProxyPolicyHandler | |
| 570 ProxyPolicyHandler::ProxyPolicyHandler() { | |
| 571 } | |
| 572 | |
| 573 ProxyPolicyHandler::~ProxyPolicyHandler() { | |
| 574 } | |
| 575 | |
| 576 bool ProxyPolicyHandler::CheckPolicySettings(const PolicyMap* policies, | |
| 577 PolicyErrorMap* errors) { | |
| 578 const Value* mode = GetProxyPolicyValue(policies, kPolicyProxyMode); | |
| 579 const Value* server = GetProxyPolicyValue(policies, kPolicyProxyServer); | |
| 580 const Value* server_mode = | |
| 581 GetProxyPolicyValue(policies, kPolicyProxyServerMode); | |
| 582 const Value* pac_url = GetProxyPolicyValue(policies, kPolicyProxyPacUrl); | |
| 583 const Value* bypass_list = | |
| 584 GetProxyPolicyValue(policies, kPolicyProxyBypassList); | |
| 585 | |
| 586 | |
| 587 if ((server || pac_url || bypass_list) && !(mode || server_mode)) { | |
| 588 errors->AddError(kPolicyProxyMode, | |
| 589 IDS_POLICY_PROXY_MODE_NOT_SPECIFIED_ERROR); | |
| 590 return false; | |
| 591 } | |
| 592 | |
| 593 std::string mode_value; | |
| 594 if (!CheckProxyModeAndServerMode(policies, errors, &mode_value)) | |
| 595 return false; | |
| 596 | |
| 597 // If neither ProxyMode nor ProxyServerMode are specified, mode_value will be | |
| 598 // empty and the proxy shouldn't be configured at all. | |
| 599 if (mode_value.empty()) | |
| 600 return true; | |
| 601 | |
| 602 if (mode_value == ProxyPrefs::kDirectProxyModeName) { | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
Hm, maybe we can specify all these checks here in
simo
2011/09/29 09:33:08
I like that, I've done it :)
| |
| 603 if (server || pac_url || bypass_list) { | |
| 604 int message_id = IDS_POLICY_PROXY_MODE_DISABLED_ERROR; | |
| 605 if (server) | |
| 606 errors->AddError(kPolicyProxyServer, message_id); | |
| 607 if (bypass_list) | |
| 608 errors->AddError(kPolicyProxyBypassList, message_id); | |
| 609 if (pac_url) | |
| 610 errors->AddError(kPolicyProxyPacUrl, message_id); | |
| 611 return false; | |
| 612 } | |
| 613 } else if (mode_value == ProxyPrefs::kAutoDetectProxyModeName) { | |
| 614 if (server || bypass_list || pac_url) { | |
| 615 int message_id = IDS_POLICY_PROXY_MODE_AUTO_DETECT_ERROR; | |
| 616 if (server) | |
| 617 errors->AddError(kPolicyProxyServer, message_id); | |
| 618 if (bypass_list) | |
| 619 errors->AddError(kPolicyProxyBypassList, message_id); | |
| 620 if (pac_url) | |
| 621 errors->AddError(kPolicyProxyPacUrl, message_id); | |
| 622 return false; | |
| 623 } | |
| 624 } else if (mode_value == ProxyPrefs::kPacScriptProxyModeName) { | |
| 625 if (server || bypass_list) { | |
| 626 int message_id = IDS_POLICY_PROXY_MODE_PAC_URL_ERROR; | |
| 627 if (server) | |
| 628 errors->AddError(kPolicyProxyServer, message_id); | |
| 629 if (bypass_list) | |
| 630 errors->AddError(kPolicyProxyBypassList, message_id); | |
| 631 return false; | |
| 632 } | |
| 633 } else if (mode_value == ProxyPrefs::kFixedServersProxyModeName) { | |
| 634 if (pac_url) { | |
| 635 errors->AddError(kPolicyProxyPacUrl, | |
| 636 IDS_POLICY_PROXY_MODE_FIXED_SERVERS_ERROR); | |
| 637 return false; | |
| 638 } | |
| 639 } else if (mode_value == ProxyPrefs::kSystemProxyModeName) { | |
| 640 if (server || pac_url || bypass_list) { | |
| 641 int message_id = IDS_POLICY_PROXY_MODE_SYSTEM_ERROR; | |
| 642 if (server) | |
| 643 errors->AddError(kPolicyProxyServer, message_id); | |
| 644 if (bypass_list) | |
| 645 errors->AddError(kPolicyProxyBypassList, message_id); | |
| 646 if (pac_url) | |
| 647 errors->AddError(kPolicyProxyPacUrl, message_id); | |
| 648 return false; | |
| 649 } | |
| 650 } else { | |
| 651 if (mode && server_mode) | |
| 652 errors->AddError(kPolicyProxyServerMode, IDS_POLICY_INVALID_ERROR); | |
| 653 else | |
| 654 errors->AddError(kPolicyProxyMode, IDS_POLICY_INVALID_ERROR); | |
| 655 return false; | |
| 656 } | |
| 657 return true; | |
| 658 } | |
| 659 | |
| 660 void ProxyPolicyHandler::ApplyPolicySettings(const PolicyMap* policies, | |
| 661 PrefValueMap* prefs) { | |
| 662 PolicyErrorMap errors; | |
| 663 if (!CheckPolicySettings(policies, &errors)) { | |
| 664 GenerateLogMessages(&errors); | |
| 665 return; | |
| 666 } | |
| 667 | |
| 668 const Value* mode = GetProxyPolicyValue(policies, kPolicyProxyMode); | |
| 669 const Value* server = GetProxyPolicyValue(policies, kPolicyProxyServer); | |
| 670 const Value* server_mode = | |
| 671 GetProxyPolicyValue(policies, kPolicyProxyServerMode); | |
| 672 const Value* pac_url = GetProxyPolicyValue(policies, kPolicyProxyPacUrl); | |
| 673 const Value* bypass_list = | |
| 674 GetProxyPolicyValue(policies, kPolicyProxyBypassList); | |
| 675 | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
The following seems to be the same code as CheckPr
simo
2011/09/29 09:33:08
In CheckProxyModeAndServerMode the |mode_value| is
| |
| 676 ProxyPrefs::ProxyMode proxy_mode; | |
| 677 if (mode) { | |
| 678 std::string string_mode; | |
| 679 DCHECK(mode->GetAsString(&string_mode)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
compiles away
simo
2011/09/29 09:33:08
Done.
| |
| 680 ProxyPrefs::StringToProxyMode(string_mode, &proxy_mode); | |
| 681 } else if (server_mode) { | |
| 682 int int_mode = 0; | |
| 683 DCHECK(server_mode->GetAsInteger(&int_mode)); | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
ditto
simo
2011/09/29 09:33:08
Done.
| |
| 684 switch (int_mode) { | |
| 685 case kPolicyNoProxyServerMode: | |
| 686 proxy_mode = ProxyPrefs::MODE_DIRECT; | |
| 687 break; | |
| 688 case kPolicyAutoDetectProxyServerMode: | |
| 689 proxy_mode = ProxyPrefs::MODE_AUTO_DETECT; | |
| 690 break; | |
| 691 case kPolicyManuallyConfiguredProxyServerMode: | |
| 692 proxy_mode = ProxyPrefs::MODE_FIXED_SERVERS; | |
| 693 if (pac_url) | |
| 694 proxy_mode = ProxyPrefs::MODE_PAC_SCRIPT; | |
| 695 break; | |
| 696 case kPolicyUseSystemProxyServerMode: | |
| 697 proxy_mode = ProxyPrefs::MODE_SYSTEM; | |
| 698 break; | |
| 699 default: | |
| 700 proxy_mode = ProxyPrefs::MODE_DIRECT; | |
| 701 NOTREACHED(); | |
| 702 } | |
| 703 } else { | |
| 704 return; | |
| 705 } | |
|
Mattias Nissler (ping if slow)
2011/09/26 13:30:48
I'd put a newline here.
simo
2011/09/29 09:33:08
Done.
| |
| 706 switch (proxy_mode) { | |
| 707 case ProxyPrefs::MODE_DIRECT: | |
| 708 prefs->SetValue(prefs::kProxy, ProxyConfigDictionary::CreateDirect()); | |
| 709 break; | |
| 710 case ProxyPrefs::MODE_AUTO_DETECT: | |
| 711 prefs->SetValue(prefs::kProxy, ProxyConfigDictionary::CreateAutoDetect()); | |
| 712 break; | |
| 713 case ProxyPrefs::MODE_PAC_SCRIPT: { | |
| 714 std::string pac_url_string; | |
| 715 DCHECK(pac_url->GetAsString(&pac_url_string)); | |
| 716 prefs->SetValue(prefs::kProxy, | |
| 717 ProxyConfigDictionary::CreatePacScript(pac_url_string, false)); | |
| 718 break; | |
| 719 } | |
| 720 case ProxyPrefs::MODE_FIXED_SERVERS: { | |
| 721 std::string proxy_server; | |
| 722 DCHECK(server->GetAsString(&proxy_server)); | |
| 723 std::string bypass_list_string; | |
| 724 if (bypass_list) | |
| 725 DCHECK(bypass_list->GetAsString(&bypass_list_string)); | |
| 726 prefs->SetValue(prefs::kProxy, | |
| 727 ProxyConfigDictionary::CreateFixedServers( | |
| 728 proxy_server, bypass_list_string)); | |
| 729 break; | |
| 730 } | |
| 731 case ProxyPrefs::MODE_SYSTEM: | |
| 732 prefs->SetValue(prefs::kProxy, | |
| 733 ProxyConfigDictionary::CreateSystem()); | |
| 734 break; | |
| 735 case ProxyPrefs::kModeCount: | |
| 736 NOTREACHED(); | |
| 737 } | |
| 738 } | |
| 739 | |
| 740 const Value* ProxyPolicyHandler::GetProxyPolicyValue( | |
| 741 const PolicyMap* policies, ConfigurationPolicyType policy) { | |
| 742 const Value* value = policies->Get(policy); | |
| 743 std::string tmp; | |
| 744 if (!value || | |
| 745 value->IsType(Value::TYPE_NULL) || | |
| 746 (value->IsType(Value::TYPE_STRING) && | |
| 747 value->GetAsString(&tmp) && | |
| 748 tmp.empty())) { | |
| 749 return NULL; | |
| 750 } | |
| 751 return value; | |
| 752 } | |
| 753 | |
| 754 bool ProxyPolicyHandler::CheckProxyModeAndServerMode(const PolicyMap* policies, | |
| 755 PolicyErrorMap* errors, | |
| 756 std::string* mode_value) { | |
| 757 const Value* mode = GetProxyPolicyValue(policies, kPolicyProxyMode); | |
| 758 const Value* server = GetProxyPolicyValue(policies, kPolicyProxyServer); | |
| 759 const Value* server_mode = | |
| 760 GetProxyPolicyValue(policies, kPolicyProxyServerMode); | |
| 761 const Value* pac_url = GetProxyPolicyValue(policies, kPolicyProxyPacUrl); | |
| 762 std::string message; | |
| 763 | |
| 764 // If there's a server mode, convert it into a mode. | |
| 765 if (mode) { | |
| 766 if (server_mode) { | |
| 767 errors->AddError(kPolicyProxyMode, IDS_POLICY_PROXY_MODE_IGNORED); | |
| 768 LOG(WARNING) << message; | |
| 769 } | |
| 770 if (!mode->GetAsString(mode_value)) { | |
| 771 errors->AddError(kPolicyProxyMode, IDS_POLICY_INVALID_ERROR); | |
| 772 LOG(WARNING) << message; | |
| 773 return false; | |
| 774 } | |
| 775 | |
| 776 ProxyPrefs::ProxyMode mode; | |
| 777 if (!ProxyPrefs::StringToProxyMode(*mode_value, &mode)) { | |
| 778 errors->AddError(kPolicyProxyMode, IDS_POLICY_NOT_RECOGNIZED_ERROR); | |
| 779 return false; | |
| 780 } | |
| 781 | |
| 782 if (mode == ProxyPrefs::MODE_PAC_SCRIPT && !pac_url) { | |
| 783 errors->AddError(kPolicyProxyPacUrl, IDS_POLICY_NOT_SPECIFIED_ERROR); | |
| 784 return false; | |
| 785 } else if (mode == ProxyPrefs::MODE_FIXED_SERVERS && !server) { | |
| 786 errors->AddError(kPolicyProxyServer, IDS_POLICY_NOT_SPECIFIED_ERROR); | |
| 787 return false; | |
| 788 } | |
| 789 } else if (server_mode) { | |
| 790 int server_mode_value; | |
| 791 if (!server_mode->GetAsInteger(&server_mode_value)) { | |
| 792 errors->AddError(kPolicyProxyServerMode, IDS_POLICY_INVALID_ERROR); | |
| 793 LOG(WARNING) << message; | |
| 794 return false; | |
| 795 } | |
| 796 | |
| 797 switch (server_mode_value) { | |
| 798 case kPolicyNoProxyServerMode: | |
| 799 *mode_value = ProxyPrefs::kDirectProxyModeName; | |
| 800 break; | |
| 801 case kPolicyAutoDetectProxyServerMode: | |
| 802 *mode_value = ProxyPrefs::kAutoDetectProxyModeName; | |
| 803 break; | |
| 804 case kPolicyManuallyConfiguredProxyServerMode: | |
| 805 if (server && pac_url) { | |
| 806 int message_id = IDS_POLICY_PROXY_BOTH_SPECIFIED_ERROR; | |
| 807 errors->AddError(kPolicyProxyServer, message_id); | |
| 808 errors->AddError(kPolicyProxyPacUrl, message_id); | |
| 809 return false; | |
| 810 } | |
| 811 if (!server && !pac_url) { | |
| 812 int message_id = IDS_POLICY_PROXY_NEITHER_SPECIFIED_ERROR; | |
| 813 errors->AddError(kPolicyProxyServer, message_id); | |
| 814 errors->AddError(kPolicyProxyPacUrl, message_id); | |
| 815 return false; | |
| 816 } | |
| 817 if (pac_url) | |
| 818 *mode_value = ProxyPrefs::kPacScriptProxyModeName; | |
| 819 else | |
| 820 *mode_value = ProxyPrefs::kFixedServersProxyModeName; | |
| 821 break; | |
| 822 case kPolicyUseSystemProxyServerMode: | |
| 823 *mode_value = ProxyPrefs::kSystemProxyModeName; | |
| 824 break; | |
| 825 default: | |
| 826 errors->AddError(kPolicyProxyServer, IDS_POLICY_INVALID_ERROR); | |
| 827 return false; | |
| 828 } | |
| 829 } | |
| 830 return true; | |
| 831 } | |
| 832 | |
| 833 } // namespace policy | |
| OLD | NEW |