| Index: chromeos/network/network_connection_handler.cc
|
| diff --git a/chromeos/network/network_connection_handler.cc b/chromeos/network/network_connection_handler.cc
|
| index e8c49396ba43b295dd1b3b19259b8d0cb5c92a66..47c1f6be5bc0ed3bad3687954fe0adccff134eca 100644
|
| --- a/chromeos/network/network_connection_handler.cc
|
| +++ b/chromeos/network/network_connection_handler.cc
|
| @@ -115,6 +115,8 @@ const char NetworkConnectionHandler::kErrorConnectCanceled[] =
|
| "connect-canceled";
|
| const char NetworkConnectionHandler::kErrorCertLoadTimeout[] =
|
| "cert-load-timeout";
|
| +const char NetworkConnectionHandler::kErrorUnmanagedNetwork[] =
|
| + "unmanaged-network";
|
|
|
| struct NetworkConnectionHandler::ConnectRequest {
|
| ConnectRequest(const std::string& service_path,
|
| @@ -285,6 +287,11 @@ void NetworkConnectionHandler::ConnectToNetwork(
|
| // Connect immediately to 'connectable' networks.
|
| // TODO(stevenjb): Shill needs to properly set Connectable for VPN.
|
| if (network && network->connectable() && network->type() != shill::kTypeVPN) {
|
| + if (IsNetworkProhibitedByPolicy(network->guid(), network->profile_path())) {
|
| + ErrorCallbackForPendingRequest(service_path, kErrorUnmanagedNetwork);
|
| + return;
|
| + }
|
| +
|
| CallShillConnect(service_path);
|
| return;
|
| }
|
| @@ -416,6 +423,11 @@ void NetworkConnectionHandler::VerifyConfiguredAndConnect(
|
| const base::DictionaryValue* user_policy =
|
| managed_configuration_handler_->FindPolicyByGuidAndProfile(guid, profile);
|
|
|
| + if (IsNetworkProhibitedByPolicy(guid, profile)) {
|
| + ErrorCallbackForPendingRequest(service_path, kErrorUnmanagedNetwork);
|
| + return;
|
| + }
|
| +
|
| client_cert::ClientCertConfig cert_config_from_policy;
|
| if (user_policy)
|
| client_cert::OncToClientCertConfig(*user_policy, &cert_config_from_policy);
|
| @@ -523,6 +535,27 @@ void NetworkConnectionHandler::VerifyConfiguredAndConnect(
|
| CallShillConnect(service_path);
|
| }
|
|
|
| +bool NetworkConnectionHandler::IsNetworkProhibitedByPolicy(
|
| + const std::string& guid,
|
| + const std::string& profile_path) {
|
| + if (!logged_in_)
|
| + return false;
|
| + const base::DictionaryValue* global_network_config =
|
| + managed_configuration_handler_->GetGlobalConfigFromPolicy(
|
| + std::string() /* no username hash, device policy */);
|
| + if (!global_network_config)
|
| + return false;
|
| + bool policy_prohibites = false;
|
| + if (!global_network_config->GetBooleanWithoutPathExpansion(
|
| + ::onc::global_network_config::kAllowOnlyPolicyNetworksToConnect,
|
| + &policy_prohibites) ||
|
| + !policy_prohibites) {
|
| + return false;
|
| + }
|
| + return !managed_configuration_handler_->FindPolicyByGuidAndProfile(
|
| + guid, profile_path);
|
| +}
|
| +
|
| void NetworkConnectionHandler::QueueConnectRequest(
|
| const std::string& service_path) {
|
| ConnectRequest* request = GetPendingRequest(service_path);
|
|
|