Index: chromeos/network/policy_applicator.cc |
diff --git a/chromeos/network/policy_applicator.cc b/chromeos/network/policy_applicator.cc |
index 462caee6690fa76f6ddf2f40ac62524ad70fabc3..1b01f674817fb4fc1357e77072dbb4eb3c5407b1 100644 |
--- a/chromeos/network/policy_applicator.cc |
+++ b/chromeos/network/policy_applicator.cc |
@@ -9,6 +9,7 @@ |
#include "base/bind.h" |
#include "base/location.h" |
#include "base/logging.h" |
+#include "base/memory/scoped_ptr.h" |
#include "base/stl_util.h" |
#include "base/values.h" |
#include "chromeos/dbus/dbus_thread_manager.h" |
@@ -167,22 +168,32 @@ void PolicyApplicator::GetEntryCallback( |
VLOG(1) << "Not updating existing managed configuration with guid " |
<< new_guid << " because the policy didn't change."; |
} else { |
- // Delete the entry to ensure that no old configuration remains. |
- // Don't do this if a policy is reapplied (e.g. after reboot) or updated |
- // (i.e. the GUID didn't change), in order to keep implicit state of |
- // Shill like "connected successfully before". |
- if (old_guid == new_guid) { |
+ const base::DictionaryValue* user_settings = |
+ ui_data ? ui_data->user_settings() : NULL; |
+ scoped_ptr<base::DictionaryValue> new_shill_properties = |
+ policy_util::CreateShillConfiguration( |
+ profile_, new_guid, new_policy, user_settings); |
+ // A new policy has to be applied to this profile entry. In order to keep |
+ // implicit state of Shill like "connected successfully before", keep the |
+ // entry if a policy is reapplied (e.g. after reboot) or is updated. |
+ // However, some Shill properties are used to identify the network and |
+ // cannot be modified after initial configuration, so we have to delete |
+ // the profile entry in these cases. Also, keeping Shill's state if the |
+ // SSID changed might not be a good idea anyways. If the policy GUID |
+ // changed, or there was no policy before, we delete the entry at first to |
+ // ensure that no old configuration remains. |
+ if (old_guid == new_guid && |
+ shill_property_util::DoIdentifyingPropertiesMatch( |
+ *new_shill_properties, entry_properties)) { |
VLOG(1) << "Updating previously managed configuration with the " |
<< "updated policy " << new_guid << "."; |
} else { |
+ VLOG(1) << "Deleting profile entry before writing new policy " |
+ << new_guid << " because of identifying properties changed."; |
DeleteEntry(entry); |
} |
- const base::DictionaryValue* user_settings = |
- ui_data ? ui_data->user_settings() : NULL; |
- |
- // Write the new configuration. |
- CreateAndWriteNewShillConfiguration(new_guid, *new_policy, user_settings); |
+ WriteNewShillConfiguration(*new_shill_properties, *new_policy); |
remaining_policies_.erase(new_guid); |
} |
} else if (was_managed) { |
@@ -196,7 +207,6 @@ void PolicyApplicator::GetEntryCallback( |
} else { |
// The entry wasn't managed and doesn't match any current policy. Global |
// network settings have to be applied. |
- |
base::DictionaryValue shill_properties_to_update; |
GetPropertiesForUnmanagedEntry(entry_properties, |
&shill_properties_to_update); |
@@ -219,10 +229,9 @@ void PolicyApplicator::DeleteEntry(const std::string& entry) { |
base::Bind(&LogErrorMessage, FROM_HERE)); |
} |
-void PolicyApplicator::CreateAndWriteNewShillConfiguration( |
- const std::string& guid, |
- const base::DictionaryValue& policy, |
- const base::DictionaryValue* user_settings) { |
+void PolicyApplicator::WriteNewShillConfiguration( |
+ const base::DictionaryValue& shill_dictionary, |
+ const base::DictionaryValue& policy) { |
// Ethernet (non EAP) settings, like GUID or UIData, cannot be stored per |
// user. Abort in that case. |
std::string type; |
@@ -239,10 +248,7 @@ void PolicyApplicator::CreateAndWriteNewShillConfiguration( |
return; |
} |
- scoped_ptr<base::DictionaryValue> shill_dictionary = |
- policy_util::CreateShillConfiguration( |
- profile_, guid, &policy, user_settings); |
- handler_->CreateConfigurationFromPolicy(*shill_dictionary); |
+ handler_->CreateConfigurationFromPolicy(shill_dictionary); |
} |
void PolicyApplicator::GetPropertiesForUnmanagedEntry( |
@@ -304,8 +310,9 @@ void PolicyApplicator::ApplyRemainingPolicies() { |
VLOG(1) << "Creating new configuration managed by policy " << *it |
<< " in profile " << profile_.ToDebugString() << "."; |
- CreateAndWriteNewShillConfiguration( |
- *it, *policy, NULL /* no user settings */); |
+ scoped_ptr<base::DictionaryValue> shill_dictionary = |
+ policy_util::CreateShillConfiguration(profile_, *it, policy, NULL); |
+ WriteNewShillConfiguration(*shill_dictionary, *policy); |
} |
} |