Chromium Code Reviews| 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/policy_applicator.h" | 5 #include "chromeos/network/policy_applicator.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 << "configuration."; | 165 << "configuration."; |
| 166 | 166 |
| 167 if (old_guid == new_guid && | 167 if (old_guid == new_guid && |
| 168 remaining_policies_.find(new_guid) == remaining_policies_.end()) { | 168 remaining_policies_.find(new_guid) == remaining_policies_.end()) { |
| 169 VLOG(1) << "Not updating existing managed configuration with guid " | 169 VLOG(1) << "Not updating existing managed configuration with guid " |
| 170 << new_guid << " because the policy didn't change."; | 170 << new_guid << " because the policy didn't change."; |
| 171 } else { | 171 } else { |
| 172 const base::DictionaryValue* user_settings = | 172 const base::DictionaryValue* user_settings = |
| 173 ui_data ? ui_data->user_settings() : NULL; | 173 ui_data ? ui_data->user_settings() : NULL; |
| 174 scoped_ptr<base::DictionaryValue> new_shill_properties = | 174 scoped_ptr<base::DictionaryValue> new_shill_properties = |
| 175 policy_util::CreateShillConfiguration( | 175 policy_util::CreateShillConfiguration(profile_, |
| 176 profile_, new_guid, new_policy, user_settings); | 176 new_guid, |
| 177 &global_network_config_, | |
| 178 new_policy, | |
| 179 user_settings); | |
| 177 // A new policy has to be applied to this profile entry. In order to keep | 180 // A new policy has to be applied to this profile entry. In order to keep |
| 178 // implicit state of Shill like "connected successfully before", keep the | 181 // implicit state of Shill like "connected successfully before", keep the |
| 179 // entry if a policy is reapplied (e.g. after reboot) or is updated. | 182 // entry if a policy is reapplied (e.g. after reboot) or is updated. |
| 180 // However, some Shill properties are used to identify the network and | 183 // However, some Shill properties are used to identify the network and |
| 181 // cannot be modified after initial configuration, so we have to delete | 184 // cannot be modified after initial configuration, so we have to delete |
| 182 // the profile entry in these cases. Also, keeping Shill's state if the | 185 // the profile entry in these cases. Also, keeping Shill's state if the |
| 183 // SSID changed might not be a good idea anyways. If the policy GUID | 186 // SSID changed might not be a good idea anyways. If the policy GUID |
| 184 // changed, or there was no policy before, we delete the entry at first to | 187 // changed, or there was no policy before, we delete the entry at first to |
| 185 // ensure that no old configuration remains. | 188 // ensure that no old configuration remains. |
| 186 if (old_guid == new_guid && | 189 if (old_guid == new_guid && |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 212 << old_guid << ", because the policy was removed."; | 215 << old_guid << ", because the policy was removed."; |
| 213 | 216 |
| 214 // Remove the entry, because the network was managed but isn't anymore. | 217 // Remove the entry, because the network was managed but isn't anymore. |
| 215 // Note: An alternative might be to preserve the user settings, but it's | 218 // Note: An alternative might be to preserve the user settings, but it's |
| 216 // unclear which values originating the policy should be removed. | 219 // unclear which values originating the policy should be removed. |
| 217 DeleteEntry(entry); | 220 DeleteEntry(entry); |
| 218 } else { | 221 } else { |
| 219 // The entry wasn't managed and doesn't match any current policy. Global | 222 // The entry wasn't managed and doesn't match any current policy. Global |
| 220 // network settings have to be applied. | 223 // network settings have to be applied. |
| 221 base::DictionaryValue shill_properties_to_update; | 224 base::DictionaryValue shill_properties_to_update; |
| 222 GetPropertiesForUnmanagedEntry(entry_properties, | 225 policy_util::SetShillPropertiesForGlobalPolicy( |
| 223 &shill_properties_to_update); | 226 entry_properties, &global_network_config_, &shill_properties_to_update); |
| 224 if (shill_properties_to_update.empty()) { | 227 if (shill_properties_to_update.empty()) { |
| 225 VLOG(2) << "Ignore unmanaged entry."; | 228 VLOG(2) << "Ignore unmanaged entry."; |
| 226 // Calling a SetProperties of Shill with an empty dictionary is a no op. | 229 // Calling a SetProperties of Shill with an empty dictionary is a no op. |
| 227 } else { | 230 } else { |
| 228 VLOG(2) << "Apply global network config to unmanaged entry."; | 231 VLOG(2) << "Apply global network config to unmanaged entry."; |
| 229 handler_->UpdateExistingConfigurationWithPropertiesFromPolicy( | 232 handler_->UpdateExistingConfigurationWithPropertiesFromPolicy( |
| 230 entry_properties, shill_properties_to_update); | 233 entry_properties, shill_properties_to_update); |
| 231 } | 234 } |
| 232 } | 235 } |
| 233 } | 236 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 259 if (auth == ::onc::ethernet::kAuthenticationNone) | 262 if (auth == ::onc::ethernet::kAuthenticationNone) |
| 260 return; | 263 return; |
| 261 } | 264 } |
| 262 | 265 |
| 263 if (write_later) | 266 if (write_later) |
| 264 new_shill_configurations_.push_back(shill_dictionary.DeepCopy()); | 267 new_shill_configurations_.push_back(shill_dictionary.DeepCopy()); |
| 265 else | 268 else |
| 266 handler_->CreateConfigurationFromPolicy(shill_dictionary); | 269 handler_->CreateConfigurationFromPolicy(shill_dictionary); |
| 267 } | 270 } |
| 268 | 271 |
| 269 void PolicyApplicator::GetPropertiesForUnmanagedEntry( | |
|
pneubeck (no reviews)
2014/08/28 16:09:49
move to policy_util.cc SetShillPropertiesForGlobal
| |
| 270 const base::DictionaryValue& entry_properties, | |
| 271 base::DictionaryValue* properties_to_update) const { | |
| 272 // kAllowOnlyPolicyNetworksToAutoconnect is currently the only global config. | |
| 273 | |
| 274 std::string type; | |
| 275 entry_properties.GetStringWithoutPathExpansion(shill::kTypeProperty, &type); | |
| 276 if (NetworkTypePattern::Ethernet().MatchesType(type)) | |
| 277 return; // Autoconnect for Ethernet cannot be configured. | |
| 278 | |
| 279 // By default all networks are allowed to autoconnect. | |
| 280 bool only_policy_autoconnect = false; | |
| 281 global_network_config_.GetBooleanWithoutPathExpansion( | |
| 282 ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect, | |
| 283 &only_policy_autoconnect); | |
| 284 if (!only_policy_autoconnect) | |
| 285 return; | |
| 286 | |
| 287 bool old_autoconnect = false; | |
| 288 if (entry_properties.GetBooleanWithoutPathExpansion( | |
| 289 shill::kAutoConnectProperty, &old_autoconnect) && | |
| 290 !old_autoconnect) { | |
| 291 // Autoconnect is already explictly disabled. No need to set it again. | |
| 292 return; | |
| 293 } | |
| 294 // If autconnect is not explicitly set yet, it might automatically be enabled | |
| 295 // by Shill. To prevent that, disable it explicitly. | |
| 296 properties_to_update->SetBooleanWithoutPathExpansion( | |
| 297 shill::kAutoConnectProperty, false); | |
| 298 } | |
| 299 | |
| 300 PolicyApplicator::~PolicyApplicator() { | 272 PolicyApplicator::~PolicyApplicator() { |
| 301 ApplyRemainingPolicies(); | 273 ApplyRemainingPolicies(); |
| 302 STLDeleteValues(&all_policies_); | 274 STLDeleteValues(&all_policies_); |
| 303 // Notify the handler about all policies being applied, so that the network | 275 // Notify the handler about all policies being applied, so that the network |
| 304 // lists can be updated. | 276 // lists can be updated. |
| 305 if (handler_) | 277 if (handler_) |
| 306 handler_->OnPoliciesApplied(); | 278 handler_->OnPoliciesApplied(); |
| 307 } | 279 } |
| 308 | 280 |
| 309 void PolicyApplicator::ApplyRemainingPolicies() { | 281 void PolicyApplicator::ApplyRemainingPolicies() { |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 324 if (remaining_policies_.empty()) | 296 if (remaining_policies_.empty()) |
| 325 return; | 297 return; |
| 326 | 298 |
| 327 VLOG(2) << "Create new managed network configurations in profile" | 299 VLOG(2) << "Create new managed network configurations in profile" |
| 328 << profile_.ToDebugString() << "."; | 300 << profile_.ToDebugString() << "."; |
| 329 // All profile entries were compared to policies. |remaining_policies_| | 301 // All profile entries were compared to policies. |remaining_policies_| |
| 330 // contains all modified policies that didn't match any entry. For these | 302 // contains all modified policies that didn't match any entry. For these |
| 331 // remaining policies, new configurations have to be created. | 303 // remaining policies, new configurations have to be created. |
| 332 for (std::set<std::string>::iterator it = remaining_policies_.begin(); | 304 for (std::set<std::string>::iterator it = remaining_policies_.begin(); |
| 333 it != remaining_policies_.end(); ++it) { | 305 it != remaining_policies_.end(); ++it) { |
| 334 const base::DictionaryValue* policy = GetByGUID(all_policies_, *it); | 306 const base::DictionaryValue* network_policy = GetByGUID(all_policies_, *it); |
| 335 DCHECK(policy); | 307 DCHECK(network_policy); |
| 336 | 308 |
| 337 VLOG(1) << "Creating new configuration managed by policy " << *it | 309 VLOG(1) << "Creating new configuration managed by policy " << *it |
| 338 << " in profile " << profile_.ToDebugString() << "."; | 310 << " in profile " << profile_.ToDebugString() << "."; |
| 339 | 311 |
| 340 scoped_ptr<base::DictionaryValue> shill_dictionary = | 312 scoped_ptr<base::DictionaryValue> shill_dictionary = |
| 341 policy_util::CreateShillConfiguration(profile_, *it, policy, NULL); | 313 policy_util::CreateShillConfiguration(profile_, |
| 342 WriteNewShillConfiguration(*shill_dictionary, *policy, false); | 314 *it, |
| 315 &global_network_config_, | |
| 316 network_policy, | |
| 317 NULL /* no user settings */); | |
| 318 WriteNewShillConfiguration(*shill_dictionary, *network_policy, false); | |
| 343 } | 319 } |
| 344 } | 320 } |
| 345 | 321 |
| 346 } // namespace chromeos | 322 } // namespace chromeos |
| OLD | NEW |