Home | History | Annotate | Download | only in prefs
      1 // Copyright (c) 2012 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/prefs/command_line_pref_store.h"
      6 
      7 #include <string>
      8 #include <vector>
      9 
     10 #include "base/files/file_path.h"
     11 #include "base/logging.h"
     12 #include "base/strings/string_number_conversions.h"
     13 #include "base/strings/string_split.h"
     14 #include "base/values.h"
     15 #include "chrome/browser/prefs/proxy_config_dictionary.h"
     16 #include "chrome/common/chrome_switches.h"
     17 #include "chrome/common/pref_names.h"
     18 #include "ui/base/ui_base_switches.h"
     19 
     20 #if defined(OS_CHROMEOS)
     21 #include "chromeos/chromeos_switches.h"
     22 #endif
     23 
     24 const CommandLinePrefStore::StringSwitchToPreferenceMapEntry
     25     CommandLinePrefStore::string_switch_map_[] = {
     26       { switches::kLang, prefs::kApplicationLocale },
     27       { switches::kAuthSchemes, prefs::kAuthSchemes },
     28       { switches::kAuthServerWhitelist, prefs::kAuthServerWhitelist },
     29       { switches::kAuthNegotiateDelegateWhitelist,
     30           prefs::kAuthNegotiateDelegateWhitelist },
     31       { switches::kGSSAPILibraryName, prefs::kGSSAPILibraryName },
     32       { data_reduction_proxy::switches::kDataReductionProxy,
     33           data_reduction_proxy::prefs::kDataReductionProxy },
     34       { switches::kSSLVersionMin, prefs::kSSLVersionMin },
     35       { switches::kSSLVersionMax, prefs::kSSLVersionMax },
     36       { switches::kSSLVersionFallbackMin, prefs::kSSLVersionFallbackMin },
     37 };
     38 
     39 const CommandLinePrefStore::PathSwitchToPreferenceMapEntry
     40     CommandLinePrefStore::path_switch_map_[] = {
     41       { switches::kDiskCacheDir, prefs::kDiskCacheDir },
     42 };
     43 
     44 const CommandLinePrefStore::BooleanSwitchToPreferenceMapEntry
     45     CommandLinePrefStore::boolean_switch_map_[] = {
     46       { switches::kDisableAuthNegotiateCnameLookup,
     47           prefs::kDisableAuthNegotiateCnameLookup, true },
     48       { switches::kEnableAuthNegotiatePort, prefs::kEnableAuthNegotiatePort,
     49           true },
     50       { switches::kDisable3DAPIs, prefs::kDisable3DAPIs, true },
     51       { switches::kEnableCloudPrintProxy, prefs::kCloudPrintProxyEnabled,
     52           true },
     53       { switches::kAllowOutdatedPlugins, prefs::kPluginsAllowOutdated, true },
     54       { switches::kAlwaysAuthorizePlugins, prefs::kPluginsAlwaysAuthorize,
     55           true },
     56       { switches::kNoPings, prefs::kEnableHyperlinkAuditing, false },
     57       { switches::kNoReferrers, prefs::kEnableReferrers, false },
     58       { switches::kAllowRunningInsecureContent,
     59         prefs::kWebKitAllowRunningInsecureContent, true },
     60       { switches::kNoDisplayingInsecureContent,
     61         prefs::kWebKitAllowDisplayingInsecureContent, false },
     62       { switches::kAllowCrossOriginAuthPrompt,
     63         prefs::kAllowCrossOriginAuthPrompt, true },
     64       { switches::kDisablePrintPreview, prefs::kPrintPreviewDisabled, true },
     65 #if defined(OS_CHROMEOS)
     66       { chromeos::switches::kEnableTouchpadThreeFingerClick,
     67           prefs::kEnableTouchpadThreeFingerClick, true },
     68 #endif
     69       { switches::kDisableAsyncDns, prefs::kBuiltInDnsClientEnabled, false },
     70       { switches::kEnableAsyncDns, prefs::kBuiltInDnsClientEnabled, true },
     71 };
     72 
     73 const CommandLinePrefStore::IntegerSwitchToPreferenceMapEntry
     74     CommandLinePrefStore::integer_switch_map_[] = {
     75       { switches::kDiskCacheSize, prefs::kDiskCacheSize },
     76       { switches::kMediaCacheSize, prefs::kMediaCacheSize },
     77     };
     78 
     79 CommandLinePrefStore::CommandLinePrefStore(const CommandLine* command_line)
     80     : command_line_(command_line) {
     81   ApplySimpleSwitches();
     82   ApplyProxyMode();
     83   ValidateProxySwitches();
     84   ApplySSLSwitches();
     85   ApplyBackgroundModeSwitches();
     86 }
     87 
     88 CommandLinePrefStore::~CommandLinePrefStore() {}
     89 
     90 bool CommandLinePrefStore::ValidateProxySwitches() {
     91   if (command_line_->HasSwitch(switches::kNoProxyServer) &&
     92       (command_line_->HasSwitch(switches::kProxyAutoDetect) ||
     93        command_line_->HasSwitch(switches::kProxyServer) ||
     94        command_line_->HasSwitch(switches::kProxyPacUrl) ||
     95        command_line_->HasSwitch(switches::kProxyBypassList))) {
     96     LOG(WARNING) << "Additional command-line proxy switches specified when --"
     97                  << switches::kNoProxyServer << " was also specified.";
     98     return false;
     99   }
    100   return true;
    101 }
    102 
    103 void CommandLinePrefStore::ApplySimpleSwitches() {
    104   // Look for each switch we know about and set its preference accordingly.
    105   for (size_t i = 0; i < arraysize(string_switch_map_); ++i) {
    106     if (command_line_->HasSwitch(string_switch_map_[i].switch_name)) {
    107       SetValue(string_switch_map_[i].preference_path,
    108                new base::StringValue(command_line_->GetSwitchValueASCII(
    109                    string_switch_map_[i].switch_name)));
    110     }
    111   }
    112 
    113   for (size_t i = 0; i < arraysize(path_switch_map_); ++i) {
    114     if (command_line_->HasSwitch(path_switch_map_[i].switch_name)) {
    115       SetValue(path_switch_map_[i].preference_path,
    116                new base::StringValue(command_line_->GetSwitchValuePath(
    117                    path_switch_map_[i].switch_name).value()));
    118     }
    119   }
    120 
    121   for (size_t i = 0; i < arraysize(integer_switch_map_); ++i) {
    122     if (command_line_->HasSwitch(integer_switch_map_[i].switch_name)) {
    123       std::string str_value = command_line_->GetSwitchValueASCII(
    124           integer_switch_map_[i].switch_name);
    125       int int_value = 0;
    126       if (!base::StringToInt(str_value, &int_value)) {
    127         LOG(ERROR) << "The value " << str_value << " of "
    128                    << integer_switch_map_[i].switch_name
    129                    << " can not be converted to integer, ignoring!";
    130         continue;
    131       }
    132       SetValue(integer_switch_map_[i].preference_path,
    133                new base::FundamentalValue(int_value));
    134     }
    135   }
    136 
    137   for (size_t i = 0; i < arraysize(boolean_switch_map_); ++i) {
    138     if (command_line_->HasSwitch(boolean_switch_map_[i].switch_name)) {
    139       SetValue(boolean_switch_map_[i].preference_path,
    140                new base::FundamentalValue(boolean_switch_map_[i].set_value));
    141     }
    142   }
    143 }
    144 
    145 void CommandLinePrefStore::ApplyProxyMode() {
    146   if (command_line_->HasSwitch(switches::kNoProxyServer)) {
    147     SetValue(prefs::kProxy,
    148              ProxyConfigDictionary::CreateDirect());
    149   } else if (command_line_->HasSwitch(switches::kProxyPacUrl)) {
    150     std::string pac_script_url =
    151         command_line_->GetSwitchValueASCII(switches::kProxyPacUrl);
    152     SetValue(prefs::kProxy,
    153              ProxyConfigDictionary::CreatePacScript(pac_script_url, false));
    154   } else if (command_line_->HasSwitch(switches::kProxyAutoDetect)) {
    155     SetValue(prefs::kProxy,
    156              ProxyConfigDictionary::CreateAutoDetect());
    157   } else if (command_line_->HasSwitch(switches::kProxyServer)) {
    158     std::string proxy_server =
    159         command_line_->GetSwitchValueASCII(switches::kProxyServer);
    160     std::string bypass_list =
    161         command_line_->GetSwitchValueASCII(switches::kProxyBypassList);
    162     SetValue(prefs::kProxy,
    163              ProxyConfigDictionary::CreateFixedServers(proxy_server,
    164                                                        bypass_list));
    165   }
    166 }
    167 
    168 void CommandLinePrefStore::ApplySSLSwitches() {
    169   if (command_line_->HasSwitch(switches::kCipherSuiteBlacklist)) {
    170     std::string cipher_suites =
    171         command_line_->GetSwitchValueASCII(switches::kCipherSuiteBlacklist);
    172     std::vector<std::string> cipher_strings;
    173     base::SplitString(cipher_suites, ',', &cipher_strings);
    174     base::ListValue* list_value = new base::ListValue();
    175     for (std::vector<std::string>::const_iterator it = cipher_strings.begin();
    176          it != cipher_strings.end(); ++it) {
    177       list_value->Append(new base::StringValue(*it));
    178     }
    179     SetValue(prefs::kCipherSuiteBlacklist, list_value);
    180   }
    181 }
    182 
    183 void CommandLinePrefStore::ApplyBackgroundModeSwitches() {
    184   if (command_line_->HasSwitch(switches::kDisableExtensions))
    185     SetValue(prefs::kBackgroundModeEnabled, new base::FundamentalValue(false));
    186 }
    187