OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/common/extensions/permissions/chrome_permission_message_rules.h
" | 5 #include "chrome/common/extensions/permissions/chrome_permission_message_rules.h
" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "chrome/grit/generated_resources.h" | 10 #include "chrome/grit/generated_resources.h" |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 } | 171 } |
172 | 172 |
173 int message_id_for_one_host_; | 173 int message_id_for_one_host_; |
174 int message_id_for_two_hosts_; | 174 int message_id_for_two_hosts_; |
175 int message_id_for_three_hosts_; | 175 int message_id_for_three_hosts_; |
176 int message_id_for_many_hosts_; | 176 int message_id_for_many_hosts_; |
177 | 177 |
178 DISALLOW_COPY_AND_ASSIGN(CommaSeparatedListFormatter); | 178 DISALLOW_COPY_AND_ASSIGN(CommaSeparatedListFormatter); |
179 }; | 179 }; |
180 | 180 |
| 181 class USBDevicesFormatter : public ChromePermissionMessageFormatter { |
| 182 public: |
| 183 USBDevicesFormatter() {} |
| 184 ~USBDevicesFormatter() override {} |
| 185 |
| 186 CoalescedPermissionMessage GetPermissionMessage( |
| 187 const PermissionIDSet& permissions) const override { |
| 188 DCHECK(permissions.size() > 0); |
| 189 return permissions.size() == 1 ? GetItemMessage(permissions) |
| 190 : GetMultiItemMessage(permissions); |
| 191 } |
| 192 |
| 193 private: |
| 194 CoalescedPermissionMessage GetItemMessage( |
| 195 const PermissionIDSet& permissions) const { |
| 196 DCHECK(permissions.size() == 1); |
| 197 const PermissionID& permission = *permissions.begin(); |
| 198 base::string16 msg; |
| 199 switch (permission.id()) { |
| 200 case APIPermission::kUsbDevice: |
| 201 msg = l10n_util::GetStringFUTF16( |
| 202 IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE, permission.parameter()); |
| 203 break; |
| 204 case APIPermission::kUsbDeviceUnknownProduct: |
| 205 msg = l10n_util::GetStringFUTF16( |
| 206 IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_UNKNOWN_PRODUCT, |
| 207 permission.parameter()); |
| 208 break; |
| 209 case APIPermission::kUsbDeviceUnknownVendor: |
| 210 msg = l10n_util::GetStringUTF16( |
| 211 IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_UNKNOWN_VENDOR); |
| 212 break; |
| 213 default: |
| 214 NOTREACHED(); |
| 215 } |
| 216 return CoalescedPermissionMessage(msg, permissions); |
| 217 } |
| 218 |
| 219 CoalescedPermissionMessage GetMultiItemMessage( |
| 220 const PermissionIDSet& permissions) const { |
| 221 DCHECK(permissions.size() > 1); |
| 222 // Put all the individual items into submessages. |
| 223 std::vector<base::string16> submessages; |
| 224 std::vector<base::string16> devices = |
| 225 permissions.GetAllPermissionsWithID(APIPermission::kUsbDevice) |
| 226 .GetAllPermissionParameters(); |
| 227 for (const base::string16& device : devices) { |
| 228 submessages.push_back(l10n_util::GetStringFUTF16( |
| 229 IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_LIST_ITEM, device)); |
| 230 } |
| 231 std::vector<base::string16> vendors = |
| 232 permissions.GetAllPermissionsWithID( |
| 233 APIPermission::kUsbDeviceUnknownProduct) |
| 234 .GetAllPermissionParameters(); |
| 235 for (const base::string16& vendor : vendors) { |
| 236 submessages.push_back(l10n_util::GetStringFUTF16( |
| 237 IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_LIST_ITEM_UNKNOWN_PRODUCT, |
| 238 vendor)); |
| 239 } |
| 240 if (permissions.ContainsID(APIPermission::kUsbDeviceUnknownVendor)) { |
| 241 submessages.push_back(l10n_util::GetStringUTF16( |
| 242 IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_LIST_ITEM_UNKNOWN_VENDOR)); |
| 243 } |
| 244 |
| 245 return CoalescedPermissionMessage( |
| 246 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_LIST), |
| 247 permissions, submessages); |
| 248 } |
| 249 |
| 250 DISALLOW_COPY_AND_ASSIGN(USBDevicesFormatter); |
| 251 }; |
| 252 |
181 } // namespace | 253 } // namespace |
182 | 254 |
183 ChromePermissionMessageRule::ChromePermissionMessageRule( | 255 ChromePermissionMessageRule::ChromePermissionMessageRule( |
184 int message_id, | 256 int message_id, |
185 PermissionIDSetInitializer required, | 257 PermissionIDSetInitializer required, |
186 PermissionIDSetInitializer optional) | 258 PermissionIDSetInitializer optional) |
187 : required_permissions_(required), | 259 : required_permissions_(required), |
188 optional_permissions_(optional), | 260 optional_permissions_(optional), |
189 formatter_(new DefaultPermissionMessageFormatter(message_id)) { | 261 formatter_(new DefaultPermissionMessageFormatter(message_id)) { |
190 } | 262 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 // yet powerful enough to encapsulate all the messages we want to display. | 323 // yet powerful enough to encapsulate all the messages we want to display. |
252 // | 324 // |
253 // TODO(sashab): Once existing message sites are deprecated, reorder this list | 325 // TODO(sashab): Once existing message sites are deprecated, reorder this list |
254 // to better describe the rules generated, rather than the callsites they are | 326 // to better describe the rules generated, rather than the callsites they are |
255 // migrated from. | 327 // migrated from. |
256 ChromePermissionMessageRule rules_arr[] = { | 328 ChromePermissionMessageRule rules_arr[] = { |
257 // Full url access permission messages. | 329 // Full url access permission messages. |
258 {IDS_EXTENSION_PROMPT_WARNING_DEBUGGER, {APIPermission::kDebugger}, {}}, | 330 {IDS_EXTENSION_PROMPT_WARNING_DEBUGGER, {APIPermission::kDebugger}, {}}, |
259 {IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS, | 331 {IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS, |
260 {APIPermission::kPlugin}, | 332 {APIPermission::kPlugin}, |
261 {APIPermission::kFullAccess, | 333 {APIPermission::kFullAccess, APIPermission::kHostsAll, |
262 APIPermission::kHostsAll, | 334 APIPermission::kHostsAllReadOnly, APIPermission::kDeclarativeWebRequest, |
263 APIPermission::kHostsAllReadOnly, | 335 APIPermission::kTopSites, APIPermission::kTab}}, |
264 APIPermission::kDeclarativeWebRequest, | |
265 APIPermission::kTopSites, | |
266 APIPermission::kTab}}, | |
267 {IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS, | 336 {IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS, |
268 {APIPermission::kFullAccess}, | 337 {APIPermission::kFullAccess}, |
269 {APIPermission::kHostsAll, | 338 {APIPermission::kHostsAll, APIPermission::kHostsAllReadOnly, |
270 APIPermission::kHostsAllReadOnly, | 339 APIPermission::kDeclarativeWebRequest, APIPermission::kTopSites, |
271 APIPermission::kDeclarativeWebRequest, | |
272 APIPermission::kTopSites, | |
273 APIPermission::kTab}}, | 340 APIPermission::kTab}}, |
274 | 341 |
275 // Parameterized permission messages: | 342 // Parameterized permission messages: |
276 // Messages generated by the sockets permission. | 343 // Messages generated by the sockets permission. |
277 {new SpaceSeparatedListFormatter( | 344 {new SpaceSeparatedListFormatter( |
278 IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN, | 345 IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN, |
279 IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS), | 346 IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS), |
280 {APIPermission::kSocketDomainHosts}, | 347 {APIPermission::kSocketDomainHosts}, |
281 {}}, | 348 {}}, |
282 {new SpaceSeparatedListFormatter( | 349 {new SpaceSeparatedListFormatter( |
(...skipping 11 matching lines...) Expand all Loading... |
294 {APIPermission::kHostReadOnly}, | 361 {APIPermission::kHostReadOnly}, |
295 {}}, | 362 {}}, |
296 {new CommaSeparatedListFormatter(IDS_EXTENSION_PROMPT_WARNING_1_HOST, | 363 {new CommaSeparatedListFormatter(IDS_EXTENSION_PROMPT_WARNING_1_HOST, |
297 IDS_EXTENSION_PROMPT_WARNING_2_HOSTS, | 364 IDS_EXTENSION_PROMPT_WARNING_2_HOSTS, |
298 IDS_EXTENSION_PROMPT_WARNING_3_HOSTS, | 365 IDS_EXTENSION_PROMPT_WARNING_3_HOSTS, |
299 IDS_EXTENSION_PROMPT_WARNING_HOSTS_LIST), | 366 IDS_EXTENSION_PROMPT_WARNING_HOSTS_LIST), |
300 {APIPermission::kHostReadWrite}, | 367 {APIPermission::kHostReadWrite}, |
301 {}}, | 368 {}}, |
302 | 369 |
303 // USB Device Permission rules: | 370 // USB Device Permission rules: |
304 // TODO(sashab, reillyg): Rework the permission message logic for USB | 371 {new USBDevicesFormatter, |
305 // devices to generate more meaningful messages and better fit the current | 372 {}, |
306 // rules system. Maybe model it similarly to host or socket permissions | 373 {APIPermission::kUsbDevice, APIPermission::kUsbDeviceUnknownProduct, |
307 // above. crbug.com/522842 | 374 APIPermission::kUsbDeviceUnknownVendor}}, |
308 {new SingleParameterFormatter(IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE), | |
309 {APIPermission::kUsbDevice}, | |
310 {}}, | |
311 {new SingleParameterFormatter( | |
312 IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_UNKNOWN_PRODUCT), | |
313 {APIPermission::kUsbDeviceUnknownProduct}, | |
314 {}}, | |
315 {IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_UNKNOWN_VENDOR, | |
316 {APIPermission::kUsbDeviceUnknownVendor}, | |
317 {}}, | |
318 {new SimpleListFormatter(IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_LIST), | |
319 {APIPermission::kUsbDeviceList}, | |
320 {}}, | |
321 | 375 |
322 // Coalesced message rules taken from | 376 // Coalesced message rules taken from |
323 // ChromePermissionMessageProvider::GetWarningMessages(): | 377 // ChromePermissionMessageProvider::GetWarningMessages(): |
324 | 378 |
325 // Access to users' devices should provide a single warning message | 379 // Access to users' devices should provide a single warning message |
326 // specifying the transport method used; serial and/or Bluetooth. | 380 // specifying the transport method used; serial and/or Bluetooth. |
327 {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_SERIAL, | 381 {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_SERIAL, |
328 {APIPermission::kBluetooth, APIPermission::kSerial}, | 382 {APIPermission::kBluetooth, APIPermission::kSerial}, |
329 {APIPermission::kBluetoothDevices}}, | 383 {APIPermission::kBluetoothDevices}}, |
330 | 384 |
(...skipping 16 matching lines...) Expand all Loading... |
347 {IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_DELETE, | 401 {IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_DELETE, |
348 {APIPermission::kMediaGalleriesAllGalleriesDelete, | 402 {APIPermission::kMediaGalleriesAllGalleriesDelete, |
349 APIPermission::kMediaGalleriesAllGalleriesRead}, | 403 APIPermission::kMediaGalleriesAllGalleriesRead}, |
350 {}}, | 404 {}}, |
351 {IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ, | 405 {IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ, |
352 {APIPermission::kMediaGalleriesAllGalleriesRead}, | 406 {APIPermission::kMediaGalleriesAllGalleriesRead}, |
353 {}}, | 407 {}}, |
354 | 408 |
355 {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS, | 409 {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS, |
356 {APIPermission::kSessions, APIPermission::kHistory}, | 410 {APIPermission::kSessions, APIPermission::kHistory}, |
357 {APIPermission::kFavicon, | 411 {APIPermission::kFavicon, APIPermission::kProcesses, APIPermission::kTab, |
358 APIPermission::kProcesses, | 412 APIPermission::kTopSites, APIPermission::kWebNavigation}}, |
359 APIPermission::kTab, | |
360 APIPermission::kTopSites, | |
361 APIPermission::kWebNavigation}}, | |
362 {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS, | 413 {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS, |
363 {APIPermission::kSessions, APIPermission::kTab}, | 414 {APIPermission::kSessions, APIPermission::kTab}, |
364 {APIPermission::kFavicon, | 415 {APIPermission::kFavicon, APIPermission::kProcesses, |
365 APIPermission::kProcesses, | 416 APIPermission::kTopSites, APIPermission::kWebNavigation}}, |
366 APIPermission::kTopSites, | |
367 APIPermission::kWebNavigation}}, | |
368 | 417 |
369 // Suppression list taken from | 418 // Suppression list taken from |
370 // ChromePermissionMessageProvider::GetPermissionMessages(): | 419 // ChromePermissionMessageProvider::GetPermissionMessages(): |
371 // Some warnings are more generic and/or powerful and supercede other | 420 // Some warnings are more generic and/or powerful and supercede other |
372 // warnings. In that case, the first message suppresses the second one. | 421 // warnings. In that case, the first message suppresses the second one. |
373 {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH, | 422 {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH, |
374 {APIPermission::kBluetooth}, | 423 {APIPermission::kBluetooth}, |
375 {APIPermission::kBluetoothDevices}}, | 424 {APIPermission::kBluetoothDevices}}, |
376 {IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS, | 425 {IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS, |
377 {APIPermission::kBookmark}, | 426 {APIPermission::kBookmark}, |
378 {APIPermission::kOverrideBookmarksUI}}, | 427 {APIPermission::kOverrideBookmarksUI}}, |
379 // History already allows reading favicons, tab access and accessing the | 428 // History already allows reading favicons, tab access and accessing the |
380 // list of most frequently visited sites. | 429 // list of most frequently visited sites. |
381 {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE, | 430 {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE, |
382 {APIPermission::kHistory}, | 431 {APIPermission::kHistory}, |
383 {APIPermission::kFavicon, | 432 {APIPermission::kFavicon, APIPermission::kProcesses, APIPermission::kTab, |
384 APIPermission::kProcesses, | 433 APIPermission::kTopSites, APIPermission::kWebNavigation}}, |
385 APIPermission::kTab, | |
386 APIPermission::kTopSites, | |
387 APIPermission::kWebNavigation}}, | |
388 // A special hack: If kFileSystemWriteDirectory would be displayed, hide | 434 // A special hack: If kFileSystemWriteDirectory would be displayed, hide |
389 // kFileSystemDirectory as the write directory message implies it. | 435 // kFileSystemDirectory as the write directory message implies it. |
390 // TODO(sashab): Remove kFileSystemWriteDirectory; it's no longer needed | 436 // TODO(sashab): Remove kFileSystemWriteDirectory; it's no longer needed |
391 // since this rules system can represent the rule. See crbug.com/284849. | 437 // since this rules system can represent the rule. See crbug.com/284849. |
392 {IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE_DIRECTORY, | 438 {IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE_DIRECTORY, |
393 {APIPermission::kFileSystemWrite, APIPermission::kFileSystemDirectory}, | 439 {APIPermission::kFileSystemWrite, APIPermission::kFileSystemDirectory}, |
394 {APIPermission::kFileSystemWriteDirectory}}, | 440 {APIPermission::kFileSystemWriteDirectory}}, |
395 // Full access already allows DeclarativeWebRequest, reading the list of | 441 // Full access already allows DeclarativeWebRequest, reading the list of |
396 // most frequently visited sites, and tab access. | 442 // most frequently visited sites, and tab access. |
397 // The warning message for declarativeWebRequest | 443 // The warning message for declarativeWebRequest |
398 // permissions speaks about blocking parts of pages, which is a | 444 // permissions speaks about blocking parts of pages, which is a |
399 // subset of what the "<all_urls>" access allows. Therefore we | 445 // subset of what the "<all_urls>" access allows. Therefore we |
400 // display only the "<all_urls>" warning message if both permissions | 446 // display only the "<all_urls>" warning message if both permissions |
401 // are required. | 447 // are required. |
402 {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS, | 448 {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS, |
403 {APIPermission::kHostsAll}, | 449 {APIPermission::kHostsAll}, |
404 {APIPermission::kDeclarativeWebRequest, | 450 {APIPermission::kDeclarativeWebRequest, APIPermission::kTopSites, |
405 APIPermission::kTopSites, | 451 APIPermission::kTab, APIPermission::kFavicon, APIPermission::kTopSites, |
406 APIPermission::kTab, | |
407 APIPermission::kFavicon, | |
408 APIPermission::kTopSites, | |
409 APIPermission::kHostsAllReadOnly}}, | 452 APIPermission::kHostsAllReadOnly}}, |
410 // AutomationManifestPermission: | 453 // AutomationManifestPermission: |
411 {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS_READ_ONLY, | 454 {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS_READ_ONLY, |
412 {APIPermission::kHostsAllReadOnly}, | 455 {APIPermission::kHostsAllReadOnly}, |
413 {}}, // TODO(treib): This should probably include kTab? | 456 {}}, // TODO(treib): This should probably include kTab? |
414 // Tabs already allows reading favicons and reading the list of most | 457 // Tabs already allows reading favicons and reading the list of most |
415 // frequently visited sites. | 458 // frequently visited sites. |
416 {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ, | 459 {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ, |
417 {APIPermission::kTab}, | 460 {APIPermission::kTab}, |
418 {APIPermission::kFavicon, | 461 {APIPermission::kFavicon, APIPermission::kProcesses, |
419 APIPermission::kProcesses, | 462 APIPermission::kTopSites, APIPermission::kWebNavigation}}, |
420 APIPermission::kTopSites, | |
421 APIPermission::kWebNavigation}}, | |
422 | 463 |
423 // Individual message rules taken from | 464 // Individual message rules taken from |
424 // ChromeAPIPermissions::GetAllPermissions(): | 465 // ChromeAPIPermissions::GetAllPermissions(): |
425 // Permission messages for all extension types: | 466 // Permission messages for all extension types: |
426 | 467 |
427 {IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD, | 468 {IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD, |
428 {APIPermission::kClipboardRead}, | 469 {APIPermission::kClipboardRead}, |
429 {}}, | 470 {}}, |
430 {IDS_EXTENSION_PROMPT_WARNING_DESKTOP_CAPTURE, | 471 {IDS_EXTENSION_PROMPT_WARNING_DESKTOP_CAPTURE, |
431 {APIPermission::kDesktopCapture}, | 472 {APIPermission::kDesktopCapture}, |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 insert(permission_four); | 721 insert(permission_four); |
681 insert(permission_five); | 722 insert(permission_five); |
682 insert(permission_six); | 723 insert(permission_six); |
683 } | 724 } |
684 | 725 |
685 ChromePermissionMessageRule::PermissionIDSetInitializer:: | 726 ChromePermissionMessageRule::PermissionIDSetInitializer:: |
686 ~PermissionIDSetInitializer() { | 727 ~PermissionIDSetInitializer() { |
687 } | 728 } |
688 | 729 |
689 } // namespace extensions | 730 } // namespace extensions |
OLD | NEW |