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