| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/command_line.h" | 5 #include "base/command_line.h" |
| 6 #include "base/json/json_file_value_serializer.h" | 6 #include "base/json/json_file_value_serializer.h" |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "chrome/common/chrome_paths.h" | 9 #include "chrome/common/chrome_paths.h" |
| 10 #include "chrome/common/chrome_switches.h" | 10 #include "chrome/common/chrome_switches.h" |
| 11 #include "chrome/common/extensions/extension_test_util.h" | 11 #include "chrome/common/extensions/extension_test_util.h" |
| 12 #include "chrome/common/extensions/features/feature_channel.h" | 12 #include "chrome/common/extensions/features/feature_channel.h" |
| 13 #include "chrome/common/extensions/permissions/chrome_permission_message_provide
r.h" | 13 #include "chrome/common/extensions/permissions/chrome_permission_message_provide
r.h" |
| 14 #include "chrome/grit/generated_resources.h" | 14 #include "chrome/grit/generated_resources.h" |
| 15 #include "extensions/common/error_utils.h" | 15 #include "extensions/common/error_utils.h" |
| 16 #include "extensions/common/extension.h" | 16 #include "extensions/common/extension.h" |
| 17 #include "extensions/common/extension_builder.h" | 17 #include "extensions/common/extension_builder.h" |
| 18 #include "extensions/common/permissions/permission_message_provider.h" | 18 #include "extensions/common/permissions/permission_message_provider.h" |
| 19 #include "extensions/common/permissions/permission_message_test_util.h" |
| 19 #include "extensions/common/permissions/permission_message_util.h" | 20 #include "extensions/common/permissions/permission_message_util.h" |
| 20 #include "extensions/common/permissions/permission_set.h" | 21 #include "extensions/common/permissions/permission_set.h" |
| 21 #include "extensions/common/permissions/permissions_data.h" | 22 #include "extensions/common/permissions/permissions_data.h" |
| 22 #include "extensions/common/permissions/permissions_info.h" | 23 #include "extensions/common/permissions/permissions_info.h" |
| 23 #include "extensions/common/permissions/socket_permission.h" | 24 #include "extensions/common/permissions/socket_permission.h" |
| 24 #include "extensions/common/value_builder.h" | 25 #include "extensions/common/value_builder.h" |
| 25 #include "extensions/strings/grit/extensions_strings.h" | 26 #include "extensions/strings/grit/extensions_strings.h" |
| 26 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
| 27 #include "ui/base/l10n/l10n_util.h" | 28 #include "ui/base/l10n/l10n_util.h" |
| 28 | 29 |
| 29 using extension_test_util::LoadManifest; | 30 using extension_test_util::LoadManifest; |
| 30 | 31 |
| 31 namespace extensions { | 32 namespace extensions { |
| 32 | 33 |
| 33 namespace { | 34 namespace { |
| 34 | 35 |
| 35 static void AddPattern(URLPatternSet* extent, const std::string& pattern) { | 36 static void AddPattern(URLPatternSet* extent, const std::string& pattern) { |
| 36 int schemes = URLPattern::SCHEME_ALL; | 37 int schemes = URLPattern::SCHEME_ALL; |
| 37 extent->AddPattern(URLPattern(schemes, pattern)); | 38 extent->AddPattern(URLPattern(schemes, pattern)); |
| 38 } | 39 } |
| 39 | 40 |
| 40 size_t IndexOf(const std::vector<base::string16>& warnings, | 41 size_t IndexOf(const PermissionMessageStrings& warnings, |
| 41 const std::string& warning) { | 42 const std::string& warning) { |
| 42 for (size_t i = 0; i < warnings.size(); ++i) { | 43 for (size_t i = 0; i < warnings.size(); ++i) { |
| 43 if (warnings[i] == base::ASCIIToUTF16(warning)) | 44 if (warnings[i].message == base::ASCIIToUTF16(warning)) |
| 44 return i; | 45 return i; |
| 45 } | 46 } |
| 46 | 47 |
| 47 return warnings.size(); | 48 return warnings.size(); |
| 48 } | 49 } |
| 49 | 50 |
| 50 bool Contains(const std::vector<base::string16>& warnings, | |
| 51 const std::string& warning) { | |
| 52 return IndexOf(warnings, warning) != warnings.size(); | |
| 53 } | |
| 54 | |
| 55 } // namespace | 51 } // namespace |
| 56 | 52 |
| 57 // Tests GetByID. | 53 // Tests GetByID. |
| 58 TEST(PermissionsTest, GetByID) { | 54 TEST(PermissionsTest, GetByID) { |
| 59 PermissionsInfo* info = PermissionsInfo::GetInstance(); | 55 PermissionsInfo* info = PermissionsInfo::GetInstance(); |
| 60 APIPermissionSet apis = info->GetAll(); | 56 APIPermissionSet apis = info->GetAll(); |
| 61 for (APIPermissionSet::const_iterator i = apis.begin(); | 57 for (APIPermissionSet::const_iterator i = apis.begin(); |
| 62 i != apis.end(); ++i) { | 58 i != apis.end(); ++i) { |
| 63 EXPECT_EQ(i->id(), i->info()->id()); | 59 EXPECT_EQ(i->id(), i->info()->id()); |
| 64 } | 60 } |
| (...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 | 964 |
| 969 TEST(PermissionsTest, AccessToDevicesMessages) { | 965 TEST(PermissionsTest, AccessToDevicesMessages) { |
| 970 { | 966 { |
| 971 APIPermissionSet api_permissions; | 967 APIPermissionSet api_permissions; |
| 972 api_permissions.insert(APIPermission::kSerial); | 968 api_permissions.insert(APIPermission::kSerial); |
| 973 scoped_refptr<PermissionSet> permissions( | 969 scoped_refptr<PermissionSet> permissions( |
| 974 new PermissionSet(api_permissions, | 970 new PermissionSet(api_permissions, |
| 975 ManifestPermissionSet(), | 971 ManifestPermissionSet(), |
| 976 URLPatternSet(), | 972 URLPatternSet(), |
| 977 URLPatternSet())); | 973 URLPatternSet())); |
| 978 std::vector<base::string16> messages = | 974 VerifyOnePermissionMessage( |
| 979 PermissionMessageProvider::Get()->GetLegacyWarningMessages( | 975 permissions.get(), Manifest::TYPE_EXTENSION, |
| 980 permissions.get(), Manifest::TYPE_EXTENSION); | 976 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_SERIAL)); |
| 981 EXPECT_EQ(1u, messages.size()); | |
| 982 EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_SERIAL), | |
| 983 messages[0]); | |
| 984 } | 977 } |
| 985 { | 978 { |
| 986 // Testing that multiple permissions will show the one message. | 979 // Testing that multiple permissions will show the one message. |
| 987 APIPermissionSet api_permissions; | 980 APIPermissionSet api_permissions; |
| 988 api_permissions.insert(APIPermission::kSerial); | 981 api_permissions.insert(APIPermission::kSerial); |
| 989 api_permissions.insert(APIPermission::kSerial); | 982 api_permissions.insert(APIPermission::kSerial); |
| 990 scoped_refptr<PermissionSet> permissions( | 983 scoped_refptr<PermissionSet> permissions( |
| 991 new PermissionSet(api_permissions, | 984 new PermissionSet(api_permissions, |
| 992 ManifestPermissionSet(), | 985 ManifestPermissionSet(), |
| 993 URLPatternSet(), | 986 URLPatternSet(), |
| 994 URLPatternSet())); | 987 URLPatternSet())); |
| 995 std::vector<base::string16> messages = | 988 VerifyOnePermissionMessage( |
| 996 PermissionMessageProvider::Get()->GetLegacyWarningMessages( | 989 permissions.get(), Manifest::TYPE_EXTENSION, |
| 997 permissions.get(), Manifest::TYPE_EXTENSION); | 990 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_SERIAL)); |
| 998 EXPECT_EQ(1u, messages.size()); | |
| 999 EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_SERIAL), | |
| 1000 messages[0]); | |
| 1001 } | 991 } |
| 1002 { | 992 { |
| 1003 scoped_refptr<Extension> extension = | 993 scoped_refptr<Extension> extension = |
| 1004 LoadManifest("permissions", "access_to_devices_bluetooth.json"); | 994 LoadManifest("permissions", "access_to_devices_bluetooth.json"); |
| 1005 const PermissionMessageProvider* provider = | |
| 1006 PermissionMessageProvider::Get(); | |
| 1007 PermissionSet* set = const_cast<PermissionSet*>( | 995 PermissionSet* set = const_cast<PermissionSet*>( |
| 1008 extension->permissions_data()->active_permissions().get()); | 996 extension->permissions_data()->active_permissions().get()); |
| 1009 std::vector<base::string16> warnings = | 997 VerifyOnePermissionMessage( |
| 1010 provider->GetLegacyWarningMessages(set, extension->GetType()); | 998 set, extension->GetType(), |
| 1011 EXPECT_EQ(1u, warnings.size()); | 999 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH)); |
| 1012 EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH), | |
| 1013 warnings[0]); | |
| 1014 | 1000 |
| 1015 // Test Bluetooth and Serial | 1001 // Test Bluetooth and Serial |
| 1016 set->apis_.insert(APIPermission::kSerial); | 1002 set->apis_.insert(APIPermission::kSerial); |
| 1017 warnings = provider->GetLegacyWarningMessages(set, extension->GetType()); | 1003 VerifyOnePermissionMessage( |
| 1018 EXPECT_EQ(1u, warnings.size()); | 1004 set, extension->GetType(), |
| 1019 EXPECT_EQ(l10n_util::GetStringUTF16( | 1005 l10n_util::GetStringUTF16( |
| 1020 IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_SERIAL), | 1006 IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_SERIAL)); |
| 1021 warnings[0]); | |
| 1022 set->apis_.erase(APIPermission::kSerial); | |
| 1023 } | 1007 } |
| 1024 } | 1008 } |
| 1025 | 1009 |
| 1026 TEST(PermissionsTest, MergedFileSystemPermissionComparison) { | 1010 TEST(PermissionsTest, MergedFileSystemPermissionComparison) { |
| 1027 APIPermissionSet write_api_permissions; | 1011 APIPermissionSet write_api_permissions; |
| 1028 write_api_permissions.insert(APIPermission::kFileSystemWrite); | 1012 write_api_permissions.insert(APIPermission::kFileSystemWrite); |
| 1029 scoped_refptr<PermissionSet> write_permissions( | 1013 scoped_refptr<PermissionSet> write_permissions( |
| 1030 new PermissionSet(write_api_permissions, ManifestPermissionSet(), | 1014 new PermissionSet(write_api_permissions, ManifestPermissionSet(), |
| 1031 URLPatternSet(), URLPatternSet())); | 1015 URLPatternSet(), URLPatternSet())); |
| 1032 | 1016 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1061 EXPECT_FALSE(provider->IsPrivilegeIncrease(directory_permissions.get(), | 1045 EXPECT_FALSE(provider->IsPrivilegeIncrease(directory_permissions.get(), |
| 1062 write_permissions.get(), | 1046 write_permissions.get(), |
| 1063 Manifest::TYPE_PLATFORM_APP)); | 1047 Manifest::TYPE_PLATFORM_APP)); |
| 1064 EXPECT_TRUE(provider->IsPrivilegeIncrease(directory_permissions.get(), | 1048 EXPECT_TRUE(provider->IsPrivilegeIncrease(directory_permissions.get(), |
| 1065 write_directory_permissions.get(), | 1049 write_directory_permissions.get(), |
| 1066 Manifest::TYPE_PLATFORM_APP)); | 1050 Manifest::TYPE_PLATFORM_APP)); |
| 1067 } | 1051 } |
| 1068 | 1052 |
| 1069 TEST(PermissionsTest, GetWarningMessages_ManyHosts) { | 1053 TEST(PermissionsTest, GetWarningMessages_ManyHosts) { |
| 1070 scoped_refptr<Extension> extension; | 1054 scoped_refptr<Extension> extension; |
| 1071 | |
| 1072 extension = LoadManifest("permissions", "many-hosts.json"); | 1055 extension = LoadManifest("permissions", "many-hosts.json"); |
| 1073 std::vector<base::string16> warnings = | 1056 EXPECT_TRUE(VerifyOnePermissionMessage( |
| 1074 extension->permissions_data()->GetPermissionMessageStrings(); | 1057 extension->permissions_data(), |
| 1075 ASSERT_EQ(1u, warnings.size()); | 1058 "Read and change your data on encrypted.google.com and www.google.com")); |
| 1076 EXPECT_EQ( | |
| 1077 "Read and change your data on encrypted.google.com and " | |
| 1078 "www.google.com", | |
| 1079 base::UTF16ToUTF8(warnings[0])); | |
| 1080 } | 1059 } |
| 1081 | 1060 |
| 1082 TEST(PermissionsTest, GetWarningMessages_Plugins) { | 1061 TEST(PermissionsTest, GetWarningMessages_Plugins) { |
| 1083 scoped_refptr<Extension> extension; | 1062 scoped_refptr<Extension> extension; |
| 1084 scoped_refptr<PermissionSet> permissions; | |
| 1085 | |
| 1086 extension = LoadManifest("permissions", "plugins.json"); | 1063 extension = LoadManifest("permissions", "plugins.json"); |
| 1087 std::vector<base::string16> warnings = | |
| 1088 extension->permissions_data()->GetPermissionMessageStrings(); | |
| 1089 // We don't parse the plugins key on Chrome OS, so it should not ask for any | 1064 // We don't parse the plugins key on Chrome OS, so it should not ask for any |
| 1090 // permissions. | 1065 // permissions. |
| 1091 #if defined(OS_CHROMEOS) | 1066 #if defined(OS_CHROMEOS) |
| 1092 ASSERT_EQ(0u, warnings.size()); | 1067 EXPECT_TRUE(VerifyNoPermissionMessages(extension->permissions_data())); |
| 1093 #else | 1068 #else |
| 1094 ASSERT_EQ(1u, warnings.size()); | 1069 EXPECT_TRUE(VerifyOnePermissionMessage( |
| 1095 EXPECT_EQ( | 1070 extension->permissions_data(), |
| 1096 "Read and change all your data on your computer and the websites " | 1071 "Read and change all your data on your computer and the websites you " |
| 1097 "you visit", | 1072 "visit")); |
| 1098 base::UTF16ToUTF8(warnings[0])); | |
| 1099 #endif | 1073 #endif |
| 1100 } | 1074 } |
| 1101 | 1075 |
| 1102 TEST(PermissionsTest, GetWarningMessages_AudioVideo) { | 1076 TEST(PermissionsTest, GetWarningMessages_AudioVideo) { |
| 1103 // Both audio and video present. | 1077 // Both audio and video present. |
| 1104 scoped_refptr<Extension> extension = | 1078 scoped_refptr<Extension> extension = |
| 1105 LoadManifest("permissions", "audio-video.json"); | 1079 LoadManifest("permissions", "audio-video.json"); |
| 1106 const PermissionMessageProvider* provider = PermissionMessageProvider::Get(); | 1080 const PermissionMessageProvider* provider = PermissionMessageProvider::Get(); |
| 1107 PermissionSet* set = const_cast<PermissionSet*>( | 1081 PermissionSet* set = const_cast<PermissionSet*>( |
| 1108 extension->permissions_data()->active_permissions().get()); | 1082 extension->permissions_data()->active_permissions().get()); |
| 1109 std::vector<base::string16> warnings = | 1083 EXPECT_FALSE(VerifyHasPermissionMessage(set, extension->GetType(), |
| 1110 provider->GetLegacyWarningMessages(set, extension->GetType()); | 1084 "Use your microphone")); |
| 1111 EXPECT_FALSE(Contains(warnings, "Use your microphone")); | 1085 EXPECT_FALSE( |
| 1112 EXPECT_FALSE(Contains(warnings, "Use your camera")); | 1086 VerifyHasPermissionMessage(set, extension->GetType(), "Use your camera")); |
| 1113 EXPECT_TRUE(Contains(warnings, "Use your microphone and camera")); | 1087 EXPECT_TRUE(VerifyHasPermissionMessage(set, extension->GetType(), |
| 1088 "Use your microphone and camera")); |
| 1089 PermissionMessageStrings warnings = |
| 1090 provider->GetPermissionMessageStrings(set, extension->GetType()); |
| 1114 size_t combined_index = IndexOf(warnings, "Use your microphone and camera"); | 1091 size_t combined_index = IndexOf(warnings, "Use your microphone and camera"); |
| 1115 size_t combined_size = warnings.size(); | 1092 size_t combined_size = warnings.size(); |
| 1116 | 1093 |
| 1117 // Just audio present. | 1094 // Just audio present. |
| 1118 set->apis_.erase(APIPermission::kVideoCapture); | 1095 set->apis_.erase(APIPermission::kVideoCapture); |
| 1119 warnings = provider->GetLegacyWarningMessages(set, extension->GetType()); | 1096 EXPECT_TRUE(VerifyHasPermissionMessage(set, extension->GetType(), |
| 1097 "Use your microphone")); |
| 1098 EXPECT_FALSE( |
| 1099 VerifyHasPermissionMessage(set, extension->GetType(), "Use your camera")); |
| 1100 EXPECT_FALSE(VerifyHasPermissionMessage(set, extension->GetType(), |
| 1101 "Use your microphone and camera")); |
| 1102 warnings = provider->GetPermissionMessageStrings(set, extension->GetType()); |
| 1120 EXPECT_EQ(combined_size, warnings.size()); | 1103 EXPECT_EQ(combined_size, warnings.size()); |
| 1121 EXPECT_EQ(combined_index, IndexOf(warnings, "Use your microphone")); | 1104 EXPECT_EQ(combined_index, IndexOf(warnings, "Use your microphone")); |
| 1122 EXPECT_FALSE(Contains(warnings, "Use your camera")); | |
| 1123 EXPECT_FALSE(Contains(warnings, "Use your microphone and camera")); | |
| 1124 | 1105 |
| 1125 // Just video present. | 1106 // Just video present. |
| 1126 set->apis_.erase(APIPermission::kAudioCapture); | 1107 set->apis_.erase(APIPermission::kAudioCapture); |
| 1127 set->apis_.insert(APIPermission::kVideoCapture); | 1108 set->apis_.insert(APIPermission::kVideoCapture); |
| 1128 warnings = provider->GetLegacyWarningMessages(set, extension->GetType()); | 1109 EXPECT_FALSE(VerifyHasPermissionMessage(set, extension->GetType(), |
| 1110 "Use your microphone")); |
| 1111 EXPECT_TRUE( |
| 1112 VerifyHasPermissionMessage(set, extension->GetType(), "Use your camera")); |
| 1113 EXPECT_FALSE(VerifyHasPermissionMessage(set, extension->GetType(), |
| 1114 "Use your microphone and camera")); |
| 1115 warnings = provider->GetPermissionMessageStrings(set, extension->GetType()); |
| 1129 EXPECT_EQ(combined_size, warnings.size()); | 1116 EXPECT_EQ(combined_size, warnings.size()); |
| 1130 EXPECT_FALSE(Contains(warnings, "Use your microphone")); | |
| 1131 EXPECT_FALSE(Contains(warnings, "Use your microphone and camera")); | |
| 1132 EXPECT_TRUE(Contains(warnings, "Use your camera")); | |
| 1133 } | 1117 } |
| 1134 | 1118 |
| 1135 TEST(PermissionsTest, GetWarningMessages_CombinedSessions) { | 1119 TEST(PermissionsTest, GetWarningMessages_CombinedSessions) { |
| 1136 { | 1120 { |
| 1137 APIPermissionSet api_permissions; | 1121 APIPermissionSet api_permissions; |
| 1138 api_permissions.insert(APIPermission::kTab); | 1122 api_permissions.insert(APIPermission::kTab); |
| 1139 api_permissions.insert(APIPermission::kTopSites); | 1123 api_permissions.insert(APIPermission::kTopSites); |
| 1140 api_permissions.insert(APIPermission::kProcesses); | 1124 api_permissions.insert(APIPermission::kProcesses); |
| 1141 api_permissions.insert(APIPermission::kWebNavigation); | 1125 api_permissions.insert(APIPermission::kWebNavigation); |
| 1142 api_permissions.insert(APIPermission::kSessions); | 1126 api_permissions.insert(APIPermission::kSessions); |
| 1143 scoped_refptr<PermissionSet> permissions( | 1127 scoped_refptr<PermissionSet> permissions( |
| 1144 new PermissionSet(api_permissions, ManifestPermissionSet(), | 1128 new PermissionSet(api_permissions, ManifestPermissionSet(), |
| 1145 URLPatternSet(), URLPatternSet())); | 1129 URLPatternSet(), URLPatternSet())); |
| 1146 std::vector<base::string16> messages = | 1130 EXPECT_TRUE(VerifyOnePermissionMessage( |
| 1147 PermissionMessageProvider::Get()->GetLegacyWarningMessages( | 1131 permissions.get(), Manifest::TYPE_EXTENSION, |
| 1148 permissions.get(), Manifest::TYPE_EXTENSION); | 1132 l10n_util::GetStringUTF16( |
| 1149 EXPECT_EQ(1u, messages.size()); | 1133 IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS))); |
| 1150 EXPECT_EQ(l10n_util::GetStringUTF16( | |
| 1151 IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS), | |
| 1152 messages[0]); | |
| 1153 } | 1134 } |
| 1154 { | 1135 { |
| 1155 APIPermissionSet api_permissions; | 1136 APIPermissionSet api_permissions; |
| 1156 api_permissions.insert(APIPermission::kHistory); | 1137 api_permissions.insert(APIPermission::kHistory); |
| 1157 api_permissions.insert(APIPermission::kTab); | 1138 api_permissions.insert(APIPermission::kTab); |
| 1158 api_permissions.insert(APIPermission::kTopSites); | 1139 api_permissions.insert(APIPermission::kTopSites); |
| 1159 api_permissions.insert(APIPermission::kProcesses); | 1140 api_permissions.insert(APIPermission::kProcesses); |
| 1160 api_permissions.insert(APIPermission::kWebNavigation); | 1141 api_permissions.insert(APIPermission::kWebNavigation); |
| 1161 api_permissions.insert(APIPermission::kSessions); | 1142 api_permissions.insert(APIPermission::kSessions); |
| 1162 scoped_refptr<PermissionSet> permissions( | 1143 scoped_refptr<PermissionSet> permissions( |
| 1163 new PermissionSet(api_permissions, ManifestPermissionSet(), | 1144 new PermissionSet(api_permissions, ManifestPermissionSet(), |
| 1164 URLPatternSet(), URLPatternSet())); | 1145 URLPatternSet(), URLPatternSet())); |
| 1165 std::vector<base::string16> messages = | 1146 EXPECT_TRUE(VerifyOnePermissionMessage( |
| 1166 PermissionMessageProvider::Get()->GetLegacyWarningMessages( | 1147 permissions.get(), Manifest::TYPE_EXTENSION, |
| 1167 permissions.get(), Manifest::TYPE_EXTENSION); | 1148 l10n_util::GetStringUTF16( |
| 1168 EXPECT_EQ(1u, messages.size()); | 1149 IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS))); |
| 1169 EXPECT_EQ(l10n_util::GetStringUTF16( | |
| 1170 IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS), | |
| 1171 messages[0]); | |
| 1172 } | 1150 } |
| 1173 } | 1151 } |
| 1174 | 1152 |
| 1175 TEST(PermissionsTest, GetWarningMessages_DeclarativeWebRequest) { | 1153 TEST(PermissionsTest, GetWarningMessages_DeclarativeWebRequest) { |
| 1176 // Test that if the declarativeWebRequest permission is present | 1154 // Test that if the declarativeWebRequest permission is present |
| 1177 // in combination with all hosts permission, then only the warning | 1155 // in combination with all hosts permission, then only the warning |
| 1178 // for host permissions is shown, because that covers the use of | 1156 // for host permissions is shown, because that covers the use of |
| 1179 // declarativeWebRequest. | 1157 // declarativeWebRequest. |
| 1180 | 1158 |
| 1181 // Until Declarative Web Request is in stable, let's make sure it is enabled | 1159 // Until Declarative Web Request is in stable, let's make sure it is enabled |
| 1182 // on the current channel. | 1160 // on the current channel. |
| 1183 ScopedCurrentChannel sc(chrome::VersionInfo::CHANNEL_CANARY); | 1161 ScopedCurrentChannel sc(chrome::VersionInfo::CHANNEL_CANARY); |
| 1184 | 1162 |
| 1185 // First verify that declarativeWebRequest produces a message when host | 1163 // First verify that declarativeWebRequest produces a message when host |
| 1186 // permissions do not cover all hosts. | 1164 // permissions do not cover all hosts. |
| 1187 scoped_refptr<Extension> extension = | 1165 scoped_refptr<Extension> extension = |
| 1188 LoadManifest("permissions", "web_request_not_all_host_permissions.json"); | 1166 LoadManifest("permissions", "web_request_not_all_host_permissions.json"); |
| 1189 const PermissionMessageProvider* provider = PermissionMessageProvider::Get(); | |
| 1190 const PermissionSet* set = | 1167 const PermissionSet* set = |
| 1191 extension->permissions_data()->active_permissions().get(); | 1168 extension->permissions_data()->active_permissions().get(); |
| 1192 std::vector<base::string16> warnings = | 1169 EXPECT_TRUE(VerifyHasPermissionMessage(set, extension->GetType(), |
| 1193 provider->GetLegacyWarningMessages(set, extension->GetType()); | 1170 "Block parts of web pages")); |
| 1194 EXPECT_TRUE(Contains(warnings, "Block parts of web pages")); | 1171 EXPECT_FALSE(VerifyHasPermissionMessage( |
| 1195 EXPECT_FALSE(Contains( | 1172 set, extension->GetType(), |
| 1196 warnings, "Read and change all your data on the websites you visit")); | 1173 "Read and change all your data on the websites you visit")); |
| 1197 | 1174 |
| 1198 // Now verify that declarativeWebRequest does not produce a message when host | 1175 // Now verify that declarativeWebRequest does not produce a message when host |
| 1199 // permissions do cover all hosts. | 1176 // permissions do cover all hosts. |
| 1200 extension = | 1177 extension = |
| 1201 LoadManifest("permissions", "web_request_all_host_permissions.json"); | 1178 LoadManifest("permissions", "web_request_all_host_permissions.json"); |
| 1202 set = extension->permissions_data()->active_permissions().get(); | 1179 set = extension->permissions_data()->active_permissions().get(); |
| 1203 warnings = provider->GetLegacyWarningMessages(set, extension->GetType()); | 1180 EXPECT_FALSE(VerifyHasPermissionMessage(set, extension->GetType(), |
| 1204 EXPECT_FALSE(Contains(warnings, "Block parts of web pages")); | 1181 "Block parts of web pages")); |
| 1205 EXPECT_TRUE(Contains( | 1182 EXPECT_TRUE(VerifyHasPermissionMessage( |
| 1206 warnings, "Read and change all your data on the websites you visit")); | 1183 set, extension->GetType(), |
| 1184 "Read and change all your data on the websites you visit")); |
| 1207 } | 1185 } |
| 1208 | 1186 |
| 1209 TEST(PermissionsTest, GetWarningMessages_Serial) { | 1187 TEST(PermissionsTest, GetWarningMessages_Serial) { |
| 1210 scoped_refptr<Extension> extension = | 1188 scoped_refptr<Extension> extension = |
| 1211 LoadManifest("permissions", "serial.json"); | 1189 LoadManifest("permissions", "serial.json"); |
| 1212 | 1190 |
| 1213 EXPECT_TRUE(extension->is_platform_app()); | 1191 EXPECT_TRUE(extension->is_platform_app()); |
| 1214 EXPECT_TRUE( | 1192 EXPECT_TRUE( |
| 1215 extension->permissions_data()->HasAPIPermission(APIPermission::kSerial)); | 1193 extension->permissions_data()->HasAPIPermission(APIPermission::kSerial)); |
| 1216 std::vector<base::string16> warnings = | 1194 EXPECT_TRUE(VerifyOnePermissionMessage(extension->permissions_data(), |
| 1217 extension->permissions_data()->GetPermissionMessageStrings(); | 1195 "Access your serial devices")); |
| 1218 EXPECT_TRUE(Contains(warnings, "Access your serial devices")); | |
| 1219 ASSERT_EQ(1u, warnings.size()); | |
| 1220 } | 1196 } |
| 1221 | 1197 |
| 1222 TEST(PermissionsTest, GetWarningMessages_Socket_AnyHost) { | 1198 TEST(PermissionsTest, GetWarningMessages_Socket_AnyHost) { |
| 1223 ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); | 1199 ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); |
| 1224 | 1200 |
| 1225 scoped_refptr<Extension> extension = | 1201 scoped_refptr<Extension> extension = |
| 1226 LoadManifest("permissions", "socket_any_host.json"); | 1202 LoadManifest("permissions", "socket_any_host.json"); |
| 1227 EXPECT_TRUE(extension->is_platform_app()); | 1203 EXPECT_TRUE(extension->is_platform_app()); |
| 1228 EXPECT_TRUE( | 1204 EXPECT_TRUE( |
| 1229 extension->permissions_data()->HasAPIPermission(APIPermission::kSocket)); | 1205 extension->permissions_data()->HasAPIPermission(APIPermission::kSocket)); |
| 1230 std::vector<base::string16> warnings = | 1206 EXPECT_TRUE(VerifyOnePermissionMessage( |
| 1231 extension->permissions_data()->GetPermissionMessageStrings(); | 1207 extension->permissions_data(), |
| 1232 EXPECT_EQ(1u, warnings.size()); | 1208 "Exchange data with any computer on the local network or internet")); |
| 1233 EXPECT_TRUE(Contains(warnings, "Exchange data with any computer " | |
| 1234 "on the local network or internet")); | |
| 1235 } | 1209 } |
| 1236 | 1210 |
| 1237 TEST(PermissionsTest, GetWarningMessages_Socket_OneDomainTwoHostnames) { | 1211 TEST(PermissionsTest, GetWarningMessages_Socket_OneDomainTwoHostnames) { |
| 1238 ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); | 1212 ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); |
| 1239 | 1213 |
| 1240 scoped_refptr<Extension> extension = | 1214 scoped_refptr<Extension> extension = |
| 1241 LoadManifest("permissions", "socket_one_domain_two_hostnames.json"); | 1215 LoadManifest("permissions", "socket_one_domain_two_hostnames.json"); |
| 1242 EXPECT_TRUE(extension->is_platform_app()); | 1216 EXPECT_TRUE(extension->is_platform_app()); |
| 1243 EXPECT_TRUE( | 1217 EXPECT_TRUE( |
| 1244 extension->permissions_data()->HasAPIPermission(APIPermission::kSocket)); | 1218 extension->permissions_data()->HasAPIPermission(APIPermission::kSocket)); |
| 1245 std::vector<base::string16> warnings = | |
| 1246 extension->permissions_data()->GetPermissionMessageStrings(); | |
| 1247 | 1219 |
| 1248 // Verify the warnings, including support for unicode characters, the fact | 1220 // Verify the warnings, including support for unicode characters, the fact |
| 1249 // that domain host warnings come before specific host warnings, and the fact | 1221 // that domain host warnings come before specific host warnings, and the fact |
| 1250 // that domains and hostnames are in alphabetical order regardless of the | 1222 // that domains and hostnames are in alphabetical order regardless of the |
| 1251 // order in the manifest file. | 1223 // order in the manifest file. |
| 1252 EXPECT_EQ(2u, warnings.size()); | 1224 EXPECT_TRUE(VerifyTwoPermissionMessages( |
| 1253 if (warnings.size() > 0) | 1225 extension->permissions_data(), |
| 1254 EXPECT_EQ(warnings[0], | 1226 "Exchange data with any computer in the domain example.org", |
| 1255 base::UTF8ToUTF16("Exchange data with any computer in the domain " | 1227 "Exchange data with the computers named: " |
| 1256 "example.org")); | 1228 "b\xC3\xA5r.example.com foo.example.com", |
| 1257 if (warnings.size() > 1) | 1229 // "\xC3\xA5" = UTF-8 for lowercase A with ring above |
| 1258 EXPECT_EQ(warnings[1], | 1230 true)); |
| 1259 base::UTF8ToUTF16("Exchange data with the computers named: " | |
| 1260 "b\xC3\xA5r.example.com foo.example.com")); | |
| 1261 // "\xC3\xA5" = UTF-8 for lowercase A with ring above | |
| 1262 } | 1231 } |
| 1263 | 1232 |
| 1264 TEST(PermissionsTest, GetWarningMessages_Socket_TwoDomainsOneHostname) { | 1233 TEST(PermissionsTest, GetWarningMessages_Socket_TwoDomainsOneHostname) { |
| 1265 ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); | 1234 ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); |
| 1266 | 1235 |
| 1267 scoped_refptr<Extension> extension = | 1236 scoped_refptr<Extension> extension = |
| 1268 LoadManifest("permissions", "socket_two_domains_one_hostname.json"); | 1237 LoadManifest("permissions", "socket_two_domains_one_hostname.json"); |
| 1269 EXPECT_TRUE(extension->is_platform_app()); | 1238 EXPECT_TRUE(extension->is_platform_app()); |
| 1270 EXPECT_TRUE( | 1239 EXPECT_TRUE( |
| 1271 extension->permissions_data()->HasAPIPermission(APIPermission::kSocket)); | 1240 extension->permissions_data()->HasAPIPermission(APIPermission::kSocket)); |
| 1272 std::vector<base::string16> warnings = | |
| 1273 extension->permissions_data()->GetPermissionMessageStrings(); | |
| 1274 | 1241 |
| 1275 // Verify the warnings, including the fact that domain host warnings come | 1242 // Verify the warnings, including the fact that domain host warnings come |
| 1276 // before specific host warnings and the fact that domains and hostnames are | 1243 // before specific host warnings and the fact that domains and hostnames are |
| 1277 // in alphabetical order regardless of the order in the manifest file. | 1244 // in alphabetical order regardless of the order in the manifest file. |
| 1278 EXPECT_EQ(2u, warnings.size()); | 1245 EXPECT_TRUE(VerifyTwoPermissionMessages( |
| 1279 if (warnings.size() > 0) | 1246 extension->permissions_data(), |
| 1280 EXPECT_EQ(warnings[0], | 1247 "Exchange data with any computer in the domains: " |
| 1281 base::UTF8ToUTF16("Exchange data with any computer in the " | 1248 "example.com foo.example.org", |
| 1282 "domains: example.com foo.example.org")); | 1249 "Exchange data with the computer named bar.example.org", true)); |
| 1283 if (warnings.size() > 1) | |
| 1284 EXPECT_EQ(warnings[1], | |
| 1285 base::UTF8ToUTF16("Exchange data with the computer named " | |
| 1286 "bar.example.org")); | |
| 1287 } | 1250 } |
| 1288 | 1251 |
| 1289 TEST(PermissionsTest, GetWarningMessages_PlatformApppHosts) { | 1252 // Since platform apps always use isolated storage, they can't (silently) |
| 1253 // access user data on other domains, so there's no need to prompt about host |
| 1254 // permissions. See crbug.com/255229. |
| 1255 TEST(PermissionsTest, GetWarningMessages_PlatformAppHosts) { |
| 1290 scoped_refptr<Extension> extension; | 1256 scoped_refptr<Extension> extension; |
| 1291 | 1257 |
| 1292 extension = LoadManifest("permissions", "platform_app_hosts.json"); | 1258 extension = LoadManifest("permissions", "platform_app_hosts.json"); |
| 1293 EXPECT_TRUE(extension->is_platform_app()); | 1259 EXPECT_TRUE(extension->is_platform_app()); |
| 1294 std::vector<base::string16> warnings = | 1260 EXPECT_TRUE(VerifyNoPermissionMessages(extension->permissions_data())); |
| 1295 extension->permissions_data()->GetPermissionMessageStrings(); | |
| 1296 ASSERT_EQ(0u, warnings.size()); | |
| 1297 | 1261 |
| 1298 extension = LoadManifest("permissions", "platform_app_all_urls.json"); | 1262 extension = LoadManifest("permissions", "platform_app_all_urls.json"); |
| 1299 EXPECT_TRUE(extension->is_platform_app()); | 1263 EXPECT_TRUE(extension->is_platform_app()); |
| 1300 warnings = extension->permissions_data()->GetPermissionMessageStrings(); | 1264 EXPECT_TRUE(VerifyNoPermissionMessages(extension->permissions_data())); |
| 1301 ASSERT_EQ(0u, warnings.size()); | |
| 1302 } | 1265 } |
| 1303 | 1266 |
| 1304 bool ShowsAllHostsWarning(const std::string& pattern) { | 1267 testing::AssertionResult ShowsAllHostsWarning(const std::string& pattern) { |
| 1305 scoped_refptr<Extension> extension = | 1268 scoped_refptr<Extension> extension = |
| 1306 ExtensionBuilder() | 1269 ExtensionBuilder() |
| 1307 .SetManifest(DictionaryBuilder() | 1270 .SetManifest(DictionaryBuilder() |
| 1308 .Set("name", "TLDWildCardTest") | 1271 .Set("name", "TLDWildCardTest") |
| 1309 .Set("version", "0.1.0") | 1272 .Set("version", "0.1.0") |
| 1310 .Set("permissions", ListBuilder().Append(pattern)) | 1273 .Set("permissions", ListBuilder().Append(pattern)) |
| 1311 .Build()) | 1274 .Build()) |
| 1312 .Build(); | 1275 .Build(); |
| 1313 | 1276 |
| 1314 std::vector<base::string16> warnings = | 1277 return VerifyHasPermissionMessage( |
| 1315 extension->permissions_data()->GetPermissionMessageStrings(); | 1278 extension->permissions_data(), |
| 1316 | 1279 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS)); |
| 1317 if (warnings.empty()) | |
| 1318 return false; | |
| 1319 | |
| 1320 if (warnings[0] != | |
| 1321 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS)) { | |
| 1322 return false; | |
| 1323 } | |
| 1324 | |
| 1325 return true; | |
| 1326 } | 1280 } |
| 1327 | 1281 |
| 1328 TEST(PermissionsTest, GetWarningMessages_TLDWildcardTreatedAsAllHosts) { | 1282 TEST(PermissionsTest, GetWarningMessages_TLDWildcardTreatedAsAllHosts) { |
| 1329 EXPECT_TRUE(ShowsAllHostsWarning("http://*.com/*")); // most popular. | 1283 EXPECT_TRUE(ShowsAllHostsWarning("http://*.com/*")); // most popular. |
| 1330 EXPECT_TRUE(ShowsAllHostsWarning("http://*.org/*")); // sanity check. | 1284 EXPECT_TRUE(ShowsAllHostsWarning("http://*.org/*")); // sanity check. |
| 1331 EXPECT_TRUE(ShowsAllHostsWarning("http://*.co.uk/*")); // eTLD. | 1285 EXPECT_TRUE(ShowsAllHostsWarning("http://*.co.uk/*")); // eTLD. |
| 1332 EXPECT_TRUE(ShowsAllHostsWarning("http://*.de/*")); // foreign country tld. | 1286 EXPECT_TRUE(ShowsAllHostsWarning("http://*.de/*")); // foreign country tld. |
| 1333 | 1287 |
| 1334 // We should still show the normal permissions (i.e., "Can access your data on | 1288 // We should still show the normal permissions (i.e., "Can access your data on |
| 1335 // *.rdcronin.com") for things that are not TLDs. | 1289 // *.rdcronin.com") for things that are not TLDs. |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1738 } | 1692 } |
| 1739 | 1693 |
| 1740 TEST(PermissionsTest, SyncFileSystemPermission) { | 1694 TEST(PermissionsTest, SyncFileSystemPermission) { |
| 1741 scoped_refptr<Extension> extension = LoadManifest( | 1695 scoped_refptr<Extension> extension = LoadManifest( |
| 1742 "permissions", "sync_file_system.json"); | 1696 "permissions", "sync_file_system.json"); |
| 1743 APIPermissionSet apis; | 1697 APIPermissionSet apis; |
| 1744 apis.insert(APIPermission::kSyncFileSystem); | 1698 apis.insert(APIPermission::kSyncFileSystem); |
| 1745 EXPECT_TRUE(extension->is_platform_app()); | 1699 EXPECT_TRUE(extension->is_platform_app()); |
| 1746 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( | 1700 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( |
| 1747 APIPermission::kSyncFileSystem)); | 1701 APIPermission::kSyncFileSystem)); |
| 1748 std::vector<base::string16> warnings = | 1702 EXPECT_TRUE( |
| 1749 extension->permissions_data()->GetPermissionMessageStrings(); | 1703 VerifyOnePermissionMessage(extension->permissions_data(), |
| 1750 EXPECT_TRUE(Contains(warnings, "Store data in your Google Drive account")); | 1704 "Store data in your Google Drive account")); |
| 1751 ASSERT_EQ(1u, warnings.size()); | |
| 1752 } | 1705 } |
| 1753 | 1706 |
| 1754 // Make sure that we don't crash when we're trying to show the permissions | 1707 // Make sure that we don't crash when we're trying to show the permissions |
| 1755 // even though chrome://thumb (and everything that's not chrome://favicon with | 1708 // even though chrome://thumb (and everything that's not chrome://favicon with |
| 1756 // a chrome:// scheme) is not a valid permission. | 1709 // a chrome:// scheme) is not a valid permission. |
| 1757 // More details here: crbug/246314. | 1710 // More details here: crbug/246314. |
| 1758 TEST(PermissionsTest, ChromeURLs) { | 1711 TEST(PermissionsTest, ChromeURLs) { |
| 1759 URLPatternSet allowed_hosts; | 1712 URLPatternSet allowed_hosts; |
| 1760 allowed_hosts.AddPattern( | 1713 allowed_hosts.AddPattern( |
| 1761 URLPattern(URLPattern::SCHEME_ALL, "http://www.google.com/")); | 1714 URLPattern(URLPattern::SCHEME_ALL, "http://www.google.com/")); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1781 scoped_refptr<const PermissionSet> permissions_dwr( | 1734 scoped_refptr<const PermissionSet> permissions_dwr( |
| 1782 extension_dwr->permissions_data()->active_permissions()); | 1735 extension_dwr->permissions_data()->active_permissions()); |
| 1783 | 1736 |
| 1784 EXPECT_FALSE(PermissionMessageProvider::Get()-> | 1737 EXPECT_FALSE(PermissionMessageProvider::Get()-> |
| 1785 IsPrivilegeIncrease(permissions.get(), | 1738 IsPrivilegeIncrease(permissions.get(), |
| 1786 permissions_dwr.get(), | 1739 permissions_dwr.get(), |
| 1787 extension->GetType())); | 1740 extension->GetType())); |
| 1788 } | 1741 } |
| 1789 | 1742 |
| 1790 } // namespace extensions | 1743 } // namespace extensions |
| OLD | NEW |