File: apn_migrator.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 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 (138 lines) | stat: -rw-r--r-- 5,899 bytes parent folder | download | duplicates (6)
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
133
134
135
136
137
138
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_NET_APN_MIGRATOR_H_
#define CHROME_BROWSER_ASH_NET_APN_MIGRATOR_H_

#include "base/containers/flat_set.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chromeos/ash/components/network/network_state_handler.h"
#include "chromeos/ash/components/network/network_state_handler_observer.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"

namespace ash {

class ManagedCellularPrefHandler;
class ManagedNetworkConfigurationHandler;
class NetworkMetadataStore;
class NetworkStateHandler;

// Handles migrating cellular networks' Access Point Names from the pre-revamp
// format to the revamped format (see go/launch/4210741) the first time each
// network is discovered with the kApnRevamp flag enabled.
class COMPONENT_EXPORT(CHROMEOS_NETWORK) ApnMigrator
    : public NetworkStateHandlerObserver {
 public:
  ApnMigrator(
      ManagedCellularPrefHandler* managed_cellular_pref_handler,
      ManagedNetworkConfigurationHandler* managed_network_configuration_handler,
      NetworkStateHandler* network_state_handler);
  ApnMigrator() = delete;
  ApnMigrator(const ApnMigrator&) = delete;
  ApnMigrator& operator=(const ApnMigrator&) = delete;
  ~ApnMigrator() override;

 private:
  friend class ApnMigratorTest;

  // NetworkStateHandlerObserver:
  void NetworkListChanged() override;

  void OnClearPropertiesSuccess(const std::string iccid);
  void OnClearPropertiesFailure(const std::string iccid,
                                const std::string guid,
                                const std::string& error_name);

  // Creates an ONC configuration object for the custom APN list Shill property
  // containing |apn_list|, and applies it for the cellular |network|.
  void SetShillCustomApnListForNetwork(const NetworkState& network,
                                       const base::Value::List* apn_list);

  void OnSetShillCustomApnListSuccess(const std::string iccid);
  void OnSetShillCustomApnListFailure(const std::string iccid,
                                      const std::string guid,
                                      const std::string& error_name);

  // Migrate the |network|'s custom APNs to the APN Revamp feature. If the
  // migration requires the network's managed properties, this function will
  // invoke an async call, and mark the network as "in migration".
  void MigrateNetwork(const NetworkState& network);

  // Finishes the migration process for networks that require managed properties
  // fields.
  void OnGetManagedProperties(std::string iccid,
                              std::string guid,
                              const std::string& service_path,
                              std::optional<base::Value::Dict> properties,
                              std::optional<std::string> error);

  // Helper func that creates the |default_apn| before creating the
  // |attach_apn|. If |can_use_default_apn_as_attach| is true, the |default_apn|
  // will be given the capability to attach as well.
  void CreateDefaultThenAttachCustomApns(
      chromeos::network_config::mojom::ApnPropertiesPtr attach_apn,
      chromeos::network_config::mojom::ApnPropertiesPtr default_apn,
      bool can_use_default_apn_as_attach,
      const std::string& guid,
      const std::string& iccid);

  void CreateCustomApn(const std::string& iccid,
                       const std::string& network_guid,
                       chromeos::network_config::mojom::ApnPropertiesPtr apn,
                       std::optional<base::OnceCallback<void(bool)>>
                           success_callback = std::nullopt);

  void CompleteMigrationAttempt(const std::string& iccid, bool success);

  base::flat_set<std::string> extract_iccids(
      NetworkStateHandler::NetworkStateList& network_list);

  bool has_iccids_changed(base::flat_set<std::string> new_iccids,
                          base::flat_set<std::string> old_iccids);

  void ResetOldIccidsForTesting();

  NetworkMetadataStore* GetNetworkMetadataStore();

  void set_network_metadata_store_for_testing(
      NetworkMetadataStore* network_metadata_store_for_testing) {
    network_metadata_store_for_testing_ = network_metadata_store_for_testing;
  }

  // ICCIDs that are currently being migrated.
  base::flat_set<std::string> iccids_in_migration_;

  // ICCIDs of networks that have been configured in shill with the appropriate
  // CustomAPNList. Networks must be updated in shill with the CustomAPNList
  // property each time the revamp flag is toggled.
  base::flat_set<std::string> shill_updated_iccids_;

  base::flat_set<std::string> old_iccids_;

  raw_ptr<ManagedCellularPrefHandler> managed_cellular_pref_handler_ = nullptr;
  raw_ptr<ManagedNetworkConfigurationHandler> network_configuration_handler_ =
      nullptr;
  raw_ptr<NetworkStateHandler> network_state_handler_ = nullptr;

  // NetworkMetadataStore may be created and destroyed multiple times
  // in ApnMigrator's lifetime, so a reference to NetworkMetadataStore
  // should not be held. See http://b/285014794#comment19 for more info.
  // Note that this should only be non-nullptr in unit tests.
  raw_ptr<NetworkMetadataStore> network_metadata_store_for_testing_ = nullptr;

  // Remote for sending requests to the CrosNetworkConfig service.
  mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig>
      remote_cros_network_config_;

  base::ScopedObservation<NetworkStateHandler, NetworkStateHandlerObserver>
      network_state_handler_observer_{this};
  base::WeakPtrFactory<ApnMigrator> weak_factory_{this};
};

}  // namespace ash

#endif  // CHROME_BROWSER_ASH_NET_APN_MIGRATOR_H_