Index: components/data_reduction_proxy/browser/data_reduction_proxy_settings.cc |
diff --git a/components/data_reduction_proxy/browser/data_reduction_proxy_settings.cc b/components/data_reduction_proxy/browser/data_reduction_proxy_settings.cc |
index cc575c94c3f6ef5e5cabd93855ed99cb89d94dd7..d0ed70d7ab992c246d210886c72a7b5d6545feba 100644 |
--- a/components/data_reduction_proxy/browser/data_reduction_proxy_settings.cc |
+++ b/components/data_reduction_proxy/browser/data_reduction_proxy_settings.cc |
@@ -24,6 +24,7 @@ |
#include "net/base/host_port_pair.h" |
#include "net/base/load_flags.h" |
#include "net/base/net_errors.h" |
+#include "net/base/net_util.h" |
#include "net/http/http_network_session.h" |
#include "net/http/http_response_headers.h" |
#include "net/url_request/url_fetcher.h" |
@@ -36,6 +37,14 @@ |
using base::StringPrintf; |
namespace { |
+// Values of the UMA DataReductionProxy.NetworkChangeEvents histograms. |
+// This enum must remain synchronized with the enum of the same |
+// name in metrics/histograms/histograms.xml. |
+enum DataReductionProxyNetworkChangeEvent { |
+ IP_CHANGED = 0, // The client IP address changed. |
+ DISABLED_ON_VPN = 1, // The proxy is disabled because a VPN is running. |
+ CHANGE_EVENT_COUNT = 2 // This must always be last. |
+}; |
// Key of the UMA DataReductionProxy.StartupState histogram. |
const char kUMAProxyStartupStateHistogram[] = |
@@ -44,6 +53,13 @@ const char kUMAProxyStartupStateHistogram[] = |
// Key of the UMA DataReductionProxy.ProbeURL histogram. |
const char kUMAProxyProbeURL[] = "DataReductionProxy.ProbeURL"; |
+// Record a network change event. |
+void RecordNetworkChangeEvent(DataReductionProxyNetworkChangeEvent event) { |
+ UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.NetworkChangeEvents", |
+ event, |
+ CHANGE_EVENT_COUNT); |
+} |
+ |
int64 GetInt64PrefValue(const base::ListValue& list_value, size_t index) { |
int64 val = 0; |
std::string pref_value; |
@@ -70,9 +86,11 @@ DataReductionProxySettings::DataReductionProxySettings( |
DataReductionProxyParams* params) |
: restricted_by_carrier_(false), |
enabled_by_user_(false), |
+ disabled_on_vpn_(false), |
prefs_(NULL), |
local_state_prefs_(NULL), |
- url_request_context_getter_(NULL) { |
+ url_request_context_getter_(NULL), |
+ usage_stats_(NULL) { |
DCHECK(params); |
params_.reset(params); |
} |
@@ -311,6 +329,9 @@ void DataReductionProxySettings::OnIPAddressChanged() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
if (enabled_by_user_) { |
DCHECK(params_->allowed()); |
+ RecordNetworkChangeEvent(IP_CHANGED); |
+ if (DisableIfVPN()) |
+ return; |
ProbeWhetherDataReductionProxyIsAvailable(); |
WarmProxyConnection(); |
} |
@@ -359,13 +380,13 @@ void DataReductionProxySettings::MaybeActivateDataReductionProxy( |
// Configure use of the data reduction proxy if it is enabled. |
enabled_by_user_= IsDataReductionProxyEnabled(); |
- SetProxyConfigs(enabled_by_user_, |
+ SetProxyConfigs(enabled_by_user_ && !disabled_on_vpn_, |
IsDataReductionProxyAlternativeEnabled(), |
restricted_by_carrier_, |
at_startup); |
// Check if the proxy has been restricted explicitly by the carrier. |
- if (enabled_by_user_) { |
+ if (enabled_by_user_ && !disabled_on_vpn_) { |
ProbeWhetherDataReductionProxyIsAvailable(); |
WarmProxyConnection(); |
} |
@@ -425,6 +446,12 @@ void DataReductionProxySettings::RecordStartupState(ProxyStartupState state) { |
PROXY_STARTUP_STATE_COUNT); |
} |
+void DataReductionProxySettings::GetNetworkList( |
+ net::NetworkInterfaceList* interfaces, |
+ int policy) { |
+ net::GetNetworkList(interfaces, policy); |
+} |
+ |
void DataReductionProxySettings::ResetParamsForTest( |
DataReductionProxyParams* params) { |
params_.reset(params); |
@@ -485,18 +512,6 @@ void DataReductionProxySettings::GetContentLengths( |
local_state->GetInt64(prefs::kDailyHttpContentLengthLastUpdateDate); |
} |
-// static |
-base::string16 DataReductionProxySettings::AuthHashForSalt( |
- int64 salt, |
- const std::string& key) { |
- std::string salted_key = |
- base::StringPrintf("%lld%s%lld", |
- static_cast<long long>(salt), |
- key.c_str(), |
- static_cast<long long>(salt)); |
- return base::UTF8ToUTF16(base::MD5String(salted_key)); |
-} |
- |
net::URLFetcher* DataReductionProxySettings::GetBaseURLFetcher( |
const GURL& gurl, |
int load_flags) { |
@@ -542,4 +557,30 @@ void DataReductionProxySettings::WarmProxyConnection() { |
warmup_fetcher_->Start(); |
} |
+bool DataReductionProxySettings::DisableIfVPN() { |
+ net::NetworkInterfaceList network_interfaces; |
+ GetNetworkList(&network_interfaces, 0); |
+ // VPNs use a "tun" interface, so the presence of a "tun" interface indicates |
+ // a VPN is in use. |
+ // TODO(kundaji): Verify this works on Windows. |
+ const std::string vpn_interface_name_prefix = "tun"; |
+ for (size_t i = 0; i < network_interfaces.size(); ++i) { |
+ std::string interface_name = network_interfaces[i].name; |
+ if (LowerCaseEqualsASCII( |
+ interface_name.begin(), |
+ interface_name.begin() + vpn_interface_name_prefix.size(), |
+ vpn_interface_name_prefix.c_str())) { |
+ SetProxyConfigs(false, |
+ IsDataReductionProxyAlternativeEnabled(), |
+ false, |
+ false); |
+ disabled_on_vpn_ = true; |
+ RecordNetworkChangeEvent(DISABLED_ON_VPN); |
+ return true; |
+ } |
+ } |
+ disabled_on_vpn_ = false; |
+ return false; |
+} |
+ |
} // namespace data_reduction_proxy |