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

Side by Side Diff: chrome/browser/extensions/api/networking_private/networking_private_chromeos.cc

Issue 378103002: Add NetworkingPrivateDelegate class (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/extensions/api/networking_private/networking_private_ch romeos.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/callback.h"
10 #include "chrome/browser/chromeos/profiles/profile_helper.h"
11 #include "chrome/browser/extensions/api/networking_private/networking_private_ap i.h"
12 #include "chrome/common/extensions/api/networking_private.h"
13 #include "chromeos/dbus/dbus_thread_manager.h"
14 #include "chromeos/dbus/shill_manager_client.h"
15 #include "chromeos/login/login_state.h"
16 #include "chromeos/network/managed_network_configuration_handler.h"
17 #include "chromeos/network/network_connection_handler.h"
18 #include "chromeos/network/network_device_handler.h"
19 #include "chromeos/network/network_event_log.h"
20 #include "chromeos/network/network_state.h"
21 #include "chromeos/network/network_state_handler.h"
22 #include "chromeos/network/network_util.h"
23 #include "chromeos/network/onc/onc_signature.h"
24 #include "chromeos/network/onc/onc_translator.h"
25 #include "chromeos/network/onc/onc_utils.h"
26 #include "chromeos/network/portal_detector/network_portal_detector.h"
27 #include "components/onc/onc_constants.h"
28 #include "content/public/browser/browser_context.h"
29
30 using chromeos::NetworkHandler;
31 using chromeos::NetworkTypePattern;
32 using chromeos::ShillManagerClient;
33 using extensions::NetworkingPrivateDelegate;
34
35 namespace {
36
37 chromeos::ShillManagerClient* GetShillManagerClient() {
38 return chromeos::DBusThreadManager::Get()->GetShillManagerClient();
39 }
40
41 chromeos::NetworkStateHandler* GetStateHandler() {
42 return NetworkHandler::Get()->network_state_handler();
43 }
44
45 chromeos::ManagedNetworkConfigurationHandler* GetManagedConfigurationHandler() {
46 return NetworkHandler::Get()->managed_network_configuration_handler();
47 }
48
49 ShillManagerClient::VerificationProperties ConvertVerificationProperties(
50 const base::DictionaryValue& input) {
51 ShillManagerClient::VerificationProperties output;
52 // These keys are described in networking_private.json but not defined
53 // anywhere as constants.
54 input.GetStringWithoutPathExpansion("certificate", &output.certificate);
pneubeck (no reviews) 2014/07/14 21:33:57 IMO, a layer violation
stevenjb 2014/07/15 00:33:40 Acknowledged.
55 input.GetStringWithoutPathExpansion("publicKey", &output.public_key);
56 input.GetStringWithoutPathExpansion("nonce", &output.nonce);
57 input.GetStringWithoutPathExpansion("signedData", &output.signed_data);
58 input.GetStringWithoutPathExpansion("deviceSerial", &output.device_serial);
59 input.GetStringWithoutPathExpansion("deviceSsid", &output.device_ssid);
60 input.GetStringWithoutPathExpansion("deviceBssid", &output.device_bssid);
61 return output;
62 }
63
64 bool GetServicePathFromGuid(const std::string& guid,
65 std::string* service_path,
66 std::string* error) {
67 const chromeos::NetworkState* network =
68 GetStateHandler()->GetNetworkStateFromGuid(guid);
69 if (!network) {
70 *error = extensions::networking_private::kErrorInvalidNetworkGuid;
pneubeck (no reviews) 2014/07/14 21:33:57 again, I think, a layer violation. Not so, if the
stevenjb 2014/07/15 00:33:40 See meta-comment.
71 return false;
72 }
73 *service_path = network->path();
74 return true;
75 }
76
77 bool GetUserIdHash(content::BrowserContext* browser_context,
78 std::string* user_hash,
79 std::string* error) {
80 std::string profile_user_hash =
81 chromeos::ProfileHelper::GetUserIdHashFromProfile(
pneubeck (no reviews) 2014/07/14 21:33:58 this dependency should be in the factory, to keep
stevenjb 2014/07/15 00:33:39 Hmm, I'm not convinced of the value in that. This
pneubeck (no reviews) 2014/07/15 09:56:28 Moving dependencies to a factory is not only helpf
82 static_cast<Profile*>(browser_context));
83
84 // Currently Chrome OS only configures networks for the primary user.
85 // Configuration attempts from other browser contexts should fail.
86 // TODO(stevenjb): use an ExtensionsBrowserClient method to access
87 // ProfileHelper when moving this to src/extensions.
88 if (profile_user_hash != chromeos::LoginState::Get()->primary_user_hash()) {
89 // Disallow class requiring a user id hash from a non-primary user context
90 // to avoid complexites with the policy code.
pneubeck (no reviews) 2014/07/14 21:33:57 complications or complexities?
stevenjb 2014/07/15 00:33:39 Done.
91 LOG(ERROR) << "networkingPrivate API call from non primary user: "
92 << profile_user_hash;
93 *error = "Error.NonPrimaryUser";
94 return false;
95 }
96 *user_hash = profile_user_hash;
97 return true;
98 }
99
100 void NetworkHandlerDictionaryCallback(
101 const NetworkingPrivateDelegate::DictionaryCallback& callback,
102 const std::string& service_path,
103 const base::DictionaryValue& dictionary) {
104 scoped_ptr<base::DictionaryValue> dictionary_copy(dictionary.DeepCopy());
105 callback.Run(dictionary_copy.Pass());
106 }
107
108 void NetworkHandlerFailureCallback(
109 const NetworkingPrivateDelegate::FailureCallback& callback,
110 const std::string& error_name,
111 scoped_ptr<base::DictionaryValue> error_data) {
112 callback.Run(error_name);
113 }
114
115 void ShillFailureCallback(
116 const NetworkingPrivateDelegate::FailureCallback& callback,
117 const std::string& error_name,
118 const std::string& error_message) {
119 callback.Run(error_name);
120 }
121
122 } // namespace
123
124 ////////////////////////////////////////////////////////////////////////////////
125
126 namespace extensions {
127
128 NetworkingPrivateChromeOS::NetworkingPrivateChromeOS(
129 content::BrowserContext* browser_context)
130 : browser_context_(browser_context) {
pneubeck (no reviews) 2014/07/14 21:33:58 as mentioned above, please get the user hash once
stevenjb 2014/07/15 00:33:40 Acknowledged.
131 }
132
133 NetworkingPrivateChromeOS::~NetworkingPrivateChromeOS() {}
134
135 void NetworkingPrivateChromeOS::GetProperties(
136 const std::string& guid,
137 const DictionaryCallback& success_callback,
138 const FailureCallback& failure_callback) {
139 std::string service_path, error;
140 if (!GetServicePathFromGuid(guid, &service_path, &error)) {
141 failure_callback.Run(error);
142 return;
143 }
144
145 GetManagedConfigurationHandler()->GetProperties(
146 service_path,
147 base::Bind(&NetworkHandlerDictionaryCallback, success_callback),
148 base::Bind(&NetworkHandlerFailureCallback, failure_callback));
149 }
150
151 void NetworkingPrivateChromeOS::GetManagedProperties(
152 const std::string& guid,
153 const DictionaryCallback& success_callback,
154 const FailureCallback& failure_callback) {
155 std::string service_path, error;
156 if (!GetServicePathFromGuid(guid, &service_path, &error)) {
157 failure_callback.Run(error);
158 return;
159 }
160
161 std::string user_id_hash;
162 if (!GetUserIdHash(browser_context_, &user_id_hash, &error)) {
163 failure_callback.Run(error);
164 return;
165 }
166
167 GetManagedConfigurationHandler()->GetManagedProperties(
168 user_id_hash,
169 service_path,
170 base::Bind(&NetworkHandlerDictionaryCallback, success_callback),
171 base::Bind(&NetworkHandlerFailureCallback, failure_callback));
172 }
173
174 void NetworkingPrivateChromeOS::GetState(
175 const std::string& guid,
176 const DictionaryCallback& success_callback,
177 const FailureCallback& failure_callback) {
178 std::string service_path, error;
179 if (!GetServicePathFromGuid(guid, &service_path, &error)) {
180 failure_callback.Run(error);
181 return;
182 }
183
184 const chromeos::NetworkState* network_state =
185 GetStateHandler()->GetNetworkStateFromServicePath(
186 service_path, false /* configured_only */);
187 if (!network_state) {
188 failure_callback.Run(networking_private::kErrorNetworkUnavailable);
189 return;
190 }
191
192 scoped_ptr<base::DictionaryValue> network_properties =
193 chromeos::network_util::TranslateNetworkStateToONC(network_state);
194
195 success_callback.Run(network_properties.Pass());
196 }
197
198 void NetworkingPrivateChromeOS::SetProperties(
199 const std::string& guid,
200 scoped_ptr<base::DictionaryValue> properties,
201 const VoidCallback& success_callback,
202 const FailureCallback& failure_callback) {
203 std::string service_path, error;
204 if (!GetServicePathFromGuid(guid, &service_path, &error)) {
205 failure_callback.Run(error);
206 return;
207 }
208
209 GetManagedConfigurationHandler()->SetProperties(
210 service_path,
211 *properties,
212 success_callback,
213 base::Bind(&NetworkHandlerFailureCallback, failure_callback));
214 }
215
216 void NetworkingPrivateChromeOS::CreateNetwork(
217 bool shared,
218 scoped_ptr<base::DictionaryValue> properties,
219 const StringCallback& success_callback,
220 const FailureCallback& failure_callback) {
221 std::string user_id_hash, error;
222 if (!shared && !GetUserIdHash(browser_context_, &user_id_hash, &error)) {
223 failure_callback.Run(error);
pneubeck (no reviews) 2014/07/14 21:33:58 optional nit: the old comment was no so bad: -
stevenjb 2014/07/15 00:33:39 Done.
224 return;
225 }
226
227 GetManagedConfigurationHandler()->CreateConfiguration(
228 user_id_hash,
229 *properties,
230 success_callback,
231 base::Bind(&NetworkHandlerFailureCallback, failure_callback));
232 }
233
234 void NetworkingPrivateChromeOS::GetNetworks(
235 const std::string& network_type,
236 bool configured_only,
237 bool visible_only,
238 int limit,
239 const NetworkListCallback& success_callback,
240 const FailureCallback& failure_callback) {
241 NetworkTypePattern pattern =
242 chromeos::onc::NetworkTypePatternFromOncType(network_type);
243 scoped_ptr<base::ListValue> network_properties_list =
244 chromeos::network_util::TranslateNetworkListToONC(
245 pattern, configured_only, visible_only, limit, false /* debugging */);
246 success_callback.Run(network_properties_list.Pass());
247 }
248
249 void NetworkingPrivateChromeOS::StartConnect(
250 const std::string& guid,
251 const VoidCallback& success_callback,
252 const FailureCallback& failure_callback) {
253 std::string service_path, error;
254 if (!GetServicePathFromGuid(guid, &service_path, &error)) {
255 failure_callback.Run(error);
256 return;
257 }
258
259 const bool check_error_state = false;
260 NetworkHandler::Get()->network_connection_handler()->ConnectToNetwork(
261 service_path,
262 success_callback,
263 base::Bind(&NetworkHandlerFailureCallback, failure_callback),
264 check_error_state);
265 }
266
267 void NetworkingPrivateChromeOS::StartDisconnect(
268 const std::string& guid,
269 const VoidCallback& success_callback,
270 const FailureCallback& failure_callback) {
271 std::string service_path, error;
272 if (!GetServicePathFromGuid(guid, &service_path, &error)) {
273 failure_callback.Run(error);
274 return;
275 }
276
277 NetworkHandler::Get()->network_connection_handler()->DisconnectNetwork(
278 service_path,
279 success_callback,
280 base::Bind(&NetworkHandlerFailureCallback, failure_callback));
281 }
282
283 void NetworkingPrivateChromeOS::VerifyDestination(
284 scoped_ptr<base::DictionaryValue> verification_properties,
285 const BoolCallback& success_callback,
286 const FailureCallback& failure_callback) {
287 ShillManagerClient::VerificationProperties verification_property_struct =
288 ConvertVerificationProperties(*verification_properties);
289
290 GetShillManagerClient()->VerifyDestination(
291 verification_property_struct,
292 success_callback,
293 base::Bind(&ShillFailureCallback, failure_callback));
294 }
295
296 void NetworkingPrivateChromeOS::VerifyAndEncryptCredentials(
297 const std::string& guid,
298 scoped_ptr<base::DictionaryValue> verification_properties,
299 const StringCallback& success_callback,
300 const FailureCallback& failure_callback) {
301 std::string service_path, error;
302 if (!GetServicePathFromGuid(guid, &service_path, &error)) {
303 failure_callback.Run(error);
304 return;
305 }
306
307 ShillManagerClient::VerificationProperties verification_property_struct =
308 ConvertVerificationProperties(*verification_properties);
309
310 GetShillManagerClient()->VerifyAndEncryptCredentials(
311 verification_property_struct,
312 service_path,
313 success_callback,
314 base::Bind(&ShillFailureCallback, failure_callback));
315 }
316
317 void NetworkingPrivateChromeOS::VerifyAndEncryptData(
318 scoped_ptr<base::DictionaryValue> verification_properties,
319 const std::string& data,
320 const StringCallback& success_callback,
321 const FailureCallback& failure_callback) {
322 ShillManagerClient::VerificationProperties verification_property_struct =
323 ConvertVerificationProperties(*verification_properties);
324
325 GetShillManagerClient()->VerifyAndEncryptData(
326 verification_property_struct,
327 data,
328 success_callback,
329 base::Bind(&ShillFailureCallback, failure_callback));
330 }
331
332 void NetworkingPrivateChromeOS::SetWifiTDLSEnabledState(
333 const std::string& ip_or_mac_address,
334 bool enabled,
335 const StringCallback& success_callback,
336 const FailureCallback& failure_callback) {
337 NetworkHandler::Get()->network_device_handler()->SetWifiTDLSEnabled(
338 ip_or_mac_address,
339 enabled,
340 success_callback,
341 base::Bind(&NetworkHandlerFailureCallback, failure_callback));
342 }
343
344 void NetworkingPrivateChromeOS::GetWifiTDLSStatus(
345 const std::string& ip_or_mac_address,
346 const StringCallback& success_callback,
347 const FailureCallback& failure_callback) {
348 NetworkHandler::Get()->network_device_handler()->GetWifiTDLSStatus(
349 ip_or_mac_address,
350 success_callback,
351 base::Bind(&NetworkHandlerFailureCallback, failure_callback));
352 }
353
354 void NetworkingPrivateChromeOS::GetCaptivePortalStatus(
355 const std::string& guid,
356 const StringCallback& success_callback,
357 const FailureCallback& failure_callback) {
358 std::string service_path, error;
359 if (!GetServicePathFromGuid(guid, &service_path, &error)) {
360 failure_callback.Run(error);
361 return;
362 }
363
364 chromeos::NetworkPortalDetector* detector =
365 chromeos::NetworkPortalDetector::Get();
pneubeck (no reviews) 2014/07/14 21:33:57 should be passed in by the factory through the con
stevenjb 2014/07/15 00:33:40 See comment above.
366 if (!detector) {
367 failure_callback.Run(networking_private::kErrorNotReady);
368 return;
369 }
370
371 chromeos::NetworkPortalDetector::CaptivePortalState state =
372 detector->GetCaptivePortalState(service_path);
373 success_callback.Run(
374 chromeos::NetworkPortalDetector::CaptivePortalStatusString(state.status));
375 }
376
377 scoped_ptr<base::ListValue>
378 NetworkingPrivateChromeOS::GetEnabledNetworkTypes() {
379 chromeos::NetworkStateHandler* state_handler = GetStateHandler();
380
381 scoped_ptr<base::ListValue> network_list(new base::ListValue);
382
383 if (state_handler->IsTechnologyEnabled(NetworkTypePattern::Ethernet()))
384 network_list->AppendString(api::networking_private::ToString(
385 api::networking_private::NETWORK_TYPE_ETHERNET));
pneubeck (no reviews) 2014/07/14 21:33:57 this translation should be in the _api.cc
stevenjb 2014/07/15 00:33:40 Done.
386 if (state_handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()))
387 network_list->AppendString(api::networking_private::ToString(
388 api::networking_private::NETWORK_TYPE_WIFI));
389 if (state_handler->IsTechnologyEnabled(NetworkTypePattern::Wimax()))
390 network_list->AppendString(api::networking_private::ToString(
391 api::networking_private::NETWORK_TYPE_WIMAX));
392 if (state_handler->IsTechnologyEnabled(NetworkTypePattern::Cellular()))
393 network_list->AppendString(api::networking_private::ToString(
394 api::networking_private::NETWORK_TYPE_CELLULAR));
395
396 return network_list.Pass();
397 }
398
399 bool NetworkingPrivateChromeOS::EnableNetworkType(const std::string& type) {
400 NetworkTypePattern pattern =
401 chromeos::onc::NetworkTypePatternFromOncType(type);
402
403 GetStateHandler()->SetTechnologyEnabled(
404 pattern, true, chromeos::network_handler::ErrorCallback());
405
406 return true;
407 }
408
409 bool NetworkingPrivateChromeOS::DisableNetworkType(const std::string& type) {
410 NetworkTypePattern pattern =
411 chromeos::onc::NetworkTypePatternFromOncType(type);
412
413 GetStateHandler()->SetTechnologyEnabled(
414 pattern, false, chromeos::network_handler::ErrorCallback());
415
416 return true;
417 }
418
419 bool NetworkingPrivateChromeOS::RequestScan() {
420 GetStateHandler()->RequestScan();
421 return true;
422 }
423
424 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698