| Index: chrome/browser/safe_browsing/download_protection_service.cc
|
| diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc
|
| index c08c1779a67e4adb6683a3ba0d10335f708eb076..11607f07b72fe42d082a97acc255467ee8468e60 100644
|
| --- a/chrome/browser/safe_browsing/download_protection_service.cc
|
| +++ b/chrome/browser/safe_browsing/download_protection_service.cc
|
| @@ -62,72 +62,83 @@ const char DownloadProtectionService::kDownloadRequestUrl[] =
|
| "https://sb-ssl.google.com/safebrowsing/clientreport/download";
|
|
|
| namespace {
|
| -// List of extensions for which we track some UMA stats.
|
| -enum MaliciousExtensionType {
|
| - EXTENSION_EXE,
|
| - EXTENSION_MSI,
|
| - EXTENSION_CAB,
|
| - EXTENSION_SYS,
|
| - EXTENSION_SCR,
|
| - EXTENSION_DRV,
|
| - EXTENSION_BAT,
|
| - EXTENSION_ZIP,
|
| - EXTENSION_RAR,
|
| - EXTENSION_DLL,
|
| - EXTENSION_PIF,
|
| - EXTENSION_COM,
|
| - EXTENSION_JAR,
|
| - EXTENSION_CLASS,
|
| - EXTENSION_PDF,
|
| - EXTENSION_VB,
|
| - EXTENSION_REG,
|
| - EXTENSION_GRP,
|
| - EXTENSION_OTHER, // Groups all other extensions into one bucket.
|
| - EXTENSION_CRX,
|
| - EXTENSION_APK,
|
| - EXTENSION_DMG,
|
| - EXTENSION_PKG,
|
| - EXTENSION_TORRENT,
|
| - EXTENSION_WEBSITE,
|
| - EXTENSION_URL,
|
| - EXTENSION_MAX,
|
| +// List of extensions for which we track some UMA stats. The position of the
|
| +// extension in kDangerousFileTypes is considered to be the UMA enumeration
|
| +// value. Naturally, new values should only be added at the end.
|
| +const base::FilePath::CharType* const kDangerousFileTypes[] = {
|
| + FILE_PATH_LITERAL(".exe"),
|
| + FILE_PATH_LITERAL(".msi"),
|
| + FILE_PATH_LITERAL(".cab"),
|
| + FILE_PATH_LITERAL(".sys"),
|
| + FILE_PATH_LITERAL(".scr"),
|
| + FILE_PATH_LITERAL(".drv"),
|
| + FILE_PATH_LITERAL(".bat"),
|
| + FILE_PATH_LITERAL(".zip"),
|
| + FILE_PATH_LITERAL(".rar"),
|
| + FILE_PATH_LITERAL(".dll"),
|
| + FILE_PATH_LITERAL(".pif"),
|
| + FILE_PATH_LITERAL(".com"),
|
| + FILE_PATH_LITERAL(".jar"),
|
| + FILE_PATH_LITERAL(".class"),
|
| + FILE_PATH_LITERAL(".pdf"),
|
| + FILE_PATH_LITERAL(".vb"),
|
| + FILE_PATH_LITERAL(".reg"),
|
| + FILE_PATH_LITERAL(".grp"),
|
| + nullptr, // The "Other" bucket. This is in the middle of the array due to
|
| + // historical reasons.
|
| + FILE_PATH_LITERAL(".crx"),
|
| + FILE_PATH_LITERAL(".apk"),
|
| + FILE_PATH_LITERAL(".dmg"),
|
| + FILE_PATH_LITERAL(".pkg"),
|
| + FILE_PATH_LITERAL(".torrent"),
|
| + FILE_PATH_LITERAL(".website"),
|
| + FILE_PATH_LITERAL(".url"),
|
| + FILE_PATH_LITERAL(".vbe"),
|
| + FILE_PATH_LITERAL(".vbs"),
|
| + FILE_PATH_LITERAL(".js"),
|
| + FILE_PATH_LITERAL(".jse"),
|
| + FILE_PATH_LITERAL(".mht"),
|
| + FILE_PATH_LITERAL(".mhtml"),
|
| + FILE_PATH_LITERAL(".msc"),
|
| + FILE_PATH_LITERAL(".msp"),
|
| + FILE_PATH_LITERAL(".mst"),
|
| + FILE_PATH_LITERAL(".bas"),
|
| + FILE_PATH_LITERAL(".hta"),
|
| + FILE_PATH_LITERAL(".msh"),
|
| + FILE_PATH_LITERAL(".msh1"),
|
| + FILE_PATH_LITERAL(".msh1xml"),
|
| + FILE_PATH_LITERAL(".msh2"),
|
| + FILE_PATH_LITERAL(".msh2xml"),
|
| + FILE_PATH_LITERAL(".mshxml"),
|
| + FILE_PATH_LITERAL(".ps1"),
|
| + FILE_PATH_LITERAL(".ps1xml"),
|
| + FILE_PATH_LITERAL(".ps2"),
|
| + FILE_PATH_LITERAL(".ps2xml"),
|
| + FILE_PATH_LITERAL(".psc1"),
|
| + FILE_PATH_LITERAL(".psc2"),
|
| + FILE_PATH_LITERAL(".scf"),
|
| + FILE_PATH_LITERAL(".sct"),
|
| + FILE_PATH_LITERAL(".wsf"),
|
| };
|
|
|
| -MaliciousExtensionType GetExtensionType(const base::FilePath& f) {
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".exe"))) return EXTENSION_EXE;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".msi"))) return EXTENSION_MSI;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".cab"))) return EXTENSION_CAB;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".sys"))) return EXTENSION_SYS;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".scr"))) return EXTENSION_SCR;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".drv"))) return EXTENSION_DRV;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".bat"))) return EXTENSION_BAT;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".zip"))) return EXTENSION_ZIP;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".rar"))) return EXTENSION_RAR;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".dll"))) return EXTENSION_DLL;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".pif"))) return EXTENSION_PIF;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".com"))) return EXTENSION_COM;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".jar"))) return EXTENSION_JAR;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".class"))) return EXTENSION_CLASS;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".pdf"))) return EXTENSION_PDF;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".vb"))) return EXTENSION_VB;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".reg"))) return EXTENSION_REG;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".grp"))) return EXTENSION_GRP;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".crx"))) return EXTENSION_CRX;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".apk"))) return EXTENSION_APK;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".dmg"))) return EXTENSION_DMG;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".pkg"))) return EXTENSION_PKG;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".torrent")))
|
| - return EXTENSION_TORRENT;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".website")))
|
| - return EXTENSION_WEBSITE;
|
| - if (f.MatchesExtension(FILE_PATH_LITERAL(".url"))) return EXTENSION_URL;
|
| - return EXTENSION_OTHER;
|
| -}
|
| +// UMA enumeration value for unrecognized file types. This is the array index of
|
| +// the "Other" bucket in kDangerousFileTypes.
|
| +const int EXTENSION_OTHER = 18;
|
|
|
| void RecordFileExtensionType(const base::FilePath& file) {
|
| + DCHECK_EQ(static_cast<base::FilePath::CharType*>(nullptr),
|
| + kDangerousFileTypes[EXTENSION_OTHER]);
|
| +
|
| + int extension_type = EXTENSION_OTHER;
|
| + for (const auto& extension : kDangerousFileTypes) {
|
| + if (extension && file.MatchesExtension(extension)) {
|
| + extension_type = &extension - kDangerousFileTypes;
|
| + break;
|
| + }
|
| + }
|
| +
|
| UMA_HISTOGRAM_ENUMERATION("SBClientDownload.DownloadExtensions",
|
| - GetExtensionType(file),
|
| - EXTENSION_MAX);
|
| + extension_type, arraysize(kDangerousFileTypes));
|
| }
|
|
|
| // Enumerate for histogramming purposes.
|
| @@ -627,6 +638,7 @@ class DownloadProtectionService::CheckClientDownloadRequest
|
| }
|
|
|
| const GURL& url = url_chain_.back();
|
| + // TODO(asanka): This may acquire a lock on the SB DB on the IO thread.
|
| if (url.is_valid() && database_manager_->MatchDownloadWhitelistUrl(url)) {
|
| DVLOG(2) << url << " is on the download whitelist.";
|
| RecordCountOfSignedOrWhitelistedDownload();
|
|
|