Chromium Code Reviews| Index: chrome/browser/safe_browsing/download_protection_service.cc |
| =================================================================== |
| --- chrome/browser/safe_browsing/download_protection_service.cc (revision 106177) |
| +++ chrome/browser/safe_browsing/download_protection_service.cc (working copy) |
| @@ -8,7 +8,9 @@ |
| #include "base/memory/scoped_ptr.h" |
| #include "base/metrics/histogram.h" |
| #include "base/stl_util.h" |
| +#include "base/string_util.h" |
| #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| +#include "chrome/browser/safe_browsing/signature_util.h" |
| #include "chrome/common/net/http_return.h" |
| #include "chrome/common/safe_browsing/csd.pb.h" |
| #include "content/browser/browser_thread.h" |
| @@ -21,13 +23,22 @@ |
| const char DownloadProtectionService::kDownloadRequestUrl[] = |
| "https://sb-ssl.google.com/safebrowsing/clientreport/download"; |
| +namespace { |
| +bool IsBinaryFile(const FilePath& file) { |
|
mattm
2011/10/19 18:54:12
"Binary" doesn't seem like quite the right term..
Brian Ryner
2011/10/19 19:20:11
I could use "executable" if you think that's bette
|
| + FilePath::StringType extension = file.Extension(); |
|
noelutz
2011/10/19 16:12:49
Maybe wrap this in StringToLowerASCII to make sure
Brian Ryner
2011/10/19 18:06:59
I ended up replacing this with calls to FilePath::
|
| + return (EndsWith(extension, FILE_PATH_LITERAL("exe"), false) || |
| + EndsWith(extension, FILE_PATH_LITERAL("cab"), false) || |
| + EndsWith(extension, FILE_PATH_LITERAL("msi"), false)); |
| +} |
| +} // namespace |
| + |
| DownloadProtectionService::DownloadInfo::DownloadInfo() |
| : total_bytes(0), user_initiated(false) {} |
| DownloadProtectionService::DownloadInfo::~DownloadInfo() {} |
| DownloadProtectionService::DownloadProtectionService( |
| - SafeBrowsingService* sb_service, |
| + const base::WeakPtr<SafeBrowsingService>& sb_service, |
|
mattm
2011/10/19 18:54:12
Hmm, still not sure about these WeakPtr's but I'm
Brian Ryner
2011/10/19 19:20:11
Hm, good point. Maybe we need to AddRef the SafeB
|
| net::URLRequestContextGetter* request_context_getter) |
| : sb_service_(sb_service), |
| request_context_getter_(request_context_getter), |
| @@ -120,6 +131,34 @@ |
| RecordStats(REASON_INVALID_URL); |
| return true; // For now we only support HTTP download URLs. |
| } |
| + |
| + if (!IsBinaryFile(info.local_file)) { |
| + RecordStats(REASON_NOT_BINARY_FILE); |
| + return true; |
| + } |
| + |
| + // Compute features from the file contents. Note that we record histograms |
| + // based on the result, so this runs regardless of whether the pingbacks are |
| + // enabled. Since we do blocking I/O, this happens on the file thread. |
| + BrowserThread::PostTask( |
| + BrowserThread::FILE, |
| + FROM_HERE, |
| + base::Bind(&DownloadProtectionService::ExtractFileFeatures, |
| + this, info, callback)); |
| + return false; |
| +} |
| + |
| +void DownloadProtectionService::ExtractFileFeatures( |
| + const DownloadInfo& info, |
| + const CheckDownloadCallback& callback) { |
| + if (safe_browsing::signature_util::IsSigned(info.local_file)) { |
| + VLOG(2) << "Downloaded a signed binary: " << info.local_file.value(); |
| + UMA_HISTOGRAM_COUNTS("SBClientDownload.SignedBinaryDownload", 1); |
|
mattm
2011/10/19 18:54:12
Could use UMA_HISTOGRAM_BOOLEAN to get them both i
Brian Ryner
2011/10/19 19:20:11
Done.
|
| + } else { |
| + VLOG(2) << "Downloaded an unsigned binary: " << info.local_file.value(); |
| + UMA_HISTOGRAM_COUNTS("SBClientDownload.UnsignedBinaryDownload", 1); |
| + } |
| + |
| // TODO(noelutz): DownloadInfo should also contain the IP address of every |
| // URL in the redirect chain. We also should check whether the download URL |
| // is hosted on the internal network. |
| @@ -128,7 +167,6 @@ |
| FROM_HERE, |
| base::Bind(&DownloadProtectionService::StartCheckClientDownload, |
| this, info, callback)); |
| - return false; |
| } |
| void DownloadProtectionService::StartCheckClientDownload( |