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 "chrome/common/safe_browsing/download_protection_util.h" | 5 #include "chrome/common/safe_browsing/download_protection_util.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
11 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 12 #include "chrome/common/safe_browsing/file_type_policies.h" |
12 | 13 |
13 namespace safe_browsing { | 14 namespace safe_browsing { |
14 namespace download_protection_util { | 15 namespace download_protection_util { |
15 | 16 |
16 namespace { | |
17 | |
18 // This enum matches the SBClientDownloadExtensions enum in histograms.xml. If | |
19 // you are adding a value here, you should also add to the enum definition in | |
20 // histograms.xml. Additions only at the end just in front of EXTENSION_MAX, | |
21 // natch. | |
22 enum SBClientDownloadExtensions { | |
23 EXTENSION_EXE, | |
24 EXTENSION_MSI, | |
25 EXTENSION_CAB, | |
26 EXTENSION_SYS, | |
27 EXTENSION_SCR, | |
28 EXTENSION_DRV, | |
29 EXTENSION_BAT, | |
30 EXTENSION_ZIP, | |
31 EXTENSION_RAR, | |
32 EXTENSION_DLL, | |
33 EXTENSION_PIF, | |
34 EXTENSION_COM, | |
35 EXTENSION_JAR, | |
36 EXTENSION_CLASS, | |
37 EXTENSION_PDF, | |
38 EXTENSION_VB, | |
39 EXTENSION_REG, | |
40 EXTENSION_GRP, | |
41 EXTENSION_OTHER, // The "other" bucket. This is in the middle of the enum | |
42 // due to historical reasons. | |
43 EXTENSION_CRX, | |
44 EXTENSION_APK, | |
45 EXTENSION_DMG, | |
46 EXTENSION_PKG, | |
47 EXTENSION_TORRENT, | |
48 EXTENSION_WEBSITE, | |
49 EXTENSION_URL, | |
50 EXTENSION_VBE, | |
51 EXTENSION_VBS, | |
52 EXTENSION_JS, | |
53 EXTENSION_JSE, | |
54 EXTENSION_MHT, | |
55 EXTENSION_MHTML, | |
56 EXTENSION_MSC, | |
57 EXTENSION_MSP, | |
58 EXTENSION_MST, | |
59 EXTENSION_BAS, | |
60 EXTENSION_HTA, | |
61 EXTENSION_MSH, | |
62 EXTENSION_MSH1, | |
63 EXTENSION_MSH1XML, | |
64 EXTENSION_MSH2, | |
65 EXTENSION_MSH2XML, | |
66 EXTENSION_MSHXML, | |
67 EXTENSION_PS1, | |
68 EXTENSION_PS1XML, | |
69 EXTENSION_PS2, | |
70 EXTENSION_PS2XML, | |
71 EXTENSION_PSC1, | |
72 EXTENSION_PSC2, | |
73 EXTENSION_SCF, | |
74 EXTENSION_SCT, | |
75 EXTENSION_WSF, | |
76 EXTENSION_7Z, | |
77 EXTENSION_XZ, | |
78 EXTENSION_GZ, | |
79 EXTENSION_TGZ, | |
80 EXTENSION_BZ2, | |
81 EXTENSION_TAR, | |
82 EXTENSION_ARJ, | |
83 EXTENSION_LZH, | |
84 EXTENSION_LHA, | |
85 EXTENSION_WIM, | |
86 EXTENSION_Z, | |
87 EXTENSION_LZMA, | |
88 EXTENSION_CPIO, | |
89 EXTENSION_CMD, | |
90 EXTENSION_APP, | |
91 EXTENSION_OSX, | |
92 EXTENSION_SWF, | |
93 EXTENSION_SPL, | |
94 EXTENSION_APPLICATION, | |
95 EXTENSION_ASP, | |
96 EXTENSION_ASX, | |
97 EXTENSION_CFG, | |
98 EXTENSION_CHI, | |
99 EXTENSION_CHM, | |
100 EXTENSION_CPL, | |
101 EXTENSION_FXP, | |
102 EXTENSION_HLP, | |
103 EXTENSION_HTT, | |
104 EXTENSION_INF, | |
105 EXTENSION_INI, | |
106 EXTENSION_INS, | |
107 EXTENSION_ISP, | |
108 EXTENSION_LNK, | |
109 EXTENSION_LOCAL, | |
110 EXTENSION_MANIFEST, | |
111 EXTENSION_MAU, | |
112 EXTENSION_MMC, | |
113 EXTENSION_MOF, | |
114 EXTENSION_OCX, | |
115 EXTENSION_OPS, | |
116 EXTENSION_PCD, | |
117 EXTENSION_PLG, | |
118 EXTENSION_PRF, | |
119 EXTENSION_PRG, | |
120 EXTENSION_PST, | |
121 EXTENSION_CRT, | |
122 EXTENSION_ADE, | |
123 EXTENSION_ADP, | |
124 EXTENSION_MAD, | |
125 EXTENSION_MAF, | |
126 EXTENSION_MAG, | |
127 EXTENSION_MAM, | |
128 EXTENSION_MAQ, | |
129 EXTENSION_MAR, | |
130 EXTENSION_MAS, | |
131 EXTENSION_MAT, | |
132 EXTENSION_MAV, | |
133 EXTENSION_MAW, | |
134 EXTENSION_MDA, | |
135 EXTENSION_MDB, | |
136 EXTENSION_MDE, | |
137 EXTENSION_MDT, | |
138 EXTENSION_MDW, | |
139 EXTENSION_MDZ, | |
140 EXTENSION_SHB, | |
141 EXTENSION_SHS, | |
142 EXTENSION_VSD, | |
143 EXTENSION_VSMACROS, | |
144 EXTENSION_VSS, | |
145 EXTENSION_VST, | |
146 EXTENSION_VSW, | |
147 EXTENSION_WS, | |
148 EXTENSION_WSC, | |
149 EXTENSION_WSH, | |
150 EXTENSION_XBAP, | |
151 EXTENSION_XNK, | |
152 EXTENSION_JNLP, | |
153 EXTENSION_PL, | |
154 EXTENSION_PY, | |
155 EXTENSION_PYC, | |
156 EXTENSION_PYW, | |
157 EXTENSION_RB, | |
158 EXTENSION_BASH, | |
159 EXTENSION_CSH, | |
160 EXTENSION_KSH, | |
161 EXTENSION_SH, | |
162 EXTENSION_SHAR, | |
163 EXTENSION_TCSH, | |
164 EXTENSION_COMMAND, | |
165 EXTENSION_DEB, | |
166 EXTENSION_RPM, | |
167 EXTENSION_DEX, | |
168 EXTENSION_APPREF_MS, | |
169 EXTENSION_GADGET, | |
170 EXTENSION_EFI, | |
171 EXTENSION_FON, | |
172 EXTENSION_BZIP2, | |
173 EXTENSION_GZIP, | |
174 EXTENSION_TAZ, | |
175 EXTENSION_TBZ, | |
176 EXTENSION_TBZ2, | |
177 EXTENSION_PARTIAL, | |
178 EXTENSION_SVG, | |
179 EXTENSION_XML, | |
180 EXTENSION_XRM_MS, | |
181 EXTENSION_XSL, | |
182 EXTENSION_ACTION, | |
183 EXTENSION_BIN, | |
184 EXTENSION_INX, | |
185 EXTENSION_IPA, | |
186 EXTENSION_ISU, | |
187 EXTENSION_JOB, | |
188 EXTENSION_OUT, | |
189 EXTENSION_PAD, | |
190 EXTENSION_PAF, | |
191 EXTENSION_RGS, | |
192 EXTENSION_U3P, | |
193 EXTENSION_VBSCRIPT, | |
194 EXTENSION_WORKFLOW, | |
195 EXTENSION_001, | |
196 EXTENSION_ACE, | |
197 EXTENSION_ARC, | |
198 EXTENSION_B64, | |
199 EXTENSION_BALZ, | |
200 EXTENSION_BHX, | |
201 EXTENSION_BZ, | |
202 EXTENSION_FAT, | |
203 EXTENSION_HFS, | |
204 EXTENSION_HQX, | |
205 EXTENSION_ISO, | |
206 EXTENSION_LPAQ1, | |
207 EXTENSION_LPAQ5, | |
208 EXTENSION_LPAQ8, | |
209 EXTENSION_MIM, | |
210 EXTENSION_NTFS, | |
211 EXTENSION_PAQ8F, | |
212 EXTENSION_PAQ8JD, | |
213 EXTENSION_PAQ8L, | |
214 EXTENSION_PAQ8O, | |
215 EXTENSION_PEA, | |
216 EXTENSION_PET, | |
217 EXTENSION_PUP, | |
218 EXTENSION_QUAD, | |
219 EXTENSION_R00, | |
220 EXTENSION_R01, | |
221 EXTENSION_R02, | |
222 EXTENSION_R03, | |
223 EXTENSION_R04, | |
224 EXTENSION_R05, | |
225 EXTENSION_R06, | |
226 EXTENSION_R07, | |
227 EXTENSION_R08, | |
228 EXTENSION_R09, | |
229 EXTENSION_R10, | |
230 EXTENSION_R11, | |
231 EXTENSION_R12, | |
232 EXTENSION_R13, | |
233 EXTENSION_R14, | |
234 EXTENSION_R15, | |
235 EXTENSION_R16, | |
236 EXTENSION_R17, | |
237 EXTENSION_R18, | |
238 EXTENSION_R19, | |
239 EXTENSION_R20, | |
240 EXTENSION_R21, | |
241 EXTENSION_R22, | |
242 EXTENSION_R23, | |
243 EXTENSION_R24, | |
244 EXTENSION_R25, | |
245 EXTENSION_R26, | |
246 EXTENSION_R27, | |
247 EXTENSION_R28, | |
248 EXTENSION_R29, | |
249 EXTENSION_SLP, | |
250 EXTENSION_SQUASHFS, | |
251 EXTENSION_SWM, | |
252 EXTENSION_TPZ, | |
253 EXTENSION_TXZ, | |
254 EXTENSION_TZ, | |
255 EXTENSION_UDF, | |
256 EXTENSION_UU, | |
257 EXTENSION_UUE, | |
258 EXTENSION_VHD, | |
259 EXTENSION_VMDK, | |
260 EXTENSION_WRC, | |
261 EXTENSION_XAR, | |
262 EXTENSION_XXE, | |
263 EXTENSION_ZIPX, | |
264 EXTENSION_ZPAQ, | |
265 EXTENSION_RELS, | |
266 EXTENSION_MSG, | |
267 EXTENSION_EML, | |
268 EXTENSION_RTF, | |
269 EXTENSION_VHDX, | |
270 EXTENSION_SEARCH_MS, | |
271 EXTENSION_IMG, | |
272 EXTENSION_SMI, | |
273 EXTENSION_SPARSEBUNDLE, | |
274 EXTENSION_SPARSEIMAGE, | |
275 EXTENSION_CDR, | |
276 EXTENSION_DMGPART, | |
277 EXTENSION_DVDR, | |
278 EXTENSION_DART, | |
279 EXTENSION_DC42, | |
280 EXTENSION_DISKCOPY42, | |
281 EXTENSION_IMGPART, | |
282 EXTENSION_NDIF, | |
283 EXTENSION_UDIF, | |
284 EXTENSION_TOAST, | |
285 | |
286 // New values go above this one. | |
287 EXTENSION_MAX | |
288 }; | |
289 | |
290 static_assert(EXTENSION_TOAST + 1 == EXTENSION_MAX, | |
291 "You must add new types to download_file_types.asciipb as " | |
292 "well."); | |
293 | |
294 struct SafeBrowsingFiletype { | |
295 const base::FilePath::CharType* const extension; | |
296 int uma_value; | |
297 bool is_supported_binary; | |
298 bool is_archive; | |
299 }; | |
300 | |
301 const SafeBrowsingFiletype kSafeBrowsingFileTypes[] = { | |
302 // KEEP THIS LIST SORTED! | |
303 {FILE_PATH_LITERAL(".001"), EXTENSION_001, true, true}, | |
304 {FILE_PATH_LITERAL(".7z"), EXTENSION_7Z, true, true}, | |
305 {FILE_PATH_LITERAL(".ace"), EXTENSION_ACE, true, true}, | |
306 {FILE_PATH_LITERAL(".action"), EXTENSION_ACTION, false, false}, // UMA. | |
307 {FILE_PATH_LITERAL(".ade"), EXTENSION_ADE, true, false}, | |
308 {FILE_PATH_LITERAL(".adp"), EXTENSION_ADP, true, false}, | |
309 {FILE_PATH_LITERAL(".apk"), EXTENSION_APK, true, false}, | |
310 {FILE_PATH_LITERAL(".app"), EXTENSION_APP, true, false}, | |
311 {FILE_PATH_LITERAL(".application"), EXTENSION_APPLICATION, true, false}, | |
312 {FILE_PATH_LITERAL(".appref-ms"), EXTENSION_APPREF_MS, true, false}, | |
313 {FILE_PATH_LITERAL(".arc"), EXTENSION_ARC, true, true}, | |
314 {FILE_PATH_LITERAL(".arj"), EXTENSION_ARJ, true, true}, | |
315 {FILE_PATH_LITERAL(".asp"), EXTENSION_ASP, true, false}, | |
316 {FILE_PATH_LITERAL(".asx"), EXTENSION_ASX, true, false}, | |
317 {FILE_PATH_LITERAL(".b64"), EXTENSION_B64, true, true}, | |
318 {FILE_PATH_LITERAL(".balz"), EXTENSION_BALZ, true, true}, | |
319 {FILE_PATH_LITERAL(".bas"), EXTENSION_BAS, true, false}, | |
320 {FILE_PATH_LITERAL(".bash"), EXTENSION_BASH, true, false}, | |
321 {FILE_PATH_LITERAL(".bat"), EXTENSION_BAT, true, false}, | |
322 {FILE_PATH_LITERAL(".bhx"), EXTENSION_BHX, true, true}, | |
323 {FILE_PATH_LITERAL(".bin"), EXTENSION_BIN, false, false}, // UMA only. | |
324 {FILE_PATH_LITERAL(".bz"), EXTENSION_BZ, true, true}, | |
325 {FILE_PATH_LITERAL(".bz2"), EXTENSION_BZ2, true, true}, | |
326 {FILE_PATH_LITERAL(".bzip2"), EXTENSION_BZIP2, true, true}, | |
327 {FILE_PATH_LITERAL(".cab"), EXTENSION_CAB, true, true}, | |
328 {FILE_PATH_LITERAL(".cdr"), EXTENSION_CDR, true, false}, | |
329 {FILE_PATH_LITERAL(".cfg"), EXTENSION_CFG, true, false}, | |
330 {FILE_PATH_LITERAL(".chi"), EXTENSION_CHI, true, false}, | |
331 {FILE_PATH_LITERAL(".chm"), EXTENSION_CHM, true, false}, | |
332 {FILE_PATH_LITERAL(".class"), EXTENSION_CLASS, true, false}, | |
333 {FILE_PATH_LITERAL(".cmd"), EXTENSION_CMD, true, false}, | |
334 {FILE_PATH_LITERAL(".com"), EXTENSION_COM, true, false}, | |
335 {FILE_PATH_LITERAL(".command"), EXTENSION_COMMAND, true, false}, | |
336 {FILE_PATH_LITERAL(".cpio"), EXTENSION_CPIO, true, true}, | |
337 {FILE_PATH_LITERAL(".cpl"), EXTENSION_CPL, true, false}, | |
338 {FILE_PATH_LITERAL(".crt"), EXTENSION_CRT, true, false}, | |
339 {FILE_PATH_LITERAL(".crx"), EXTENSION_CRX, true, false}, | |
340 {FILE_PATH_LITERAL(".csh"), EXTENSION_CSH, true, false}, | |
341 {FILE_PATH_LITERAL(".dart"), EXTENSION_DART, true, false}, | |
342 {FILE_PATH_LITERAL(".dc42"), EXTENSION_DC42, true, false}, | |
343 {FILE_PATH_LITERAL(".deb"), EXTENSION_DEB, true, false}, | |
344 {FILE_PATH_LITERAL(".dex"), EXTENSION_DEX, true, false}, | |
345 {FILE_PATH_LITERAL(".diskcopy42"), EXTENSION_DISKCOPY42, true, false}, | |
346 {FILE_PATH_LITERAL(".dll"), EXTENSION_DLL, true, false}, | |
347 {FILE_PATH_LITERAL(".dmg"), EXTENSION_DMG, true, false}, | |
348 {FILE_PATH_LITERAL(".dmgpart"), EXTENSION_DMGPART, true, false}, | |
349 {FILE_PATH_LITERAL(".drv"), EXTENSION_DRV, true, false}, | |
350 {FILE_PATH_LITERAL(".dvdr"), EXTENSION_DVDR, true, false}, | |
351 {FILE_PATH_LITERAL(".efi"), EXTENSION_EFI, true, false}, | |
352 {FILE_PATH_LITERAL(".eml"), EXTENSION_EML, true, false}, | |
353 {FILE_PATH_LITERAL(".exe"), EXTENSION_EXE, true, false}, | |
354 {FILE_PATH_LITERAL(".fat"), EXTENSION_FAT, true, true}, | |
355 {FILE_PATH_LITERAL(".fon"), EXTENSION_FON, true, false}, | |
356 {FILE_PATH_LITERAL(".fxp"), EXTENSION_FXP, true, false}, | |
357 {FILE_PATH_LITERAL(".gadget"), EXTENSION_GADGET, true, false}, | |
358 {FILE_PATH_LITERAL(".grp"), EXTENSION_GRP, true, false}, | |
359 {FILE_PATH_LITERAL(".gz"), EXTENSION_GZ, true, true}, | |
360 {FILE_PATH_LITERAL(".gzip"), EXTENSION_GZIP, true, true}, | |
361 {FILE_PATH_LITERAL(".hfs"), EXTENSION_HFS, true, true}, | |
362 {FILE_PATH_LITERAL(".hlp"), EXTENSION_HLP, true, false}, | |
363 {FILE_PATH_LITERAL(".hqx"), EXTENSION_HQX, true, true}, | |
364 {FILE_PATH_LITERAL(".hta"), EXTENSION_HTA, true, false}, | |
365 {FILE_PATH_LITERAL(".htt"), EXTENSION_HTT, true, false}, | |
366 {FILE_PATH_LITERAL(".img"), EXTENSION_IMG, true, false}, | |
367 {FILE_PATH_LITERAL(".imgpart"), EXTENSION_IMGPART, true, false}, | |
368 {FILE_PATH_LITERAL(".inf"), EXTENSION_INF, true, false}, | |
369 {FILE_PATH_LITERAL(".ini"), EXTENSION_INI, true, false}, | |
370 {FILE_PATH_LITERAL(".ins"), EXTENSION_INS, true, false}, | |
371 {FILE_PATH_LITERAL(".inx"), EXTENSION_INX, false, false}, // UMA only. | |
372 {FILE_PATH_LITERAL(".ipa"), EXTENSION_IPA, false, false}, // UMA only. | |
373 {FILE_PATH_LITERAL(".iso"), EXTENSION_ISO, true, true}, | |
374 {FILE_PATH_LITERAL(".isp"), EXTENSION_ISP, true, false}, | |
375 {FILE_PATH_LITERAL(".isu"), EXTENSION_ISU, false, false}, // UMA only. | |
376 {FILE_PATH_LITERAL(".jar"), EXTENSION_JAR, true, false}, | |
377 {FILE_PATH_LITERAL(".jnlp"), EXTENSION_JNLP, true, false}, | |
378 {FILE_PATH_LITERAL(".job"), EXTENSION_JOB, false, false}, // UMA only. | |
379 {FILE_PATH_LITERAL(".js"), EXTENSION_JS, true, false}, | |
380 {FILE_PATH_LITERAL(".jse"), EXTENSION_JSE, true, false}, | |
381 {FILE_PATH_LITERAL(".ksh"), EXTENSION_KSH, true, false}, | |
382 {FILE_PATH_LITERAL(".lha"), EXTENSION_LHA, true, true}, | |
383 {FILE_PATH_LITERAL(".lnk"), EXTENSION_LNK, true, false}, | |
384 {FILE_PATH_LITERAL(".local"), EXTENSION_LOCAL, true, false}, | |
385 {FILE_PATH_LITERAL(".lpaq1"), EXTENSION_LPAQ1, true, true}, | |
386 {FILE_PATH_LITERAL(".lpaq5"), EXTENSION_LPAQ5, true, true}, | |
387 {FILE_PATH_LITERAL(".lpaq8"), EXTENSION_LPAQ8, true, true}, | |
388 {FILE_PATH_LITERAL(".lzh"), EXTENSION_LZH, true, true}, | |
389 {FILE_PATH_LITERAL(".lzma"), EXTENSION_LZMA, true, true}, | |
390 {FILE_PATH_LITERAL(".mad"), EXTENSION_MAD, true, false}, | |
391 {FILE_PATH_LITERAL(".maf"), EXTENSION_MAF, true, false}, | |
392 {FILE_PATH_LITERAL(".mag"), EXTENSION_MAG, true, false}, | |
393 {FILE_PATH_LITERAL(".mam"), EXTENSION_MAM, true, false}, | |
394 {FILE_PATH_LITERAL(".manifest"), EXTENSION_MANIFEST, true, false}, | |
395 {FILE_PATH_LITERAL(".maq"), EXTENSION_MAQ, true, false}, | |
396 {FILE_PATH_LITERAL(".mar"), EXTENSION_MAR, true, false}, | |
397 {FILE_PATH_LITERAL(".mas"), EXTENSION_MAS, true, false}, | |
398 {FILE_PATH_LITERAL(".mat"), EXTENSION_MAT, true, false}, | |
399 {FILE_PATH_LITERAL(".mau"), EXTENSION_MAU, true, false}, | |
400 {FILE_PATH_LITERAL(".mav"), EXTENSION_MAV, true, false}, | |
401 {FILE_PATH_LITERAL(".maw"), EXTENSION_MAW, true, false}, | |
402 {FILE_PATH_LITERAL(".mda"), EXTENSION_MDA, true, false}, | |
403 {FILE_PATH_LITERAL(".mdb"), EXTENSION_MDB, true, false}, | |
404 {FILE_PATH_LITERAL(".mde"), EXTENSION_MDE, true, false}, | |
405 {FILE_PATH_LITERAL(".mdt"), EXTENSION_MDT, true, false}, | |
406 {FILE_PATH_LITERAL(".mdw"), EXTENSION_MDW, true, false}, | |
407 {FILE_PATH_LITERAL(".mdz"), EXTENSION_MDZ, true, false}, | |
408 {FILE_PATH_LITERAL(".mht"), EXTENSION_MHT, true, false}, | |
409 {FILE_PATH_LITERAL(".mhtml"), EXTENSION_MHTML, true, false}, | |
410 {FILE_PATH_LITERAL(".mim"), EXTENSION_MIM, true, true}, | |
411 {FILE_PATH_LITERAL(".mmc"), EXTENSION_MMC, true, false}, | |
412 {FILE_PATH_LITERAL(".mof"), EXTENSION_MOF, true, false}, | |
413 {FILE_PATH_LITERAL(".msc"), EXTENSION_MSC, true, false}, | |
414 {FILE_PATH_LITERAL(".msg"), EXTENSION_MSG, true, false}, | |
415 {FILE_PATH_LITERAL(".msh"), EXTENSION_MSH, true, false}, | |
416 {FILE_PATH_LITERAL(".msh1"), EXTENSION_MSH1, true, false}, | |
417 {FILE_PATH_LITERAL(".msh1xml"), EXTENSION_MSH1XML, true, false}, | |
418 {FILE_PATH_LITERAL(".msh2"), EXTENSION_MSH2, true, false}, | |
419 {FILE_PATH_LITERAL(".msh2xml"), EXTENSION_MSH2XML, true, false}, | |
420 {FILE_PATH_LITERAL(".mshxml"), EXTENSION_MSHXML, true, false}, | |
421 {FILE_PATH_LITERAL(".msi"), EXTENSION_MSI, true, false}, | |
422 {FILE_PATH_LITERAL(".msp"), EXTENSION_MSP, true, false}, | |
423 {FILE_PATH_LITERAL(".mst"), EXTENSION_MST, true, false}, | |
424 {FILE_PATH_LITERAL(".ndif"), EXTENSION_NDIF, true, false}, | |
425 {FILE_PATH_LITERAL(".ntfs"), EXTENSION_NTFS, true, true}, | |
426 {FILE_PATH_LITERAL(".ocx"), EXTENSION_OCX, true, false}, | |
427 {FILE_PATH_LITERAL(".ops"), EXTENSION_OPS, true, false}, | |
428 {FILE_PATH_LITERAL(".osx"), EXTENSION_OSX, true, false}, | |
429 {FILE_PATH_LITERAL(".out"), EXTENSION_OUT, false, false}, // UMA only. | |
430 {FILE_PATH_LITERAL(".pad"), EXTENSION_PAD, false, false}, // UMA only. | |
431 {FILE_PATH_LITERAL(".paf"), EXTENSION_PAF, false, false}, // UMA only. | |
432 {FILE_PATH_LITERAL(".paq8f"), EXTENSION_PAQ8F, true, true}, | |
433 {FILE_PATH_LITERAL(".paq8jd"), EXTENSION_PAQ8JD, true, true}, | |
434 {FILE_PATH_LITERAL(".paq8l"), EXTENSION_PAQ8L, true, true}, | |
435 {FILE_PATH_LITERAL(".paq8o"), EXTENSION_PAQ8O, true, true}, | |
436 {FILE_PATH_LITERAL(".partial"), EXTENSION_PARTIAL, true, false}, | |
437 {FILE_PATH_LITERAL(".pcd"), EXTENSION_PCD, true, false}, | |
438 {FILE_PATH_LITERAL(".pea"), EXTENSION_PEA, true, true}, | |
439 {FILE_PATH_LITERAL(".pet"), EXTENSION_PET, true, true}, | |
440 {FILE_PATH_LITERAL(".pif"), EXTENSION_PIF, true, false}, | |
441 {FILE_PATH_LITERAL(".pkg"), EXTENSION_PKG, true, false}, | |
442 {FILE_PATH_LITERAL(".pl"), EXTENSION_PL, true, false}, | |
443 {FILE_PATH_LITERAL(".plg"), EXTENSION_PLG, true, false}, | |
444 {FILE_PATH_LITERAL(".prf"), EXTENSION_PRF, true, false}, | |
445 {FILE_PATH_LITERAL(".prg"), EXTENSION_PRG, true, false}, | |
446 {FILE_PATH_LITERAL(".ps1"), EXTENSION_PS1, true, false}, | |
447 {FILE_PATH_LITERAL(".ps1xml"), EXTENSION_PS1XML, true, false}, | |
448 {FILE_PATH_LITERAL(".ps2"), EXTENSION_PS2, true, false}, | |
449 {FILE_PATH_LITERAL(".ps2xml"), EXTENSION_PS2XML, true, false}, | |
450 {FILE_PATH_LITERAL(".psc1"), EXTENSION_PSC1, true, false}, | |
451 {FILE_PATH_LITERAL(".psc2"), EXTENSION_PSC2, true, false}, | |
452 {FILE_PATH_LITERAL(".pst"), EXTENSION_PST, true, false}, | |
453 {FILE_PATH_LITERAL(".pup"), EXTENSION_PUP, true, true}, | |
454 {FILE_PATH_LITERAL(".py"), EXTENSION_PY, true, false}, | |
455 {FILE_PATH_LITERAL(".pyc"), EXTENSION_PYC, true, false}, | |
456 {FILE_PATH_LITERAL(".pyw"), EXTENSION_PYW, true, false}, | |
457 {FILE_PATH_LITERAL(".quad"), EXTENSION_QUAD, true, true}, | |
458 {FILE_PATH_LITERAL(".r00"), EXTENSION_R00, true, true}, | |
459 {FILE_PATH_LITERAL(".r01"), EXTENSION_R01, true, true}, | |
460 {FILE_PATH_LITERAL(".r02"), EXTENSION_R02, true, true}, | |
461 {FILE_PATH_LITERAL(".r03"), EXTENSION_R03, true, true}, | |
462 {FILE_PATH_LITERAL(".r04"), EXTENSION_R04, true, true}, | |
463 {FILE_PATH_LITERAL(".r05"), EXTENSION_R05, true, true}, | |
464 {FILE_PATH_LITERAL(".r06"), EXTENSION_R06, true, true}, | |
465 {FILE_PATH_LITERAL(".r07"), EXTENSION_R07, true, true}, | |
466 {FILE_PATH_LITERAL(".r08"), EXTENSION_R08, true, true}, | |
467 {FILE_PATH_LITERAL(".r09"), EXTENSION_R09, true, true}, | |
468 {FILE_PATH_LITERAL(".r10"), EXTENSION_R10, true, true}, | |
469 {FILE_PATH_LITERAL(".r11"), EXTENSION_R11, true, true}, | |
470 {FILE_PATH_LITERAL(".r12"), EXTENSION_R12, true, true}, | |
471 {FILE_PATH_LITERAL(".r13"), EXTENSION_R13, true, true}, | |
472 {FILE_PATH_LITERAL(".r14"), EXTENSION_R14, true, true}, | |
473 {FILE_PATH_LITERAL(".r15"), EXTENSION_R15, true, true}, | |
474 {FILE_PATH_LITERAL(".r16"), EXTENSION_R16, true, true}, | |
475 {FILE_PATH_LITERAL(".r17"), EXTENSION_R17, true, true}, | |
476 {FILE_PATH_LITERAL(".r18"), EXTENSION_R18, true, true}, | |
477 {FILE_PATH_LITERAL(".r19"), EXTENSION_R19, true, true}, | |
478 {FILE_PATH_LITERAL(".r20"), EXTENSION_R20, true, true}, | |
479 {FILE_PATH_LITERAL(".r21"), EXTENSION_R21, true, true}, | |
480 {FILE_PATH_LITERAL(".r22"), EXTENSION_R22, true, true}, | |
481 {FILE_PATH_LITERAL(".r23"), EXTENSION_R23, true, true}, | |
482 {FILE_PATH_LITERAL(".r24"), EXTENSION_R24, true, true}, | |
483 {FILE_PATH_LITERAL(".r25"), EXTENSION_R25, true, true}, | |
484 {FILE_PATH_LITERAL(".r26"), EXTENSION_R26, true, true}, | |
485 {FILE_PATH_LITERAL(".r27"), EXTENSION_R27, true, true}, | |
486 {FILE_PATH_LITERAL(".r28"), EXTENSION_R28, true, true}, | |
487 {FILE_PATH_LITERAL(".r29"), EXTENSION_R29, true, true}, | |
488 {FILE_PATH_LITERAL(".rar"), EXTENSION_RAR, true, true}, | |
489 {FILE_PATH_LITERAL(".rb"), EXTENSION_RB, true, false}, | |
490 {FILE_PATH_LITERAL(".rels"), EXTENSION_RELS, true, false}, | |
491 {FILE_PATH_LITERAL(".reg"), EXTENSION_REG, true, false}, | |
492 {FILE_PATH_LITERAL(".rgs"), EXTENSION_RGS, false, false}, // UMA only. | |
493 {FILE_PATH_LITERAL(".rpm"), EXTENSION_RPM, true, false}, | |
494 {FILE_PATH_LITERAL(".rtf"), EXTENSION_RTF, false, false}, // UMA only. | |
495 {FILE_PATH_LITERAL(".scf"), EXTENSION_SCF, true, false}, | |
496 {FILE_PATH_LITERAL(".scr"), EXTENSION_SCR, true, false}, | |
497 {FILE_PATH_LITERAL(".sct"), EXTENSION_SCT, true, false}, | |
498 {FILE_PATH_LITERAL(".search-ms"), EXTENSION_SEARCH_MS, true, false}, | |
499 {FILE_PATH_LITERAL(".sh"), EXTENSION_SH, true, false}, | |
500 {FILE_PATH_LITERAL(".shar"), EXTENSION_SHAR, true, false}, | |
501 {FILE_PATH_LITERAL(".shb"), EXTENSION_SHB, true, false}, | |
502 {FILE_PATH_LITERAL(".shs"), EXTENSION_SHS, true, false}, | |
503 {FILE_PATH_LITERAL(".slp"), EXTENSION_SLP, true, true}, | |
504 {FILE_PATH_LITERAL(".smi"), EXTENSION_SMI, true, false}, | |
505 {FILE_PATH_LITERAL(".sparsebundle"), EXTENSION_SPARSEBUNDLE, true, false}, | |
506 {FILE_PATH_LITERAL(".sparseimage"), EXTENSION_SPARSEIMAGE, true, false}, | |
507 {FILE_PATH_LITERAL(".spl"), EXTENSION_SPL, true, false}, | |
508 {FILE_PATH_LITERAL(".squashfs"), EXTENSION_SQUASHFS, true, true}, | |
509 {FILE_PATH_LITERAL(".svg"), EXTENSION_SVG, true, false}, | |
510 {FILE_PATH_LITERAL(".swf"), EXTENSION_SWF, true, false}, | |
511 {FILE_PATH_LITERAL(".swm"), EXTENSION_SWM, true, true}, | |
512 {FILE_PATH_LITERAL(".sys"), EXTENSION_SYS, true, false}, | |
513 {FILE_PATH_LITERAL(".tar"), EXTENSION_TAR, true, true}, | |
514 {FILE_PATH_LITERAL(".taz"), EXTENSION_TAZ, true, true}, | |
515 {FILE_PATH_LITERAL(".tbz"), EXTENSION_TBZ, true, true}, | |
516 {FILE_PATH_LITERAL(".tbz2"), EXTENSION_TBZ2, true, true}, | |
517 {FILE_PATH_LITERAL(".tcsh"), EXTENSION_TCSH, true, false}, | |
518 {FILE_PATH_LITERAL(".tgz"), EXTENSION_TGZ, true, true}, | |
519 {FILE_PATH_LITERAL(".toast"), EXTENSION_TOAST, true, false}, | |
520 {FILE_PATH_LITERAL(".torrent"), EXTENSION_TORRENT, true, false}, | |
521 {FILE_PATH_LITERAL(".tpz"), EXTENSION_TPZ, true, true}, | |
522 {FILE_PATH_LITERAL(".txz"), EXTENSION_TXZ, true, true}, | |
523 {FILE_PATH_LITERAL(".tz"), EXTENSION_TZ, true, true}, | |
524 {FILE_PATH_LITERAL(".u3p"), EXTENSION_U3P, false, false}, // UMA only. | |
525 {FILE_PATH_LITERAL(".udf"), EXTENSION_UDF, true, true}, | |
526 {FILE_PATH_LITERAL(".udif"), EXTENSION_UDIF, true, false}, | |
527 {FILE_PATH_LITERAL(".url"), EXTENSION_URL, true, false}, | |
528 {FILE_PATH_LITERAL(".uu"), EXTENSION_UU, true, true}, | |
529 {FILE_PATH_LITERAL(".uue"), EXTENSION_UUE, true, true}, | |
530 {FILE_PATH_LITERAL(".vb"), EXTENSION_VB, true, false}, | |
531 {FILE_PATH_LITERAL(".vbe"), EXTENSION_VBE, true, false}, | |
532 {FILE_PATH_LITERAL(".vbs"), EXTENSION_VBS, true, false}, | |
533 {FILE_PATH_LITERAL(".vbscript"), EXTENSION_VBSCRIPT, false, false}, // UMA. | |
534 {FILE_PATH_LITERAL(".vhd"), EXTENSION_VHD, true, true}, | |
535 {FILE_PATH_LITERAL(".vhdx"), EXTENSION_VHDX, true, true}, | |
536 {FILE_PATH_LITERAL(".vmdk"), EXTENSION_VMDK, true, true}, | |
537 {FILE_PATH_LITERAL(".vsd"), EXTENSION_VSD, true, false}, | |
538 {FILE_PATH_LITERAL(".vsmacros"), EXTENSION_VSMACROS, true, false}, | |
539 {FILE_PATH_LITERAL(".vss"), EXTENSION_VSS, true, false}, | |
540 {FILE_PATH_LITERAL(".vst"), EXTENSION_VST, true, false}, | |
541 {FILE_PATH_LITERAL(".vsw"), EXTENSION_VSW, true, false}, | |
542 {FILE_PATH_LITERAL(".website"), EXTENSION_WEBSITE, true, false}, | |
543 {FILE_PATH_LITERAL(".wim"), EXTENSION_WIM, true, true}, | |
544 {FILE_PATH_LITERAL(".workflow"), EXTENSION_WORKFLOW, false, false}, // UMA. | |
545 {FILE_PATH_LITERAL(".wrc"), EXTENSION_WRC, true, true}, | |
546 {FILE_PATH_LITERAL(".ws"), EXTENSION_WS, true, false}, | |
547 {FILE_PATH_LITERAL(".wsc"), EXTENSION_WSC, true, false}, | |
548 {FILE_PATH_LITERAL(".wsf"), EXTENSION_WSF, true, false}, | |
549 {FILE_PATH_LITERAL(".wsh"), EXTENSION_WSH, true, false}, | |
550 {FILE_PATH_LITERAL(".xar"), EXTENSION_XAR, true, true}, | |
551 {FILE_PATH_LITERAL(".xbap"), EXTENSION_XBAP, true, false}, | |
552 {FILE_PATH_LITERAL(".xml"), EXTENSION_XML, true, false}, | |
553 {FILE_PATH_LITERAL(".xnk"), EXTENSION_XNK, true, false}, | |
554 {FILE_PATH_LITERAL(".xrm-ms"), EXTENSION_XRM_MS, true, false}, | |
555 {FILE_PATH_LITERAL(".xsl"), EXTENSION_XSL, true, false}, | |
556 {FILE_PATH_LITERAL(".xxe"), EXTENSION_XXE, true, true}, | |
557 {FILE_PATH_LITERAL(".xz"), EXTENSION_XZ, true, true}, | |
558 {FILE_PATH_LITERAL(".z"), EXTENSION_Z, true, true}, | |
559 {FILE_PATH_LITERAL(".zip"), EXTENSION_ZIP, true, true}, | |
560 {FILE_PATH_LITERAL(".zipx"), EXTENSION_ZIPX, true, true}, | |
561 {FILE_PATH_LITERAL(".zpaq"), EXTENSION_ZPAQ, true, true}, | |
562 }; | |
563 | |
564 const SafeBrowsingFiletype& GetFileType(const base::FilePath& file) { | |
565 static const SafeBrowsingFiletype kOther = { | |
566 nullptr, EXTENSION_OTHER, false, false | |
567 }; | |
568 | |
569 base::FilePath::StringType extension = GetFileExtension(file); | |
570 SafeBrowsingFiletype needle = {extension.c_str()}; | |
571 | |
572 const auto begin = kSafeBrowsingFileTypes; | |
573 const auto end = kSafeBrowsingFileTypes + arraysize(kSafeBrowsingFileTypes); | |
574 const auto result = std::lower_bound( | |
575 begin, end, needle, | |
576 [](const SafeBrowsingFiletype& left, const SafeBrowsingFiletype& right) { | |
577 return base::FilePath::CompareLessIgnoreCase(left.extension, | |
578 right.extension); | |
579 }); | |
580 if (result == end || | |
581 !base::FilePath::CompareEqualIgnoreCase(needle.extension, | |
582 result->extension)) | |
583 return kOther; | |
584 return *result; | |
585 } | |
586 | |
587 } // namespace | |
588 | |
589 const int kSBClientDownloadExtensionsMax = EXTENSION_MAX; | |
590 | |
591 const base::FilePath::StringType GetFileExtension(const base::FilePath& file) { | |
592 // Remove trailing space and period characters from the extension. | |
593 base::FilePath::StringType file_basename = file.BaseName().value(); | |
594 base::FilePath::StringPieceType trimmed_filename = base::TrimString( | |
595 file_basename, FILE_PATH_LITERAL(". "), base::TRIM_TRAILING); | |
596 return base::FilePath(trimmed_filename).FinalExtension(); | |
597 } | |
598 | |
599 bool IsArchiveFile(const base::FilePath& file) { | |
600 // List of interesting archive file formats in kSafeBrowsingFileTypes is by no | |
601 // means exhaustive, but are currently file types that Safe Browsing would | |
602 // like to see pings for due to the possibility of them being used as wrapper | |
603 // formats for malicious payloads. | |
604 return GetFileType(file).is_archive; | |
605 } | |
606 | |
607 bool IsSupportedBinaryFile(const base::FilePath& file) { | |
608 return GetFileType(file).is_supported_binary; | |
609 } | |
610 | |
611 ClientDownloadRequest::DownloadType GetDownloadType( | 17 ClientDownloadRequest::DownloadType GetDownloadType( |
612 const base::FilePath& file) { | 18 const base::FilePath& file) { |
613 DCHECK(IsSupportedBinaryFile(file)); | 19 // TODO(nparker): Put all of this logic into the FileTypePolicies |
| 20 // protobuf. |
614 if (file.MatchesExtension(FILE_PATH_LITERAL(".apk"))) | 21 if (file.MatchesExtension(FILE_PATH_LITERAL(".apk"))) |
615 return ClientDownloadRequest::ANDROID_APK; | 22 return ClientDownloadRequest::ANDROID_APK; |
616 else if (file.MatchesExtension(FILE_PATH_LITERAL(".crx"))) | 23 else if (file.MatchesExtension(FILE_PATH_LITERAL(".crx"))) |
617 return ClientDownloadRequest::CHROME_EXTENSION; | 24 return ClientDownloadRequest::CHROME_EXTENSION; |
618 else if (file.MatchesExtension(FILE_PATH_LITERAL(".zip"))) | 25 else if (file.MatchesExtension(FILE_PATH_LITERAL(".zip"))) |
619 // DownloadProtectionService doesn't send a ClientDownloadRequest for ZIP | 26 // DownloadProtectionService doesn't send a ClientDownloadRequest for ZIP |
620 // files unless they contain either executables or archives. The resulting | 27 // files unless they contain either executables or archives. The resulting |
621 // DownloadType is either ZIPPED_EXECUTABLE or ZIPPED_ARCHIVE respectively. | 28 // DownloadType is either ZIPPED_EXECUTABLE or ZIPPED_ARCHIVE respectively. |
622 // This function will return ZIPPED_EXECUTABLE for ZIP files as a | 29 // This function will return ZIPPED_EXECUTABLE for ZIP files as a |
623 // placeholder. The correct DownloadType will be determined based on the | 30 // placeholder. The correct DownloadType will be determined based on the |
(...skipping 12 matching lines...) Expand all Loading... |
636 file.MatchesExtension(FILE_PATH_LITERAL(".dart")) || | 43 file.MatchesExtension(FILE_PATH_LITERAL(".dart")) || |
637 file.MatchesExtension(FILE_PATH_LITERAL(".dc42")) || | 44 file.MatchesExtension(FILE_PATH_LITERAL(".dc42")) || |
638 file.MatchesExtension(FILE_PATH_LITERAL(".diskcopy42")) || | 45 file.MatchesExtension(FILE_PATH_LITERAL(".diskcopy42")) || |
639 file.MatchesExtension(FILE_PATH_LITERAL(".imgpart")) || | 46 file.MatchesExtension(FILE_PATH_LITERAL(".imgpart")) || |
640 file.MatchesExtension(FILE_PATH_LITERAL(".ndif")) || | 47 file.MatchesExtension(FILE_PATH_LITERAL(".ndif")) || |
641 file.MatchesExtension(FILE_PATH_LITERAL(".udif")) || | 48 file.MatchesExtension(FILE_PATH_LITERAL(".udif")) || |
642 file.MatchesExtension(FILE_PATH_LITERAL(".toast")) || | 49 file.MatchesExtension(FILE_PATH_LITERAL(".toast")) || |
643 file.MatchesExtension(FILE_PATH_LITERAL(".sparsebundle")) || | 50 file.MatchesExtension(FILE_PATH_LITERAL(".sparsebundle")) || |
644 file.MatchesExtension(FILE_PATH_LITERAL(".sparseimage"))) | 51 file.MatchesExtension(FILE_PATH_LITERAL(".sparseimage"))) |
645 return ClientDownloadRequest::MAC_EXECUTABLE; | 52 return ClientDownloadRequest::MAC_EXECUTABLE; |
646 else if (IsArchiveFile(file)) | 53 else if (FileTypePolicies::GlobalInstance()->IsArchiveFile(file)) |
647 return ClientDownloadRequest::ARCHIVE; | 54 return ClientDownloadRequest::ARCHIVE; |
648 return ClientDownloadRequest::WIN_EXECUTABLE; | 55 return ClientDownloadRequest::WIN_EXECUTABLE; |
649 } | 56 } |
650 | 57 |
651 int GetSBClientDownloadExtensionValueForUMA(const base::FilePath& file) { | |
652 return GetFileType(file).uma_value; | |
653 } | |
654 | |
655 } // namespace download_protection_util | 58 } // namespace download_protection_util |
656 } // namespace safe_browsing | 59 } // namespace safe_browsing |
OLD | NEW |