Chromium Code Reviews| 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 |