172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/command_line_pref_store.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/logging.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/prefs/proxy_config_dictionary.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/ui_base_switches.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst CommandLinePrefStore::StringSwitchToPreferenceMapEntry
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CommandLinePrefStore::string_switch_map_[] = {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      { switches::kLang, prefs::kApplicationLocale },
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      { switches::kAuthSchemes, prefs::kAuthSchemes },
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      { switches::kAuthServerWhitelist, prefs::kAuthServerWhitelist },
194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      { switches::kAuthNegotiateDelegateWhitelist,
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          prefs::kAuthNegotiateDelegateWhitelist },
214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      { switches::kGSSAPILibraryName, prefs::kGSSAPILibraryName },
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst CommandLinePrefStore::BooleanSwitchToPreferenceMapEntry
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CommandLinePrefStore::boolean_switch_map_[] = {
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      { switches::kDisableAuthNegotiateCnameLookup,
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          prefs::kDisableAuthNegotiateCnameLookup, true },
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      { switches::kEnableAuthNegotiatePort, prefs::kEnableAuthNegotiatePort,
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          true },
30ac1e49eb6695f711d72215fcdf9388548942a00dBen Murdoch      { switches::kDisable3DAPIs, prefs::kDisable3DAPIs, true },
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      { switches::kEnableCloudPrintProxy, prefs::kCloudPrintProxyEnabled,
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          true },
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      { switches::kAllowOutdatedPlugins, prefs::kPluginsAllowOutdated, true },
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      { switches::kNoPings, prefs::kEnableHyperlinkAuditing, false },
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      { switches::kNoReferrers, prefs::kEnableReferrers, false },
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCommandLinePrefStore::CommandLinePrefStore(const CommandLine* command_line)
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    : command_line_(command_line) {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ApplySimpleSwitches();
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ApplyProxyMode();
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ValidateProxySwitches();
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenCommandLinePrefStore::~CommandLinePrefStore() {}
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CommandLinePrefStore::ApplySimpleSwitches() {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Look for each switch we know about and set its preference accordingly.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < arraysize(string_switch_map_); ++i) {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (command_line_->HasSwitch(string_switch_map_[i].switch_name)) {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Value* value = Value::CreateStringValue(command_line_->
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GetSwitchValueASCII(string_switch_map_[i].switch_name));
5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      SetValue(string_switch_map_[i].preference_path, value);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < arraysize(boolean_switch_map_); ++i) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (command_line_->HasSwitch(boolean_switch_map_[i].switch_name)) {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Value* value = Value::CreateBooleanValue(
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          boolean_switch_map_[i].set_value);
6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      SetValue(boolean_switch_map_[i].preference_path, value);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool CommandLinePrefStore::ValidateProxySwitches() {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (command_line_->HasSwitch(switches::kNoProxyServer) &&
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      (command_line_->HasSwitch(switches::kProxyAutoDetect) ||
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       command_line_->HasSwitch(switches::kProxyServer) ||
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       command_line_->HasSwitch(switches::kProxyPacUrl) ||
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       command_line_->HasSwitch(switches::kProxyBypassList))) {
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOG(WARNING) << "Additional command-line proxy switches specified when --"
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 << switches::kNoProxyServer << " was also specified.";
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid CommandLinePrefStore::ApplyProxyMode() {
8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (command_line_->HasSwitch(switches::kNoProxyServer)) {
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SetValue(prefs::kProxy,
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             ProxyConfigDictionary::CreateDirect());
8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (command_line_->HasSwitch(switches::kProxyPacUrl)) {
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string pac_script_url =
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        command_line_->GetSwitchValueASCII(switches::kProxyPacUrl);
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SetValue(prefs::kProxy,
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             ProxyConfigDictionary::CreatePacScript(pac_script_url));
8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (command_line_->HasSwitch(switches::kProxyAutoDetect)) {
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SetValue(prefs::kProxy,
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             ProxyConfigDictionary::CreateAutoDetect());
9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (command_line_->HasSwitch(switches::kProxyServer)) {
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string proxy_server =
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        command_line_->GetSwitchValueASCII(switches::kProxyServer);
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string bypass_list =
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        command_line_->GetSwitchValueASCII(switches::kProxyBypassList);
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SetValue(prefs::kProxy,
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             ProxyConfigDictionary::CreateFixedServers(proxy_server,
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                       bypass_list));
9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
101