| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "extensions/common/permissions/socket_permission.h" |
| |
| #include <algorithm> |
| |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "extensions/common/permissions/permissions_info.h" |
| #include "extensions/common/permissions/set_disjunction_permission.h" |
| #include "grit/extensions_strings.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| namespace extensions { |
| |
| SocketPermission::SocketPermission(const APIPermissionInfo* info) |
| : SetDisjunctionPermission<SocketPermissionData, SocketPermission>(info) {} |
| |
| SocketPermission::~SocketPermission() {} |
| |
| PermissionMessages SocketPermission::GetMessages() const { |
| DCHECK(HasMessages()); |
| PermissionMessages result; |
| if (!AddAnyHostMessage(result)) { |
| AddSpecificHostMessage(result); |
| AddSubdomainHostMessage(result); |
| } |
| AddNetworkListMessage(result); |
| return result; |
| } |
| |
| bool SocketPermission::AddAnyHostMessage(PermissionMessages& messages) const { |
| std::set<SocketPermissionData>::const_iterator i; |
| for (i = data_set_.begin(); i != data_set_.end(); ++i) { |
| if (i->entry().IsAddressBoundType() && |
| i->entry().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 SocketPermission::AddSubdomainHostMessage( |
| PermissionMessages& messages) const { |
| std::set<base::string16> domains; |
| std::set<SocketPermissionData>::const_iterator i; |
| for (i = data_set_.begin(); i != data_set_.end(); ++i) { |
| if (i->entry().GetHostType() == SocketPermissionEntry::HOSTS_IN_DOMAINS) |
| domains.insert(base::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<base::string16>(domains.begin(), domains.end()), |
| ' ')))); |
| } |
| } |
| |
| void SocketPermission::AddSpecificHostMessage( |
| PermissionMessages& messages) const { |
| std::set<base::string16> hostnames; |
| std::set<SocketPermissionData>::const_iterator i; |
| for (i = data_set_.begin(); i != data_set_.end(); ++i) { |
| if (i->entry().GetHostType() == SocketPermissionEntry::SPECIFIC_HOSTS) |
| hostnames.insert(base::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<base::string16>(hostnames.begin(), hostnames.end()), |
| ' ')))); |
| } |
| } |
| |
| void SocketPermission::AddNetworkListMessage( |
| PermissionMessages& messages) const { |
| std::set<SocketPermissionData>::const_iterator i; |
| for (i = data_set_.begin(); i != data_set_.end(); ++i) { |
| if (i->entry().pattern().type == |
| content::SocketPermissionRequest::NETWORK_STATE) { |
| messages.push_back( |
| PermissionMessage(PermissionMessage::kNetworkState, |
| l10n_util::GetStringUTF16( |
| IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE))); |
| } |
| } |
| } |
| |
| } // namespace extensions |