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

Side by Side Diff: components/data_reduction_proxy/browser/data_reduction_proxy_settings.cc

Issue 373153003: Bypass data reduction proxy when using VPN (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/data_reduction_proxy/browser/data_reduction_proxy_settings. h" 5 #include "components/data_reduction_proxy/browser/data_reduction_proxy_settings. h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/metrics/field_trial.h" 9 #include "base/metrics/field_trial.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
11 #include "base/prefs/pref_member.h" 11 #include "base/prefs/pref_member.h"
12 #include "base/prefs/pref_service.h" 12 #include "base/prefs/pref_service.h"
13 #include "base/prefs/scoped_user_pref_update.h" 13 #include "base/prefs/scoped_user_pref_update.h"
14 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "base/strings/stringprintf.h" 16 #include "base/strings/stringprintf.h"
17 #include "base/strings/utf_string_conversions.h" 17 #include "base/strings/utf_string_conversions.h"
18 #include "components/data_reduction_proxy/browser/data_reduction_proxy_auth_requ est_handler.h" 18 #include "components/data_reduction_proxy/browser/data_reduction_proxy_auth_requ est_handler.h"
19 #include "components/data_reduction_proxy/browser/data_reduction_proxy_configura tor.h" 19 #include "components/data_reduction_proxy/browser/data_reduction_proxy_configura tor.h"
20 #include "components/data_reduction_proxy/browser/data_reduction_proxy_params.h" 20 #include "components/data_reduction_proxy/browser/data_reduction_proxy_params.h"
21 #include "components/data_reduction_proxy/browser/data_reduction_proxy_usage_sta ts.h" 21 #include "components/data_reduction_proxy/browser/data_reduction_proxy_usage_sta ts.h"
22 #include "components/data_reduction_proxy/common/data_reduction_proxy_pref_names .h" 22 #include "components/data_reduction_proxy/common/data_reduction_proxy_pref_names .h"
23 #include "components/data_reduction_proxy/common/data_reduction_proxy_switches.h " 23 #include "components/data_reduction_proxy/common/data_reduction_proxy_switches.h "
24 #include "net/base/host_port_pair.h" 24 #include "net/base/host_port_pair.h"
25 #include "net/base/load_flags.h" 25 #include "net/base/load_flags.h"
26 #include "net/base/net_errors.h" 26 #include "net/base/net_errors.h"
27 #include "net/base/net_util.h"
27 #include "net/http/http_network_session.h" 28 #include "net/http/http_network_session.h"
28 #include "net/http/http_response_headers.h" 29 #include "net/http/http_response_headers.h"
29 #include "net/url_request/url_fetcher.h" 30 #include "net/url_request/url_fetcher.h"
30 #include "net/url_request/url_fetcher_delegate.h" 31 #include "net/url_request/url_fetcher_delegate.h"
31 #include "net/url_request/url_request_context_getter.h" 32 #include "net/url_request/url_request_context_getter.h"
32 #include "net/url_request/url_request_status.h" 33 #include "net/url_request/url_request_status.h"
33 #include "url/gurl.h" 34 #include "url/gurl.h"
34 35
35 36
36 using base::StringPrintf; 37 using base::StringPrintf;
37 38
38 namespace { 39 namespace {
40 // Values of the UMA DataReductionProxy.NetworkChangeEvents histograms.
41 // This enum must remain synchronized with the enum of the same
42 // name in metrics/histograms/histograms.xml.
43 enum DataReductionProxyNetworkChangeEvent {
44 IP_CHANGED = 0, // The client IP address changed.
45 DISABLED_ON_VPN = 1, // The proxy is disabled because a VPN is running.
46 CHANGE_EVENT_COUNT = 2 // This must always be last.
47 };
39 48
40 // Key of the UMA DataReductionProxy.StartupState histogram. 49 // Key of the UMA DataReductionProxy.StartupState histogram.
41 const char kUMAProxyStartupStateHistogram[] = 50 const char kUMAProxyStartupStateHistogram[] =
42 "DataReductionProxy.StartupState"; 51 "DataReductionProxy.StartupState";
43 52
44 // Key of the UMA DataReductionProxy.ProbeURL histogram. 53 // Key of the UMA DataReductionProxy.ProbeURL histogram.
45 const char kUMAProxyProbeURL[] = "DataReductionProxy.ProbeURL"; 54 const char kUMAProxyProbeURL[] = "DataReductionProxy.ProbeURL";
46 55
56 // Record a network change event.
57 void RecordNetworkChangeEvent(DataReductionProxyNetworkChangeEvent event) {
58 UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.NetworkChangeEvents",
59 event,
60 CHANGE_EVENT_COUNT);
61 }
62
47 int64 GetInt64PrefValue(const base::ListValue& list_value, size_t index) { 63 int64 GetInt64PrefValue(const base::ListValue& list_value, size_t index) {
48 int64 val = 0; 64 int64 val = 0;
49 std::string pref_value; 65 std::string pref_value;
50 bool rv = list_value.GetString(index, &pref_value); 66 bool rv = list_value.GetString(index, &pref_value);
51 DCHECK(rv); 67 DCHECK(rv);
52 if (rv) { 68 if (rv) {
53 rv = base::StringToInt64(pref_value, &val); 69 rv = base::StringToInt64(pref_value, &val);
54 DCHECK(rv); 70 DCHECK(rv);
55 } 71 }
56 return val; 72 return val;
57 } 73 }
58 74
59 bool IsEnabledOnCommandLine() { 75 bool IsEnabledOnCommandLine() {
60 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 76 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
61 return command_line.HasSwitch( 77 return command_line.HasSwitch(
62 data_reduction_proxy::switches::kEnableDataReductionProxy); 78 data_reduction_proxy::switches::kEnableDataReductionProxy);
63 } 79 }
64 80
65 } // namespace 81 } // namespace
66 82
67 namespace data_reduction_proxy { 83 namespace data_reduction_proxy {
68 84
69 DataReductionProxySettings::DataReductionProxySettings( 85 DataReductionProxySettings::DataReductionProxySettings(
70 DataReductionProxyParams* params) 86 DataReductionProxyParams* params)
71 : restricted_by_carrier_(false), 87 : restricted_by_carrier_(false),
72 enabled_by_user_(false), 88 enabled_by_user_(false),
89 disabled_on_vpn_(false),
73 prefs_(NULL), 90 prefs_(NULL),
74 local_state_prefs_(NULL), 91 local_state_prefs_(NULL),
75 url_request_context_getter_(NULL), 92 url_request_context_getter_(NULL) {
76 usage_stats_(NULL) {
77 DCHECK(params); 93 DCHECK(params);
78 params_.reset(params); 94 params_.reset(params);
79 } 95 }
80 96
81 DataReductionProxySettings::~DataReductionProxySettings() { 97 DataReductionProxySettings::~DataReductionProxySettings() {
82 if (params_->allowed()) 98 if (params_->allowed())
83 spdy_proxy_auth_enabled_.Destroy(); 99 spdy_proxy_auth_enabled_.Destroy();
84 } 100 }
85 101
86 void DataReductionProxySettings::InitPrefMembers() { 102 void DataReductionProxySettings::InitPrefMembers() {
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 kOn + std::string(" ") + (restricted ? kRestricted : kUnrestricted); 321 kOn + std::string(" ") + (restricted ? kRestricted : kUnrestricted);
306 322
307 LOG(WARNING) << "SPDY proxy " << (enabled ? annotated_on : kOff) 323 LOG(WARNING) << "SPDY proxy " << (enabled ? annotated_on : kOff)
308 << " " << (at_startup ? kAtStartup : kByUser); 324 << " " << (at_startup ? kAtStartup : kByUser);
309 } 325 }
310 326
311 void DataReductionProxySettings::OnIPAddressChanged() { 327 void DataReductionProxySettings::OnIPAddressChanged() {
312 DCHECK(thread_checker_.CalledOnValidThread()); 328 DCHECK(thread_checker_.CalledOnValidThread());
313 if (enabled_by_user_) { 329 if (enabled_by_user_) {
314 DCHECK(params_->allowed()); 330 DCHECK(params_->allowed());
331 RecordNetworkChangeEvent(IP_CHANGED);
332 if (DisableIfVPN())
333 return;
315 ProbeWhetherDataReductionProxyIsAvailable(); 334 ProbeWhetherDataReductionProxyIsAvailable();
316 WarmProxyConnection(); 335 WarmProxyConnection();
317 } 336 }
318 } 337 }
319 338
320 void DataReductionProxySettings::OnProxyEnabledPrefChange() { 339 void DataReductionProxySettings::OnProxyEnabledPrefChange() {
321 DCHECK(thread_checker_.CalledOnValidThread()); 340 DCHECK(thread_checker_.CalledOnValidThread());
322 if (!params_->allowed()) 341 if (!params_->allowed())
323 return; 342 return;
324 MaybeActivateDataReductionProxy(false); 343 MaybeActivateDataReductionProxy(false);
(...skipping 28 matching lines...) Expand all
353 // TODO(marq): Consider moving this so stats are wiped the first time the 372 // TODO(marq): Consider moving this so stats are wiped the first time the
354 // proxy settings are actually (not maybe) turned on. 373 // proxy settings are actually (not maybe) turned on.
355 if (spdy_proxy_auth_enabled_.GetValue() && 374 if (spdy_proxy_auth_enabled_.GetValue() &&
356 !prefs->GetBoolean(prefs::kDataReductionProxyWasEnabledBefore)) { 375 !prefs->GetBoolean(prefs::kDataReductionProxyWasEnabledBefore)) {
357 prefs->SetBoolean(prefs::kDataReductionProxyWasEnabledBefore, true); 376 prefs->SetBoolean(prefs::kDataReductionProxyWasEnabledBefore, true);
358 ResetDataReductionStatistics(); 377 ResetDataReductionStatistics();
359 } 378 }
360 379
361 // Configure use of the data reduction proxy if it is enabled. 380 // Configure use of the data reduction proxy if it is enabled.
362 enabled_by_user_= IsDataReductionProxyEnabled(); 381 enabled_by_user_= IsDataReductionProxyEnabled();
363 SetProxyConfigs(enabled_by_user_, 382 SetProxyConfigs(enabled_by_user_ && !disabled_on_vpn_,
364 IsDataReductionProxyAlternativeEnabled(), 383 IsDataReductionProxyAlternativeEnabled(),
365 restricted_by_carrier_, 384 restricted_by_carrier_,
366 at_startup); 385 at_startup);
367 386
368 // Check if the proxy has been restricted explicitly by the carrier. 387 // Check if the proxy has been restricted explicitly by the carrier.
369 if (enabled_by_user_) { 388 if (enabled_by_user_ && !disabled_on_vpn_) {
370 ProbeWhetherDataReductionProxyIsAvailable(); 389 ProbeWhetherDataReductionProxyIsAvailable();
371 WarmProxyConnection(); 390 WarmProxyConnection();
372 } 391 }
373 } 392 }
374 393
375 void DataReductionProxySettings::SetProxyConfigs(bool enabled, 394 void DataReductionProxySettings::SetProxyConfigs(bool enabled,
376 bool alternative_enabled, 395 bool alternative_enabled,
377 bool restricted, 396 bool restricted,
378 bool at_startup) { 397 bool at_startup) {
379 DCHECK(thread_checker_.CalledOnValidThread()); 398 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 result, 438 result,
420 PROBE_URL_FETCH_RESULT_COUNT); 439 PROBE_URL_FETCH_RESULT_COUNT);
421 } 440 }
422 441
423 void DataReductionProxySettings::RecordStartupState(ProxyStartupState state) { 442 void DataReductionProxySettings::RecordStartupState(ProxyStartupState state) {
424 UMA_HISTOGRAM_ENUMERATION(kUMAProxyStartupStateHistogram, 443 UMA_HISTOGRAM_ENUMERATION(kUMAProxyStartupStateHistogram,
425 state, 444 state,
426 PROXY_STARTUP_STATE_COUNT); 445 PROXY_STARTUP_STATE_COUNT);
427 } 446 }
428 447
448 void DataReductionProxySettings::GetNetworkList(
449 net::NetworkInterfaceList* interfaces,
450 int policy) {
451 net::GetNetworkList(interfaces, policy);
452 }
453
429 void DataReductionProxySettings::ResetParamsForTest( 454 void DataReductionProxySettings::ResetParamsForTest(
430 DataReductionProxyParams* params) { 455 DataReductionProxyParams* params) {
431 params_.reset(params); 456 params_.reset(params);
432 } 457 }
433 458
434 DataReductionProxySettings::ContentLengthList 459 DataReductionProxySettings::ContentLengthList
435 DataReductionProxySettings::GetDailyContentLengths(const char* pref_name) { 460 DataReductionProxySettings::GetDailyContentLengths(const char* pref_name) {
436 DCHECK(thread_checker_.CalledOnValidThread()); 461 DCHECK(thread_checker_.CalledOnValidThread());
437 DataReductionProxySettings::ContentLengthList content_lengths; 462 DataReductionProxySettings::ContentLengthList content_lengths;
438 const base::ListValue* list_value = GetLocalStatePrefs()->GetList(pref_name); 463 const base::ListValue* list_value = GetLocalStatePrefs()->GetList(pref_name);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 i < kNumDaysInHistory; ++i) { 504 i < kNumDaysInHistory; ++i) {
480 orig += GetInt64PrefValue(*original_list, i); 505 orig += GetInt64PrefValue(*original_list, i);
481 recv += GetInt64PrefValue(*received_list, i); 506 recv += GetInt64PrefValue(*received_list, i);
482 } 507 }
483 *original_content_length = orig; 508 *original_content_length = orig;
484 *received_content_length = recv; 509 *received_content_length = recv;
485 *last_update_time = 510 *last_update_time =
486 local_state->GetInt64(prefs::kDailyHttpContentLengthLastUpdateDate); 511 local_state->GetInt64(prefs::kDailyHttpContentLengthLastUpdateDate);
487 } 512 }
488 513
489 // static
490 base::string16 DataReductionProxySettings::AuthHashForSalt(
491 int64 salt,
492 const std::string& key) {
493 std::string salted_key =
494 base::StringPrintf("%lld%s%lld",
495 static_cast<long long>(salt),
496 key.c_str(),
497 static_cast<long long>(salt));
498 return base::UTF8ToUTF16(base::MD5String(salted_key));
499 }
500
501 net::URLFetcher* DataReductionProxySettings::GetBaseURLFetcher( 514 net::URLFetcher* DataReductionProxySettings::GetBaseURLFetcher(
502 const GURL& gurl, 515 const GURL& gurl,
503 int load_flags) { 516 int load_flags) {
504 517
505 net::URLFetcher* fetcher = net::URLFetcher::Create(gurl, 518 net::URLFetcher* fetcher = net::URLFetcher::Create(gurl,
506 net::URLFetcher::GET, 519 net::URLFetcher::GET,
507 this); 520 this);
508 fetcher->SetLoadFlags(load_flags); 521 fetcher->SetLoadFlags(load_flags);
509 DCHECK(url_request_context_getter_); 522 DCHECK(url_request_context_getter_);
510 fetcher->SetRequestContext(url_request_context_getter_); 523 fetcher->SetRequestContext(url_request_context_getter_);
(...skipping 25 matching lines...) Expand all
536 } 549 }
537 550
538 void DataReductionProxySettings::WarmProxyConnection() { 551 void DataReductionProxySettings::WarmProxyConnection() {
539 net::URLFetcher* fetcher = GetURLFetcherForWarmup(); 552 net::URLFetcher* fetcher = GetURLFetcherForWarmup();
540 if (!fetcher) 553 if (!fetcher)
541 return; 554 return;
542 warmup_fetcher_.reset(fetcher); 555 warmup_fetcher_.reset(fetcher);
543 warmup_fetcher_->Start(); 556 warmup_fetcher_->Start();
544 } 557 }
545 558
559 bool DataReductionProxySettings::DisableIfVPN() {
560 net::NetworkInterfaceList network_interfaces;
561 GetNetworkList(&network_interfaces, 0);
562 // VPNs use a "tun" interface, so the presence of a "tun" interface indicates
563 // a VPN is in use.
564 // TODO(kundaji): Verify this works on Windows.
565 const std::string vpn_interface_name_prefix = "tun";
566 for (size_t i = 0; i < network_interfaces.size(); ++i) {
567 std::string interface_name = network_interfaces[i].name;
568 if (LowerCaseEqualsASCII(
569 interface_name.begin(),
570 interface_name.begin() + vpn_interface_name_prefix.size(),
571 vpn_interface_name_prefix.c_str())) {
572 SetProxyConfigs(false,
573 IsDataReductionProxyAlternativeEnabled(),
574 false,
575 false);
576 disabled_on_vpn_ = true;
577 RecordNetworkChangeEvent(DISABLED_ON_VPN);
578 return true;
579 }
580 }
581 if (disabled_on_vpn_) {
582 SetProxyConfigs(enabled_by_user_,
583 IsDataReductionProxyAlternativeEnabled(),
584 restricted_by_carrier_,
585 false);
586 }
587 disabled_on_vpn_ = false;
588 return false;
589 }
590
546 } // namespace data_reduction_proxy 591 } // namespace data_reduction_proxy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698