Home | History | Annotate | Download | only in permissions
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "extensions/common/permissions/socket_permission.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "base/logging.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/strings/utf_string_conversions.h"
     12 #include "extensions/common/permissions/permissions_info.h"
     13 #include "extensions/common/permissions/set_disjunction_permission.h"
     14 #include "grit/extensions_strings.h"
     15 #include "ui/base/l10n/l10n_util.h"
     16 
     17 namespace extensions {
     18 
     19 SocketPermission::SocketPermission(const APIPermissionInfo* info)
     20     : SetDisjunctionPermission<SocketPermissionData, SocketPermission>(info) {}
     21 
     22 SocketPermission::~SocketPermission() {}
     23 
     24 PermissionMessages SocketPermission::GetMessages() const {
     25   DCHECK(HasMessages());
     26   PermissionMessages result;
     27   if (!AddAnyHostMessage(result)) {
     28     AddSpecificHostMessage(result);
     29     AddSubdomainHostMessage(result);
     30   }
     31   AddNetworkListMessage(result);
     32   return result;
     33 }
     34 
     35 bool SocketPermission::AddAnyHostMessage(PermissionMessages& messages) const {
     36   std::set<SocketPermissionData>::const_iterator i;
     37   for (i = data_set_.begin(); i != data_set_.end(); ++i) {
     38     if (i->entry().IsAddressBoundType() &&
     39         i->entry().GetHostType() == SocketPermissionEntry::ANY_HOST) {
     40       messages.push_back(
     41           PermissionMessage(PermissionMessage::kSocketAnyHost,
     42                             l10n_util::GetStringUTF16(
     43                                 IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST)));
     44       return true;
     45     }
     46   }
     47   return false;
     48 }
     49 
     50 void SocketPermission::AddSubdomainHostMessage(
     51     PermissionMessages& messages) const {
     52   std::set<base::string16> domains;
     53   std::set<SocketPermissionData>::const_iterator i;
     54   for (i = data_set_.begin(); i != data_set_.end(); ++i) {
     55     if (i->entry().GetHostType() == SocketPermissionEntry::HOSTS_IN_DOMAINS)
     56       domains.insert(base::UTF8ToUTF16(i->entry().pattern().host));
     57   }
     58   if (!domains.empty()) {
     59     int id = (domains.size() == 1)
     60                  ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN
     61                  : IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS;
     62     messages.push_back(PermissionMessage(
     63         PermissionMessage::kSocketDomainHosts,
     64         l10n_util::GetStringFUTF16(
     65             id,
     66             JoinString(
     67                 std::vector<base::string16>(domains.begin(), domains.end()),
     68                 ' '))));
     69   }
     70 }
     71 
     72 void SocketPermission::AddSpecificHostMessage(
     73     PermissionMessages& messages) const {
     74   std::set<base::string16> hostnames;
     75   std::set<SocketPermissionData>::const_iterator i;
     76   for (i = data_set_.begin(); i != data_set_.end(); ++i) {
     77     if (i->entry().GetHostType() == SocketPermissionEntry::SPECIFIC_HOSTS)
     78       hostnames.insert(base::UTF8ToUTF16(i->entry().pattern().host));
     79   }
     80   if (!hostnames.empty()) {
     81     int id = (hostnames.size() == 1)
     82                  ? IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST
     83                  : IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS;
     84     messages.push_back(PermissionMessage(
     85         PermissionMessage::kSocketSpecificHosts,
     86         l10n_util::GetStringFUTF16(
     87             id,
     88             JoinString(
     89                 std::vector<base::string16>(hostnames.begin(), hostnames.end()),
     90                 ' '))));
     91   }
     92 }
     93 
     94 void SocketPermission::AddNetworkListMessage(
     95     PermissionMessages& messages) const {
     96   std::set<SocketPermissionData>::const_iterator i;
     97   for (i = data_set_.begin(); i != data_set_.end(); ++i) {
     98     if (i->entry().pattern().type ==
     99         content::SocketPermissionRequest::NETWORK_STATE) {
    100       messages.push_back(
    101           PermissionMessage(PermissionMessage::kNetworkState,
    102                             l10n_util::GetStringUTF16(
    103                                 IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE)));
    104     }
    105   }
    106 }
    107 
    108 }  // namespace extensions
    109