summaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
authorstevenjb <stevenjb@chromium.org>2015-09-16 18:10:31 -0700
committerCommit bot <commit-bot@chromium.org>2015-09-17 01:11:41 +0000
commit845fe5282698356aaf9f4db88c1e339b4be76c5d (patch)
tree62f28da61bc3dce7b03d3b7283922aafdc6f98a0 /extensions
parent20e5942015f490bbeca91314d8e41116c3271c89 (diff)
downloadchromium_src-845fe5282698356aaf9f4db88c1e339b4be76c5d.zip
chromium_src-845fe5282698356aaf9f4db88c1e339b4be76c5d.tar.gz
chromium_src-845fe5282698356aaf9f4db88c1e339b4be76c5d.tar.bz2
Add Provider Name to ONC ThirdPartyVPN dictionary
This CL: * Populates ThirdPartyVPN.Name property for all networkingPrivate get* methods, including getState and getNetworks so that the VPN network names can be displayed correctly. * Updates the existing and new Settings UI to use this property. BUG=516796 Review URL: https://codereview.chromium.org/1295583003 Cr-Commit-Position: refs/heads/master@{#349305}
Diffstat (limited to 'extensions')
-rw-r--r--extensions/browser/api/networking_private/networking_private_chromeos.cc150
-rw-r--r--extensions/browser/api/networking_private/networking_private_chromeos.h23
-rw-r--r--extensions/browser/api/networking_private/networking_private_delegate.h4
-rw-r--r--extensions/browser/api/networking_private/networking_private_linux.h2
-rw-r--r--extensions/common/api/networking_private.idl1
5 files changed, 140 insertions, 40 deletions
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.cc b/extensions/browser/api/networking_private/networking_private_chromeos.cc
index 76f504c..412bfc0 100644
--- a/extensions/browser/api/networking_private/networking_private_chromeos.cc
+++ b/extensions/browser/api/networking_private/networking_private_chromeos.cc
@@ -7,6 +7,8 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/callback.h"
+#include "base/logging.h"
+#include "base/values.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/shill_manager_client.h"
#include "chromeos/login/login_state.h"
@@ -26,7 +28,12 @@
#include "components/onc/onc_constants.h"
#include "content/public/browser/browser_context.h"
#include "extensions/browser/api/networking_private/networking_private_api.h"
+#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extensions_browser_client.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/extension_set.h"
+#include "extensions/common/permissions/api_permission.h"
+#include "extensions/common/permissions/permissions_data.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
using chromeos::DeviceState;
@@ -61,9 +68,9 @@ bool GetServicePathFromGuid(const std::string& guid,
return true;
}
-bool GetUserIdHash(content::BrowserContext* browser_context,
- std::string* user_hash,
- std::string* error) {
+bool GetPrimaryUserIdHash(content::BrowserContext* browser_context,
+ std::string* user_hash,
+ std::string* error) {
std::string context_user_hash =
extensions::ExtensionsBrowserClient::Get()->GetUserIdHashFromContext(
browser_context);
@@ -75,10 +82,12 @@ bool GetUserIdHash(content::BrowserContext* browser_context,
// to avoid complexities with the policy code.
LOG(ERROR) << "networkingPrivate API call from non primary user: "
<< context_user_hash;
- *error = "Error.NonPrimaryUser";
+ if (error)
+ *error = "Error.NonPrimaryUser";
return false;
}
- *user_hash = context_user_hash;
+ if (user_hash)
+ *user_hash = context_user_hash;
return true;
}
@@ -128,14 +137,6 @@ void AppendDeviceState(
device_state_list->push_back(properties.Pass());
}
-void NetworkHandlerDictionaryCallback(
- const NetworkingPrivateDelegate::DictionaryCallback& callback,
- const std::string& service_path,
- const base::DictionaryValue& dictionary) {
- scoped_ptr<base::DictionaryValue> dictionary_copy(dictionary.DeepCopy());
- callback.Run(dictionary_copy.Pass());
-}
-
void NetworkHandlerFailureCallback(
const NetworkingPrivateDelegate::FailureCallback& callback,
const std::string& error_name,
@@ -161,6 +162,40 @@ void RequirePinSuccess(
base::Bind(&NetworkHandlerFailureCallback, failure_callback));
}
+// Returns the string corresponding to |key|. If the property is a managed
+// dictionary, returns the active value. If the property does not exist or
+// has no active value, returns an empty string.
+std::string GetStringFromDictionary(const base::DictionaryValue& dictionary,
+ const std::string& key) {
+ std::string result;
+ if (!dictionary.GetStringWithoutPathExpansion(key, &result)) {
+ const base::DictionaryValue* managed = nullptr;
+ if (dictionary.GetDictionaryWithoutPathExpansion(key, &managed)) {
+ managed->GetStringWithoutPathExpansion(::onc::kAugmentationActiveSetting,
+ &result);
+ }
+ }
+ return result;
+}
+
+base::DictionaryValue* GetThirdPartyVPNDictionary(
+ base::DictionaryValue* dictionary) {
+ const std::string type =
+ GetStringFromDictionary(*dictionary, ::onc::network_config::kType);
+ if (type != ::onc::network_config::kVPN)
+ return nullptr;
+ base::DictionaryValue* vpn_dict = nullptr;
+ if (!dictionary->GetDictionary(::onc::network_config::kVPN, &vpn_dict))
+ return nullptr;
+ if (GetStringFromDictionary(*vpn_dict, ::onc::vpn::kType) !=
+ ::onc::vpn::kThirdPartyVpn) {
+ return nullptr;
+ }
+ base::DictionaryValue* third_party_vpn = nullptr;
+ vpn_dict->GetDictionary(::onc::vpn::kThirdPartyVpn, &third_party_vpn);
+ return third_party_vpn;
+}
+
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -188,14 +223,15 @@ void NetworkingPrivateChromeOS::GetProperties(
}
std::string user_id_hash;
- if (!GetUserIdHash(browser_context_, &user_id_hash, &error)) {
+ if (!GetPrimaryUserIdHash(browser_context_, &user_id_hash, &error)) {
failure_callback.Run(error);
return;
}
GetManagedConfigurationHandler()->GetProperties(
user_id_hash, service_path,
- base::Bind(&NetworkHandlerDictionaryCallback, success_callback),
+ base::Bind(&NetworkingPrivateChromeOS::GetPropertiesCallback,
+ weak_ptr_factory_.GetWeakPtr(), success_callback),
base::Bind(&NetworkHandlerFailureCallback, failure_callback));
}
@@ -210,14 +246,15 @@ void NetworkingPrivateChromeOS::GetManagedProperties(
}
std::string user_id_hash;
- if (!GetUserIdHash(browser_context_, &user_id_hash, &error)) {
+ if (!GetPrimaryUserIdHash(browser_context_, &user_id_hash, &error)) {
failure_callback.Run(error);
return;
}
GetManagedConfigurationHandler()->GetManagedProperties(
user_id_hash, service_path,
- base::Bind(&NetworkHandlerDictionaryCallback, success_callback),
+ base::Bind(&NetworkingPrivateChromeOS::GetPropertiesCallback,
+ weak_ptr_factory_.GetWeakPtr(), success_callback),
base::Bind(&NetworkHandlerFailureCallback, failure_callback));
}
@@ -241,6 +278,7 @@ void NetworkingPrivateChromeOS::GetState(
scoped_ptr<base::DictionaryValue> network_properties =
chromeos::network_util::TranslateNetworkStateToONC(network_state);
+ AppendThirdPartyProviderName(network_properties.get());
success_callback.Run(network_properties.Pass());
}
@@ -268,7 +306,8 @@ void NetworkingPrivateChromeOS::CreateNetwork(
const FailureCallback& failure_callback) {
std::string user_id_hash, error;
// Do not allow configuring a non-shared network from a non-primary user.
- if (!shared && !GetUserIdHash(browser_context_, &user_id_hash, &error)) {
+ if (!shared &&
+ !GetPrimaryUserIdHash(browser_context_, &user_id_hash, &error)) {
failure_callback.Run(error);
return;
}
@@ -305,6 +344,15 @@ void NetworkingPrivateChromeOS::GetNetworks(
scoped_ptr<base::ListValue> network_properties_list =
chromeos::network_util::TranslateNetworkListToONC(
pattern, configured_only, visible_only, limit);
+
+ for (base::Value* value : *network_properties_list) {
+ base::DictionaryValue* network_dict = nullptr;
+ value->GetAsDictionary(&network_dict);
+ DCHECK(network_dict);
+ if (GetThirdPartyVPNDictionary(network_dict))
+ AppendThirdPartyProviderName(network_dict);
+ }
+
success_callback.Run(network_properties_list.Pass());
}
@@ -327,22 +375,6 @@ void NetworkingPrivateChromeOS::StartConnect(
check_error_state);
}
-void NetworkingPrivateChromeOS::ConnectFailureCallback(
- const std::string& guid,
- const VoidCallback& success_callback,
- const FailureCallback& failure_callback,
- const std::string& error_name,
- scoped_ptr<base::DictionaryValue> error_data) {
- // TODO(stevenjb): Temporary workaround to show the configuration UI.
- // Eventually the caller (e.g. Settings) should handle any failures and
- // show its own configuration UI. crbug.com/380937.
- if (ui_delegate()->HandleConnectFailed(guid, error_name)) {
- success_callback.Run();
- return;
- }
- failure_callback.Run(error_name);
-}
-
void NetworkingPrivateChromeOS::StartDisconnect(
const std::string& guid,
const VoidCallback& success_callback,
@@ -577,4 +609,54 @@ bool NetworkingPrivateChromeOS::RequestScan() {
return true;
}
+// Private methods
+
+void NetworkingPrivateChromeOS::GetPropertiesCallback(
+ const DictionaryCallback& callback,
+ const std::string& service_path,
+ const base::DictionaryValue& dictionary) {
+ scoped_ptr<base::DictionaryValue> dictionary_copy(dictionary.DeepCopy());
+ AppendThirdPartyProviderName(dictionary_copy.get());
+ callback.Run(dictionary_copy.Pass());
+}
+
+// Populate ThirdPartyVPN.kProviderName for third-party VPNs.
+void NetworkingPrivateChromeOS::AppendThirdPartyProviderName(
+ base::DictionaryValue* dictionary) {
+ base::DictionaryValue* third_party_vpn =
+ GetThirdPartyVPNDictionary(dictionary);
+ if (!third_party_vpn)
+ return;
+
+ const std::string extension_id = GetStringFromDictionary(
+ *third_party_vpn, ::onc::third_party_vpn::kExtensionID);
+ const ExtensionSet& extensions =
+ ExtensionRegistry::Get(browser_context_)->enabled_extensions();
+ for (const auto& extension : extensions) {
+ if (extension->permissions_data()->HasAPIPermission(
+ APIPermission::kVpnProvider) &&
+ extension->id() == extension_id) {
+ third_party_vpn->SetStringWithoutPathExpansion(
+ ::onc::third_party_vpn::kProviderName, extension->name());
+ break;
+ }
+ }
+}
+
+void NetworkingPrivateChromeOS::ConnectFailureCallback(
+ const std::string& guid,
+ const VoidCallback& success_callback,
+ const FailureCallback& failure_callback,
+ const std::string& error_name,
+ scoped_ptr<base::DictionaryValue> error_data) {
+ // TODO(stevenjb): Temporary workaround to show the configuration UI.
+ // Eventually the caller (e.g. Settings) should handle any failures and
+ // show its own configuration UI. crbug.com/380937.
+ if (ui_delegate()->HandleConnectFailed(guid, error_name)) {
+ success_callback.Run();
+ return;
+ }
+ failure_callback.Run(error_name);
+}
+
} // namespace extensions
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.h b/extensions/browser/api/networking_private/networking_private_chromeos.h
index dd511f9..3394e48 100644
--- a/extensions/browser/api/networking_private/networking_private_chromeos.h
+++ b/extensions/browser/api/networking_private/networking_private_chromeos.h
@@ -5,10 +5,17 @@
#ifndef EXTENSIONS_BROWSER_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_CHROMEOS_H_
#define EXTENSIONS_BROWSER_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_CHROMEOS_H_
+#include <string>
+
+#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "extensions/browser/api/networking_private/networking_private_delegate.h"
-namespace context {
+namespace base {
+class DictionaryValue;
+}
+
+namespace content {
class BrowserContext;
}
@@ -89,6 +96,20 @@ class NetworkingPrivateChromeOS : public NetworkingPrivateDelegate {
bool RequestScan() override;
private:
+ // Callback for both GetProperties and GetManagedProperties. Copies
+ // |dictionary| and appends any networkingPrivate API specific properties,
+ // then calls |callback| with the result.
+ void GetPropertiesCallback(const DictionaryCallback& callback,
+ const std::string& service_path,
+ const base::DictionaryValue& dictionary);
+
+ // Populate ThirdPartyVPN.ProviderName with the provider name for third-party
+ // VPNs. The provider name needs to be looked up from the list of extensions
+ // which is not available to the chromeos/network module.
+ void AppendThirdPartyProviderName(base::DictionaryValue* dictionary);
+
+ // Handles connection failures, possibly showing UI for configuration
+ // failures, then calls the appropriate callback.
void ConnectFailureCallback(const std::string& guid,
const VoidCallback& success_callback,
const FailureCallback& failure_callback,
diff --git a/extensions/browser/api/networking_private/networking_private_delegate.h b/extensions/browser/api/networking_private/networking_private_delegate.h
index c08ff65..32201da 100644
--- a/extensions/browser/api/networking_private/networking_private_delegate.h
+++ b/extensions/browser/api/networking_private/networking_private_delegate.h
@@ -15,10 +15,6 @@
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/common/api/networking_private.h"
-namespace content {
-class BrowserContext;
-}
-
namespace extensions {
class NetworkingPrivateDelegateObserver;
diff --git a/extensions/browser/api/networking_private/networking_private_linux.h b/extensions/browser/api/networking_private/networking_private_linux.h
index 7784919..792b9ec 100644
--- a/extensions/browser/api/networking_private/networking_private_linux.h
+++ b/extensions/browser/api/networking_private/networking_private_linux.h
@@ -14,7 +14,7 @@
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/browser/api/networking_private/networking_private_delegate.h"
-namespace context {
+namespace content {
class BrowserContext;
}
diff --git a/extensions/common/api/networking_private.idl b/extensions/common/api/networking_private.idl
index f393d23..b813e34 100644
--- a/extensions/common/api/networking_private.idl
+++ b/extensions/common/api/networking_private.idl
@@ -165,6 +165,7 @@ namespace networkingPrivate {
dictionary ThirdPartyVPNProperties {
DOMString ExtensionID;
+ DOMString? ProviderName;
};
dictionary VPNConfigProperties {