Home | History | Annotate | Download | only in permissions
      1 // Copyright (c) 2012 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 "chrome/common/extensions/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 "chrome/common/extensions/permissions/permissions_info.h"
     13 #include "chrome/common/extensions/permissions/set_disjunction_permission.h"
     14 #include "grit/generated_resources.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 
     23 SocketPermission::~SocketPermission() {
     24 }
     25 
     26 PermissionMessages SocketPermission::GetMessages() const {
     27   DCHECK(HasMessages());
     28   PermissionMessages result;
     29   if (!AddAnyHostMessage(result)) {
     30     AddSpecificHostMessage(result);
     31     AddSubdomainHostMessage(result);
     32   }
     33   return result;
     34 }
     35 
     36 bool SocketPermission::AddAnyHostMessage(PermissionMessages& messages)
     37     const {
     38   std::set<SocketPermissionData>::const_iterator i;
     39   for (i = data_set_.begin(); i != data_set_.end(); ++i) {
     40     if (i->GetHostType() == SocketPermissionData::ANY_HOST) {
     41       messages.push_back(PermissionMessage(
     42             PermissionMessage::kSocketAnyHost,
     43             l10n_util::GetStringUTF16(
     44                 IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST)));
     45       return true;
     46     }
     47   }
     48   return false;
     49 }
     50 
     51 void SocketPermission::AddSubdomainHostMessage(PermissionMessages& messages)
     52     const {
     53   std::set<string16> domains;
     54   std::set<SocketPermissionData>::const_iterator i;
     55   for (i = data_set_.begin(); i != data_set_.end(); ++i) {
     56     if (i->GetHostType() == SocketPermissionData::HOSTS_IN_DOMAINS)
     57       domains.insert(UTF8ToUTF16(i->GetHost()));
     58   }
     59   if (!domains.empty()) {
     60     int id = (domains.size() == 1) ?
     61              IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN :
     62              IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS;
     63     messages.push_back(PermissionMessage(
     64           PermissionMessage::kSocketDomainHosts,
     65           l10n_util::GetStringFUTF16(
     66               id,
     67               JoinString(
     68                   std::vector<string16>(
     69                       domains.begin(), domains.end()), ' '))));
     70   }
     71 }
     72 
     73 void SocketPermission::AddSpecificHostMessage(PermissionMessages& messages)
     74     const {
     75   std::set<string16> hostnames;
     76   std::set<SocketPermissionData>::const_iterator i;
     77   for (i = data_set_.begin(); i != data_set_.end(); ++i) {
     78     if (i->GetHostType() == SocketPermissionData::SPECIFIC_HOSTS)
     79       hostnames.insert(UTF8ToUTF16(i->GetHost()));
     80   }
     81   if (!hostnames.empty()) {
     82     int id = (hostnames.size() == 1) ?
     83              IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST :
     84              IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS;
     85     messages.push_back(PermissionMessage(
     86           PermissionMessage::kSocketSpecificHosts,
     87           l10n_util::GetStringFUTF16(
     88               id,
     89               JoinString(
     90                   std::vector<string16>(
     91                       hostnames.begin(), hostnames.end()), ' '))));
     92   }
     93 }
     94 
     95 }  // namespace extensions
     96