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 <algorithm> | 5 #include <algorithm> |
6 #include <set> | 6 #include <set> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" | 52 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" |
53 #include "chrome/browser/extensions/installed_loader.h" | 53 #include "chrome/browser/extensions/installed_loader.h" |
54 #include "chrome/browser/extensions/pack_extension_job.h" | 54 #include "chrome/browser/extensions/pack_extension_job.h" |
55 #include "chrome/browser/extensions/pending_extension_info.h" | 55 #include "chrome/browser/extensions/pending_extension_info.h" |
56 #include "chrome/browser/extensions/pending_extension_manager.h" | 56 #include "chrome/browser/extensions/pending_extension_manager.h" |
57 #include "chrome/browser/extensions/test_blacklist.h" | 57 #include "chrome/browser/extensions/test_blacklist.h" |
58 #include "chrome/browser/extensions/test_extension_system.h" | 58 #include "chrome/browser/extensions/test_extension_system.h" |
59 #include "chrome/browser/extensions/unpacked_installer.h" | 59 #include "chrome/browser/extensions/unpacked_installer.h" |
60 #include "chrome/browser/extensions/updater/extension_updater.h" | 60 #include "chrome/browser/extensions/updater/extension_updater.h" |
61 #include "chrome/browser/prefs/pref_service_syncable.h" | 61 #include "chrome/browser/prefs/pref_service_syncable.h" |
| 62 #include "chrome/browser/supervised_user/supervised_user_service.h" |
| 63 #include "chrome/browser/supervised_user/supervised_user_service_factory.h" |
62 #include "chrome/browser/sync/profile_sync_service.h" | 64 #include "chrome/browser/sync/profile_sync_service.h" |
63 #include "chrome/browser/sync/profile_sync_service_factory.h" | 65 #include "chrome/browser/sync/profile_sync_service_factory.h" |
64 #include "chrome/common/chrome_constants.h" | 66 #include "chrome/common/chrome_constants.h" |
65 #include "chrome/common/chrome_switches.h" | 67 #include "chrome/common/chrome_switches.h" |
66 #include "chrome/common/extensions/api/plugins/plugins_handler.h" | 68 #include "chrome/common/extensions/api/plugins/plugins_handler.h" |
67 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" | 69 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" |
68 #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" | 70 #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" |
69 #include "chrome/common/extensions/manifest_url_handler.h" | 71 #include "chrome/common/extensions/manifest_url_handler.h" |
70 #include "chrome/common/pref_names.h" | 72 #include "chrome/common/pref_names.h" |
71 #include "chrome/common/url_constants.h" | 73 #include "chrome/common/url_constants.h" |
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 loaded_.clear(); | 739 loaded_.clear(); |
738 ExtensionErrorReporter::GetInstance()->ClearErrors(); | 740 ExtensionErrorReporter::GetInstance()->ClearErrors(); |
739 return extension; | 741 return extension; |
740 } | 742 } |
741 | 743 |
742 enum UpdateState { | 744 enum UpdateState { |
743 FAILED_SILENTLY, | 745 FAILED_SILENTLY, |
744 FAILED, | 746 FAILED, |
745 UPDATED, | 747 UPDATED, |
746 INSTALLED, | 748 INSTALLED, |
| 749 DISABLED, |
747 ENABLED | 750 ENABLED |
748 }; | 751 }; |
749 | 752 |
750 void BlackListWebGL() { | 753 void BlackListWebGL() { |
751 static const std::string json_blacklist = | 754 static const std::string json_blacklist = |
752 "{\n" | 755 "{\n" |
753 " \"name\": \"gpu blacklist\",\n" | 756 " \"name\": \"gpu blacklist\",\n" |
754 " \"version\": \"1.0\",\n" | 757 " \"version\": \"1.0\",\n" |
755 " \"entries\": [\n" | 758 " \"entries\": [\n" |
756 " {\n" | 759 " {\n" |
(...skipping 10 matching lines...) Expand all Loading... |
767 // Helper method to set up a WindowedNotificationObserver to wait for a | 770 // Helper method to set up a WindowedNotificationObserver to wait for a |
768 // specific CrxInstaller to finish if we don't know the value of the | 771 // specific CrxInstaller to finish if we don't know the value of the |
769 // |installer| yet. | 772 // |installer| yet. |
770 static bool IsCrxInstallerDone(extensions::CrxInstaller** installer, | 773 static bool IsCrxInstallerDone(extensions::CrxInstaller** installer, |
771 const content::NotificationSource& source, | 774 const content::NotificationSource& source, |
772 const content::NotificationDetails& details) { | 775 const content::NotificationDetails& details) { |
773 return content::Source<extensions::CrxInstaller>(source).ptr() == | 776 return content::Source<extensions::CrxInstaller>(source).ptr() == |
774 *installer; | 777 *installer; |
775 } | 778 } |
776 | 779 |
| 780 void PackCRXAndUpdateExtension(const std::string& id, |
| 781 const base::FilePath& dir_path, |
| 782 const base::FilePath& pem_path, |
| 783 UpdateState expected_state) { |
| 784 base::ScopedTempDir temp_dir; |
| 785 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 786 base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx"); |
| 787 |
| 788 PackCRX(dir_path, pem_path, crx_path); |
| 789 UpdateExtension(id, crx_path, expected_state); |
| 790 } |
| 791 |
777 void UpdateExtension(const std::string& id, | 792 void UpdateExtension(const std::string& id, |
778 const base::FilePath& in_path, | 793 const base::FilePath& in_path, |
779 UpdateState expected_state) { | 794 UpdateState expected_state) { |
780 ASSERT_TRUE(base::PathExists(in_path)); | 795 ASSERT_TRUE(base::PathExists(in_path)); |
781 | 796 |
782 // We need to copy this to a temporary location because Update() will delete | 797 // We need to copy this to a temporary location because Update() will delete |
783 // it. | 798 // it. |
784 base::FilePath path = temp_dir().path(); | 799 base::FilePath path = temp_dir().path(); |
785 path = path.Append(in_path.BaseName()); | 800 path = path.Append(in_path.BaseName()); |
786 ASSERT_TRUE(base::CopyFile(in_path, path)); | 801 ASSERT_TRUE(base::CopyFile(in_path, path)); |
(...skipping 5310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6097 const extensions::PendingExtensionInfo* info; | 6112 const extensions::PendingExtensionInfo* info; |
6098 EXPECT_TRUE( | 6113 EXPECT_TRUE( |
6099 (info = service()->pending_extension_manager()->GetById(good_crx))); | 6114 (info = service()->pending_extension_manager()->GetById(good_crx))); |
6100 EXPECT_EQ(ext_specifics->update_url(), info->update_url().spec()); | 6115 EXPECT_EQ(ext_specifics->update_url(), info->update_url().spec()); |
6101 EXPECT_TRUE(info->is_from_sync()); | 6116 EXPECT_TRUE(info->is_from_sync()); |
6102 EXPECT_TRUE(info->install_silently()); | 6117 EXPECT_TRUE(info->install_silently()); |
6103 EXPECT_EQ(Manifest::INTERNAL, info->install_source()); | 6118 EXPECT_EQ(Manifest::INTERNAL, info->install_source()); |
6104 // TODO(akalin): Figure out a way to test |info.ShouldAllowInstall()|. | 6119 // TODO(akalin): Figure out a way to test |info.ShouldAllowInstall()|. |
6105 } | 6120 } |
6106 | 6121 |
6107 TEST_F(ExtensionServiceTest, SyncUninstallForSupervisedUser) { | 6122 TEST_F(ExtensionServiceTest, SupervisedUser_InstallOnlyAllowedByCustodian) { |
| 6123 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
| 6124 params.profile_is_supervised = true; |
| 6125 InitializeExtensionService(params); |
| 6126 |
| 6127 SupervisedUserService* supervised_user_service = |
| 6128 SupervisedUserServiceFactory::GetForProfile(profile()); |
| 6129 GetManagementPolicy()->RegisterProvider(supervised_user_service); |
| 6130 |
| 6131 base::FilePath path1 = data_dir().AppendASCII("good.crx"); |
| 6132 base::FilePath path2 = data_dir().AppendASCII("good2048.crx"); |
| 6133 const Extension* extensions[] = { |
| 6134 InstallCRX(path1, INSTALL_FAILED), |
| 6135 InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN) |
| 6136 }; |
| 6137 |
| 6138 // Only the extension with the "installed by custodian" flag should have been |
| 6139 // installed and enabled. |
| 6140 EXPECT_FALSE(extensions[0]); |
| 6141 ASSERT_TRUE(extensions[1]); |
| 6142 EXPECT_TRUE(registry()->enabled_extensions().Contains(extensions[1]->id())); |
| 6143 } |
| 6144 |
| 6145 TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithoutPermissionIncrease) { |
| 6146 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
| 6147 params.profile_is_supervised = true; |
| 6148 InitializeExtensionService(params); |
| 6149 |
| 6150 SupervisedUserService* supervised_user_service = |
| 6151 SupervisedUserServiceFactory::GetForProfile(profile()); |
| 6152 GetManagementPolicy()->RegisterProvider(supervised_user_service); |
| 6153 |
| 6154 base::FilePath base_path = data_dir().AppendASCII("autoupdate"); |
| 6155 base::FilePath pem_path = base_path.AppendASCII("key.pem"); |
| 6156 |
| 6157 base::FilePath path = base_path.AppendASCII("v1"); |
| 6158 const Extension* extension = |
| 6159 PackAndInstallCRX(path, pem_path, INSTALL_NEW, |
| 6160 Extension::WAS_INSTALLED_BY_CUSTODIAN); |
| 6161 // The extension must now be installed and enabled. |
| 6162 ASSERT_TRUE(extension); |
| 6163 ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id())); |
| 6164 |
| 6165 // Save the id, as the extension object will be destroyed during updating. |
| 6166 std::string id = extension->id(); |
| 6167 |
| 6168 std::string old_version = extension->VersionString(); |
| 6169 |
| 6170 // Update to a new version. |
| 6171 path = base_path.AppendASCII("v2"); |
| 6172 PackCRXAndUpdateExtension(id, path, pem_path, ENABLED); |
| 6173 |
| 6174 // The extension should still be there and enabled. |
| 6175 extension = registry()->enabled_extensions().GetByID(id); |
| 6176 ASSERT_TRUE(extension); |
| 6177 // The version should have changed. |
| 6178 EXPECT_NE(extension->VersionString(), old_version); |
| 6179 } |
| 6180 |
| 6181 TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithPermissionIncrease) { |
| 6182 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
| 6183 params.profile_is_supervised = true; |
| 6184 InitializeExtensionService(params); |
| 6185 |
| 6186 SupervisedUserService* supervised_user_service = |
| 6187 SupervisedUserServiceFactory::GetForProfile(profile()); |
| 6188 GetManagementPolicy()->RegisterProvider(supervised_user_service); |
| 6189 |
| 6190 base::FilePath base_path = data_dir().AppendASCII("permissions_increase"); |
| 6191 base::FilePath pem_path = base_path.AppendASCII("permissions.pem"); |
| 6192 |
| 6193 base::FilePath path = base_path.AppendASCII("v1"); |
| 6194 const Extension* extension = |
| 6195 PackAndInstallCRX(path, pem_path, INSTALL_NEW, |
| 6196 Extension::WAS_INSTALLED_BY_CUSTODIAN); |
| 6197 // The extension must now be installed and enabled. |
| 6198 ASSERT_TRUE(extension); |
| 6199 ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id())); |
| 6200 |
| 6201 // Save the id, as the extension object will be destroyed during updating. |
| 6202 std::string id = extension->id(); |
| 6203 |
| 6204 std::string old_version = extension->VersionString(); |
| 6205 |
| 6206 // Update to a new version with increased permissions. |
| 6207 path = base_path.AppendASCII("v2"); |
| 6208 PackCRXAndUpdateExtension(id, path, pem_path, DISABLED); |
| 6209 |
| 6210 // The extension should still be there, but disabled. |
| 6211 EXPECT_FALSE(registry()->enabled_extensions().Contains(id)); |
| 6212 extension = registry()->disabled_extensions().GetByID(id); |
| 6213 ASSERT_TRUE(extension); |
| 6214 // The version should have changed. |
| 6215 EXPECT_NE(extension->VersionString(), old_version); |
| 6216 } |
| 6217 |
| 6218 TEST_F(ExtensionServiceTest, |
| 6219 SupervisedUser_SyncUninstallByCustodianSkipsPolicy) { |
6108 InitializeEmptyExtensionService(); | 6220 InitializeEmptyExtensionService(); |
6109 InitializeExtensionSyncService(); | 6221 InitializeExtensionSyncService(); |
6110 extension_sync_service()->MergeDataAndStartSyncing( | 6222 extension_sync_service()->MergeDataAndStartSyncing( |
6111 syncer::EXTENSIONS, | 6223 syncer::EXTENSIONS, |
6112 syncer::SyncDataList(), | 6224 syncer::SyncDataList(), |
6113 scoped_ptr<syncer::SyncChangeProcessor>( | 6225 scoped_ptr<syncer::SyncChangeProcessor>( |
6114 new syncer::FakeSyncChangeProcessor), | 6226 new syncer::FakeSyncChangeProcessor), |
6115 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | 6227 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
6116 | 6228 |
6117 // Install two extensions. | 6229 // Install two extensions. |
6118 base::FilePath path1 = data_dir().AppendASCII("good.crx"); | 6230 base::FilePath path1 = data_dir().AppendASCII("good.crx"); |
6119 base::FilePath path2 = data_dir().AppendASCII("good2048.crx"); | 6231 base::FilePath path2 = data_dir().AppendASCII("good2048.crx"); |
6120 const Extension* extensions[2] = { | 6232 const Extension* extensions[] = { |
6121 InstallCRX(path1, INSTALL_NEW), | 6233 InstallCRX(path1, INSTALL_NEW), |
6122 InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN) | 6234 InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN) |
6123 }; | 6235 }; |
6124 | 6236 |
6125 // Add a policy provider that will disallow any changes. | 6237 // Add a policy provider that will disallow any changes. |
6126 extensions::TestManagementPolicyProvider provider( | 6238 extensions::TestManagementPolicyProvider provider( |
6127 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); | 6239 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); |
6128 GetManagementPolicy()->RegisterProvider(&provider); | 6240 GetManagementPolicy()->RegisterProvider(&provider); |
6129 | 6241 |
6130 // Create a sync deletion for each extension. | 6242 // Create a sync deletion for each extension. |
6131 syncer::SyncChangeList change_list; | 6243 syncer::SyncChangeList change_list; |
6132 for (int i = 0; i < 2; i++) { | 6244 for (size_t i = 0; i < arraysize(extensions); i++) { |
6133 const std::string& id = extensions[i]->id(); | 6245 const std::string& id = extensions[i]->id(); |
6134 sync_pb::EntitySpecifics specifics; | 6246 sync_pb::EntitySpecifics specifics; |
6135 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 6247 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
6136 ext_specifics->set_id(id); | 6248 ext_specifics->set_id(id); |
6137 ext_specifics->set_version("1.0"); | 6249 ext_specifics->set_version("1.0"); |
6138 ext_specifics->set_installed_by_custodian( | 6250 ext_specifics->set_installed_by_custodian( |
6139 extensions[i]->was_installed_by_custodian()); | 6251 extensions[i]->was_installed_by_custodian()); |
6140 syncer::SyncData sync_data = | 6252 syncer::SyncData sync_data = |
6141 syncer::SyncData::CreateLocalData(id, "Name", specifics); | 6253 syncer::SyncData::CreateLocalData(id, "Name", specifics); |
6142 change_list.push_back(syncer::SyncChange(FROM_HERE, | 6254 change_list.push_back(syncer::SyncChange(FROM_HERE, |
6143 syncer::SyncChange::ACTION_DELETE, | 6255 syncer::SyncChange::ACTION_DELETE, |
6144 sync_data)); | 6256 sync_data)); |
6145 } | 6257 } |
6146 | 6258 |
6147 // Save the extension ids, as uninstalling destroys the Extension instance. | 6259 // Save the extension ids, as uninstalling destroys the Extension instance. |
6148 std::string extension_ids[2] = { | 6260 std::string extension_ids[] = { |
6149 extensions[0]->id(), | 6261 extensions[0]->id(), |
6150 extensions[1]->id() | 6262 extensions[1]->id() |
6151 }; | 6263 }; |
6152 | 6264 |
6153 // Now apply the uninstallations. | 6265 // Now apply the uninstallations. |
6154 extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list); | 6266 extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list); |
6155 | 6267 |
6156 // Uninstalling the extension without installed_by_custodian should have been | 6268 // Uninstalling the extension without installed_by_custodian should have been |
6157 // blocked by policy. | 6269 // blocked by policy, so it should still be there. |
6158 EXPECT_TRUE(service()->GetExtensionById(extension_ids[0], true)); | 6270 EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_ids[0])); |
6159 | 6271 |
6160 // But installed_by_custodian should result in bypassing the policy check. | 6272 // But installed_by_custodian should result in bypassing the policy check. |
6161 EXPECT_FALSE(service()->GetExtensionById(extension_ids[1], true)); | 6273 EXPECT_FALSE( |
| 6274 registry()->GenerateInstalledExtensionsSet()->Contains(extension_ids[1])); |
6162 } | 6275 } |
6163 | 6276 |
6164 TEST_F(ExtensionServiceTest, InstallPriorityExternalUpdateUrl) { | 6277 TEST_F(ExtensionServiceTest, InstallPriorityExternalUpdateUrl) { |
6165 InitializeEmptyExtensionService(); | 6278 InitializeEmptyExtensionService(); |
6166 | 6279 |
6167 base::FilePath path = data_dir().AppendASCII("good.crx"); | 6280 base::FilePath path = data_dir().AppendASCII("good.crx"); |
6168 InstallCRX(path, INSTALL_NEW); | 6281 InstallCRX(path, INSTALL_NEW); |
6169 ValidatePrefKeyCount(1u); | 6282 ValidatePrefKeyCount(1u); |
6170 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); | 6283 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); |
6171 ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); | 6284 ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); |
(...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7039 | 7152 |
7040 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, | 7153 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, |
7041 content::Source<Profile>(profile()), | 7154 content::Source<Profile>(profile()), |
7042 content::NotificationService::NoDetails()); | 7155 content::NotificationService::NoDetails()); |
7043 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); | 7156 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); |
7044 EXPECT_EQ(0u, registry()->enabled_extensions().size()); | 7157 EXPECT_EQ(0u, registry()->enabled_extensions().size()); |
7045 EXPECT_EQ(0u, registry()->disabled_extensions().size()); | 7158 EXPECT_EQ(0u, registry()->disabled_extensions().size()); |
7046 EXPECT_EQ(0u, registry()->terminated_extensions().size()); | 7159 EXPECT_EQ(0u, registry()->terminated_extensions().size()); |
7047 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); | 7160 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); |
7048 } | 7161 } |
OLD | NEW |