Index: extensions/browser/api/networking_private/networking_private_chromeos.cc |
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.cc b/extensions/browser/api/networking_private/networking_private_chromeos.cc |
index 5d84f0ba7eaa643d0b98947249adfbf10a5e104b..485a9092396c14b96edbe95ba15a8a92a7276746 100644 |
--- a/extensions/browser/api/networking_private/networking_private_chromeos.cc |
+++ b/extensions/browser/api/networking_private/networking_private_chromeos.cc |
@@ -444,6 +444,7 @@ void NetworkingPrivateChromeOS::CreateNetwork( |
void NetworkingPrivateChromeOS::ForgetNetwork( |
const std::string& guid, |
+ bool allow_forget_shared_config, |
const VoidCallback& success_callback, |
const FailureCallback& failure_callback) { |
std::string service_path, error; |
@@ -452,9 +453,50 @@ void NetworkingPrivateChromeOS::ForgetNetwork( |
return; |
} |
- GetManagedConfigurationHandler()->RemoveConfiguration( |
- service_path, success_callback, |
- base::Bind(&NetworkHandlerFailureCallback, failure_callback)); |
+ const chromeos::NetworkState* network = |
+ GetStateHandler()->GetNetworkStateFromServicePath( |
+ service_path, true /* configured only */); |
+ if (!network) { |
+ failure_callback.Run(networking_private::kErrorNetworkUnavailable); |
+ return; |
+ } |
+ |
+ std::string user_id_hash; |
+ // Don't allow non-primary user to remove private configs - the private |
+ // configs belong to the primary user (non-primary users' network configs |
+ // never get loaded by shill). |
+ if (!GetPrimaryUserIdHash(browser_context_, &user_id_hash, &error) && |
+ network->IsPrivate()) { |
+ failure_callback.Run(error); |
+ return; |
+ } |
+ |
+ if (!allow_forget_shared_config && !network->IsPrivate()) { |
+ failure_callback.Run(networking_private::kErrorAccessToSharedConfig); |
+ return; |
+ } |
+ |
+ onc::ONCSource onc_source = onc::ONC_SOURCE_UNKNOWN; |
+ if (GetManagedConfigurationHandler()->FindPolicyByGUID(user_id_hash, guid, |
+ &onc_source)) { |
+ // Fail if requested configuration removal includes a policy controlled |
+ // network configuration. |
+ if (allow_forget_shared_config || |
+ onc_source == onc::ONC_SOURCE_USER_POLICY) { |
stevenjb
2017/03/30 17:33:13
This logic is confusing to follow. I guess it is s
tbarzic
2017/03/30 18:00:05
yeah, good point. Done.
|
+ failure_callback.Run(networking_private::kErrorPolicyControlled); |
+ return; |
+ } |
+ } |
+ |
+ if (allow_forget_shared_config) { |
+ GetManagedConfigurationHandler()->RemoveConfiguration( |
+ service_path, success_callback, |
+ base::Bind(&NetworkHandlerFailureCallback, failure_callback)); |
+ } else { |
+ GetManagedConfigurationHandler()->RemoveConfigurationFromCurrentProfile( |
+ service_path, success_callback, |
+ base::Bind(&NetworkHandlerFailureCallback, failure_callback)); |
+ } |
} |
void NetworkingPrivateChromeOS::GetNetworks( |