OLD | NEW |
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" |
11 #include "base/guid.h" | 11 #include "base/guid.h" |
12 #include "base/location.h" | 12 #include "base/location.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
17 #include "base/values.h" | 17 #include "base/values.h" |
18 #include "chromeos/dbus/shill_manager_client.h" | 18 #include "chromeos/dbus/shill_manager_client.h" |
19 #include "chromeos/dbus/shill_profile_client.h" | 19 #include "chromeos/dbus/shill_profile_client.h" |
20 #include "chromeos/dbus/shill_service_client.h" | 20 #include "chromeos/dbus/shill_service_client.h" |
| 21 #include "chromeos/network/device_state.h" |
21 #include "chromeos/network/network_configuration_handler.h" | 22 #include "chromeos/network/network_configuration_handler.h" |
22 #include "chromeos/network/network_event_log.h" | 23 #include "chromeos/network/network_event_log.h" |
23 #include "chromeos/network/network_policy_observer.h" | 24 #include "chromeos/network/network_policy_observer.h" |
24 #include "chromeos/network/network_profile.h" | 25 #include "chromeos/network/network_profile.h" |
25 #include "chromeos/network/network_profile_handler.h" | 26 #include "chromeos/network/network_profile_handler.h" |
26 #include "chromeos/network/network_state.h" | 27 #include "chromeos/network/network_state.h" |
27 #include "chromeos/network/network_state_handler.h" | 28 #include "chromeos/network/network_state_handler.h" |
28 #include "chromeos/network/network_ui_data.h" | 29 #include "chromeos/network/network_ui_data.h" |
29 #include "chromeos/network/onc/onc_merger.h" | 30 #include "chromeos/network/onc/onc_merger.h" |
30 #include "chromeos/network/onc/onc_signature.h" | 31 #include "chromeos/network/onc/onc_signature.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 } | 77 } |
77 | 78 |
78 const base::DictionaryValue* GetByGUID(const GuidToPolicyMap& policies, | 79 const base::DictionaryValue* GetByGUID(const GuidToPolicyMap& policies, |
79 const std::string& guid) { | 80 const std::string& guid) { |
80 GuidToPolicyMap::const_iterator it = policies.find(guid); | 81 GuidToPolicyMap::const_iterator it = policies.find(guid); |
81 if (it == policies.end()) | 82 if (it == policies.end()) |
82 return NULL; | 83 return NULL; |
83 return it->second; | 84 return it->second; |
84 } | 85 } |
85 | 86 |
86 void TranslatePropertiesToOncAndRunCallback( | |
87 const network_handler::DictionaryResultCallback& callback, | |
88 const std::string& service_path, | |
89 const base::DictionaryValue& shill_properties) { | |
90 scoped_ptr<base::DictionaryValue> onc_network( | |
91 onc::TranslateShillServiceToONCPart( | |
92 shill_properties, | |
93 &onc::kNetworkWithStateSignature)); | |
94 callback.Run(service_path, *onc_network); | |
95 } | |
96 | |
97 } // namespace | 87 } // namespace |
98 | 88 |
99 struct ManagedNetworkConfigurationHandlerImpl::Policies { | 89 struct ManagedNetworkConfigurationHandlerImpl::Policies { |
100 ~Policies(); | 90 ~Policies(); |
101 | 91 |
102 GuidToPolicyMap per_network_config; | 92 GuidToPolicyMap per_network_config; |
103 base::DictionaryValue global_network_config; | 93 base::DictionaryValue global_network_config; |
104 }; | 94 }; |
105 | 95 |
106 ManagedNetworkConfigurationHandlerImpl::Policies::~Policies() { | 96 ManagedNetworkConfigurationHandlerImpl::Policies::~Policies() { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 user_settings = ui_data->user_settings(); | 152 user_settings = ui_data->user_settings(); |
163 else | 153 else |
164 NOTREACHED(); | 154 NOTREACHED(); |
165 } else if (profile) { | 155 } else if (profile) { |
166 NET_LOG_ERROR("Service contains empty or invalid UIData", service_path); | 156 NET_LOG_ERROR("Service contains empty or invalid UIData", service_path); |
167 // TODO(pneubeck): add a conversion of user configured entries of old | 157 // TODO(pneubeck): add a conversion of user configured entries of old |
168 // ChromeOS versions. We will have to use a heuristic to determine which | 158 // ChromeOS versions. We will have to use a heuristic to determine which |
169 // properties _might_ be user configured. | 159 // properties _might_ be user configured. |
170 } | 160 } |
171 | 161 |
| 162 scoped_ptr<base::DictionaryValue> properties_copy( |
| 163 shill_properties.DeepCopy()); |
| 164 // Add the IPConfigs to the dictionary before the ONC translation. |
| 165 GetIPConfigs(service_path, properties_copy.get()); |
| 166 |
172 scoped_ptr<base::DictionaryValue> active_settings( | 167 scoped_ptr<base::DictionaryValue> active_settings( |
173 onc::TranslateShillServiceToONCPart( | 168 onc::TranslateShillServiceToONCPart( |
174 shill_properties, | 169 *properties_copy, |
175 &onc::kNetworkWithStateSignature)); | 170 &onc::kNetworkWithStateSignature)); |
176 | 171 |
177 std::string guid; | 172 std::string guid; |
178 active_settings->GetStringWithoutPathExpansion(::onc::network_config::kGUID, | 173 active_settings->GetStringWithoutPathExpansion(::onc::network_config::kGUID, |
179 &guid); | 174 &guid); |
180 | 175 |
181 const base::DictionaryValue* user_policy = NULL; | 176 const base::DictionaryValue* user_policy = NULL; |
182 const base::DictionaryValue* device_policy = NULL; | 177 const base::DictionaryValue* device_policy = NULL; |
183 if (!guid.empty() && profile) { | 178 if (!guid.empty() && profile) { |
184 const Policies* policies = GetPoliciesForProfile(*profile); | 179 const Policies* policies = GetPoliciesForProfile(*profile); |
(...skipping 20 matching lines...) Expand all Loading... |
205 device_policy, | 200 device_policy, |
206 user_settings, | 201 user_settings, |
207 shared_settings, | 202 shared_settings, |
208 active_settings.get()); | 203 active_settings.get()); |
209 callback.Run(service_path, *augmented_properties); | 204 callback.Run(service_path, *augmented_properties); |
210 } | 205 } |
211 | 206 |
212 void ManagedNetworkConfigurationHandlerImpl::GetProperties( | 207 void ManagedNetworkConfigurationHandlerImpl::GetProperties( |
213 const std::string& service_path, | 208 const std::string& service_path, |
214 const network_handler::DictionaryResultCallback& callback, | 209 const network_handler::DictionaryResultCallback& callback, |
215 const network_handler::ErrorCallback& error_callback) const { | 210 const network_handler::ErrorCallback& error_callback) { |
216 network_configuration_handler_->GetProperties( | 211 network_configuration_handler_->GetProperties( |
217 service_path, | 212 service_path, |
218 base::Bind(&TranslatePropertiesToOncAndRunCallback, callback), | 213 base::Bind(&ManagedNetworkConfigurationHandlerImpl::GetPropertiesCallback, |
| 214 weak_ptr_factory_.GetWeakPtr(), |
| 215 callback), |
219 error_callback); | 216 error_callback); |
220 } | 217 } |
221 | 218 |
| 219 void ManagedNetworkConfigurationHandlerImpl::GetPropertiesCallback( |
| 220 const network_handler::DictionaryResultCallback& callback, |
| 221 const std::string& service_path, |
| 222 const base::DictionaryValue& shill_properties) { |
| 223 scoped_ptr<base::DictionaryValue> properties_copy( |
| 224 shill_properties.DeepCopy()); |
| 225 // Add the IPConfigs to the dictionary before the ONC translation. |
| 226 GetIPConfigs(service_path, properties_copy.get()); |
| 227 |
| 228 scoped_ptr<base::DictionaryValue> onc_network( |
| 229 onc::TranslateShillServiceToONCPart( |
| 230 *properties_copy, |
| 231 &onc::kNetworkWithStateSignature)); |
| 232 callback.Run(service_path, *onc_network); |
| 233 } |
| 234 |
222 void ManagedNetworkConfigurationHandlerImpl::SetProperties( | 235 void ManagedNetworkConfigurationHandlerImpl::SetProperties( |
223 const std::string& service_path, | 236 const std::string& service_path, |
224 const base::DictionaryValue& user_settings, | 237 const base::DictionaryValue& user_settings, |
225 const base::Closure& callback, | 238 const base::Closure& callback, |
226 const network_handler::ErrorCallback& error_callback) const { | 239 const network_handler::ErrorCallback& error_callback) const { |
227 const NetworkState* state = | 240 const NetworkState* state = |
228 network_state_handler_->GetNetworkState(service_path); | 241 network_state_handler_->GetNetworkState(service_path); |
229 | 242 |
230 if (!state) { | 243 if (!state) { |
231 InvokeErrorCallback(service_path, error_callback, kUnknownServicePath); | 244 InvokeErrorCallback(service_path, error_callback, kUnknownServicePath); |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 } | 602 } |
590 | 603 |
591 void ManagedNetworkConfigurationHandlerImpl::OnPolicyAppliedToNetwork( | 604 void ManagedNetworkConfigurationHandlerImpl::OnPolicyAppliedToNetwork( |
592 const std::string& service_path) { | 605 const std::string& service_path) { |
593 if (service_path.empty()) | 606 if (service_path.empty()) |
594 return; | 607 return; |
595 FOR_EACH_OBSERVER( | 608 FOR_EACH_OBSERVER( |
596 NetworkPolicyObserver, observers_, PolicyApplied(service_path)); | 609 NetworkPolicyObserver, observers_, PolicyApplied(service_path)); |
597 } | 610 } |
598 | 611 |
| 612 void ManagedNetworkConfigurationHandlerImpl::GetIPConfigs( |
| 613 const std::string& service_path, |
| 614 base::DictionaryValue* properties) { |
| 615 std::string connection_state; |
| 616 properties->GetStringWithoutPathExpansion( |
| 617 shill::kStateProperty, &connection_state); |
| 618 if (!NetworkState::StateIsConnected(connection_state)) |
| 619 return; |
| 620 |
| 621 // Get the IPConfig properties from the device and store them in "IPConfigs" |
| 622 // (plural) in the properties dictionary. (Note: Shill only provides a single |
| 623 // "IPConfig" property for a network service, but a consumer of this API may |
| 624 // want information about all ipv4 and ipv6 IPConfig properties. |
| 625 std::string device; |
| 626 properties->GetStringWithoutPathExpansion(shill::kDeviceProperty, &device); |
| 627 const DeviceState* device_state = |
| 628 network_state_handler_->GetDeviceState(device); |
| 629 if (!device_state) { |
| 630 NET_LOG_ERROR("GetIPConfigs: no device: " + device, service_path); |
| 631 return; |
| 632 } |
| 633 // Convert IPConfig dictionary to a ListValue. |
| 634 base::ListValue* ip_configs = new base::ListValue; |
| 635 for (base::DictionaryValue::Iterator iter(device_state->ip_configs()); |
| 636 !iter.IsAtEnd(); iter.Advance()) { |
| 637 ip_configs->Append(iter.value().DeepCopy()); |
| 638 } |
| 639 properties->SetWithoutPathExpansion(shill::kIPConfigsProperty, ip_configs); |
| 640 } |
| 641 |
599 } // namespace chromeos | 642 } // namespace chromeos |
OLD | NEW |