OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "extensions/common/permissions/permissions_data.h" | 5 #include "extensions/common/permissions/permissions_data.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/strings/string16.h" | 9 #include "base/strings/string16.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 | 335 |
336 // static | 336 // static |
337 void PermissionsData::ClearTabSpecificPermissions( | 337 void PermissionsData::ClearTabSpecificPermissions( |
338 const Extension* extension, | 338 const Extension* extension, |
339 int tab_id) { | 339 int tab_id) { |
340 CHECK_GE(tab_id, 0); | 340 CHECK_GE(tab_id, 0); |
341 extension->permissions_data()->tab_specific_permissions_.erase(tab_id); | 341 extension->permissions_data()->tab_specific_permissions_.erase(tab_id); |
342 } | 342 } |
343 | 343 |
344 // static | 344 // static |
| 345 bool PermissionsData::HasTabSpecificScriptPermission(const Extension* extension, |
| 346 int tab_id, |
| 347 const GURL& url) { |
| 348 if (tab_id >= 0) { |
| 349 scoped_refptr<const PermissionSet> tab_permissions = |
| 350 GetTabSpecificPermissions(extension, tab_id); |
| 351 if (tab_permissions.get() && |
| 352 tab_permissions->explicit_hosts().MatchesSecurityOrigin(url)) { |
| 353 return true; |
| 354 } |
| 355 } |
| 356 return false; |
| 357 } |
| 358 |
| 359 // static |
345 bool PermissionsData::HasAPIPermission(const Extension* extension, | 360 bool PermissionsData::HasAPIPermission(const Extension* extension, |
346 APIPermission::ID permission) { | 361 APIPermission::ID permission) { |
347 base::AutoLock auto_lock(extension->permissions_data()->runtime_lock_); | 362 base::AutoLock auto_lock(extension->permissions_data()->runtime_lock_); |
348 return GetActivePermissions(extension)->HasAPIPermission(permission); | 363 return GetActivePermissions(extension)->HasAPIPermission(permission); |
349 } | 364 } |
350 | 365 |
351 // static | 366 // static |
352 bool PermissionsData::HasAPIPermission( | 367 bool PermissionsData::HasAPIPermission( |
353 const Extension* extension, | 368 const Extension* extension, |
354 const std::string& permission_name) { | 369 const std::string& permission_name) { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 return GetActivePermissions(extension)->HasExplicitAccessToOrigin(url); | 422 return GetActivePermissions(extension)->HasExplicitAccessToOrigin(url); |
408 } | 423 } |
409 | 424 |
410 // static | 425 // static |
411 bool PermissionsData::HasEffectiveAccessToAllHosts(const Extension* extension) { | 426 bool PermissionsData::HasEffectiveAccessToAllHosts(const Extension* extension) { |
412 base::AutoLock auto_lock(extension->permissions_data()->runtime_lock_); | 427 base::AutoLock auto_lock(extension->permissions_data()->runtime_lock_); |
413 return GetActivePermissions(extension)->HasEffectiveAccessToAllHosts(); | 428 return GetActivePermissions(extension)->HasEffectiveAccessToAllHosts(); |
414 } | 429 } |
415 | 430 |
416 // static | 431 // static |
| 432 bool PermissionsData::ShouldWarnAllHosts(const Extension* extension) { |
| 433 base::AutoLock auto_lock(extension->permissions_data()->runtime_lock_); |
| 434 return GetActivePermissions(extension)->ShouldWarnAllHosts(); |
| 435 } |
| 436 |
| 437 // static |
417 PermissionMessages PermissionsData::GetPermissionMessages( | 438 PermissionMessages PermissionsData::GetPermissionMessages( |
418 const Extension* extension) { | 439 const Extension* extension) { |
419 base::AutoLock auto_lock(extension->permissions_data()->runtime_lock_); | 440 base::AutoLock auto_lock(extension->permissions_data()->runtime_lock_); |
420 if (ShouldSkipPermissionWarnings(extension)) { | 441 if (ShouldSkipPermissionWarnings(extension)) { |
421 return PermissionMessages(); | 442 return PermissionMessages(); |
422 } else { | 443 } else { |
423 return PermissionMessageProvider::Get()->GetPermissionMessages( | 444 return PermissionMessageProvider::Get()->GetPermissionMessages( |
424 GetActivePermissions(extension), extension->GetType()); | 445 GetActivePermissions(extension), extension->GetType()); |
425 } | 446 } |
426 } | 447 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 | 504 |
484 if (top_frame_url.SchemeIs(extensions::kExtensionScheme) && | 505 if (top_frame_url.SchemeIs(extensions::kExtensionScheme) && |
485 top_frame_url.GetOrigin() != | 506 top_frame_url.GetOrigin() != |
486 Extension::GetBaseURLFromExtensionId(extension->id()).GetOrigin() && | 507 Extension::GetBaseURLFromExtensionId(extension->id()).GetOrigin() && |
487 !can_execute_everywhere) { | 508 !can_execute_everywhere) { |
488 if (error) | 509 if (error) |
489 *error = errors::kCannotAccessExtensionUrl; | 510 *error = errors::kCannotAccessExtensionUrl; |
490 return false; | 511 return false; |
491 } | 512 } |
492 | 513 |
493 // If a tab ID is specified, try the tab-specific permissions. | 514 if (HasTabSpecificScriptPermission(extension, tab_id, top_frame_url)) |
494 if (tab_id >= 0) { | 515 return true; |
495 scoped_refptr<const PermissionSet> tab_permissions = | |
496 GetTabSpecificPermissions(extension, tab_id); | |
497 if (tab_permissions.get() && | |
498 tab_permissions->explicit_hosts().MatchesSecurityOrigin(document_url)) { | |
499 return true; | |
500 } | |
501 } | |
502 | 516 |
503 bool can_access = false; | 517 bool can_access = false; |
504 | 518 |
505 if (script) { | 519 if (script) { |
506 // If a script is specified, use its matches. | 520 // If a script is specified, use its matches. |
507 can_access = script->MatchesURL(document_url); | 521 can_access = script->MatchesURL(document_url); |
508 } else { | 522 } else { |
509 // Otherwise, see if this extension has permission to execute script | 523 // Otherwise, see if this extension has permission to execute script |
510 // programmatically on pages. | 524 // programmatically on pages. |
511 can_access = GetActivePermissions(extension)-> | 525 can_access = GetActivePermissions(extension)-> |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 return false; | 569 return false; |
556 } | 570 } |
557 | 571 |
558 if (error) | 572 if (error) |
559 *error = errors::kAllURLOrActiveTabNeeded; | 573 *error = errors::kAllURLOrActiveTabNeeded; |
560 return false; | 574 return false; |
561 } | 575 } |
562 | 576 |
563 // static | 577 // static |
564 bool PermissionsData::RequiresActionForScriptExecution( | 578 bool PermissionsData::RequiresActionForScriptExecution( |
565 const Extension* extension) { | 579 const Extension* extension, |
| 580 int tab_id, |
| 581 const GURL& url) { |
566 // For now, the user should be notified when an extension with all hosts | 582 // For now, the user should be notified when an extension with all hosts |
567 // permission tries to execute a script on a page. Exceptions for policy- | 583 // permission tries to execute a script on a page, with exceptions for policy- |
568 // enabled and component extensions. | 584 // enabled and component extensions. If this doesn't meet those criteria, |
569 return extension->ShouldDisplayInExtensionSettings() && | 585 // return immediately. |
570 !Manifest::IsPolicyLocation(extension->location()) && | 586 if (!extension->ShouldDisplayInExtensionSettings() || |
571 !Manifest::IsComponentLocation(extension->location()) && | 587 Manifest::IsPolicyLocation(extension->location()) || |
572 HasEffectiveAccessToAllHosts(extension); | 588 Manifest::IsComponentLocation(extension->location()) || |
| 589 !ShouldWarnAllHosts(extension)) { |
| 590 return false; |
| 591 } |
| 592 |
| 593 // If the extension has explicit permission to run on the given tab, then |
| 594 // we don't need to alert the user. |
| 595 if (HasTabSpecificScriptPermission(extension, tab_id, url)) |
| 596 return false; |
| 597 |
| 598 return true; |
573 } | 599 } |
574 | 600 |
575 bool PermissionsData::ParsePermissions(Extension* extension, | 601 bool PermissionsData::ParsePermissions(Extension* extension, |
576 base::string16* error) { | 602 base::string16* error) { |
577 initial_required_permissions_.reset(new InitialPermissions); | 603 initial_required_permissions_.reset(new InitialPermissions); |
578 if (!ParseHelper(extension, | 604 if (!ParseHelper(extension, |
579 keys::kPermissions, | 605 keys::kPermissions, |
580 &initial_required_permissions_->api_permissions, | 606 &initial_required_permissions_->api_permissions, |
581 &initial_required_permissions_->host_permissions, | 607 &initial_required_permissions_->host_permissions, |
582 error)) { | 608 error)) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 initial_optional_permissions_->api_permissions, | 643 initial_optional_permissions_->api_permissions, |
618 initial_optional_permissions_->manifest_permissions, | 644 initial_optional_permissions_->manifest_permissions, |
619 initial_optional_permissions_->host_permissions, | 645 initial_optional_permissions_->host_permissions, |
620 URLPatternSet()); | 646 URLPatternSet()); |
621 | 647 |
622 initial_required_permissions_.reset(); | 648 initial_required_permissions_.reset(); |
623 initial_optional_permissions_.reset(); | 649 initial_optional_permissions_.reset(); |
624 } | 650 } |
625 | 651 |
626 } // namespace extensions | 652 } // namespace extensions |
OLD | NEW |