| // 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 "chrome/common/extensions/permissions/chrome_permission_message_rules.h" |
| |
| #include <iterator> |
| #include <memory> |
| #include <utility> |
| |
| #include "base/macros.h" |
| #include "base/stl_util.h" |
| #include "base/strings/string_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| namespace extensions { |
| |
| namespace { |
| |
| // The default formatter for a permission message. Simply displays the message |
| // with the given ID. |
| class DefaultPermissionMessageFormatter |
| : public ChromePermissionMessageFormatter { |
| public: |
| explicit DefaultPermissionMessageFormatter(int message_id) |
| : message_id_(message_id) {} |
| ~DefaultPermissionMessageFormatter() override {} |
| |
| PermissionMessage GetPermissionMessage( |
| const PermissionIDSet& permissions) const override { |
| return PermissionMessage(l10n_util::GetStringUTF16(message_id_), |
| permissions); |
| } |
| |
| private: |
| int message_id_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DefaultPermissionMessageFormatter); |
| }; |
| |
| // A formatter that substitutes the parameter into the message using string |
| // formatting. |
| // NOTE: Only one permission with the given ID is substituted using this rule. |
| class SingleParameterFormatter : public ChromePermissionMessageFormatter { |
| public: |
| explicit SingleParameterFormatter(int message_id) : message_id_(message_id) {} |
| ~SingleParameterFormatter() override {} |
| |
| PermissionMessage GetPermissionMessage( |
| const PermissionIDSet& permissions) const override { |
| DCHECK(permissions.size() > 0); |
| std::vector<base::string16> parameters = |
| permissions.GetAllPermissionParameters(); |
| DCHECK_EQ(1U, parameters.size()) |
| << "Only one message with each ID can be parameterized."; |
| return PermissionMessage( |
| l10n_util::GetStringFUTF16(message_id_, parameters[0]), permissions); |
| } |
| |
| private: |
| int message_id_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SingleParameterFormatter); |
| }; |
| |
| // Adds each parameter to a growing list, with the given |root_message_id| as |
| // the message at the top of the list. |
| class SimpleListFormatter : public ChromePermissionMessageFormatter { |
| public: |
| explicit SimpleListFormatter(int root_message_id) |
| : root_message_id_(root_message_id) {} |
| ~SimpleListFormatter() override {} |
| |
| PermissionMessage GetPermissionMessage( |
| const PermissionIDSet& permissions) const override { |
| DCHECK(permissions.size() > 0); |
| return PermissionMessage(l10n_util::GetStringUTF16(root_message_id_), |
| permissions, |
| permissions.GetAllPermissionParameters()); |
| } |
| |
| private: |
| int root_message_id_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SimpleListFormatter); |
| }; |
| |
| // Creates a space-separated list of permissions with the given PermissionID. |
| // The list is inserted into the messages with the given IDs: one for the case |
| // where there is a single permission, and the other for the case where there |
| // are multiple. |
| // TODO(sashab): Extend this to pluralize correctly in all languages. |
| class SpaceSeparatedListFormatter : public ChromePermissionMessageFormatter { |
| public: |
| SpaceSeparatedListFormatter(int message_id_for_one_host, |
| int message_id_for_multiple_hosts) |
| : message_id_for_one_host_(message_id_for_one_host), |
| message_id_for_multiple_hosts_(message_id_for_multiple_hosts) {} |
| ~SpaceSeparatedListFormatter() override {} |
| |
| PermissionMessage GetPermissionMessage( |
| const PermissionIDSet& permissions) const override { |
| DCHECK(permissions.size() > 0); |
| std::vector<base::string16> hostnames = |
| permissions.GetAllPermissionParameters(); |
| base::string16 hosts_string = |
| base::JoinString(hostnames, base::ASCIIToUTF16(" ")); |
| return PermissionMessage( |
| l10n_util::GetStringFUTF16(hostnames.size() == 1 |
| ? message_id_for_one_host_ |
| : message_id_for_multiple_hosts_, |
| hosts_string), |
| permissions); |
| } |
| |
| private: |
| int message_id_for_one_host_; |
| int message_id_for_multiple_hosts_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SpaceSeparatedListFormatter); |
| }; |
| |
| // Creates a list of host permissions. If there are 1-3 hosts, they are inserted |
| // directly into a message with a given ID. If there are more than 3, they are |
| // displayed as list of submessages instead. |
| class HostListFormatter : public ChromePermissionMessageFormatter { |
| public: |
| HostListFormatter(int message_id_for_one_host, |
| int message_id_for_two_hosts, |
| int message_id_for_three_hosts, |
| int message_id_for_many_hosts) |
| : message_id_for_one_host_(message_id_for_one_host), |
| message_id_for_two_hosts_(message_id_for_two_hosts), |
| message_id_for_three_hosts_(message_id_for_three_hosts), |
| message_id_for_many_hosts_(message_id_for_many_hosts) {} |
| ~HostListFormatter() override {} |
| |
| PermissionMessage GetPermissionMessage( |
| const PermissionIDSet& permissions) const override { |
| DCHECK(!permissions.empty()); |
| std::vector<base::string16> hostnames = |
| GetHostMessages(permissions.GetAllPermissionParameters()); |
| int message_id = message_id_for_hosts(hostnames.size()); |
| if (hostnames.size() <= kMaxHostsInMainMessage) { |
| return PermissionMessage( |
| l10n_util::GetStringFUTF16(message_id, hostnames, nullptr), |
| permissions); |
| } |
| return PermissionMessage(l10n_util::GetStringUTF16(message_id), permissions, |
| hostnames); |
| } |
| |
| private: |
| int message_id_for_hosts(int number_of_hosts) const { |
| switch (number_of_hosts) { |
| case 1: |
| return message_id_for_one_host_; |
| case 2: |
| return message_id_for_two_hosts_; |
| case 3: |
| return message_id_for_three_hosts_; |
| default: |
| return message_id_for_many_hosts_; |
| } |
| } |
| |
| std::vector<base::string16> GetHostMessages( |
| const std::vector<base::string16>& hosts) const { |
| int msg_id = hosts.size() <= kMaxHostsInMainMessage |
| ? IDS_EXTENSION_PROMPT_WARNING_HOST_AND_SUBDOMAIN |
| : IDS_EXTENSION_PROMPT_WARNING_HOST_AND_SUBDOMAIN_LIST; |
| std::vector<base::string16> messages; |
| for (const base::string16& host : hosts) { |
| messages.push_back( |
| host[0] == '*' && host[1] == '.' |
| ? l10n_util::GetStringFUTF16(msg_id, host.substr(2)) |
| : host); |
| } |
| return messages; |
| } |
| |
| static const int kMaxHostsInMainMessage = 3; |
| |
| int message_id_for_one_host_; |
| int message_id_for_two_hosts_; |
| int message_id_for_three_hosts_; |
| int message_id_for_many_hosts_; |
| |
| DISALLOW_COPY_AND_ASSIGN(HostListFormatter); |
| }; |
| |
| class USBDevicesFormatter : public ChromePermissionMessageFormatter { |
| public: |
| USBDevicesFormatter() {} |
| ~USBDevicesFormatter() override {} |
| |
| PermissionMessage GetPermissionMessage( |
| const PermissionIDSet& permissions) const override { |
| DCHECK(permissions.size() > 0); |
| return permissions.size() == 1 ? GetItemMessage(permissions) |
| : GetMultiItemMessage(permissions); |
| } |
| |
| private: |
| PermissionMessage GetItemMessage(const PermissionIDSet& permissions) const { |
| DCHECK(permissions.size() == 1); |
| const PermissionID& permission = *permissions.begin(); |
| base::string16 msg; |
| switch (permission.id()) { |
| case APIPermission::kUsbDevice: |
| msg = l10n_util::GetStringFUTF16( |
| IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE, permission.parameter()); |
| break; |
| case APIPermission::kUsbDeviceUnknownProduct: |
| msg = l10n_util::GetStringFUTF16( |
| IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_UNKNOWN_PRODUCT, |
| permission.parameter()); |
| break; |
| case APIPermission::kUsbDeviceUnknownVendor: |
| msg = l10n_util::GetStringUTF16( |
| IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_UNKNOWN_VENDOR); |
| break; |
| default: |
| NOTREACHED(); |
| } |
| return PermissionMessage(msg, permissions); |
| } |
| |
| PermissionMessage GetMultiItemMessage( |
| const PermissionIDSet& permissions) const { |
| DCHECK(permissions.size() > 1); |
| // Put all the individual items into submessages. |
| std::vector<base::string16> submessages = |
| permissions.GetAllPermissionsWithID(APIPermission::kUsbDevice) |
| .GetAllPermissionParameters(); |
| std::vector<base::string16> vendors = |
| permissions.GetAllPermissionsWithID( |
| APIPermission::kUsbDeviceUnknownProduct) |
| .GetAllPermissionParameters(); |
| for (const base::string16& vendor : vendors) { |
| submessages.push_back(l10n_util::GetStringFUTF16( |
| IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_LIST_ITEM_UNKNOWN_PRODUCT, |
| vendor)); |
| } |
| if (permissions.ContainsID(APIPermission::kUsbDeviceUnknownVendor)) { |
| submessages.push_back(l10n_util::GetStringUTF16( |
| IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_LIST_ITEM_UNKNOWN_VENDOR)); |
| } |
| |
| return PermissionMessage( |
| l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_LIST), |
| permissions, submessages); |
| } |
| |
| DISALLOW_COPY_AND_ASSIGN(USBDevicesFormatter); |
| }; |
| |
| } // namespace |
| |
| ChromePermissionMessageRule::ChromePermissionMessageRule( |
| int message_id, |
| const std::initializer_list<APIPermission::ID>& required, |
| const std::initializer_list<APIPermission::ID>& optional) |
| : ChromePermissionMessageRule( |
| std::make_unique<DefaultPermissionMessageFormatter>(message_id), |
| required, |
| optional) {} |
| |
| ChromePermissionMessageRule::ChromePermissionMessageRule( |
| std::unique_ptr<ChromePermissionMessageFormatter> formatter, |
| const std::initializer_list<APIPermission::ID>& required, |
| const std::initializer_list<APIPermission::ID>& optional) |
| : required_permissions_(required), |
| optional_permissions_(optional), |
| formatter_(std::move(formatter)) { |
| DCHECK(!required_permissions_.empty()); |
| } |
| |
| ChromePermissionMessageRule::ChromePermissionMessageRule( |
| ChromePermissionMessageRule&& other) = default; |
| |
| ChromePermissionMessageRule& ChromePermissionMessageRule::operator=( |
| ChromePermissionMessageRule&& other) = default; |
| |
| ChromePermissionMessageRule::~ChromePermissionMessageRule() { |
| } |
| |
| std::set<APIPermission::ID> ChromePermissionMessageRule::required_permissions() |
| const { |
| return required_permissions_; |
| } |
| std::set<APIPermission::ID> ChromePermissionMessageRule::optional_permissions() |
| const { |
| return optional_permissions_; |
| } |
| |
| std::set<APIPermission::ID> ChromePermissionMessageRule::all_permissions() |
| const { |
| return base::STLSetUnion<std::set<APIPermission::ID>>(required_permissions(), |
| optional_permissions()); |
| } |
| |
| PermissionMessage ChromePermissionMessageRule::GetPermissionMessage( |
| const PermissionIDSet& permissions) const { |
| return formatter_->GetPermissionMessage(permissions); |
| } |
| |
| // static |
| std::vector<ChromePermissionMessageRule> |
| ChromePermissionMessageRule::GetAllRules() { |
| // The rules for generating messages from permissions. Any new rules should be |
| // added directly to this list, not elsewhere in the code, so that all the |
| // logic of generating and coalescing permission messages happens here. |
| // |
| // Each rule has 3 components: |
| // 1. The message itself |
| // 2. The permissions that need to be present for the message to appear |
| // 3. Permissions that, if present, also contribute to the message, but do not |
| // form the message on their own |
| // |
| // Rules are applied in precedence order: rules that come first consume |
| // permissions (both required and optional) so they can not be used in later |
| // rules. |
| // NOTE: The order of this list matters - be careful when adding new rules! |
| // If unsure, add them near related rules and add tests to |
| // permission_message_combinations_unittest.cc (or elsewhere) to ensure your |
| // messages are being generated/coalesced correctly. |
| // |
| // Rules are not transitive: This means that if the kTab permission 'absorbs' |
| // (suppresses) the messages for kTopSites and kFavicon, and the kHistory |
| // permission suppresses kTab, be careful to also add kTopSites and kFavicon |
| // to the kHistory absorb list. Ideally, the rules system should be simple |
| // enough that rules like this should not occur; the visibility of the rules |
| // system should allow us to design a system that is simple enough to explain |
| // yet powerful enough to encapsulate all the messages we want to display. |
| ChromePermissionMessageRule rules_arr[] = { |
| // BEGIN POWERFUL PERMISSIONS: |
| // The following permissions are shown in the chrome://management page. |
| // See also GetPowerfulPermissionMessages(). |
| |
| // Full access permission messages. |
| {IDS_EXTENSION_PROMPT_WARNING_DEBUGGER, {APIPermission::kDebugger}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS, |
| {APIPermission::kFullAccess}, |
| {APIPermission::kDeclarativeWebRequest, |
| APIPermission::kDeclarativeNetRequestFeedback, APIPermission::kFavicon, |
| APIPermission::kHostsAll, APIPermission::kHostsAllReadOnly, |
| APIPermission::kProcesses, APIPermission::kTab, |
| APIPermission::kTopSites, APIPermission::kWebNavigation, |
| APIPermission::kDeclarativeNetRequest}}, |
| |
| // Hosts permission messages. |
| // Full host access already allows DeclarativeWebRequest, reading the list |
| // of most frequently visited sites, and tab access. |
| // The warning message for declarativeWebRequest permissions speaks about |
| // blocking parts of pages, which is a subset of what the "<all_urls>" |
| // access allows. Therefore we display only the "<all_urls>" warning |
| // message if both permissions are required. |
| {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS, |
| {APIPermission::kHostsAll}, |
| {APIPermission::kDeclarativeWebRequest, |
| APIPermission::kDeclarativeNetRequestFeedback, APIPermission::kFavicon, |
| APIPermission::kHostsAllReadOnly, APIPermission::kHostReadOnly, |
| APIPermission::kHostReadWrite, APIPermission::kProcesses, |
| APIPermission::kTab, APIPermission::kTopSites, |
| APIPermission::kWebNavigation, APIPermission::kDeclarativeNetRequest}}, |
| {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS_READ_ONLY, |
| {APIPermission::kHostsAllReadOnly}, |
| {APIPermission::kDeclarativeNetRequestFeedback, APIPermission::kFavicon, |
| APIPermission::kHostReadOnly, APIPermission::kProcesses, |
| APIPermission::kTab, APIPermission::kTopSites, |
| APIPermission::kWebNavigation}}, |
| |
| {std::make_unique<HostListFormatter>( |
| IDS_EXTENSION_PROMPT_WARNING_1_HOST, |
| IDS_EXTENSION_PROMPT_WARNING_2_HOSTS, |
| IDS_EXTENSION_PROMPT_WARNING_3_HOSTS, |
| IDS_EXTENSION_PROMPT_WARNING_HOSTS_LIST), |
| {APIPermission::kHostReadWrite}, |
| {}}, |
| {std::make_unique<HostListFormatter>( |
| IDS_EXTENSION_PROMPT_WARNING_1_HOST_READ_ONLY, |
| IDS_EXTENSION_PROMPT_WARNING_2_HOSTS_READ_ONLY, |
| IDS_EXTENSION_PROMPT_WARNING_3_HOSTS_READ_ONLY, |
| IDS_EXTENSION_PROMPT_WARNING_HOSTS_LIST_READ_ONLY), |
| {APIPermission::kHostReadOnly}, |
| {}}, |
| |
| // New tab page permission is fairly highly used so rank it quite highly. |
| // Nothing should subsume it. |
| {IDS_EXTENSION_PROMPT_WARNING_NEW_TAB_PAGE_OVERRIDE, |
| {APIPermission::kNewTabPageOverride}, |
| {}}, |
| |
| // History-related permission messages. |
| // History already allows reading favicons, tab access and accessing the |
| // list of most frequently visited sites. |
| {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS, |
| {APIPermission::kHistory, APIPermission::kSessions}, |
| {APIPermission::kDeclarativeNetRequestFeedback, APIPermission::kFavicon, |
| APIPermission::kProcesses, APIPermission::kTab, |
| APIPermission::kTopSites, APIPermission::kWebNavigation}}, |
| {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS, |
| {APIPermission::kTab, APIPermission::kSessions}, |
| {APIPermission::kDeclarativeNetRequestFeedback, APIPermission::kFavicon, |
| APIPermission::kProcesses, APIPermission::kTopSites, |
| APIPermission::kWebNavigation}}, |
| {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE, |
| {APIPermission::kHistory}, |
| {APIPermission::kDeclarativeNetRequestFeedback, APIPermission::kFavicon, |
| APIPermission::kProcesses, APIPermission::kTab, |
| APIPermission::kTopSites, APIPermission::kWebNavigation}}, |
| // Note: kSessions allows reading history from other devices only if kTab |
| // is also present. Therefore, there are no _AND_SESSIONS versions of |
| // the other rules that generate the HISTORY_READ warning. |
| {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ, |
| {APIPermission::kTab}, |
| {APIPermission::kDeclarativeNetRequestFeedback, APIPermission::kFavicon, |
| APIPermission::kProcesses, APIPermission::kTopSites, |
| APIPermission::kWebNavigation}}, |
| {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ, |
| {APIPermission::kProcesses}, |
| {APIPermission::kDeclarativeNetRequestFeedback, APIPermission::kFavicon, |
| APIPermission::kTopSites, APIPermission::kWebNavigation}}, |
| {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ, |
| {APIPermission::kWebNavigation}, |
| {APIPermission::kDeclarativeNetRequestFeedback, APIPermission::kFavicon, |
| APIPermission::kTopSites}}, |
| {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ, |
| {APIPermission::kDeclarativeNetRequestFeedback}, |
| {APIPermission::kFavicon, APIPermission::kTopSites}}, |
| {IDS_EXTENSION_PROMPT_WARNING_FAVICON, {APIPermission::kFavicon}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_TOPSITES, {APIPermission::kTopSites}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_PRINTING, {APIPermission::kPrinting}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_PRINTING_METRICS, |
| {APIPermission::kPrintingMetrics}, |
| {}}, |
| |
| // END POWERFUL PERMISSIONS |
| |
| {IDS_EXTENSION_PROMPT_WARNING_DECLARATIVE_WEB_REQUEST, |
| {APIPermission::kDeclarativeWebRequest}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_DECLARATIVE_NET_REQUEST, |
| {APIPermission::kDeclarativeNetRequest}, |
| {}}, |
| |
| // Messages generated by the sockets permission. |
| {IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST, |
| {APIPermission::kSocketAnyHost}, |
| {APIPermission::kSocketDomainHosts, |
| APIPermission::kSocketSpecificHosts}}, |
| {std::make_unique<SpaceSeparatedListFormatter>( |
| IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN, |
| IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS), |
| {APIPermission::kSocketDomainHosts}, |
| {}}, |
| {std::make_unique<SpaceSeparatedListFormatter>( |
| IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST, |
| IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS), |
| {APIPermission::kSocketSpecificHosts}, |
| {}}, |
| |
| // Devices-related messages. |
| // USB Device Permission rules. Think of these three rules as a single one |
| // that applies when any of the three kUsb* IDs is there, and pulls them |
| // all into a single formatter. |
| {std::make_unique<USBDevicesFormatter>(), |
| {APIPermission::kUsbDevice}, |
| {APIPermission::kUsbDeviceUnknownProduct, |
| APIPermission::kUsbDeviceUnknownVendor}}, |
| {std::make_unique<USBDevicesFormatter>(), |
| {APIPermission::kUsbDeviceUnknownProduct}, |
| {APIPermission::kUsbDeviceUnknownVendor}}, |
| {std::make_unique<USBDevicesFormatter>(), |
| {APIPermission::kUsbDeviceUnknownVendor}, |
| {}}, |
| // Access to users' devices should provide a single warning message |
| // specifying the transport method used; serial and/or Bluetooth. |
| {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_SERIAL, |
| {APIPermission::kBluetooth, APIPermission::kSerial}, |
| {APIPermission::kBluetoothDevices}}, |
| {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH, |
| {APIPermission::kBluetooth}, |
| {APIPermission::kBluetoothDevices}}, |
| {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_DEVICES, |
| {APIPermission::kBluetoothDevices}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_PRIVATE, |
| {APIPermission::kBluetoothPrivate}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_SERIAL, {APIPermission::kSerial}, {}}, |
| // Universal 2nd Factor devices. |
| {IDS_EXTENSION_PROMPT_WARNING_U2F_DEVICES, |
| {APIPermission::kU2fDevices}, |
| {}}, |
| // Notifications. |
| {IDS_EXTENSION_PROMPT_WARNING_NOTIFICATIONS, |
| {APIPermission::kNotifications}, |
| {}}, |
| |
| // Accessibility features. |
| {IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_READ_MODIFY, |
| {APIPermission::kAccessibilityFeaturesModify, |
| APIPermission::kAccessibilityFeaturesRead}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_MODIFY, |
| {APIPermission::kAccessibilityFeaturesModify}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_READ, |
| {APIPermission::kAccessibilityFeaturesRead}, |
| {}}, |
| |
| // Media galleries permissions. We don't have strings for every possible |
| // combination, e.g. we don't bother with a special string for "write, but |
| // not read" - just show the "read and write" string instead, etc. |
| {IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_WRITE_DELETE, |
| {APIPermission::kMediaGalleriesAllGalleriesCopyTo, |
| APIPermission::kMediaGalleriesAllGalleriesDelete}, |
| {APIPermission::kMediaGalleriesAllGalleriesRead}}, |
| {IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_WRITE, |
| {APIPermission::kMediaGalleriesAllGalleriesCopyTo}, |
| {APIPermission::kMediaGalleriesAllGalleriesRead}}, |
| {IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_DELETE, |
| {APIPermission::kMediaGalleriesAllGalleriesDelete}, |
| {APIPermission::kMediaGalleriesAllGalleriesRead}}, |
| {IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ, |
| {APIPermission::kMediaGalleriesAllGalleriesRead}, |
| {}}, |
| |
| // File system permissions. We only have permission strings for directory |
| // access, and show a different message for read-only directory access |
| // versus writable directory access. We don't warn for write-only access, |
| // since the user must select the file and the chooser is considered |
| // sufficient warning. |
| {IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE_DIRECTORY, |
| {APIPermission::kFileSystemWrite, APIPermission::kFileSystemDirectory}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_DIRECTORY, |
| {APIPermission::kFileSystemDirectory}, |
| {}}, |
| |
| // Video and audio capture. |
| {IDS_EXTENSION_PROMPT_WARNING_AUDIO_AND_VIDEO_CAPTURE, |
| {APIPermission::kAudioCapture, APIPermission::kVideoCapture}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_AUDIO_CAPTURE, |
| {APIPermission::kAudioCapture}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_VIDEO_CAPTURE, |
| {APIPermission::kVideoCapture}, |
| {}}, |
| |
| // Network-related permissions. |
| {IDS_EXTENSION_PROMPT_WARNING_NETWORKING_PRIVATE, |
| {APIPermission::kNetworkingOnc}, |
| // Adding networkingPrivate as an optional permission for this rule so |
| // the permission is removed from the available permission set when the |
| // next rule (for networkingPrivate permission) is considered - without |
| // this, IDS_EXTENSION_PROMPT_WARNING_NETWORK_PRIVATE would be duplicated |
| // for manifests that have both networking.onc and networkingPrivate |
| // permission. |
| {APIPermission::kNetworkingPrivate}}, |
| {IDS_EXTENSION_PROMPT_WARNING_NETWORKING_PRIVATE, |
| {APIPermission::kNetworkingPrivate}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_NETWORKING_CONFIG, |
| {APIPermission::kNetworkingConfig}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE, |
| {APIPermission::kNetworkState}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_VPN, {APIPermission::kVpnProvider}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_WEB_CONNECTABLE, |
| {APIPermission::kWebConnectable}, |
| {}}, |
| {std::make_unique<SingleParameterFormatter>( |
| IDS_EXTENSION_PROMPT_WARNING_HOME_PAGE_SETTING_OVERRIDE), |
| {APIPermission::kHomepage}, |
| {}}, |
| {std::make_unique<SingleParameterFormatter>( |
| IDS_EXTENSION_PROMPT_WARNING_SEARCH_SETTINGS_OVERRIDE), |
| {APIPermission::kSearchProvider}, |
| {}}, |
| {std::make_unique<SingleParameterFormatter>( |
| IDS_EXTENSION_PROMPT_WARNING_START_PAGE_SETTING_OVERRIDE), |
| {APIPermission::kStartupPages}, |
| {}}, |
| |
| {IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS, |
| {APIPermission::kBookmark}, |
| {APIPermission::kOverrideBookmarksUI}}, |
| {IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD_READWRITE, |
| {APIPermission::kClipboardRead, APIPermission::kClipboardWrite}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD, |
| {APIPermission::kClipboardRead}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD_WRITE, |
| {APIPermission::kClipboardWrite}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_DESKTOP_CAPTURE, |
| {APIPermission::kDesktopCapture}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS, {APIPermission::kDownloads}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS_OPEN, |
| {APIPermission::kDownloadsOpen}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_IDENTITY_EMAIL, |
| {APIPermission::kIdentityEmail}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION, |
| {APIPermission::kGeolocation}, |
| {}}, |
| |
| {IDS_EXTENSION_PROMPT_WARNING_SYSTEM_STORAGE, |
| {APIPermission::kSystemStorage}, |
| {}}, |
| |
| {IDS_EXTENSION_PROMPT_WARNING_CONTENT_SETTINGS, |
| {APIPermission::kContentSettings}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_DOCUMENT_SCAN, |
| {APIPermission::kDocumentScan}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_INPUT, {APIPermission::kInput}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT, |
| {APIPermission::kManagement}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_MDNS, {APIPermission::kMDns}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_NATIVE_MESSAGING, |
| {APIPermission::kNativeMessaging}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_PRIVACY, {APIPermission::kPrivacy}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_SIGNED_IN_DEVICES, |
| {APIPermission::kSignedInDevices}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_SYNCFILESYSTEM, |
| {APIPermission::kSyncFileSystem}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_TTS_ENGINE, |
| {APIPermission::kTtsEngine}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_WALLPAPER, {APIPermission::kWallpaper}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_PLATFORMKEYS, |
| {APIPermission::kPlatformKeys}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_CERTIFICATEPROVIDER, |
| {APIPermission::kCertificateProvider}, |
| {}}, |
| |
| {IDS_EXTENSION_PROMPT_WARNING_ACTIVITY_LOG_PRIVATE, |
| {APIPermission::kActivityLogPrivate}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_MUSIC_MANAGER_PRIVATE, |
| {APIPermission::kMusicManagerPrivate}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_SETTINGS_PRIVATE, |
| {APIPermission::kSettingsPrivate}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_AUTOFILL_PRIVATE, |
| {APIPermission::kAutofillPrivate}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_PASSWORDS_PRIVATE, |
| {APIPermission::kPasswordsPrivate}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_USERS_PRIVATE, |
| {APIPermission::kUsersPrivate}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_DISPLAY_SOURCE, |
| {APIPermission::kDisplaySource}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_ENTERPRISE_HARDWARE_PLATFORM, |
| {APIPermission::kEnterpriseHardwarePlatform}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_LOGIN, {APIPermission::kLogin}, {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_LOGIN_SCREEN_UI, |
| {APIPermission::kLoginScreenUi}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_LOGIN_SCREEN_STORAGE, |
| {APIPermission::kLoginScreenStorage}, |
| {}}, |
| {IDS_EXTENSION_PROMPT_WARNING_TRANSIENT_BACKGROUND, |
| {APIPermission::kTransientBackground}, |
| {}}, |
| }; |
| |
| return std::vector<ChromePermissionMessageRule>( |
| std::make_move_iterator(std::begin(rules_arr)), |
| std::make_move_iterator(std::end(rules_arr))); |
| } |
| |
| } // namespace extensions |