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

Side by Side Diff: chromeos/network/managed_network_configuration_handler_impl.cc

Issue 23526016: Autoconnect policy for CrOS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 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 "chromeos/network/managed_network_configuration_handler_impl.h" 5 #include "chromeos/network/managed_network_configuration_handler_impl.h"
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 21 matching lines...) Expand all
32 #include "chromeos/network/onc/onc_validator.h" 32 #include "chromeos/network/onc/onc_validator.h"
33 #include "chromeos/network/policy_util.h" 33 #include "chromeos/network/policy_util.h"
34 #include "chromeos/network/shill_property_util.h" 34 #include "chromeos/network/shill_property_util.h"
35 #include "components/onc/onc_constants.h" 35 #include "components/onc/onc_constants.h"
36 #include "third_party/cros_system_api/dbus/service_constants.h" 36 #include "third_party/cros_system_api/dbus/service_constants.h"
37 37
38 namespace chromeos { 38 namespace chromeos {
39 39
40 namespace { 40 namespace {
41 41
42 typedef std::map<std::string, const base::DictionaryValue*> GuidToPolicyMap;
43
42 // These are error strings used for error callbacks. None of these error 44 // These are error strings used for error callbacks. None of these error
43 // messages are user-facing: they should only appear in logs. 45 // messages are user-facing: they should only appear in logs.
44 const char kInvalidUserSettingsMessage[] = "User settings are invalid."; 46 const char kInvalidUserSettingsMessage[] = "User settings are invalid.";
45 const char kInvalidUserSettings[] = "Error.InvalidUserSettings"; 47 const char kInvalidUserSettings[] = "Error.InvalidUserSettings";
46 const char kNetworkAlreadyConfiguredMessage[] = 48 const char kNetworkAlreadyConfiguredMessage[] =
47 "Network is already configured."; 49 "Network is already configured.";
48 const char kNetworkAlreadyConfigured[] = "Error.NetworkAlreadyConfigured"; 50 const char kNetworkAlreadyConfigured[] = "Error.NetworkAlreadyConfigured";
49 const char kPoliciesNotInitializedMessage[] = "Policies not initialized."; 51 const char kPoliciesNotInitializedMessage[] = "Policies not initialized.";
50 const char kPoliciesNotInitialized[] = "Error.PoliciesNotInitialized"; 52 const char kPoliciesNotInitialized[] = "Error.PoliciesNotInitialized";
51 const char kProfileNotInitializedMessage[] = "Profile not initialized."; 53 const char kProfileNotInitializedMessage[] = "Profile not initialized.";
(...skipping 24 matching lines...) Expand all
76 error_name, 78 error_name,
77 error_message))); 79 error_message)));
78 } 80 }
79 81
80 void LogErrorWithDict(const tracked_objects::Location& from_where, 82 void LogErrorWithDict(const tracked_objects::Location& from_where,
81 const std::string& error_name, 83 const std::string& error_name,
82 scoped_ptr<base::DictionaryValue> error_data) { 84 scoped_ptr<base::DictionaryValue> error_data) {
83 LOG(ERROR) << from_where.ToString() << ": " << error_name; 85 LOG(ERROR) << from_where.ToString() << ": " << error_name;
84 } 86 }
85 87
86 const base::DictionaryValue* GetByGUID( 88 const base::DictionaryValue* GetByGUID(const GuidToPolicyMap& policies,
87 const ManagedNetworkConfigurationHandlerImpl::GuidToPolicyMap& policies, 89 const std::string& guid) {
88 const std::string& guid) { 90 GuidToPolicyMap::const_iterator it = policies.find(guid);
89 ManagedNetworkConfigurationHandlerImpl::GuidToPolicyMap::const_iterator it =
90 policies.find(guid);
91 if (it == policies.end()) 91 if (it == policies.end())
92 return NULL; 92 return NULL;
93 return it->second; 93 return it->second;
94 } 94 }
95 95
96 void TranslatePropertiesToOncAndRunCallback( 96 void TranslatePropertiesToOncAndRunCallback(
97 const network_handler::DictionaryResultCallback& callback, 97 const network_handler::DictionaryResultCallback& callback,
98 const std::string& service_path, 98 const std::string& service_path,
99 const base::DictionaryValue& shill_properties) { 99 const base::DictionaryValue& shill_properties) {
100 scoped_ptr<base::DictionaryValue> onc_network( 100 scoped_ptr<base::DictionaryValue> onc_network(
101 onc::TranslateShillServiceToONCPart( 101 onc::TranslateShillServiceToONCPart(
102 shill_properties, 102 shill_properties,
103 &onc::kNetworkWithStateSignature)); 103 &onc::kNetworkWithStateSignature));
104 callback.Run(service_path, *onc_network); 104 callback.Run(service_path, *onc_network);
105 } 105 }
106 106
107 } // namespace 107 } // namespace
108 108
109 struct ManagedNetworkConfigurationHandlerImpl::Policies {
110 ~Policies() { STLDeleteValues(&per_network_config); }
bartfab (slow) 2013/10/16 12:40:31 The style guide says: "Simple accessors should ge
pneubeck (no reviews) 2013/10/17 10:22:26 Hm. Whether this applies to .cc local classes as w
bartfab (slow) 2013/10/17 11:57:58 Yes. There was a discussion about this on chromium
111
112 GuidToPolicyMap per_network_config;
113 base::DictionaryValue global_network_config;
114 };
115
109 void ManagedNetworkConfigurationHandlerImpl::AddObserver( 116 void ManagedNetworkConfigurationHandlerImpl::AddObserver(
110 NetworkPolicyObserver* observer) { 117 NetworkPolicyObserver* observer) {
111 observers_.AddObserver(observer); 118 observers_.AddObserver(observer);
112 } 119 }
113 120
114 void ManagedNetworkConfigurationHandlerImpl::RemoveObserver( 121 void ManagedNetworkConfigurationHandlerImpl::RemoveObserver(
115 NetworkPolicyObserver* observer) { 122 NetworkPolicyObserver* observer) {
116 observers_.RemoveObserver(observer); 123 observers_.RemoveObserver(observer);
117 } 124 }
118 125
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 shill_properties, 186 shill_properties,
180 &onc::kNetworkWithStateSignature)); 187 &onc::kNetworkWithStateSignature));
181 188
182 std::string guid; 189 std::string guid;
183 active_settings->GetStringWithoutPathExpansion(::onc::network_config::kGUID, 190 active_settings->GetStringWithoutPathExpansion(::onc::network_config::kGUID,
184 &guid); 191 &guid);
185 192
186 const base::DictionaryValue* user_policy = NULL; 193 const base::DictionaryValue* user_policy = NULL;
187 const base::DictionaryValue* device_policy = NULL; 194 const base::DictionaryValue* device_policy = NULL;
188 if (!guid.empty() && profile) { 195 if (!guid.empty() && profile) {
189 const GuidToPolicyMap* policies = GetPoliciesForProfile(*profile); 196 const Policies* policies = GetPoliciesForProfile(*profile);
190 if (!policies) { 197 if (!policies) {
191 RunErrorCallback(service_path, 198 RunErrorCallback(service_path,
192 kPoliciesNotInitialized, 199 kPoliciesNotInitialized,
193 kPoliciesNotInitializedMessage, 200 kPoliciesNotInitializedMessage,
194 error_callback); 201 error_callback);
195 return; 202 return;
196 } 203 }
197 const base::DictionaryValue* policy = GetByGUID(*policies, guid); 204 const base::DictionaryValue* policy =
205 GetByGUID(policies->per_network_config, guid);
198 if (profile->type() == NetworkProfile::TYPE_SHARED) 206 if (profile->type() == NetworkProfile::TYPE_SHARED)
199 device_policy = policy; 207 device_policy = policy;
200 else if (profile->type() == NetworkProfile::TYPE_USER) 208 else if (profile->type() == NetworkProfile::TYPE_USER)
201 user_policy = policy; 209 user_policy = policy;
202 else 210 else
203 NOTREACHED(); 211 NOTREACHED();
204 } 212 }
205 213
206 // This call also removes credentials from policies. 214 // This call also removes credentials from policies.
207 scoped_ptr<base::DictionaryValue> augmented_properties = 215 scoped_ptr<base::DictionaryValue> augmented_properties =
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 RunErrorCallback(service_path, 268 RunErrorCallback(service_path,
261 kUnknownProfilePath, 269 kUnknownProfilePath,
262 kUnknownProfilePathMessage, 270 kUnknownProfilePathMessage,
263 error_callback); 271 error_callback);
264 return; 272 return;
265 } 273 }
266 274
267 VLOG(2) << "SetProperties: Found GUID " << guid << " and profile " 275 VLOG(2) << "SetProperties: Found GUID " << guid << " and profile "
268 << profile->ToDebugString(); 276 << profile->ToDebugString();
269 277
270 const GuidToPolicyMap* policies = GetPoliciesForProfile(*profile); 278 const Policies* policies = GetPoliciesForProfile(*profile);
271 if (!policies) { 279 if (!policies) {
272 RunErrorCallback(service_path, 280 RunErrorCallback(service_path,
273 kPoliciesNotInitialized, 281 kPoliciesNotInitialized,
274 kPoliciesNotInitializedMessage, 282 kPoliciesNotInitializedMessage,
275 error_callback); 283 error_callback);
276 return; 284 return;
277 } 285 }
278 286
279 // Validate the ONC dictionary. We are liberal and ignore unknown field 287 // Validate the ONC dictionary. We are liberal and ignore unknown field
280 // names. User settings are only partial ONC, thus we ignore missing fields. 288 // names. User settings are only partial ONC, thus we ignore missing fields.
(...skipping 12 matching lines...) Expand all
293 if (validation_result == onc::Validator::INVALID) { 301 if (validation_result == onc::Validator::INVALID) {
294 RunErrorCallback(service_path, 302 RunErrorCallback(service_path,
295 kInvalidUserSettings, 303 kInvalidUserSettings,
296 kInvalidUserSettingsMessage, 304 kInvalidUserSettingsMessage,
297 error_callback); 305 error_callback);
298 return; 306 return;
299 } 307 }
300 if (validation_result == onc::Validator::VALID_WITH_WARNINGS) 308 if (validation_result == onc::Validator::VALID_WITH_WARNINGS)
301 LOG(WARNING) << "Validation of ONC user settings produced warnings."; 309 LOG(WARNING) << "Validation of ONC user settings produced warnings.";
302 310
303 const base::DictionaryValue* policy = GetByGUID(*policies, guid); 311 const base::DictionaryValue* policy =
312 GetByGUID(policies->per_network_config, guid);
304 VLOG(2) << "This configuration is " << (policy ? "" : "not ") << "managed."; 313 VLOG(2) << "This configuration is " << (policy ? "" : "not ") << "managed.";
305 314
306 scoped_ptr<base::DictionaryValue> shill_dictionary( 315 scoped_ptr<base::DictionaryValue> shill_dictionary(
307 policy_util::CreateShillConfiguration( 316 policy_util::CreateShillConfiguration(
308 *profile, guid, policy, validated_user_settings.get())); 317 *profile, guid, policy, validated_user_settings.get()));
309 318
310 network_configuration_handler_->SetProperties( 319 network_configuration_handler_->SetProperties(
311 service_path, *shill_dictionary, callback, error_callback); 320 service_path, *shill_dictionary, callback, error_callback);
312 } 321 }
313 322
314 void ManagedNetworkConfigurationHandlerImpl::CreateConfiguration( 323 void ManagedNetworkConfigurationHandlerImpl::CreateConfiguration(
315 const std::string& userhash, 324 const std::string& userhash,
316 const base::DictionaryValue& properties, 325 const base::DictionaryValue& properties,
317 const network_handler::StringResultCallback& callback, 326 const network_handler::StringResultCallback& callback,
318 const network_handler::ErrorCallback& error_callback) const { 327 const network_handler::ErrorCallback& error_callback) const {
319 const GuidToPolicyMap* policies = GetPoliciesForUser(userhash); 328 const Policies* policies = GetPoliciesForUser(userhash);
320 if (!policies) { 329 if (!policies) {
321 RunErrorCallback("", 330 RunErrorCallback("",
322 kPoliciesNotInitialized, 331 kPoliciesNotInitialized,
323 kPoliciesNotInitializedMessage, 332 kPoliciesNotInitializedMessage,
324 error_callback); 333 error_callback);
325 return; 334 return;
326 } 335 }
327 336
328 if (policy_util::FindMatchingPolicy(*policies, properties)) { 337 if (policy_util::FindMatchingPolicy(policies->per_network_config,
338 properties)) {
329 RunErrorCallback("", 339 RunErrorCallback("",
330 kNetworkAlreadyConfigured, 340 kNetworkAlreadyConfigured,
331 kNetworkAlreadyConfiguredMessage, 341 kNetworkAlreadyConfiguredMessage,
332 error_callback); 342 error_callback);
333 } 343 }
334 344
335 const NetworkProfile* profile = 345 const NetworkProfile* profile =
336 network_profile_handler_->GetProfileForUserhash(userhash); 346 network_profile_handler_->GetProfileForUserhash(userhash);
337 if (!profile) { 347 if (!profile) {
338 RunErrorCallback("", 348 RunErrorCallback("",
(...skipping 21 matching lines...) Expand all
360 const std::string& service_path, 370 const std::string& service_path,
361 const base::Closure& callback, 371 const base::Closure& callback,
362 const network_handler::ErrorCallback& error_callback) const { 372 const network_handler::ErrorCallback& error_callback) const {
363 network_configuration_handler_->RemoveConfiguration( 373 network_configuration_handler_->RemoveConfiguration(
364 service_path, callback, error_callback); 374 service_path, callback, error_callback);
365 } 375 }
366 376
367 void ManagedNetworkConfigurationHandlerImpl::SetPolicy( 377 void ManagedNetworkConfigurationHandlerImpl::SetPolicy(
368 ::onc::ONCSource onc_source, 378 ::onc::ONCSource onc_source,
369 const std::string& userhash, 379 const std::string& userhash,
370 const base::ListValue& network_configs_onc) { 380 const base::ListValue& network_configs_onc,
381 const base::DictionaryValue& global_network_config) {
371 VLOG(1) << "Setting policies from " << ToDebugString(onc_source, userhash) 382 VLOG(1) << "Setting policies from " << ToDebugString(onc_source, userhash)
372 << "."; 383 << ".";
373 384
374 // |userhash| must be empty for device policies. 385 // |userhash| must be empty for device policies.
375 DCHECK(onc_source != ::onc::ONC_SOURCE_DEVICE_POLICY || 386 DCHECK(onc_source != ::onc::ONC_SOURCE_DEVICE_POLICY ||
376 userhash.empty()); 387 userhash.empty());
377 GuidToPolicyMap& policies = policies_by_user_[userhash]; 388 Policies* policies = NULL;
389 if (ContainsKey(policies_by_user_, userhash)) {
390 policies = policies_by_user_[userhash].get();
391 } else {
392 policies = new Policies;
393 policies_by_user_[userhash] = make_linked_ptr(policies);
394 }
378 395
379 GuidToPolicyMap old_policies; 396 policies->global_network_config.MergeDictionary(&global_network_config);
380 policies.swap(old_policies); 397
398 GuidToPolicyMap old_per_network_config;
399 policies->per_network_config.swap(old_per_network_config);
381 400
382 // This stores all GUIDs of policies that have changed or are new. 401 // This stores all GUIDs of policies that have changed or are new.
383 std::set<std::string> modified_policies; 402 std::set<std::string> modified_policies;
384 403
385 for (base::ListValue::const_iterator it = network_configs_onc.begin(); 404 for (base::ListValue::const_iterator it = network_configs_onc.begin();
386 it != network_configs_onc.end(); ++it) { 405 it != network_configs_onc.end(); ++it) {
387 const base::DictionaryValue* network = NULL; 406 const base::DictionaryValue* network = NULL;
388 (*it)->GetAsDictionary(&network); 407 (*it)->GetAsDictionary(&network);
389 DCHECK(network); 408 DCHECK(network);
390 409
391 std::string guid; 410 std::string guid;
392 network->GetStringWithoutPathExpansion(::onc::network_config::kGUID, &guid); 411 network->GetStringWithoutPathExpansion(::onc::network_config::kGUID, &guid);
393 DCHECK(!guid.empty()); 412 DCHECK(!guid.empty());
394 413
395 if (policies.count(guid) > 0) { 414 if (policies->per_network_config.count(guid) > 0) {
396 LOG(ERROR) << "ONC from " << ToDebugString(onc_source, userhash) 415 LOG(ERROR) << "ONC from " << ToDebugString(onc_source, userhash)
397 << " contains several entries for the same GUID " 416 << " contains several entries for the same GUID "
398 << guid << "."; 417 << guid << ".";
399 delete policies[guid]; 418 delete policies->per_network_config[guid];
400 } 419 }
401 const base::DictionaryValue* new_entry = network->DeepCopy(); 420 const base::DictionaryValue* new_entry = network->DeepCopy();
402 policies[guid] = new_entry; 421 policies->per_network_config[guid] = new_entry;
403 422
404 const base::DictionaryValue* old_entry = old_policies[guid]; 423 const base::DictionaryValue* old_entry = old_per_network_config[guid];
405 if (!old_entry || !old_entry->Equals(new_entry)) 424 if (!old_entry || !old_entry->Equals(new_entry))
406 modified_policies.insert(guid); 425 modified_policies.insert(guid);
407 } 426 }
408 427
409 STLDeleteValues(&old_policies); 428 STLDeleteValues(&old_per_network_config);
410 429
411 const NetworkProfile* profile = 430 const NetworkProfile* profile =
412 network_profile_handler_->GetProfileForUserhash(userhash); 431 network_profile_handler_->GetProfileForUserhash(userhash);
413 if (!profile) { 432 if (!profile) {
414 VLOG(1) << "The relevant Shill profile isn't initialized yet, postponing " 433 VLOG(1) << "The relevant Shill profile isn't initialized yet, postponing "
415 << "policy application."; 434 << "policy application.";
416 return; 435 return;
417 } 436 }
418 437
419 scoped_refptr<PolicyApplicator> applicator = new PolicyApplicator( 438 scoped_refptr<PolicyApplicator> applicator =
420 weak_ptr_factory_.GetWeakPtr(), *profile, policies, &modified_policies); 439 new PolicyApplicator(weak_ptr_factory_.GetWeakPtr(),
440 *profile,
441 policies->per_network_config,
bartfab (slow) 2013/10/16 12:40:31 Since you have a struct that groups per-network co
pneubeck (no reviews) 2013/10/17 10:22:26 I think it's not worth it for two arguments only,
442 policies->global_network_config,
443 &modified_policies);
421 applicator->Run(); 444 applicator->Run();
422 } 445 }
423 446
424 void ManagedNetworkConfigurationHandlerImpl::OnProfileAdded( 447 void ManagedNetworkConfigurationHandlerImpl::OnProfileAdded(
425 const NetworkProfile& profile) { 448 const NetworkProfile& profile) {
426 VLOG(1) << "Adding profile " << profile.ToDebugString() << "'."; 449 VLOG(1) << "Adding profile " << profile.ToDebugString() << "'.";
427 450
428 const GuidToPolicyMap* policies = GetPoliciesForProfile(profile); 451 const Policies* policies = GetPoliciesForProfile(profile);
429 if (!policies) { 452 if (!policies) {
430 VLOG(1) << "The relevant policy is not initialized, " 453 VLOG(1) << "The relevant policy is not initialized, "
431 << "postponing policy application."; 454 << "postponing policy application.";
432 return; 455 return;
433 } 456 }
434 457
435 std::set<std::string> policy_guids; 458 std::set<std::string> policy_guids;
436 for (GuidToPolicyMap::const_iterator it = policies->begin(); 459 for (GuidToPolicyMap::const_iterator it =
437 it != policies->end(); ++it) { 460 policies->per_network_config.begin();
461 it != policies->per_network_config.end(); ++it) {
438 policy_guids.insert(it->first); 462 policy_guids.insert(it->first);
439 } 463 }
440 464
441 scoped_refptr<PolicyApplicator> applicator = new PolicyApplicator( 465 scoped_refptr<PolicyApplicator> applicator =
442 weak_ptr_factory_.GetWeakPtr(), profile, *policies, &policy_guids); 466 new PolicyApplicator(weak_ptr_factory_.GetWeakPtr(),
467 profile,
468 policies->per_network_config,
469 policies->global_network_config,
470 &policy_guids);
443 applicator->Run(); 471 applicator->Run();
444 } 472 }
445 473
446 void ManagedNetworkConfigurationHandlerImpl::OnProfileRemoved( 474 void ManagedNetworkConfigurationHandlerImpl::OnProfileRemoved(
447 const NetworkProfile& profile) { 475 const NetworkProfile& profile) {
448 // Nothing to do in this case. 476 // Nothing to do in this case.
449 } 477 }
450 478
451 void ManagedNetworkConfigurationHandlerImpl::CreateConfigurationFromPolicy( 479 void ManagedNetworkConfigurationHandlerImpl::CreateConfigurationFromPolicy(
452 const base::DictionaryValue& shill_properties) { 480 const base::DictionaryValue& shill_properties) {
453 network_configuration_handler_->CreateConfiguration( 481 network_configuration_handler_->CreateConfiguration(
454 shill_properties, 482 shill_properties,
455 base::Bind(&ManagedNetworkConfigurationHandlerImpl::OnPolicyApplied, 483 base::Bind(&ManagedNetworkConfigurationHandlerImpl::OnPolicyApplied,
456 weak_ptr_factory_.GetWeakPtr()), 484 weak_ptr_factory_.GetWeakPtr()),
457 base::Bind(&LogErrorWithDict, FROM_HERE)); 485 base::Bind(&LogErrorWithDict, FROM_HERE));
458 } 486 }
459 487
488 void ManagedNetworkConfigurationHandlerImpl::
489 UpdateExistingConfigurationWithPropertiesFromPolicy(
490 const base::DictionaryValue& existing_properties,
491 const base::DictionaryValue& new_properties) {
492 base::DictionaryValue shill_properties;
493
494 std::string profile;
495 existing_properties.GetStringWithoutPathExpansion(shill::kProfileProperty,
496 &profile);
497 if (profile.empty()) {
498 LOG(ERROR) << "Missing profile property.";
499 return;
500 }
501 shill_properties.SetStringWithoutPathExpansion(shill::kProfileProperty,
502 profile);
503
504 if (!shill_property_util::CopyIdentifyingProperties(existing_properties,
505 &shill_properties)) {
506 LOG(ERROR) << "Missing identifying properties.";
507 }
508
509 shill_properties.MergeDictionary(&new_properties);
510
511 network_configuration_handler_->CreateConfiguration(
512 shill_properties,
513 base::Bind(&ManagedNetworkConfigurationHandlerImpl::OnPolicyApplied,
514 weak_ptr_factory_.GetWeakPtr()),
515 base::Bind(&LogErrorWithDict, FROM_HERE));
516 }
517
460 const base::DictionaryValue* 518 const base::DictionaryValue*
461 ManagedNetworkConfigurationHandlerImpl::FindPolicyByGUID( 519 ManagedNetworkConfigurationHandlerImpl::FindPolicyByGUID(
462 const std::string userhash, 520 const std::string userhash,
463 const std::string& guid, 521 const std::string& guid,
464 ::onc::ONCSource* onc_source) const { 522 ::onc::ONCSource* onc_source) const {
465 *onc_source = ::onc::ONC_SOURCE_NONE; 523 *onc_source = ::onc::ONC_SOURCE_NONE;
466 524
467 if (!userhash.empty()) { 525 if (!userhash.empty()) {
468 const GuidToPolicyMap* user_policies = GetPoliciesForUser(userhash); 526 const Policies* user_policies = GetPoliciesForUser(userhash);
469 if (user_policies) { 527 if (user_policies) {
470 GuidToPolicyMap::const_iterator found = user_policies->find(guid); 528 const base::DictionaryValue* policy =
471 if (found != user_policies->end()) { 529 GetByGUID(user_policies->per_network_config, guid);
530 if (policy) {
472 *onc_source = ::onc::ONC_SOURCE_USER_POLICY; 531 *onc_source = ::onc::ONC_SOURCE_USER_POLICY;
473 return found->second; 532 return policy;
474 } 533 }
475 } 534 }
476 } 535 }
477 536
478 const GuidToPolicyMap* device_policies = GetPoliciesForUser(std::string()); 537 const Policies* device_policies = GetPoliciesForUser(std::string());
479 if (device_policies) { 538 if (device_policies) {
480 GuidToPolicyMap::const_iterator found = device_policies->find(guid); 539 const base::DictionaryValue* policy =
481 if (found != device_policies->end()) { 540 GetByGUID(device_policies->per_network_config, guid);
541 if (policy) {
482 *onc_source = ::onc::ONC_SOURCE_DEVICE_POLICY; 542 *onc_source = ::onc::ONC_SOURCE_DEVICE_POLICY;
483 return found->second; 543 return policy;
484 } 544 }
485 } 545 }
486 546
487 return NULL; 547 return NULL;
488 } 548 }
489 549
490 const base::DictionaryValue* 550 const base::DictionaryValue*
491 ManagedNetworkConfigurationHandlerImpl::FindPolicyByGuidAndProfile( 551 ManagedNetworkConfigurationHandlerImpl::FindPolicyByGuidAndProfile(
492 const std::string& guid, 552 const std::string& guid,
493 const std::string& profile_path) const { 553 const std::string& profile_path) const {
494 const NetworkProfile* profile = 554 const NetworkProfile* profile =
495 network_profile_handler_->GetProfileForPath(profile_path); 555 network_profile_handler_->GetProfileForPath(profile_path);
496 if (!profile) { 556 if (!profile) {
497 LOG(ERROR) << "Profile path unknown: " << profile_path; 557 LOG(ERROR) << "Profile path unknown: " << profile_path;
498 return NULL; 558 return NULL;
499 } 559 }
500 560
501 const GuidToPolicyMap* policies = GetPoliciesForProfile(*profile); 561 const Policies* policies = GetPoliciesForProfile(*profile);
502 if (!policies) 562 if (!policies)
503 return NULL; 563 return NULL;
504 564
505 GuidToPolicyMap::const_iterator it = policies->find(guid); 565 return GetByGUID(policies->per_network_config, guid);
506 if (it == policies->end())
507 return NULL;
508 return it->second;
509 } 566 }
510 567
511 const ManagedNetworkConfigurationHandlerImpl::GuidToPolicyMap* 568 const ManagedNetworkConfigurationHandlerImpl::Policies*
512 ManagedNetworkConfigurationHandlerImpl::GetPoliciesForUser( 569 ManagedNetworkConfigurationHandlerImpl::GetPoliciesForUser(
513 const std::string& userhash) const { 570 const std::string& userhash) const {
514 UserToPoliciesMap::const_iterator it = policies_by_user_.find(userhash); 571 UserToPoliciesMap::const_iterator it = policies_by_user_.find(userhash);
515 if (it == policies_by_user_.end()) 572 if (it == policies_by_user_.end())
516 return NULL; 573 return NULL;
517 return &it->second; 574 return it->second.get();
518 } 575 }
519 576
520 const ManagedNetworkConfigurationHandlerImpl::GuidToPolicyMap* 577 const ManagedNetworkConfigurationHandlerImpl::Policies*
521 ManagedNetworkConfigurationHandlerImpl::GetPoliciesForProfile( 578 ManagedNetworkConfigurationHandlerImpl::GetPoliciesForProfile(
522 const NetworkProfile& profile) const { 579 const NetworkProfile& profile) const {
523 DCHECK(profile.type() != NetworkProfile::TYPE_SHARED || 580 DCHECK(profile.type() != NetworkProfile::TYPE_SHARED ||
524 profile.userhash.empty()); 581 profile.userhash.empty());
525 return GetPoliciesForUser(profile.userhash); 582 return GetPoliciesForUser(profile.userhash);
526 } 583 }
527 584
528 ManagedNetworkConfigurationHandlerImpl::ManagedNetworkConfigurationHandlerImpl() 585 ManagedNetworkConfigurationHandlerImpl::ManagedNetworkConfigurationHandlerImpl()
529 : network_state_handler_(NULL), 586 : network_state_handler_(NULL),
530 network_profile_handler_(NULL), 587 network_profile_handler_(NULL),
531 network_configuration_handler_(NULL), 588 network_configuration_handler_(NULL),
532 weak_ptr_factory_(this) {} 589 weak_ptr_factory_(this) {}
533 590
534 ManagedNetworkConfigurationHandlerImpl:: 591 ManagedNetworkConfigurationHandlerImpl::
535 ~ManagedNetworkConfigurationHandlerImpl() { 592 ~ManagedNetworkConfigurationHandlerImpl() {
536 network_profile_handler_->RemoveObserver(this); 593 network_profile_handler_->RemoveObserver(this);
537 for (UserToPoliciesMap::iterator it = policies_by_user_.begin();
538 it != policies_by_user_.end(); ++it) {
539 STLDeleteValues(&it->second);
540 }
541 } 594 }
542 595
543 void ManagedNetworkConfigurationHandlerImpl::Init( 596 void ManagedNetworkConfigurationHandlerImpl::Init(
544 NetworkStateHandler* network_state_handler, 597 NetworkStateHandler* network_state_handler,
545 NetworkProfileHandler* network_profile_handler, 598 NetworkProfileHandler* network_profile_handler,
546 NetworkConfigurationHandler* network_configuration_handler) { 599 NetworkConfigurationHandler* network_configuration_handler) {
547 network_state_handler_ = network_state_handler; 600 network_state_handler_ = network_state_handler;
548 network_profile_handler_ = network_profile_handler; 601 network_profile_handler_ = network_profile_handler;
549 network_configuration_handler_ = network_configuration_handler; 602 network_configuration_handler_ = network_configuration_handler;
550 network_profile_handler_->AddObserver(this); 603 network_profile_handler_->AddObserver(this);
551 } 604 }
552 605
553 void ManagedNetworkConfigurationHandlerImpl::OnPolicyApplied( 606 void ManagedNetworkConfigurationHandlerImpl::OnPolicyApplied(
554 const std::string& service_path) { 607 const std::string& service_path) {
555 if (service_path.empty()) 608 if (service_path.empty())
556 return; 609 return;
557 FOR_EACH_OBSERVER( 610 FOR_EACH_OBSERVER(
558 NetworkPolicyObserver, observers_, PolicyApplied(service_path)); 611 NetworkPolicyObserver, observers_, PolicyApplied(service_path));
559 } 612 }
560 613
561 } // namespace chromeos 614 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698