File: ip_protection_proxy_config_manager_impl.h

package info (click to toggle)
chromium 139.0.7258.127-2
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 6,122,156 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (132 lines) | stat: -rw-r--r-- 4,599 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_IP_PROTECTION_COMMON_IP_PROTECTION_PROXY_CONFIG_MANAGER_IMPL_H_
#define COMPONENTS_IP_PROTECTION_COMMON_IP_PROTECTION_PROXY_CONFIG_MANAGER_IMPL_H_

#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>

#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "components/ip_protection/common/ip_protection_proxy_config_manager.h"

namespace net {

class ProxyChain;

}  // namespace net

namespace ip_protection {

class IpProtectionProxyConfigFetcher;
class IpProtectionCore;
struct GeoHint;

// The production implementation of IpProtectionProxyConfigManager.
class IpProtectionProxyConfigManagerImpl
    : public IpProtectionProxyConfigManager {
 public:
  explicit IpProtectionProxyConfigManagerImpl(
      IpProtectionCore* core,
      std::unique_ptr<IpProtectionProxyConfigFetcher> fetcher,
      bool disable_proxy_refreshing_for_testing = false);
  ~IpProtectionProxyConfigManagerImpl() override;

  // IpProtectionProxyConfigManager implementation.
  bool IsProxyListAvailable() override;
  const std::vector<net::ProxyChain>& ProxyList() override;
  const std::string& CurrentGeo() override;
  void RequestRefreshProxyList() override;

  // Set a callback to occur when the proxy list has been refreshed.
  void SetOnProxyListRefreshedForTesting(
      base::OnceClosure on_proxy_list_refreshed) {
    on_proxy_list_refreshed_for_testing_ = std::move(on_proxy_list_refreshed);
  }

  // Trigger a proxy list refresh.
  void EnableAndTriggerProxyListRefreshingForTesting() {
    EnableProxyListRefreshingForTesting();
    RefreshProxyList();
  }

  // Enable proxy refreshing.
  // This does not trigger an immediate proxy list refresh.
  void EnableProxyListRefreshingForTesting() {
    disable_proxy_refreshing_for_testing_ = false;
  }

  void SetProxyListForTesting(std::vector<net::ProxyChain> proxy_list,
                              std::optional<GeoHint> geo_hint);

  void EnableProxyListFetchIntervalFuzzingForTesting(bool enable);

 private:
  void RefreshProxyList();
  void ScheduleRefreshProxyList(base::TimeDelta delay);
  void OnGotProxyList(base::TimeTicks refresh_start_time_for_metrics,
                      std::optional<std::vector<net::ProxyChain>> proxy_list,
                      std::optional<GeoHint> geo_hint);
  bool IsProxyListOlderThanMinAge() const;
  base::TimeDelta FuzzProxyListFetchInterval(base::TimeDelta delay);

  // Latest fetched proxy list.
  std::vector<net::ProxyChain> proxy_list_;

  // Current geo of the proxy list.
  std::string current_geo_id_ = "";

  // True if an invocation of `fetcher_.GetProxyConfig()` is
  // outstanding.
  bool fetching_proxy_list_ = false;

  // True if the proxy list has been fetched at least once.
  bool have_fetched_proxy_list_ = false;

  // Pointer to the `IpProtectionCore` that holds the proxy list and
  // tokens. Required to observe geo changes from refreshed proxy lists.
  // The lifetime of the `IpProtectionCore` object WILL ALWAYS outlive
  // this class b/c `ip_protection_core_` owns this (at least outside of
  // testing).
  const raw_ptr<IpProtectionCore> ip_protection_core_;

  // Source of proxy list, when needed.
  std::unique_ptr<IpProtectionProxyConfigFetcher> fetcher_;

  // The last time this instance began refreshing the proxy list successfully.
  base::Time last_successful_proxy_list_refresh_;

  // The min age of the proxy list before an additional refresh is allowed.
  const base::TimeDelta proxy_list_min_age_;

  // The regular time interval where the proxy list is refreshed.
  const base::TimeDelta proxy_list_refresh_interval_;

  // If false, proxy list refresh interval is not fuzzed.
  bool enable_proxy_list_fetch_interval_fuzzing_ = true;

  // A timer to run `RefreshProxyList()` when necessary.
  base::OneShotTimer next_refresh_proxy_list_;

  // A callback triggered when an asynchronous proxy-list refresh is complete,
  // for use in testing.
  base::OnceClosure on_proxy_list_refreshed_for_testing_;

  // If true, do not try to automatically refresh the proxy list.
  bool disable_proxy_refreshing_for_testing_ = false;

  base::WeakPtrFactory<IpProtectionProxyConfigManagerImpl> weak_ptr_factory_{
      this};
};

}  // namespace ip_protection

#endif  // COMPONENTS_IP_PROTECTION_COMMON_IP_PROTECTION_PROXY_CONFIG_MANAGER_IMPL_H_