| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/safe_browsing/file_type_policies.h" | 5 #include "chrome/common/safe_browsing/file_type_policies.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 // that gen_file_type_proto.py does its job. | 47 // that gen_file_type_proto.py does its job. |
| 48 // | 48 // |
| 49 // NOTE: If the settings for these change in download_file_types.asciipb, | 49 // NOTE: If the settings for these change in download_file_types.asciipb, |
| 50 // then you'll need to change them here as well. | 50 // then you'll need to change them here as well. |
| 51 | 51 |
| 52 // Lookup .exe that varies on OS_WIN. | 52 // Lookup .exe that varies on OS_WIN. |
| 53 base::FilePath exe_file(FILE_PATH_LITERAL("a/foo.exe")); | 53 base::FilePath exe_file(FILE_PATH_LITERAL("a/foo.exe")); |
| 54 DownloadFileType file_type = policies_.PolicyForFile(exe_file); | 54 DownloadFileType file_type = policies_.PolicyForFile(exe_file); |
| 55 EXPECT_EQ("exe", file_type.extension()); | 55 EXPECT_EQ("exe", file_type.extension()); |
| 56 EXPECT_EQ(0l, file_type.uma_value()); | 56 EXPECT_EQ(0l, file_type.uma_value()); |
| 57 EXPECT_EQ(false, file_type.is_archive()); | 57 EXPECT_FALSE(file_type.is_archive()); |
| 58 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); | 58 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); |
| 59 #if defined(OS_WIN) | 59 #if defined(OS_WIN) |
| 60 EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, | 60 EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, |
| 61 file_type.platform_settings(0).danger_level()); | 61 file_type.platform_settings(0).danger_level()); |
| 62 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, | 62 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, |
| 63 file_type.platform_settings(0).auto_open_hint()); | 63 file_type.platform_settings(0).auto_open_hint()); |
| 64 #else | 64 #else |
| 65 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, | 65 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, |
| 66 file_type.platform_settings(0).danger_level()); | 66 file_type.platform_settings(0).danger_level()); |
| 67 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, | 67 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, |
| 68 file_type.platform_settings(0).auto_open_hint()); | 68 file_type.platform_settings(0).auto_open_hint()); |
| 69 #endif | 69 #endif |
| 70 | 70 |
| 71 // Lookup .class that varies on OS_CHROMEOS, and also has a | 71 // Lookup .class that varies on OS_CHROMEOS, and also has a |
| 72 // default setting set. | 72 // default setting set. |
| 73 base::FilePath class_file(FILE_PATH_LITERAL("foo.class")); | 73 base::FilePath class_file(FILE_PATH_LITERAL("foo.class")); |
| 74 file_type = policies_.PolicyForFile(class_file); | 74 file_type = policies_.PolicyForFile(class_file); |
| 75 EXPECT_EQ("class", file_type.extension()); | 75 EXPECT_EQ("class", file_type.extension()); |
| 76 EXPECT_EQ(13l, file_type.uma_value()); | 76 EXPECT_EQ(13l, file_type.uma_value()); |
| 77 EXPECT_EQ(false, file_type.is_archive()); | 77 EXPECT_FALSE(file_type.is_archive()); |
| 78 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); | 78 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); |
| 79 #if defined(OS_CHROMEOS) | 79 #if defined(OS_CHROMEOS) |
| 80 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, | 80 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, |
| 81 file_type.platform_settings(0).danger_level()); | 81 file_type.platform_settings(0).danger_level()); |
| 82 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, | 82 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, |
| 83 file_type.platform_settings(0).auto_open_hint()); | 83 file_type.platform_settings(0).auto_open_hint()); |
| 84 #else | 84 #else |
| 85 EXPECT_EQ(DownloadFileType::DANGEROUS, | 85 EXPECT_EQ(DownloadFileType::DANGEROUS, |
| 86 file_type.platform_settings(0).danger_level()); | 86 file_type.platform_settings(0).danger_level()); |
| 87 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, | 87 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, |
| 88 file_type.platform_settings(0).auto_open_hint()); | 88 file_type.platform_settings(0).auto_open_hint()); |
| 89 #endif | 89 #endif |
| 90 | 90 |
| 91 // Lookup .dmg that varies on OS_MACOS | 91 // Lookup .dmg that varies on OS_MACOS |
| 92 base::FilePath dmg_file(FILE_PATH_LITERAL("foo.dmg")); | 92 base::FilePath dmg_file(FILE_PATH_LITERAL("foo.dmg")); |
| 93 file_type = policies_.PolicyForFile(dmg_file); | 93 file_type = policies_.PolicyForFile(dmg_file); |
| 94 EXPECT_EQ("dmg", file_type.extension()); | 94 EXPECT_EQ("dmg", file_type.extension()); |
| 95 EXPECT_EQ(21, file_type.uma_value()); | 95 EXPECT_EQ(21, file_type.uma_value()); |
| 96 EXPECT_EQ(false, file_type.is_archive()); | 96 EXPECT_FALSE(file_type.is_archive()); |
| 97 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); | 97 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); |
| 98 #if defined(OS_MACOSX) | 98 #if defined(OS_MACOSX) |
| 99 EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, | 99 EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, |
| 100 file_type.platform_settings(0).danger_level()); | 100 file_type.platform_settings(0).danger_level()); |
| 101 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, | 101 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, |
| 102 file_type.platform_settings(0).auto_open_hint()); | 102 file_type.platform_settings(0).auto_open_hint()); |
| 103 #else | 103 #else |
| 104 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, | 104 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, |
| 105 file_type.platform_settings(0).danger_level()); | 105 file_type.platform_settings(0).danger_level()); |
| 106 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, | 106 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, |
| 107 file_type.platform_settings(0).auto_open_hint()); | 107 file_type.platform_settings(0).auto_open_hint()); |
| 108 #endif | 108 #endif |
| 109 | 109 |
| 110 // Lookup .dex that varies on OS_ANDROID | 110 // Lookup .dex that varies on OS_ANDROID |
| 111 base::FilePath dex_file(FILE_PATH_LITERAL("foo.dex")); | 111 base::FilePath dex_file(FILE_PATH_LITERAL("foo.dex")); |
| 112 file_type = policies_.PolicyForFile(dex_file); | 112 file_type = policies_.PolicyForFile(dex_file); |
| 113 EXPECT_EQ("dex", file_type.extension()); | 113 EXPECT_EQ("dex", file_type.extension()); |
| 114 EXPECT_EQ(143, file_type.uma_value()); | 114 EXPECT_EQ(143, file_type.uma_value()); |
| 115 EXPECT_EQ(false, file_type.is_archive()); | 115 EXPECT_FALSE(file_type.is_archive()); |
| 116 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); | 116 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); |
| 117 #if defined(OS_ANDROID) | 117 #if defined(OS_ANDROID) |
| 118 EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, | 118 EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, |
| 119 file_type.platform_settings(0).danger_level()); | 119 file_type.platform_settings(0).danger_level()); |
| 120 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, | 120 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, |
| 121 file_type.platform_settings(0).auto_open_hint()); | 121 file_type.platform_settings(0).auto_open_hint()); |
| 122 #else | 122 #else |
| 123 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, | 123 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, |
| 124 file_type.platform_settings(0).danger_level()); | 124 file_type.platform_settings(0).danger_level()); |
| 125 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, | 125 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, |
| 126 file_type.platform_settings(0).auto_open_hint()); | 126 file_type.platform_settings(0).auto_open_hint()); |
| 127 #endif | 127 #endif |
| 128 | 128 |
| 129 // Lookup .rpm that varies on OS_LINUX | 129 // Lookup .rpm that varies on OS_LINUX |
| 130 base::FilePath rpm_file(FILE_PATH_LITERAL("foo.rpm")); | 130 base::FilePath rpm_file(FILE_PATH_LITERAL("foo.rpm")); |
| 131 file_type = policies_.PolicyForFile(rpm_file); | 131 file_type = policies_.PolicyForFile(rpm_file); |
| 132 EXPECT_EQ("rpm", file_type.extension()); | 132 EXPECT_EQ("rpm", file_type.extension()); |
| 133 EXPECT_EQ(142, file_type.uma_value()); | 133 EXPECT_EQ(142, file_type.uma_value()); |
| 134 EXPECT_EQ(false, file_type.is_archive()); | 134 EXPECT_FALSE(file_type.is_archive()); |
| 135 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); | 135 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); |
| 136 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 136 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 137 EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, | 137 EXPECT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE, |
| 138 file_type.platform_settings(0).danger_level()); | 138 file_type.platform_settings(0).danger_level()); |
| 139 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, | 139 EXPECT_EQ(DownloadFileType::DISALLOW_AUTO_OPEN, |
| 140 file_type.platform_settings(0).auto_open_hint()); | 140 file_type.platform_settings(0).auto_open_hint()); |
| 141 #else | 141 #else |
| 142 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, | 142 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, |
| 143 file_type.platform_settings(0).danger_level()); | 143 file_type.platform_settings(0).danger_level()); |
| 144 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, | 144 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, |
| 145 file_type.platform_settings(0).auto_open_hint()); | 145 file_type.platform_settings(0).auto_open_hint()); |
| 146 #endif | 146 #endif |
| 147 | 147 |
| 148 // Look .zip, an archive. The same on all platforms. | 148 // Look .zip, an archive. The same on all platforms. |
| 149 base::FilePath zip_file(FILE_PATH_LITERAL("b/bar.txt.zip")); | 149 base::FilePath zip_file(FILE_PATH_LITERAL("b/bar.txt.zip")); |
| 150 file_type = policies_.PolicyForFile(zip_file); | 150 file_type = policies_.PolicyForFile(zip_file); |
| 151 EXPECT_EQ("zip", file_type.extension()); | 151 EXPECT_EQ("zip", file_type.extension()); |
| 152 EXPECT_EQ(7l, file_type.uma_value()); | 152 EXPECT_EQ(7l, file_type.uma_value()); |
| 153 EXPECT_EQ(true, file_type.is_archive()); | 153 EXPECT_TRUE(file_type.is_archive()); |
| 154 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); | 154 EXPECT_EQ(DownloadFileType::FULL_PING, file_type.ping_setting()); |
| 155 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, | 155 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, |
| 156 file_type.platform_settings(0).danger_level()); | 156 file_type.platform_settings(0).danger_level()); |
| 157 | 157 |
| 158 // Check other accessors | 158 // Check other accessors |
| 159 EXPECT_EQ(7l, policies_.UmaValueForFile(zip_file)); | 159 EXPECT_EQ(7l, policies_.UmaValueForFile(zip_file)); |
| 160 EXPECT_EQ(true, policies_.IsFileAnArchive(zip_file)); | 160 EXPECT_TRUE(policies_.IsArchiveFile(zip_file)); |
| 161 EXPECT_FALSE(policies_.IsArchiveFile(exe_file)); |
| 161 | 162 |
| 162 // Verify settings on the default type. | 163 // Verify settings on the default type. |
| 163 file_type = policies_.PolicyForFile( | 164 file_type = policies_.PolicyForFile( |
| 164 base::FilePath(FILE_PATH_LITERAL("a/foo.fooobar"))); | 165 base::FilePath(FILE_PATH_LITERAL("a/foo.fooobar"))); |
| 165 EXPECT_EQ("", file_type.extension()); | 166 EXPECT_EQ("", file_type.extension()); |
| 166 EXPECT_EQ(18l, file_type.uma_value()); | 167 EXPECT_EQ(18l, file_type.uma_value()); |
| 167 EXPECT_EQ(false, file_type.is_archive()); | 168 EXPECT_FALSE(file_type.is_archive()); |
| 168 EXPECT_EQ(DownloadFileType::SAMPLED_PING, file_type.ping_setting()); | 169 EXPECT_EQ(DownloadFileType::SAMPLED_PING, file_type.ping_setting()); |
| 169 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, | 170 EXPECT_EQ(DownloadFileType::NOT_DANGEROUS, |
| 170 file_type.platform_settings(0).danger_level()); | 171 file_type.platform_settings(0).danger_level()); |
| 171 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, | 172 EXPECT_EQ(DownloadFileType::ALLOW_AUTO_OPEN, |
| 172 file_type.platform_settings(0).auto_open_hint()); | 173 file_type.platform_settings(0).auto_open_hint()); |
| 173 } | 174 } |
| 174 | 175 |
| 175 TEST_F(FileTypePoliciesTest, BadProto) { | 176 TEST_F(FileTypePoliciesTest, BadProto) { |
| 177 base::AutoLock lock(policies_.lock_); |
| 176 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_EMPTY, | 178 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_EMPTY, |
| 177 policies_.PopulateFromBinaryPb(std::string())); | 179 policies_.PopulateFromBinaryPb(std::string())); |
| 178 | 180 |
| 179 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_PROTO_PARSE, | 181 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_PROTO_PARSE, |
| 180 policies_.PopulateFromBinaryPb("foobar")); | 182 policies_.PopulateFromBinaryPb("foobar")); |
| 181 | 183 |
| 182 DownloadFileTypeConfig cfg; | 184 DownloadFileTypeConfig cfg; |
| 183 cfg.set_sampled_ping_probability(0.1f); | 185 cfg.set_sampled_ping_probability(0.1f); |
| 184 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_DEFAULT_SETTING_SET, | 186 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_DEFAULT_SETTING_SET, |
| 185 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); | 187 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); |
| 186 | 188 |
| 187 cfg.mutable_default_file_type()->add_platform_settings(); | 189 cfg.mutable_default_file_type()->add_platform_settings(); |
| 188 auto file_type = cfg.add_file_types(); // This is missing a platform_setting. | 190 auto file_type = cfg.add_file_types(); // This is missing a platform_setting. |
| 189 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_WRONG_SETTINGS_COUNT, | 191 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_WRONG_SETTINGS_COUNT, |
| 190 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); | 192 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); |
| 191 | 193 |
| 192 file_type->add_platform_settings(); | 194 file_type->add_platform_settings(); |
| 193 EXPECT_EQ(FileTypePolicies::UpdateResult::SUCCESS, | 195 EXPECT_EQ(FileTypePolicies::UpdateResult::SUCCESS, |
| 194 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); | 196 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); |
| 195 } | 197 } |
| 196 | 198 |
| 197 TEST_F(FileTypePoliciesTest, BadUpdateFromExisting) { | 199 TEST_F(FileTypePoliciesTest, BadUpdateFromExisting) { |
| 200 base::AutoLock lock(policies_.lock_); |
| 198 // Make a minimum viable config | 201 // Make a minimum viable config |
| 199 DownloadFileTypeConfig cfg; | 202 DownloadFileTypeConfig cfg; |
| 200 cfg.mutable_default_file_type()->add_platform_settings(); | 203 cfg.mutable_default_file_type()->add_platform_settings(); |
| 201 cfg.add_file_types()->add_platform_settings(); | 204 cfg.add_file_types()->add_platform_settings(); |
| 202 cfg.set_version_id(2); | 205 cfg.set_version_id(2); |
| 203 EXPECT_EQ(FileTypePolicies::UpdateResult::SUCCESS, | 206 EXPECT_EQ(FileTypePolicies::UpdateResult::SUCCESS, |
| 204 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); | 207 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); |
| 205 | 208 |
| 206 // Can't update to the same version | 209 // Can't update to the same version |
| 207 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_VERSION_CHECK, | 210 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_VERSION_CHECK, |
| 208 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); | 211 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); |
| 209 | 212 |
| 210 // Can't go backward | 213 // Can't go backward |
| 211 cfg.set_version_id(1); | 214 cfg.set_version_id(1); |
| 212 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_VERSION_CHECK, | 215 EXPECT_EQ(FileTypePolicies::UpdateResult::FAILED_VERSION_CHECK, |
| 213 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); | 216 policies_.PopulateFromBinaryPb(cfg.SerializeAsString())); |
| 214 } | 217 } |
| 215 } // namespace safe_browsing | 218 } // namespace safe_browsing |
| OLD | NEW |