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

Side by Side Diff: components/arc/net/arc_net_host_impl.cc

Issue 1925083003: Notify ARC of default network changes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@wifi-change
Patch Set: rename a bunch of temporary variables Created 4 years, 7 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
« no previous file with comments | « components/arc/net/arc_net_host_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/arc/net/arc_net_host_impl.h" 5 #include "components/arc/net/arc_net_host_impl.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 11 matching lines...) Expand all
22 #include "chromeos/network/network_state_handler.h" 22 #include "chromeos/network/network_state_handler.h"
23 #include "chromeos/network/network_type_pattern.h" 23 #include "chromeos/network/network_type_pattern.h"
24 #include "chromeos/network/network_util.h" 24 #include "chromeos/network/network_util.h"
25 #include "chromeos/network/onc/onc_utils.h" 25 #include "chromeos/network/onc/onc_utils.h"
26 #include "components/arc/arc_bridge_service.h" 26 #include "components/arc/arc_bridge_service.h"
27 27
28 namespace { 28 namespace {
29 29
30 const int kGetNetworksListLimit = 100; 30 const int kGetNetworksListLimit = 100;
31 31
32 } // namespace
33
34 namespace arc {
35
36 chromeos::NetworkStateHandler* GetStateHandler() { 32 chromeos::NetworkStateHandler* GetStateHandler() {
37 return chromeos::NetworkHandler::Get()->network_state_handler(); 33 return chromeos::NetworkHandler::Get()->network_state_handler();
38 } 34 }
39 35
40 chromeos::ManagedNetworkConfigurationHandler* GetManagedConfigurationHandler() { 36 chromeos::ManagedNetworkConfigurationHandler* GetManagedConfigurationHandler() {
41 return chromeos::NetworkHandler::Get() 37 return chromeos::NetworkHandler::Get()
42 ->managed_network_configuration_handler(); 38 ->managed_network_configuration_handler();
43 } 39 }
44 40
45 chromeos::NetworkConnectionHandler* GetNetworkConnectionHandler() { 41 chromeos::NetworkConnectionHandler* GetNetworkConnectionHandler() {
46 return chromeos::NetworkHandler::Get()->network_connection_handler(); 42 return chromeos::NetworkHandler::Get()->network_connection_handler();
47 } 43 }
48 44
49 bool IsDeviceOwner() { 45 bool IsDeviceOwner() {
50 // Check whether the logged-in Chrome OS user is allowed to add or 46 // Check whether the logged-in Chrome OS user is allowed to add or
51 // remove WiFi networks. 47 // remove WiFi networks.
52 return chromeos::LoginState::Get()->GetLoggedInUserType() == 48 return chromeos::LoginState::Get()->GetLoggedInUserType() ==
53 chromeos::LoginState::LOGGED_IN_USER_OWNER; 49 chromeos::LoginState::LOGGED_IN_USER_OWNER;
54 } 50 }
55 51
52 std::string GetStringFromOncDictionary(const base::DictionaryValue* dict,
53 const char* key,
54 bool required) {
55 std::string value;
56 dict->GetString(key, &value);
57 if (required && value.empty())
58 NOTREACHED();
59 return value;
60 }
61
62 arc::mojom::SecurityType TranslateONCWifiSecurityType(
63 const base::DictionaryValue* dict) {
64 std::string type = GetStringFromOncDictionary(dict, onc::wifi::kSecurity,
65 true /* required */);
66 if (type == onc::wifi::kWEP_PSK)
67 return arc::mojom::SecurityType::WEP_PSK;
68 else if (type == onc::wifi::kWEP_8021X)
69 return arc::mojom::SecurityType::WEP_8021X;
70 else if (type == onc::wifi::kWPA_PSK)
71 return arc::mojom::SecurityType::WPA_PSK;
72 else if (type == onc::wifi::kWPA_EAP)
73 return arc::mojom::SecurityType::WPA_EAP;
74 else
75 return arc::mojom::SecurityType::NONE;
76 }
77
78 arc::mojom::WiFiPtr TranslateONCWifi(const base::DictionaryValue* dict) {
79 arc::mojom::WiFiPtr wifi = arc::mojom::WiFi::New();
80
81 // Optional; defaults to 0.
82 dict->GetInteger(onc::wifi::kFrequency, &wifi->frequency);
83
84 wifi->bssid =
85 GetStringFromOncDictionary(dict, onc::wifi::kBSSID, false /* required */);
86 wifi->hex_ssid = GetStringFromOncDictionary(dict, onc::wifi::kHexSSID,
87 true /* required */);
88
89 // Optional; defaults to false.
90 dict->GetBoolean(onc::wifi::kHiddenSSID, &wifi->hidden_ssid);
91
92 wifi->security = TranslateONCWifiSecurityType(dict);
93
94 // Optional; defaults to 0.
95 dict->GetInteger(onc::wifi::kSignalStrength, &wifi->signal_strength);
96
97 return wifi;
98 }
99
100 mojo::Array<mojo::String> TranslateStringArray(const base::ListValue* list) {
101 mojo::Array<mojo::String> strings = mojo::Array<mojo::String>::New(0);
102
103 for (size_t i = 0; i < list->GetSize(); i++) {
104 std::string value;
105 list->GetString(i, &value);
106 DCHECK(!value.empty());
107 strings.push_back(static_cast<mojo::String>(value));
108 }
109
110 return strings;
111 }
112
113 mojo::Array<arc::mojom::IPConfigurationPtr> TranslateONCIPConfigs(
114 const base::ListValue* list) {
115 mojo::Array<arc::mojom::IPConfigurationPtr> configs =
116 mojo::Array<arc::mojom::IPConfigurationPtr>::New(0);
117
118 for (size_t i = 0; i < list->GetSize(); i++) {
119 const base::DictionaryValue* ip_dict = nullptr;
120 arc::mojom::IPConfigurationPtr configuration =
121 arc::mojom::IPConfiguration::New();
122
123 list->GetDictionary(i, &ip_dict);
124 DCHECK(ip_dict);
125
126 configuration->gateway = GetStringFromOncDictionary(
127 ip_dict, onc::ipconfig::kGateway, true /* required */);
128 configuration->ip_address = GetStringFromOncDictionary(
129 ip_dict, onc::ipconfig::kIPAddress, true /* required */);
130
131 const base::ListValue* dns_list;
132 if (!ip_dict->GetList(onc::ipconfig::kNameServers, &dns_list))
133 NOTREACHED();
134 configuration->name_servers = TranslateStringArray(dns_list);
135
136 if (!ip_dict->GetInteger(onc::ipconfig::kRoutingPrefix,
137 &configuration->routing_prefix)) {
138 NOTREACHED();
139 }
140
141 std::string type = GetStringFromOncDictionary(ip_dict, onc::ipconfig::kType,
142 true /* required */);
143 configuration->type = type == onc::ipconfig::kIPv6
144 ? arc::mojom::IPAddressType::IPV6
145 : arc::mojom::IPAddressType::IPV4;
146
147 configuration->web_proxy_auto_discovery_url = GetStringFromOncDictionary(
148 ip_dict, onc::ipconfig::kWebProxyAutoDiscoveryUrl, true /* required */);
149
150 configs.push_back(std::move(configuration));
151 }
152 return configs;
153 }
154
155 arc::mojom::ConnectionStateType TranslateONCConnectionState(
156 const base::DictionaryValue* dict) {
157 std::string connection_state = GetStringFromOncDictionary(
158 dict, onc::network_config::kConnectionState, true /* required */);
159
160 if (connection_state == onc::connection_state::kConnected)
161 return arc::mojom::ConnectionStateType::CONNECTED;
162 else if (connection_state == onc::connection_state::kConnecting)
163 return arc::mojom::ConnectionStateType::CONNECTING;
164 else if (connection_state == onc::connection_state::kNotConnected)
165 return arc::mojom::ConnectionStateType::NOT_CONNECTED;
166
167 NOTREACHED();
168 return arc::mojom::ConnectionStateType::NOT_CONNECTED;
169 }
170
171 void TranslateONCNetworkTypeDetails(const base::DictionaryValue* dict,
172 arc::mojom::NetworkConfiguration* mojo) {
173 std::string type = GetStringFromOncDictionary(
174 dict, onc::network_config::kType, true /* required */);
175 if (type == onc::network_type::kCellular) {
176 mojo->type = arc::mojom::NetworkType::CELLULAR;
177 } else if (type == onc::network_type::kEthernet) {
178 mojo->type = arc::mojom::NetworkType::ETHERNET;
179 } else if (type == onc::network_type::kVPN) {
180 mojo->type = arc::mojom::NetworkType::VPN;
181 } else if (type == onc::network_type::kWiFi) {
182 mojo->type = arc::mojom::NetworkType::WIFI;
183
184 const base::DictionaryValue* wifi_dict = nullptr;
185 dict->GetDictionary(onc::network_config::kWiFi, &wifi_dict);
186 DCHECK(wifi_dict);
187 mojo->wifi = TranslateONCWifi(wifi_dict);
188 } else if (type == onc::network_type::kWimax) {
189 mojo->type = arc::mojom::NetworkType::WIMAX;
190 } else {
191 NOTREACHED();
192 }
193 }
194
195 arc::mojom::NetworkConfigurationPtr TranslateONCConfiguration(
196 const base::DictionaryValue* dict) {
197 arc::mojom::NetworkConfigurationPtr mojo =
198 arc::mojom::NetworkConfiguration::New();
199
200 mojo->connection_state = TranslateONCConnectionState(dict);
201
202 mojo->guid = GetStringFromOncDictionary(dict, onc::network_config::kGUID,
203 true /* required */);
204
205 const base::ListValue* ip_config_list = nullptr;
206 if (dict->GetList(onc::network_config::kIPConfigs, &ip_config_list)) {
207 DCHECK(ip_config_list);
208 mojo->ip_configs = TranslateONCIPConfigs(ip_config_list);
209 }
210
211 mojo->guid = GetStringFromOncDictionary(dict, onc::network_config::kGUID,
212 true /* required */);
213 mojo->mac_address = GetStringFromOncDictionary(
214 dict, onc::network_config::kMacAddress, true /* required */);
215 TranslateONCNetworkTypeDetails(dict, mojo.get());
216
217 return mojo;
218 }
219
220 } // namespace
221
222 namespace arc {
223
56 ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* bridge_service) 224 ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* bridge_service)
57 : ArcService(bridge_service), binding_(this) { 225 : ArcService(bridge_service), binding_(this) {
58 arc_bridge_service()->AddObserver(this); 226 arc_bridge_service()->AddObserver(this);
59 GetStateHandler()->AddObserver(this, FROM_HERE); 227 GetStateHandler()->AddObserver(this, FROM_HERE);
60 } 228 }
61 229
62 ArcNetHostImpl::~ArcNetHostImpl() { 230 ArcNetHostImpl::~ArcNetHostImpl() {
63 DCHECK(thread_checker_.CalledOnValidThread()); 231 DCHECK(thread_checker_.CalledOnValidThread());
64 arc_bridge_service()->RemoveObserver(this); 232 arc_bridge_service()->RemoveObserver(this);
65 if (chromeos::NetworkHandler::IsInitialized()) { 233 if (chromeos::NetworkHandler::IsInitialized()) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 VLOG(1) << "CreateNetworkSuccessCallback"; 348 VLOG(1) << "CreateNetworkSuccessCallback";
181 mojo_callback.Run(guid); 349 mojo_callback.Run(guid);
182 } 350 }
183 351
184 void CreateNetworkFailureCallback( 352 void CreateNetworkFailureCallback(
185 const arc::mojom::NetHost::CreateNetworkCallback& mojo_callback, 353 const arc::mojom::NetHost::CreateNetworkCallback& mojo_callback,
186 const std::string& error_name, 354 const std::string& error_name,
187 std::unique_ptr<base::DictionaryValue> error_data) { 355 std::unique_ptr<base::DictionaryValue> error_data) {
188 VLOG(1) << "CreateNetworkFailureCallback: " << error_name; 356 VLOG(1) << "CreateNetworkFailureCallback: " << error_name;
189 mojo_callback.Run(""); 357 mojo_callback.Run("");
190 } 358 }
stevenjb 2016/05/18 23:01:17 Move these two to anon namespace.
Kevin Cernekee 2016/05/18 23:24:53 Done.
191 359
192 void ArcNetHostImpl::CreateNetwork(mojom::WifiConfigurationPtr cfg, 360 void ArcNetHostImpl::CreateNetwork(mojom::WifiConfigurationPtr cfg,
193 const CreateNetworkCallback& callback) { 361 const CreateNetworkCallback& callback) {
194 if (!IsDeviceOwner()) { 362 if (!IsDeviceOwner()) {
195 callback.Run(""); 363 callback.Run("");
196 return; 364 return;
197 } 365 }
198 366
199 std::unique_ptr<base::DictionaryValue> properties(new base::DictionaryValue); 367 std::unique_ptr<base::DictionaryValue> properties(new base::DictionaryValue);
200 std::unique_ptr<base::DictionaryValue> wifi_dict(new base::DictionaryValue); 368 std::unique_ptr<base::DictionaryValue> wifi_dict(new base::DictionaryValue);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 const arc::mojom::NetHost::ForgetNetworkCallback& mojo_callback) { 408 const arc::mojom::NetHost::ForgetNetworkCallback& mojo_callback) {
241 mojo_callback.Run(mojom::NetworkResult::SUCCESS); 409 mojo_callback.Run(mojom::NetworkResult::SUCCESS);
242 } 410 }
243 411
244 void ForgetNetworkFailureCallback( 412 void ForgetNetworkFailureCallback(
245 const arc::mojom::NetHost::ForgetNetworkCallback& mojo_callback, 413 const arc::mojom::NetHost::ForgetNetworkCallback& mojo_callback,
246 const std::string& error_name, 414 const std::string& error_name,
247 std::unique_ptr<base::DictionaryValue> error_data) { 415 std::unique_ptr<base::DictionaryValue> error_data) {
248 VLOG(1) << "ForgetNetworkFailureCallback: " << error_name; 416 VLOG(1) << "ForgetNetworkFailureCallback: " << error_name;
249 mojo_callback.Run(mojom::NetworkResult::FAILURE); 417 mojo_callback.Run(mojom::NetworkResult::FAILURE);
250 } 418 }
stevenjb 2016/05/18 23:01:17 Move these two to anon namespace.
Kevin Cernekee 2016/05/18 23:24:53 Done.
251 419
252 void ArcNetHostImpl::ForgetNetwork(const mojo::String& guid, 420 void ArcNetHostImpl::ForgetNetwork(const mojo::String& guid,
253 const ForgetNetworkCallback& callback) { 421 const ForgetNetworkCallback& callback) {
254 if (!IsDeviceOwner()) { 422 if (!IsDeviceOwner()) {
255 callback.Run(mojom::NetworkResult::FAILURE); 423 callback.Run(mojom::NetworkResult::FAILURE);
256 return; 424 return;
257 } 425 }
258 426
259 const chromeos::NetworkState* network = 427 const chromeos::NetworkState* network =
260 GetStateHandler()->GetNetworkStateFromGuid(guid); 428 GetStateHandler()->GetNetworkStateFromGuid(guid);
(...skipping 12 matching lines...) Expand all
273 const arc::mojom::NetHost::StartConnectCallback& mojo_callback) { 441 const arc::mojom::NetHost::StartConnectCallback& mojo_callback) {
274 mojo_callback.Run(mojom::NetworkResult::SUCCESS); 442 mojo_callback.Run(mojom::NetworkResult::SUCCESS);
275 } 443 }
276 444
277 void StartConnectFailureCallback( 445 void StartConnectFailureCallback(
278 const arc::mojom::NetHost::StartConnectCallback& mojo_callback, 446 const arc::mojom::NetHost::StartConnectCallback& mojo_callback,
279 const std::string& error_name, 447 const std::string& error_name,
280 std::unique_ptr<base::DictionaryValue> error_data) { 448 std::unique_ptr<base::DictionaryValue> error_data) {
281 VLOG(1) << "StartConnectFailureCallback: " << error_name; 449 VLOG(1) << "StartConnectFailureCallback: " << error_name;
282 mojo_callback.Run(mojom::NetworkResult::FAILURE); 450 mojo_callback.Run(mojom::NetworkResult::FAILURE);
283 } 451 }
stevenjb 2016/05/18 23:01:17 Move these two to anon namespace.
Kevin Cernekee 2016/05/18 23:24:53 Done.
284 452
285 void ArcNetHostImpl::StartConnect(const mojo::String& guid, 453 void ArcNetHostImpl::StartConnect(const mojo::String& guid,
286 const StartConnectCallback& callback) { 454 const StartConnectCallback& callback) {
287 const chromeos::NetworkState* network = 455 const chromeos::NetworkState* network =
288 GetStateHandler()->GetNetworkStateFromGuid(guid); 456 GetStateHandler()->GetNetworkStateFromGuid(guid);
289 457
290 if (!network) { 458 if (!network) {
291 callback.Run(mojom::NetworkResult::FAILURE); 459 callback.Run(mojom::NetworkResult::FAILURE);
292 return; 460 return;
293 } 461 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 return; 531 return;
364 } 532 }
365 if (arc_bridge_service()->net_version() < 1) { 533 if (arc_bridge_service()->net_version() < 1) {
366 VLOG(1) << "NetInstance does not support ScanCompleted."; 534 VLOG(1) << "NetInstance does not support ScanCompleted.";
367 return; 535 return;
368 } 536 }
369 537
370 arc_bridge_service()->net_instance()->ScanCompleted(); 538 arc_bridge_service()->net_instance()->ScanCompleted();
371 } 539 }
372 540
541 void GetDefaultNetworkSuccessCallback(
542 const ArcNetHostImpl::GetDefaultNetworkCallback& callback,
543 const std::string& service_path,
544 const base::DictionaryValue& dictionary) {
545 // TODO(cernekee): Figure out how to query Chrome for the default physical
546 // service if a VPN is connected, rather than just reporting the
547 // default logical service in both fields.
548 callback.Run(TranslateONCConfiguration(&dictionary),
549 TranslateONCConfiguration(&dictionary));
550 }
551
552 void GetDefaultNetworkFailureCallback(
553 const ArcNetHostImpl::GetDefaultNetworkCallback& callback,
554 const std::string& error_name,
555 std::unique_ptr<base::DictionaryValue> error_data) {
556 LOG(ERROR) << "Failed to query default logical network";
557 callback.Run(nullptr, nullptr);
558 }
stevenjb 2016/05/18 23:01:17 Move these two to anon namespace.
Kevin Cernekee 2016/05/18 23:24:53 Done.
559
560 void ArcNetHostImpl::GetDefaultNetwork(
561 const GetDefaultNetworkCallback& callback) {
562 const chromeos::NetworkState* default_network =
563 GetStateHandler()->DefaultNetwork();
564 if (!default_network) {
565 VLOG(1) << "GetDefaultNetwork: no default network";
566 callback.Run(nullptr, nullptr);
567 return;
568 }
569 VLOG(1) << "GetDefaultNetwork: default network is "
570 << default_network->path();
571 std::string user_id_hash = chromeos::LoginState::Get()->primary_user_hash();
572 GetManagedConfigurationHandler()->GetProperties(
573 user_id_hash, default_network->path(),
574 base::Bind(&GetDefaultNetworkSuccessCallback, callback),
575 base::Bind(&GetDefaultNetworkFailureCallback, callback));
576 }
577
578 void DefaultNetworkSuccessCallback(ArcNetHostImpl* instance,
579 const std::string& service_path,
580 const base::DictionaryValue& dictionary) {
581 instance->arc_bridge_service()->net_instance()->DefaultNetworkChanged(
582 TranslateONCConfiguration(&dictionary),
583 TranslateONCConfiguration(&dictionary));
584 }
stevenjb 2016/05/18 23:01:17 See comment below.
Kevin Cernekee 2016/05/18 23:24:53 Done.
585
586 void DefaultNetworkFailureCallback(
587 const std::string& error_name,
588 std::unique_ptr<base::DictionaryValue> error_data) {
589 LOG(ERROR) << "Failed to query default logical network";
590 }
591
stevenjb 2016/05/18 23:01:17 Move this to anon namespace.
Kevin Cernekee 2016/05/18 23:24:53 Done.
592 void ArcNetHostImpl::DefaultNetworkChanged(
593 const chromeos::NetworkState* network) {
594 if (arc_bridge_service()->net_version() < 2) {
595 VLOG(1) << "ArcBridgeService does not support DefaultNetworkChanged.";
596 return;
597 }
598
599 if (!network) {
600 VLOG(1) << "No default network";
601 arc_bridge_service()->net_instance()->DefaultNetworkChanged(nullptr,
602 nullptr);
603 return;
604 }
605
606 VLOG(1) << "New default network: " << network->path();
607 std::string user_id_hash = chromeos::LoginState::Get()->primary_user_hash();
608 GetManagedConfigurationHandler()->GetProperties(
609 user_id_hash, network->path(),
610 base::Bind(&DefaultNetworkSuccessCallback, base::Unretained(this)),
dcheng 2016/05/18 22:31:57 Why is Unretained safe here?
stevenjb 2016/05/18 23:01:17 +1, I missed this (I was mostly focused on the Net
Kevin Cernekee 2016/05/18 23:24:53 Done.
611 base::Bind(&DefaultNetworkFailureCallback));
612 }
613
373 void ArcNetHostImpl::OnShuttingDown() { 614 void ArcNetHostImpl::OnShuttingDown() {
374 GetStateHandler()->RemoveObserver(this, FROM_HERE); 615 GetStateHandler()->RemoveObserver(this, FROM_HERE);
375 } 616 }
376 617
377 } // namespace arc 618 } // namespace arc
OLDNEW
« no previous file with comments | « components/arc/net/arc_net_host_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698