| 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/extension.h" | 5 #include "extensions/common/extension.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 int flags, | 110 int flags, |
| 111 const std::string& explicit_id, | 111 const std::string& explicit_id, |
| 112 std::string* utf8_error) { | 112 std::string* utf8_error) { |
| 113 DCHECK(utf8_error); | 113 DCHECK(utf8_error); |
| 114 base::string16 error; | 114 base::string16 error; |
| 115 scoped_ptr<extensions::Manifest> manifest( | 115 scoped_ptr<extensions::Manifest> manifest( |
| 116 new extensions::Manifest( | 116 new extensions::Manifest( |
| 117 location, scoped_ptr<base::DictionaryValue>(value.DeepCopy()))); | 117 location, scoped_ptr<base::DictionaryValue>(value.DeepCopy()))); |
| 118 | 118 |
| 119 if (!InitExtensionID(manifest.get(), path, explicit_id, flags, &error)) { | 119 if (!InitExtensionID(manifest.get(), path, explicit_id, flags, &error)) { |
| 120 *utf8_error = UTF16ToUTF8(error); | 120 *utf8_error = base::UTF16ToUTF8(error); |
| 121 return NULL; | 121 return NULL; |
| 122 } | 122 } |
| 123 | 123 |
| 124 std::vector<InstallWarning> install_warnings; | 124 std::vector<InstallWarning> install_warnings; |
| 125 if (!manifest->ValidateManifest(utf8_error, &install_warnings)) { | 125 if (!manifest->ValidateManifest(utf8_error, &install_warnings)) { |
| 126 return NULL; | 126 return NULL; |
| 127 } | 127 } |
| 128 | 128 |
| 129 scoped_refptr<Extension> extension = new Extension(path, manifest.Pass()); | 129 scoped_refptr<Extension> extension = new Extension(path, manifest.Pass()); |
| 130 extension->install_warnings_.swap(install_warnings); | 130 extension->install_warnings_.swap(install_warnings); |
| 131 | 131 |
| 132 if (!extension->InitFromValue(flags, &error)) { | 132 if (!extension->InitFromValue(flags, &error)) { |
| 133 *utf8_error = UTF16ToUTF8(error); | 133 *utf8_error = base::UTF16ToUTF8(error); |
| 134 return NULL; | 134 return NULL; |
| 135 } | 135 } |
| 136 | 136 |
| 137 return extension; | 137 return extension; |
| 138 } | 138 } |
| 139 | 139 |
| 140 // static | 140 // static |
| 141 bool Extension::IdIsValid(const std::string& id) { | 141 bool Extension::IdIsValid(const std::string& id) { |
| 142 // Verify that the id is legal. | 142 // Verify that the id is legal. |
| 143 if (id.size() != (id_util::kIdSize * 2)) | 143 if (id.size() != (id_util::kIdSize * 2)) |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 if (!explicit_id.empty()) { | 472 if (!explicit_id.empty()) { |
| 473 manifest->set_extension_id(explicit_id); | 473 manifest->set_extension_id(explicit_id); |
| 474 return true; | 474 return true; |
| 475 } | 475 } |
| 476 | 476 |
| 477 if (manifest->HasKey(keys::kPublicKey)) { | 477 if (manifest->HasKey(keys::kPublicKey)) { |
| 478 std::string public_key; | 478 std::string public_key; |
| 479 std::string public_key_bytes; | 479 std::string public_key_bytes; |
| 480 if (!manifest->GetString(keys::kPublicKey, &public_key) || | 480 if (!manifest->GetString(keys::kPublicKey, &public_key) || |
| 481 !ParsePEMKeyBytes(public_key, &public_key_bytes)) { | 481 !ParsePEMKeyBytes(public_key, &public_key_bytes)) { |
| 482 *error = ASCIIToUTF16(errors::kInvalidKey); | 482 *error = base::ASCIIToUTF16(errors::kInvalidKey); |
| 483 return false; | 483 return false; |
| 484 } | 484 } |
| 485 std::string extension_id = id_util::GenerateId(public_key_bytes); | 485 std::string extension_id = id_util::GenerateId(public_key_bytes); |
| 486 manifest->set_extension_id(extension_id); | 486 manifest->set_extension_id(extension_id); |
| 487 return true; | 487 return true; |
| 488 } | 488 } |
| 489 | 489 |
| 490 if (creation_flags & REQUIRE_KEY) { | 490 if (creation_flags & REQUIRE_KEY) { |
| 491 *error = ASCIIToUTF16(errors::kInvalidKey); | 491 *error = base::ASCIIToUTF16(errors::kInvalidKey); |
| 492 return false; | 492 return false; |
| 493 } else { | 493 } else { |
| 494 // If there is a path, we generate the ID from it. This is useful for | 494 // If there is a path, we generate the ID from it. This is useful for |
| 495 // development mode, because it keeps the ID stable across restarts and | 495 // development mode, because it keeps the ID stable across restarts and |
| 496 // reloading the extension. | 496 // reloading the extension. |
| 497 std::string extension_id = id_util::GenerateIdForPath(path); | 497 std::string extension_id = id_util::GenerateIdForPath(path); |
| 498 if (extension_id.empty()) { | 498 if (extension_id.empty()) { |
| 499 NOTREACHED() << "Could not create ID from path."; | 499 NOTREACHED() << "Could not create ID from path."; |
| 500 return false; | 500 return false; |
| 501 } | 501 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 bool Extension::LoadRequiredFeatures(base::string16* error) { | 568 bool Extension::LoadRequiredFeatures(base::string16* error) { |
| 569 if (!LoadName(error) || | 569 if (!LoadName(error) || |
| 570 !LoadVersion(error)) | 570 !LoadVersion(error)) |
| 571 return false; | 571 return false; |
| 572 return true; | 572 return true; |
| 573 } | 573 } |
| 574 | 574 |
| 575 bool Extension::LoadName(base::string16* error) { | 575 bool Extension::LoadName(base::string16* error) { |
| 576 base::string16 localized_name; | 576 base::string16 localized_name; |
| 577 if (!manifest_->GetString(keys::kName, &localized_name)) { | 577 if (!manifest_->GetString(keys::kName, &localized_name)) { |
| 578 *error = ASCIIToUTF16(errors::kInvalidName); | 578 *error = base::ASCIIToUTF16(errors::kInvalidName); |
| 579 return false; | 579 return false; |
| 580 } | 580 } |
| 581 non_localized_name_ = UTF16ToUTF8(localized_name); | 581 non_localized_name_ = base::UTF16ToUTF8(localized_name); |
| 582 base::i18n::AdjustStringForLocaleDirection(&localized_name); | 582 base::i18n::AdjustStringForLocaleDirection(&localized_name); |
| 583 name_ = UTF16ToUTF8(localized_name); | 583 name_ = base::UTF16ToUTF8(localized_name); |
| 584 return true; | 584 return true; |
| 585 } | 585 } |
| 586 | 586 |
| 587 bool Extension::LoadVersion(base::string16* error) { | 587 bool Extension::LoadVersion(base::string16* error) { |
| 588 std::string version_str; | 588 std::string version_str; |
| 589 if (!manifest_->GetString(keys::kVersion, &version_str)) { | 589 if (!manifest_->GetString(keys::kVersion, &version_str)) { |
| 590 *error = ASCIIToUTF16(errors::kInvalidVersion); | 590 *error = base::ASCIIToUTF16(errors::kInvalidVersion); |
| 591 return false; | 591 return false; |
| 592 } | 592 } |
| 593 version_.reset(new base::Version(version_str)); | 593 version_.reset(new base::Version(version_str)); |
| 594 if (!version_->IsValid() || version_->components().size() > 4) { | 594 if (!version_->IsValid() || version_->components().size() > 4) { |
| 595 *error = ASCIIToUTF16(errors::kInvalidVersion); | 595 *error = base::ASCIIToUTF16(errors::kInvalidVersion); |
| 596 return false; | 596 return false; |
| 597 } | 597 } |
| 598 return true; | 598 return true; |
| 599 } | 599 } |
| 600 | 600 |
| 601 bool Extension::LoadAppFeatures(base::string16* error) { | 601 bool Extension::LoadAppFeatures(base::string16* error) { |
| 602 if (!LoadExtent(keys::kWebURLs, &extent_, | 602 if (!LoadExtent(keys::kWebURLs, &extent_, |
| 603 errors::kInvalidWebURLs, errors::kInvalidWebURL, error)) { | 603 errors::kInvalidWebURLs, errors::kInvalidWebURL, error)) { |
| 604 return false; | 604 return false; |
| 605 } | 605 } |
| 606 if (manifest_->HasKey(keys::kDisplayInLauncher) && | 606 if (manifest_->HasKey(keys::kDisplayInLauncher) && |
| 607 !manifest_->GetBoolean(keys::kDisplayInLauncher, &display_in_launcher_)) { | 607 !manifest_->GetBoolean(keys::kDisplayInLauncher, &display_in_launcher_)) { |
| 608 *error = ASCIIToUTF16(errors::kInvalidDisplayInLauncher); | 608 *error = base::ASCIIToUTF16(errors::kInvalidDisplayInLauncher); |
| 609 return false; | 609 return false; |
| 610 } | 610 } |
| 611 if (manifest_->HasKey(keys::kDisplayInNewTabPage)) { | 611 if (manifest_->HasKey(keys::kDisplayInNewTabPage)) { |
| 612 if (!manifest_->GetBoolean(keys::kDisplayInNewTabPage, | 612 if (!manifest_->GetBoolean(keys::kDisplayInNewTabPage, |
| 613 &display_in_new_tab_page_)) { | 613 &display_in_new_tab_page_)) { |
| 614 *error = ASCIIToUTF16(errors::kInvalidDisplayInNewTabPage); | 614 *error = base::ASCIIToUTF16(errors::kInvalidDisplayInNewTabPage); |
| 615 return false; | 615 return false; |
| 616 } | 616 } |
| 617 } else { | 617 } else { |
| 618 // Inherit default from display_in_launcher property. | 618 // Inherit default from display_in_launcher property. |
| 619 display_in_new_tab_page_ = display_in_launcher_; | 619 display_in_new_tab_page_ = display_in_launcher_; |
| 620 } | 620 } |
| 621 return true; | 621 return true; |
| 622 } | 622 } |
| 623 | 623 |
| 624 bool Extension::LoadExtent(const char* key, | 624 bool Extension::LoadExtent(const char* key, |
| 625 URLPatternSet* extent, | 625 URLPatternSet* extent, |
| 626 const char* list_error, | 626 const char* list_error, |
| 627 const char* value_error, | 627 const char* value_error, |
| 628 base::string16* error) { | 628 base::string16* error) { |
| 629 const base::Value* temp_pattern_value = NULL; | 629 const base::Value* temp_pattern_value = NULL; |
| 630 if (!manifest_->Get(key, &temp_pattern_value)) | 630 if (!manifest_->Get(key, &temp_pattern_value)) |
| 631 return true; | 631 return true; |
| 632 | 632 |
| 633 const base::ListValue* pattern_list = NULL; | 633 const base::ListValue* pattern_list = NULL; |
| 634 if (!temp_pattern_value->GetAsList(&pattern_list)) { | 634 if (!temp_pattern_value->GetAsList(&pattern_list)) { |
| 635 *error = ASCIIToUTF16(list_error); | 635 *error = base::ASCIIToUTF16(list_error); |
| 636 return false; | 636 return false; |
| 637 } | 637 } |
| 638 | 638 |
| 639 for (size_t i = 0; i < pattern_list->GetSize(); ++i) { | 639 for (size_t i = 0; i < pattern_list->GetSize(); ++i) { |
| 640 std::string pattern_string; | 640 std::string pattern_string; |
| 641 if (!pattern_list->GetString(i, &pattern_string)) { | 641 if (!pattern_list->GetString(i, &pattern_string)) { |
| 642 *error = ErrorUtils::FormatErrorMessageUTF16(value_error, | 642 *error = ErrorUtils::FormatErrorMessageUTF16(value_error, |
| 643 base::UintToString(i), | 643 base::UintToString(i), |
| 644 errors::kExpectString); | 644 errors::kExpectString); |
| 645 return false; | 645 return false; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 !ManifestHandler::ParseExtension(this, error) || | 700 !ManifestHandler::ParseExtension(this, error) || |
| 701 !LoadShortName(error)) | 701 !LoadShortName(error)) |
| 702 return false; | 702 return false; |
| 703 | 703 |
| 704 return true; | 704 return true; |
| 705 } | 705 } |
| 706 | 706 |
| 707 bool Extension::LoadDescription(base::string16* error) { | 707 bool Extension::LoadDescription(base::string16* error) { |
| 708 if (manifest_->HasKey(keys::kDescription) && | 708 if (manifest_->HasKey(keys::kDescription) && |
| 709 !manifest_->GetString(keys::kDescription, &description_)) { | 709 !manifest_->GetString(keys::kDescription, &description_)) { |
| 710 *error = ASCIIToUTF16(errors::kInvalidDescription); | 710 *error = base::ASCIIToUTF16(errors::kInvalidDescription); |
| 711 return false; | 711 return false; |
| 712 } | 712 } |
| 713 return true; | 713 return true; |
| 714 } | 714 } |
| 715 | 715 |
| 716 bool Extension::LoadManifestVersion(base::string16* error) { | 716 bool Extension::LoadManifestVersion(base::string16* error) { |
| 717 // Get the original value out of the dictionary so that we can validate it | 717 // Get the original value out of the dictionary so that we can validate it |
| 718 // more strictly. | 718 // more strictly. |
| 719 if (manifest_->value()->HasKey(keys::kManifestVersion)) { | 719 if (manifest_->value()->HasKey(keys::kManifestVersion)) { |
| 720 int manifest_version = 1; | 720 int manifest_version = 1; |
| 721 if (!manifest_->GetInteger(keys::kManifestVersion, &manifest_version) || | 721 if (!manifest_->GetInteger(keys::kManifestVersion, &manifest_version) || |
| 722 manifest_version < 1) { | 722 manifest_version < 1) { |
| 723 *error = ASCIIToUTF16(errors::kInvalidManifestVersion); | 723 *error = base::ASCIIToUTF16(errors::kInvalidManifestVersion); |
| 724 return false; | 724 return false; |
| 725 } | 725 } |
| 726 } | 726 } |
| 727 | 727 |
| 728 manifest_version_ = manifest_->GetManifestVersion(); | 728 manifest_version_ = manifest_->GetManifestVersion(); |
| 729 if (manifest_version_ < kModernManifestVersion && | 729 if (manifest_version_ < kModernManifestVersion && |
| 730 ((creation_flags_ & REQUIRE_MODERN_MANIFEST_VERSION && | 730 ((creation_flags_ & REQUIRE_MODERN_MANIFEST_VERSION && |
| 731 !CommandLine::ForCurrentProcess()->HasSwitch( | 731 !CommandLine::ForCurrentProcess()->HasSwitch( |
| 732 switches::kAllowLegacyExtensionManifests)) || | 732 switches::kAllowLegacyExtensionManifests)) || |
| 733 GetType() == Manifest::TYPE_PLATFORM_APP)) { | 733 GetType() == Manifest::TYPE_PLATFORM_APP)) { |
| 734 *error = ErrorUtils::FormatErrorMessageUTF16( | 734 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 735 errors::kInvalidManifestVersionOld, | 735 errors::kInvalidManifestVersionOld, |
| 736 base::IntToString(kModernManifestVersion), | 736 base::IntToString(kModernManifestVersion), |
| 737 is_platform_app() ? "apps" : "extensions"); | 737 is_platform_app() ? "apps" : "extensions"); |
| 738 return false; | 738 return false; |
| 739 } | 739 } |
| 740 | 740 |
| 741 return true; | 741 return true; |
| 742 } | 742 } |
| 743 | 743 |
| 744 bool Extension::LoadShortName(base::string16* error) { | 744 bool Extension::LoadShortName(base::string16* error) { |
| 745 if (manifest_->HasKey(keys::kShortName)) { | 745 if (manifest_->HasKey(keys::kShortName)) { |
| 746 base::string16 localized_short_name; | 746 base::string16 localized_short_name; |
| 747 if (!manifest_->GetString(keys::kShortName, &localized_short_name) || | 747 if (!manifest_->GetString(keys::kShortName, &localized_short_name) || |
| 748 localized_short_name.empty()) { | 748 localized_short_name.empty()) { |
| 749 *error = ASCIIToUTF16(errors::kInvalidShortName); | 749 *error = base::ASCIIToUTF16(errors::kInvalidShortName); |
| 750 return false; | 750 return false; |
| 751 } | 751 } |
| 752 | 752 |
| 753 base::i18n::AdjustStringForLocaleDirection(&localized_short_name); | 753 base::i18n::AdjustStringForLocaleDirection(&localized_short_name); |
| 754 short_name_ = UTF16ToUTF8(localized_short_name); | 754 short_name_ = base::UTF16ToUTF8(localized_short_name); |
| 755 } else { | 755 } else { |
| 756 short_name_ = name_; | 756 short_name_ = name_; |
| 757 } | 757 } |
| 758 return true; | 758 return true; |
| 759 } | 759 } |
| 760 | 760 |
| 761 ExtensionInfo::ExtensionInfo(const base::DictionaryValue* manifest, | 761 ExtensionInfo::ExtensionInfo(const base::DictionaryValue* manifest, |
| 762 const std::string& id, | 762 const std::string& id, |
| 763 const base::FilePath& path, | 763 const base::FilePath& path, |
| 764 Manifest::Location location) | 764 Manifest::Location location) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 787 | 787 |
| 788 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 788 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
| 789 const Extension* extension, | 789 const Extension* extension, |
| 790 const PermissionSet* permissions, | 790 const PermissionSet* permissions, |
| 791 Reason reason) | 791 Reason reason) |
| 792 : reason(reason), | 792 : reason(reason), |
| 793 extension(extension), | 793 extension(extension), |
| 794 permissions(permissions) {} | 794 permissions(permissions) {} |
| 795 | 795 |
| 796 } // namespace extensions | 796 } // namespace extensions |
| OLD | NEW |