Index: chrome/common/extensions/api/sockets/sockets_handler.cc |
diff --git a/chrome/common/extensions/api/sockets/sockets_handler.cc b/chrome/common/extensions/api/sockets/sockets_handler.cc |
index a1b51c21e3a0974a19e75b779742eb714ed162a5..9ecdd218f83465cdd24c4f132182b8a5804e57d5 100644 |
--- a/chrome/common/extensions/api/sockets/sockets_handler.cc |
+++ b/chrome/common/extensions/api/sockets/sockets_handler.cc |
@@ -14,6 +14,8 @@ |
#include "extensions/common/error_utils.h" |
#include "extensions/common/manifest_constants.h" |
#include "extensions/common/permissions/api_permission_set.h" |
+#include "grit/generated_resources.h" |
+#include "ui/base/l10n/l10n_util.h" |
namespace extensions { |
@@ -45,6 +47,34 @@ bool SocketsHandler::Parse(Extension* extension, string16* error) { |
return true; |
} |
+void SocketsHandler::AddPermissionWarningMessages( |
+ const Extension* extension, |
+ std::vector<string16>& messages) const { |
+ SocketsManifestData* manifest_data = SocketsManifestData::Get(extension); |
+ if (!manifest_data) |
+ return; |
+ PermissionMessages permission_messages = |
+ manifest_data->GetPermissionMessages(); |
+ for (PermissionMessages::const_iterator i = permission_messages.begin(); |
+ i != permission_messages.end(); ++i) { |
+ messages.push_back(i->message()); |
+ } |
+} |
+ |
+void SocketsHandler::AddPermissionWarningMessagesDetails( |
+ const Extension* extension, |
+ std::vector<string16>& messages) const { |
+ SocketsManifestData* manifest_data = SocketsManifestData::Get(extension); |
+ if (!manifest_data) |
+ return; |
+ PermissionMessages permission_messages = |
+ manifest_data->GetPermissionMessages(); |
+ for (PermissionMessages::const_iterator i = permission_messages.begin(); |
+ i != permission_messages.end(); ++i) { |
+ messages.push_back(i->details()); |
+ } |
+} |
+ |
const std::vector<std::string> SocketsHandler::Keys() const { |
return SingleKey(manifest_keys::kSockets); |
} |
@@ -152,4 +182,92 @@ bool SocketsManifestData::CheckRequestImpl( |
return false; |
} |
+PermissionMessages SocketsManifestData::GetPermissionMessages() const { |
+ // TODO(rpaquay): This function and callees is (almost) a copy/paste |
Yoyo Zhou
2013/11/06 04:02:36
Have you thought about how extensions that current
rpaquay
2013/11/06 16:16:16
Good question. I guess unless we do extra work, th
|
+ // from |extensions::SocketPermission|. |
+ PermissionMessages result; |
+ if (!AddAnyHostMessage(result)) { |
+ AddSpecificHostMessage(result); |
+ AddSubdomainHostMessage(result); |
+ } |
+ AddNetworkListMessage(result); |
+ return result; |
+} |
+ |
+bool SocketsManifestData::AddAnyHostMessage( |
+ PermissionMessages& messages) const { |
+ for (PermissionSet::const_iterator it = permissions_.begin(); |
+ it != permissions_.end(); ++it) { |
+ if (it->IsAddressBoundType() && |
+ it->GetHostType() == SocketPermissionEntry::ANY_HOST) { |
+ messages.push_back(PermissionMessage( |
+ PermissionMessage::kSocketAnyHost, |
+ l10n_util::GetStringUTF16( |
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST))); |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
+void SocketsManifestData::AddSubdomainHostMessage( |
+ PermissionMessages& messages) const { |
+ std::set<string16> domains; |
+ std::set<SocketPermissionData>::const_iterator i; |
+ for (PermissionSet::const_iterator it = permissions_.begin(); |
+ it != permissions_.end(); ++it) { |
+ if (it->GetHostType() == SocketPermissionEntry::HOSTS_IN_DOMAINS) |
+ domains.insert(UTF8ToUTF16(i->entry().pattern().host)); |
+ } |
+ if (!domains.empty()) { |
+ int id = (domains.size() == 1) ? |
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN : |
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS; |
+ messages.push_back(PermissionMessage( |
+ PermissionMessage::kSocketDomainHosts, |
+ l10n_util::GetStringFUTF16( |
+ id, |
+ JoinString( |
+ std::vector<string16>( |
+ domains.begin(), domains.end()), ' ')))); |
+ } |
+} |
+ |
+void SocketsManifestData::AddSpecificHostMessage( |
+ PermissionMessages& messages) const { |
+ std::set<string16> hostnames; |
+ std::set<SocketPermissionData>::const_iterator i; |
+ for (PermissionSet::const_iterator it = permissions_.begin(); |
+ it != permissions_.end(); ++it) { |
+ if (it->GetHostType() == SocketPermissionEntry::SPECIFIC_HOSTS) |
+ hostnames.insert(UTF8ToUTF16(i->entry().pattern().host)); |
+ } |
+ if (!hostnames.empty()) { |
+ int id = (hostnames.size() == 1) ? |
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST : |
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS; |
+ messages.push_back(PermissionMessage( |
+ PermissionMessage::kSocketSpecificHosts, |
+ l10n_util::GetStringFUTF16( |
+ id, |
+ JoinString( |
+ std::vector<string16>( |
+ hostnames.begin(), hostnames.end()), ' ')))); |
+ } |
+} |
+ |
+void SocketsManifestData::AddNetworkListMessage( |
+ PermissionMessages& messages) const { |
+ std::set<SocketPermissionData>::const_iterator i; |
+ for (PermissionSet::const_iterator it = permissions_.begin(); |
+ it != permissions_.end(); ++it) { |
+ if (it->pattern().type == content::SocketPermissionRequest::NETWORK_STATE) { |
+ messages.push_back(PermissionMessage( |
+ PermissionMessage::kNetworkState, |
+ l10n_util::GetStringUTF16( |
+ IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE))); |
+ } |
+ } |
+} |
+ |
} // namespace extensions |