| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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.h" | 5 #include "chromeos/network/managed_network_configuration_handler.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/guid.h" | 11 #include "base/guid.h" |
| 12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
| 13 #include "base/location.h" | 13 #include "base/location.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
| 16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
| 17 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
| 18 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
| 19 #include "base/values.h" | 19 #include "base/values.h" |
| 20 #include "chromeos/dbus/dbus_method_call_status.h" | 20 #include "chromeos/dbus/dbus_method_call_status.h" |
| 21 #include "chromeos/dbus/dbus_thread_manager.h" | 21 #include "chromeos/dbus/dbus_thread_manager.h" |
| 22 #include "chromeos/dbus/shill_manager_client.h" | 22 #include "chromeos/dbus/shill_manager_client.h" |
| 23 #include "chromeos/dbus/shill_profile_client.h" | 23 #include "chromeos/dbus/shill_profile_client.h" |
| 24 #include "chromeos/dbus/shill_service_client.h" | 24 #include "chromeos/dbus/shill_service_client.h" |
| 25 #include "chromeos/network/network_configuration_handler.h" | 25 #include "chromeos/network/network_configuration_handler.h" |
| 26 #include "chromeos/network/network_event_log.h" | 26 #include "chromeos/network/network_event_log.h" |
| 27 #include "chromeos/network/network_handler_callbacks.h" | 27 #include "chromeos/network/network_handler_callbacks.h" |
| 28 #include "chromeos/network/network_policy_observer.h" |
| 28 #include "chromeos/network/network_profile.h" | 29 #include "chromeos/network/network_profile.h" |
| 29 #include "chromeos/network/network_profile_handler.h" | 30 #include "chromeos/network/network_profile_handler.h" |
| 30 #include "chromeos/network/network_state.h" | 31 #include "chromeos/network/network_state.h" |
| 31 #include "chromeos/network/network_state_handler.h" | 32 #include "chromeos/network/network_state_handler.h" |
| 32 #include "chromeos/network/network_ui_data.h" | 33 #include "chromeos/network/network_ui_data.h" |
| 33 #include "chromeos/network/onc/onc_constants.h" | 34 #include "chromeos/network/onc/onc_constants.h" |
| 34 #include "chromeos/network/onc/onc_merger.h" | 35 #include "chromeos/network/onc/onc_merger.h" |
| 35 #include "chromeos/network/onc/onc_normalizer.h" | 36 #include "chromeos/network/onc/onc_normalizer.h" |
| 36 #include "chromeos/network/onc/onc_signature.h" | 37 #include "chromeos/network/onc/onc_signature.h" |
| 37 #include "chromeos/network/onc/onc_translator.h" | 38 #include "chromeos/network/onc/onc_translator.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 void SetUIData(const NetworkUIData& ui_data, | 92 void SetUIData(const NetworkUIData& ui_data, |
| 92 base::DictionaryValue* shill_dictionary) { | 93 base::DictionaryValue* shill_dictionary) { |
| 93 base::DictionaryValue ui_data_dict; | 94 base::DictionaryValue ui_data_dict; |
| 94 ui_data.FillDictionary(&ui_data_dict); | 95 ui_data.FillDictionary(&ui_data_dict); |
| 95 std::string ui_data_blob; | 96 std::string ui_data_blob; |
| 96 base::JSONWriter::Write(&ui_data_dict, &ui_data_blob); | 97 base::JSONWriter::Write(&ui_data_dict, &ui_data_blob); |
| 97 shill_dictionary->SetStringWithoutPathExpansion(flimflam::kUIDataProperty, | 98 shill_dictionary->SetStringWithoutPathExpansion(flimflam::kUIDataProperty, |
| 98 ui_data_blob); | 99 ui_data_blob); |
| 99 } | 100 } |
| 100 | 101 |
| 101 // A dummy callback to ignore the result of Shill calls. | |
| 102 void IgnoreString(const std::string& str) { | |
| 103 } | |
| 104 | |
| 105 void LogErrorWithDict(const tracked_objects::Location& from_where, | 102 void LogErrorWithDict(const tracked_objects::Location& from_where, |
| 106 const std::string& error_name, | 103 const std::string& error_name, |
| 107 scoped_ptr<base::DictionaryValue> error_data) { | 104 scoped_ptr<base::DictionaryValue> error_data) { |
| 108 LOG(ERROR) << from_where.ToString() << ": " << error_name; | 105 LOG(ERROR) << from_where.ToString() << ": " << error_name; |
| 109 } | 106 } |
| 110 | 107 |
| 111 void LogErrorMessage(const tracked_objects::Location& from_where, | 108 void LogErrorMessage(const tracked_objects::Location& from_where, |
| 112 const std::string& error_name, | 109 const std::string& error_name, |
| 113 const std::string& error_message) { | 110 const std::string& error_message) { |
| 114 LOG(ERROR) << from_where.ToString() << ": " << error_message; | 111 LOG(ERROR) << from_where.ToString() << ": " << error_message; |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 onc::ReadDictionaryFromJson(ui_data_blob); | 364 onc::ReadDictionaryFromJson(ui_data_blob); |
| 368 if (ui_data_dict) | 365 if (ui_data_dict) |
| 369 return make_scoped_ptr(new NetworkUIData(*ui_data_dict)); | 366 return make_scoped_ptr(new NetworkUIData(*ui_data_dict)); |
| 370 else | 367 else |
| 371 LOG(ERROR) << "UIData is not a valid JSON dictionary."; | 368 LOG(ERROR) << "UIData is not a valid JSON dictionary."; |
| 372 } | 369 } |
| 373 VLOG(2) << "JSON dictionary has no UIData blob: " << shill_dictionary; | 370 VLOG(2) << "JSON dictionary has no UIData blob: " << shill_dictionary; |
| 374 return scoped_ptr<NetworkUIData>(); | 371 return scoped_ptr<NetworkUIData>(); |
| 375 } | 372 } |
| 376 | 373 |
| 374 void ManagedNetworkConfigurationHandler::AddObserver( |
| 375 NetworkPolicyObserver* observer) { |
| 376 observers_.AddObserver(observer); |
| 377 } |
| 378 |
| 379 void ManagedNetworkConfigurationHandler::RemoveObserver( |
| 380 NetworkPolicyObserver* observer) { |
| 381 observers_.RemoveObserver(observer); |
| 382 } |
| 383 |
| 377 void ManagedNetworkConfigurationHandler::GetManagedProperties( | 384 void ManagedNetworkConfigurationHandler::GetManagedProperties( |
| 378 const std::string& userhash, | 385 const std::string& userhash, |
| 379 const std::string& service_path, | 386 const std::string& service_path, |
| 380 const network_handler::DictionaryResultCallback& callback, | 387 const network_handler::DictionaryResultCallback& callback, |
| 381 const network_handler::ErrorCallback& error_callback) { | 388 const network_handler::ErrorCallback& error_callback) { |
| 382 if (!GetPoliciesForUser(userhash) || !GetPoliciesForUser(std::string())) { | 389 if (!GetPoliciesForUser(userhash) || !GetPoliciesForUser(std::string())) { |
| 383 RunErrorCallback(service_path, | 390 RunErrorCallback(service_path, |
| 384 kPoliciesNotInitialized, | 391 kPoliciesNotInitialized, |
| 385 kPoliciesNotInitializedMessage, | 392 kPoliciesNotInitializedMessage, |
| 386 error_callback); | 393 error_callback); |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 GuidToPolicyMap::const_iterator found = device_policies->find(guid); | 734 GuidToPolicyMap::const_iterator found = device_policies->find(guid); |
| 728 if (found != device_policies->end()) { | 735 if (found != device_policies->end()) { |
| 729 *onc_source = onc::ONC_SOURCE_DEVICE_POLICY; | 736 *onc_source = onc::ONC_SOURCE_DEVICE_POLICY; |
| 730 return found->second; | 737 return found->second; |
| 731 } | 738 } |
| 732 } | 739 } |
| 733 | 740 |
| 734 return NULL; | 741 return NULL; |
| 735 } | 742 } |
| 736 | 743 |
| 744 const base::DictionaryValue* |
| 745 ManagedNetworkConfigurationHandler::FindPolicyByGuidAndProfile( |
| 746 const std::string& guid, |
| 747 const std::string& profile_path) const { |
| 748 const NetworkProfile* profile = |
| 749 network_profile_handler_->GetProfileForPath(profile_path); |
| 750 if (!profile) { |
| 751 LOG(ERROR) << "Profile path unknown: " << profile_path; |
| 752 return NULL; |
| 753 } |
| 754 |
| 755 const GuidToPolicyMap* policies = GetPoliciesForProfile(*profile); |
| 756 if (!policies) |
| 757 return NULL; |
| 758 |
| 759 GuidToPolicyMap::const_iterator it = policies->find(guid); |
| 760 if (it == policies->end()) |
| 761 return NULL; |
| 762 return it->second; |
| 763 } |
| 764 |
| 737 void ManagedNetworkConfigurationHandler::OnProfileRemoved( | 765 void ManagedNetworkConfigurationHandler::OnProfileRemoved( |
| 738 const NetworkProfile& profile) { | 766 const NetworkProfile& profile) { |
| 739 // Nothing to do in this case. | 767 // Nothing to do in this case. |
| 740 } | 768 } |
| 741 | 769 |
| 742 const ManagedNetworkConfigurationHandler::GuidToPolicyMap* | 770 const ManagedNetworkConfigurationHandler::GuidToPolicyMap* |
| 743 ManagedNetworkConfigurationHandler::GetPoliciesForUser( | 771 ManagedNetworkConfigurationHandler::GetPoliciesForUser( |
| 744 const std::string& userhash) const { | 772 const std::string& userhash) const { |
| 745 UserToPoliciesMap::const_iterator it = policies_by_user_.find(userhash); | 773 UserToPoliciesMap::const_iterator it = policies_by_user_.find(userhash); |
| 746 if (it == policies_by_user_.end()) | 774 if (it == policies_by_user_.end()) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 774 void ManagedNetworkConfigurationHandler::Init( | 802 void ManagedNetworkConfigurationHandler::Init( |
| 775 NetworkStateHandler* network_state_handler, | 803 NetworkStateHandler* network_state_handler, |
| 776 NetworkProfileHandler* network_profile_handler, | 804 NetworkProfileHandler* network_profile_handler, |
| 777 NetworkConfigurationHandler* network_configuration_handler) { | 805 NetworkConfigurationHandler* network_configuration_handler) { |
| 778 network_state_handler_ = network_state_handler; | 806 network_state_handler_ = network_state_handler; |
| 779 network_profile_handler_ = network_profile_handler; | 807 network_profile_handler_ = network_profile_handler; |
| 780 network_configuration_handler_ = network_configuration_handler; | 808 network_configuration_handler_ = network_configuration_handler; |
| 781 network_profile_handler_->AddObserver(this); | 809 network_profile_handler_->AddObserver(this); |
| 782 } | 810 } |
| 783 | 811 |
| 812 void ManagedNetworkConfigurationHandler::OnPolicyApplied( |
| 813 const std::string& service_path) { |
| 814 if (service_path.empty()) |
| 815 return; |
| 816 FOR_EACH_OBSERVER( |
| 817 NetworkPolicyObserver, observers_, PolicyApplied(service_path)); |
| 818 } |
| 819 |
| 784 ManagedNetworkConfigurationHandler::PolicyApplicator::PolicyApplicator( | 820 ManagedNetworkConfigurationHandler::PolicyApplicator::PolicyApplicator( |
| 785 base::WeakPtr<ManagedNetworkConfigurationHandler> handler, | 821 base::WeakPtr<ManagedNetworkConfigurationHandler> handler, |
| 786 const NetworkProfile& profile, | 822 const NetworkProfile& profile, |
| 787 std::set<std::string>* modified_policies) | 823 std::set<std::string>* modified_policies) |
| 788 : handler_(handler), profile_(profile) { | 824 : handler_(handler), profile_(profile) { |
| 789 remaining_policies_.swap(*modified_policies); | 825 remaining_policies_.swap(*modified_policies); |
| 790 } | 826 } |
| 791 | 827 |
| 792 void ManagedNetworkConfigurationHandler::PolicyApplicator::Run() { | 828 void ManagedNetworkConfigurationHandler::PolicyApplicator::Run() { |
| 793 DBusThreadManager::Get()->GetShillProfileClient()->GetProperties( | 829 DBusThreadManager::Get()->GetShillProfileClient()->GetProperties( |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 DeleteEntry(entry); | 950 DeleteEntry(entry); |
| 915 } | 951 } |
| 916 | 952 |
| 917 const base::DictionaryValue* user_settings = | 953 const base::DictionaryValue* user_settings = |
| 918 ui_data ? ui_data->user_settings() : NULL; | 954 ui_data ? ui_data->user_settings() : NULL; |
| 919 | 955 |
| 920 // Write the new configuration. | 956 // Write the new configuration. |
| 921 scoped_ptr<base::DictionaryValue> shill_dictionary = | 957 scoped_ptr<base::DictionaryValue> shill_dictionary = |
| 922 CreateShillConfiguration( | 958 CreateShillConfiguration( |
| 923 profile_, new_guid, new_policy, user_settings); | 959 profile_, new_guid, new_policy, user_settings); |
| 924 handler_->network_configuration_handler() | 960 handler_->network_configuration_handler()->CreateConfiguration( |
| 925 ->CreateConfiguration(*shill_dictionary, | 961 *shill_dictionary, |
| 926 base::Bind(&IgnoreString), | 962 base::Bind(&ManagedNetworkConfigurationHandler::OnPolicyApplied, |
| 927 base::Bind(&LogErrorWithDict, FROM_HERE)); | 963 handler_), |
| 964 base::Bind(&LogErrorWithDict, FROM_HERE)); |
| 928 remaining_policies_.erase(new_guid); | 965 remaining_policies_.erase(new_guid); |
| 929 } | 966 } |
| 930 } else if (was_managed) { | 967 } else if (was_managed) { |
| 931 VLOG(1) << "Removing configuration previously managed by policy " | 968 VLOG(1) << "Removing configuration previously managed by policy " |
| 932 << old_guid << ", because the policy was removed."; | 969 << old_guid << ", because the policy was removed."; |
| 933 | 970 |
| 934 // Remove the entry, because the network was managed but isn't anymore. | 971 // Remove the entry, because the network was managed but isn't anymore. |
| 935 // Note: An alternative might be to preserve the user settings, but it's | 972 // Note: An alternative might be to preserve the user settings, but it's |
| 936 // unclear which values originating the policy should be removed. | 973 // unclear which values originating the policy should be removed. |
| 937 DeleteEntry(entry); | 974 DeleteEntry(entry); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 980 LOG(ERROR) << "Policy " << *it << " doesn't exist anymore."; | 1017 LOG(ERROR) << "Policy " << *it << " doesn't exist anymore."; |
| 981 continue; | 1018 continue; |
| 982 } | 1019 } |
| 983 | 1020 |
| 984 VLOG(1) << "Creating new configuration managed by policy " << *it | 1021 VLOG(1) << "Creating new configuration managed by policy " << *it |
| 985 << " in profile " << profile_.ToDebugString() << "."; | 1022 << " in profile " << profile_.ToDebugString() << "."; |
| 986 | 1023 |
| 987 scoped_ptr<base::DictionaryValue> shill_dictionary = | 1024 scoped_ptr<base::DictionaryValue> shill_dictionary = |
| 988 CreateShillConfiguration( | 1025 CreateShillConfiguration( |
| 989 profile_, *it, policy, NULL /* no user settings */); | 1026 profile_, *it, policy, NULL /* no user settings */); |
| 990 handler_->network_configuration_handler() | 1027 handler_->network_configuration_handler()->CreateConfiguration( |
| 991 ->CreateConfiguration(*shill_dictionary, | 1028 *shill_dictionary, |
| 992 base::Bind(&IgnoreString), | 1029 base::Bind(&ManagedNetworkConfigurationHandler::OnPolicyApplied, |
| 993 base::Bind(&LogErrorWithDict, FROM_HERE)); | 1030 handler_), |
| 1031 base::Bind(&LogErrorWithDict, FROM_HERE)); |
| 994 } | 1032 } |
| 995 } | 1033 } |
| 996 | 1034 |
| 997 } // namespace chromeos | 1035 } // namespace chromeos |
| OLD | NEW |