blob: ebf72055f37c94785059db33db32c293b706d374 [file] [log] [blame]
// Copyright (c) 2012 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 "chrome/common/extensions/permissions/socket_permission.h"
#include <algorithm>
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/common/extensions/permissions/permissions_info.h"
#include "chrome/common/extensions/permissions/set_disjunction_permission.h"
#include "grit/generated_resources.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->IsAddressBoundType() &&
i->GetHostType() == SocketPermissionData::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<string16> domains;
std::set<SocketPermissionData>::const_iterator i;
for (i = data_set_.begin(); i != data_set_.end(); ++i) {
if (i->GetHostType() == SocketPermissionData::HOSTS_IN_DOMAINS)
domains.insert(UTF8ToUTF16(i->GetHost()));
}
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 SocketPermission::AddSpecificHostMessage(
PermissionMessages& messages) const {
std::set<string16> hostnames;
std::set<SocketPermissionData>::const_iterator i;
for (i = data_set_.begin(); i != data_set_.end(); ++i) {
if (i->GetHostType() == SocketPermissionData::SPECIFIC_HOSTS)
hostnames.insert(UTF8ToUTF16(i->GetHost()));
}
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 SocketPermission::AddNetworkListMessage(
PermissionMessages& messages) const {
std::set<SocketPermissionData>::const_iterator i;
for (i = data_set_.begin(); i != data_set_.end(); ++i) {
if (i->pattern().type == content::SocketPermissionRequest::NETWORK_STATE) {
messages.push_back(PermissionMessage(
PermissionMessage::kNetworkState,
l10n_util::GetStringUTF16(
IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE)));
}
}
}
} // namespace extensions