| 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/browser/safe_browsing/safe_browsing_database.h" | 5 #include "chrome/browser/safe_browsing/safe_browsing_database.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
| 12 #include "base/macros.h" |
| 12 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
| 13 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
| 14 #include "base/metrics/stats_counters.h" | 15 #include "base/metrics/stats_counters.h" |
| 15 #include "base/process/process_handle.h" | 16 #include "base/process/process_handle.h" |
| 16 #include "base/process/process_metrics.h" | 17 #include "base/process/process_metrics.h" |
| 17 #include "base/sha1.h" | 18 #include "base/sha1.h" |
| 18 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
| 20 #include "base/strings/string_util.h" |
| 19 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
| 20 #include "base/time/time.h" | 22 #include "base/time/time.h" |
| 21 #include "chrome/browser/safe_browsing/prefix_set.h" | 23 #include "chrome/browser/safe_browsing/prefix_set.h" |
| 22 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" | 24 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" |
| 23 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
| 24 #include "crypto/sha2.h" | 26 #include "crypto/sha2.h" |
| 25 #include "net/base/net_util.h" | 27 #include "net/base/net_util.h" |
| 26 #include "url/gurl.h" | 28 #include "url/gurl.h" |
| 27 | 29 |
| 28 #if defined(OS_MACOSX) | 30 #if defined(OS_MACOSX) |
| 29 #include "base/mac/mac_util.h" | 31 #include "base/mac/mac_util.h" |
| 30 #endif | 32 #endif |
| 31 | 33 |
| 32 using content::BrowserThread; | 34 using content::BrowserThread; |
| 33 using safe_browsing::PrefixSet; | 35 using safe_browsing::PrefixSet; |
| 34 using safe_browsing::PrefixSetBuilder; | 36 using safe_browsing::PrefixSetBuilder; |
| 35 | 37 |
| 36 namespace { | 38 namespace { |
| 37 | 39 |
| 38 // Filename suffix for the bloom filter. | 40 // Filename suffix for the bloom filter. |
| 39 const base::FilePath::CharType kBloomFilterFile[] = | 41 const base::FilePath::CharType kBloomFilterFileSuffix[] = |
| 40 FILE_PATH_LITERAL(" Filter 2"); | 42 FILE_PATH_LITERAL(" Filter 2"); |
| 41 // Filename suffix for the prefix set. | 43 // Filename suffix for the prefix set. |
| 42 const base::FilePath::CharType kPrefixSetFile[] = | 44 const base::FilePath::CharType kPrefixSetFileSuffix[] = |
| 43 FILE_PATH_LITERAL(" Prefix Set"); | 45 FILE_PATH_LITERAL(" Prefix Set"); |
| 44 // Filename suffix for download store. | 46 // Filename suffix for download store. |
| 45 const base::FilePath::CharType kDownloadDBFile[] = | 47 const base::FilePath::CharType kDownloadDBFile[] = |
| 46 FILE_PATH_LITERAL(" Download"); | 48 FILE_PATH_LITERAL(" Download"); |
| 47 // Filename suffix for client-side phishing detection whitelist store. | 49 // Filename suffix for client-side phishing detection whitelist store. |
| 48 const base::FilePath::CharType kCsdWhitelistDBFile[] = | 50 const base::FilePath::CharType kCsdWhitelistDBFile[] = |
| 49 FILE_PATH_LITERAL(" Csd Whitelist"); | 51 FILE_PATH_LITERAL(" Csd Whitelist"); |
| 50 // Filename suffix for the download whitelist store. | 52 // Filename suffix for the download whitelist store. |
| 51 const base::FilePath::CharType kDownloadWhitelistDBFile[] = | 53 const base::FilePath::CharType kDownloadWhitelistDBFile[] = |
| 52 FILE_PATH_LITERAL(" Download Whitelist"); | 54 FILE_PATH_LITERAL(" Download Whitelist"); |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 | 383 |
| 382 // static | 384 // static |
| 383 base::FilePath SafeBrowsingDatabase::DownloadDBFilename( | 385 base::FilePath SafeBrowsingDatabase::DownloadDBFilename( |
| 384 const base::FilePath& db_base_filename) { | 386 const base::FilePath& db_base_filename) { |
| 385 return base::FilePath(db_base_filename.value() + kDownloadDBFile); | 387 return base::FilePath(db_base_filename.value() + kDownloadDBFile); |
| 386 } | 388 } |
| 387 | 389 |
| 388 // static | 390 // static |
| 389 base::FilePath SafeBrowsingDatabase::BloomFilterForFilename( | 391 base::FilePath SafeBrowsingDatabase::BloomFilterForFilename( |
| 390 const base::FilePath& db_filename) { | 392 const base::FilePath& db_filename) { |
| 391 return base::FilePath(db_filename.value() + kBloomFilterFile); | 393 return base::FilePath(db_filename.value() + kBloomFilterFileSuffix); |
| 392 } | 394 } |
| 393 | 395 |
| 394 // static | 396 // static |
| 395 base::FilePath SafeBrowsingDatabase::PrefixSetForFilename( | 397 base::FilePath SafeBrowsingDatabase::PrefixSetForFilename( |
| 396 const base::FilePath& db_filename) { | 398 const base::FilePath& db_filename) { |
| 397 return base::FilePath(db_filename.value() + kPrefixSetFile); | 399 return base::FilePath(db_filename.value() + kPrefixSetFileSuffix); |
| 398 } | 400 } |
| 399 | 401 |
| 400 // static | 402 // static |
| 401 base::FilePath SafeBrowsingDatabase::CsdWhitelistDBFilename( | 403 base::FilePath SafeBrowsingDatabase::CsdWhitelistDBFilename( |
| 402 const base::FilePath& db_filename) { | 404 const base::FilePath& db_filename) { |
| 403 return base::FilePath(db_filename.value() + kCsdWhitelistDBFile); | 405 return base::FilePath(db_filename.value() + kCsdWhitelistDBFile); |
| 404 } | 406 } |
| 405 | 407 |
| 406 // static | 408 // static |
| 407 base::FilePath SafeBrowsingDatabase::DownloadWhitelistDBFilename( | 409 base::FilePath SafeBrowsingDatabase::DownloadWhitelistDBFilename( |
| (...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1343 if (side_effect_free_whitelist_store_) | 1345 if (side_effect_free_whitelist_store_) |
| 1344 side_effect_free_whitelist_store_->CancelUpdate(); | 1346 side_effect_free_whitelist_store_->CancelUpdate(); |
| 1345 if (ip_blacklist_store_) | 1347 if (ip_blacklist_store_) |
| 1346 ip_blacklist_store_->CancelUpdate(); | 1348 ip_blacklist_store_->CancelUpdate(); |
| 1347 if (unwanted_software_store_) | 1349 if (unwanted_software_store_) |
| 1348 unwanted_software_store_->CancelUpdate(); | 1350 unwanted_software_store_->CancelUpdate(); |
| 1349 return; | 1351 return; |
| 1350 } | 1352 } |
| 1351 | 1353 |
| 1352 if (download_store_) { | 1354 if (download_store_) { |
| 1353 int64 size_bytes = UpdateHashPrefixStore( | 1355 UpdateHashPrefixStore(DownloadDBFilename(filename_base_), |
| 1354 DownloadDBFilename(filename_base_), | 1356 download_store_.get(), |
| 1355 download_store_.get(), | 1357 FAILURE_DOWNLOAD_DATABASE_UPDATE_FINISH); |
| 1356 FAILURE_DOWNLOAD_DATABASE_UPDATE_FINISH); | |
| 1357 UMA_HISTOGRAM_COUNTS("SB2.DownloadDatabaseKilobytes", | |
| 1358 static_cast<int>(size_bytes / 1024)); | |
| 1359 } | 1358 } |
| 1360 | 1359 |
| 1361 UpdatePrefixSetUrlStore(BrowseDBFilename(filename_base_), | 1360 UpdatePrefixSetUrlStore(BrowseDBFilename(filename_base_), |
| 1362 browse_store_.get(), | 1361 browse_store_.get(), |
| 1363 PrefixSetId::BROWSE, | 1362 PrefixSetId::BROWSE, |
| 1364 FAILURE_BROWSE_DATABASE_UPDATE_FINISH, | 1363 FAILURE_BROWSE_DATABASE_UPDATE_FINISH, |
| 1365 FAILURE_BROWSE_PREFIX_SET_WRITE, | 1364 FAILURE_BROWSE_PREFIX_SET_WRITE, |
| 1366 true); | 1365 true); |
| 1367 | 1366 |
| 1368 UpdateWhitelistStore(CsdWhitelistDBFilename(filename_base_), | 1367 UpdateWhitelistStore(CsdWhitelistDBFilename(filename_base_), |
| 1369 csd_whitelist_store_.get(), | 1368 csd_whitelist_store_.get(), |
| 1370 SBWhitelistId::CSD); | 1369 SBWhitelistId::CSD); |
| 1371 UpdateWhitelistStore(DownloadWhitelistDBFilename(filename_base_), | 1370 UpdateWhitelistStore(DownloadWhitelistDBFilename(filename_base_), |
| 1372 download_whitelist_store_.get(), | 1371 download_whitelist_store_.get(), |
| 1373 SBWhitelistId::DOWNLOAD); | 1372 SBWhitelistId::DOWNLOAD); |
| 1374 | 1373 |
| 1375 if (extension_blacklist_store_) { | 1374 if (extension_blacklist_store_) { |
| 1376 int64 size_bytes = UpdateHashPrefixStore( | 1375 UpdateHashPrefixStore(ExtensionBlacklistDBFilename(filename_base_), |
| 1377 ExtensionBlacklistDBFilename(filename_base_), | 1376 extension_blacklist_store_.get(), |
| 1378 extension_blacklist_store_.get(), | 1377 FAILURE_EXTENSION_BLACKLIST_UPDATE_FINISH); |
| 1379 FAILURE_EXTENSION_BLACKLIST_UPDATE_FINISH); | |
| 1380 UMA_HISTOGRAM_COUNTS("SB2.ExtensionBlacklistKilobytes", | |
| 1381 static_cast<int>(size_bytes / 1024)); | |
| 1382 } | 1378 } |
| 1383 | 1379 |
| 1384 if (side_effect_free_whitelist_store_) { | 1380 if (side_effect_free_whitelist_store_) { |
| 1385 UpdatePrefixSetUrlStore(SideEffectFreeWhitelistDBFilename(filename_base_), | 1381 UpdatePrefixSetUrlStore(SideEffectFreeWhitelistDBFilename(filename_base_), |
| 1386 side_effect_free_whitelist_store_.get(), | 1382 side_effect_free_whitelist_store_.get(), |
| 1387 PrefixSetId::SIDE_EFFECT_FREE_WHITELIST, | 1383 PrefixSetId::SIDE_EFFECT_FREE_WHITELIST, |
| 1388 FAILURE_SIDE_EFFECT_FREE_WHITELIST_UPDATE_FINISH, | 1384 FAILURE_SIDE_EFFECT_FREE_WHITELIST_UPDATE_FINISH, |
| 1389 FAILURE_SIDE_EFFECT_FREE_WHITELIST_PREFIX_SET_WRITE, | 1385 FAILURE_SIDE_EFFECT_FREE_WHITELIST_PREFIX_SET_WRITE, |
| 1390 false); | 1386 false); |
| 1391 } | 1387 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1415 // Note: |builder| will not be empty. The current data store implementation | 1411 // Note: |builder| will not be empty. The current data store implementation |
| 1416 // stores all full-length hashes as both full and prefix hashes. | 1412 // stores all full-length hashes as both full and prefix hashes. |
| 1417 PrefixSetBuilder builder; | 1413 PrefixSetBuilder builder; |
| 1418 std::vector<SBAddFullHash> full_hashes; | 1414 std::vector<SBAddFullHash> full_hashes; |
| 1419 if (!store->FinishUpdate(&builder, &full_hashes)) { | 1415 if (!store->FinishUpdate(&builder, &full_hashes)) { |
| 1420 RecordFailure(FAILURE_WHITELIST_DATABASE_UPDATE_FINISH); | 1416 RecordFailure(FAILURE_WHITELIST_DATABASE_UPDATE_FINISH); |
| 1421 state_manager_.BeginWriteTransaction()->WhitelistEverything(whitelist_id); | 1417 state_manager_.BeginWriteTransaction()->WhitelistEverything(whitelist_id); |
| 1422 return; | 1418 return; |
| 1423 } | 1419 } |
| 1424 | 1420 |
| 1421 RecordFileSizeHistogram(store_filename); |
| 1422 |
| 1425 #if defined(OS_MACOSX) | 1423 #if defined(OS_MACOSX) |
| 1426 base::mac::SetFileBackupExclusion(store_filename); | 1424 base::mac::SetFileBackupExclusion(store_filename); |
| 1427 #endif | 1425 #endif |
| 1428 | 1426 |
| 1429 LoadWhitelist(full_hashes, whitelist_id); | 1427 LoadWhitelist(full_hashes, whitelist_id); |
| 1430 } | 1428 } |
| 1431 | 1429 |
| 1432 int64 SafeBrowsingDatabaseNew::UpdateHashPrefixStore( | 1430 void SafeBrowsingDatabaseNew::UpdateHashPrefixStore( |
| 1433 const base::FilePath& store_filename, | 1431 const base::FilePath& store_filename, |
| 1434 SafeBrowsingStore* store, | 1432 SafeBrowsingStore* store, |
| 1435 FailureType failure_type) { | 1433 FailureType failure_type) { |
| 1436 DCHECK(thread_checker_.CalledOnValidThread()); | 1434 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1437 | 1435 |
| 1438 // These results are not used after this call. Simply ignore the | 1436 // These results are not used after this call. Simply ignore the |
| 1439 // returned value after FinishUpdate(...). | 1437 // returned value after FinishUpdate(...). |
| 1440 PrefixSetBuilder builder; | 1438 PrefixSetBuilder builder; |
| 1441 std::vector<SBAddFullHash> add_full_hashes_result; | 1439 std::vector<SBAddFullHash> add_full_hashes_result; |
| 1442 | 1440 |
| 1443 if (!store->FinishUpdate(&builder, &add_full_hashes_result)) | 1441 if (!store->FinishUpdate(&builder, &add_full_hashes_result)) |
| 1444 RecordFailure(failure_type); | 1442 RecordFailure(failure_type); |
| 1445 | 1443 |
| 1444 RecordFileSizeHistogram(store_filename); |
| 1445 |
| 1446 #if defined(OS_MACOSX) | 1446 #if defined(OS_MACOSX) |
| 1447 base::mac::SetFileBackupExclusion(store_filename); | 1447 base::mac::SetFileBackupExclusion(store_filename); |
| 1448 #endif | 1448 #endif |
| 1449 | |
| 1450 return GetFileSizeOrZero(store_filename); | |
| 1451 } | 1449 } |
| 1452 | 1450 |
| 1453 void SafeBrowsingDatabaseNew::UpdatePrefixSetUrlStore( | 1451 void SafeBrowsingDatabaseNew::UpdatePrefixSetUrlStore( |
| 1454 const base::FilePath& db_filename, | 1452 const base::FilePath& db_filename, |
| 1455 SafeBrowsingStore* url_store, | 1453 SafeBrowsingStore* url_store, |
| 1456 PrefixSetId prefix_set_id, | 1454 PrefixSetId prefix_set_id, |
| 1457 FailureType finish_failure_type, | 1455 FailureType finish_failure_type, |
| 1458 FailureType write_failure_type, | 1456 FailureType write_failure_type, |
| 1459 bool store_full_hashes_in_prefix_set) { | 1457 bool store_full_hashes_in_prefix_set) { |
| 1460 DCHECK(thread_checker_.CalledOnValidThread()); | 1458 DCHECK(thread_checker_.CalledOnValidThread()); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1504 // here. | 1502 // here. |
| 1505 new_prefix_set = builder.GetPrefixSetNoHashes(); | 1503 new_prefix_set = builder.GetPrefixSetNoHashes(); |
| 1506 } | 1504 } |
| 1507 | 1505 |
| 1508 // Swap in the newly built filter. | 1506 // Swap in the newly built filter. |
| 1509 state_manager_.BeginWriteTransaction()->SwapPrefixSet(prefix_set_id, | 1507 state_manager_.BeginWriteTransaction()->SwapPrefixSet(prefix_set_id, |
| 1510 new_prefix_set.Pass()); | 1508 new_prefix_set.Pass()); |
| 1511 | 1509 |
| 1512 UMA_HISTOGRAM_LONG_TIMES("SB2.BuildFilter", base::TimeTicks::Now() - before); | 1510 UMA_HISTOGRAM_LONG_TIMES("SB2.BuildFilter", base::TimeTicks::Now() - before); |
| 1513 | 1511 |
| 1514 { | 1512 WritePrefixSet(db_filename, prefix_set_id, write_failure_type); |
| 1515 // Persist the prefix set to disk. Do not grab the lock to avoid contention | |
| 1516 // while writing to disk. This is safe as only this thread can ever modify | |
| 1517 // |state_manager_|'s prefix sets anyways. | |
| 1518 scoped_ptr<ReadTransaction> txn = | |
| 1519 state_manager_.BeginReadTransactionNoLockOnMainThread(); | |
| 1520 WritePrefixSet(db_filename, txn->GetPrefixSet(prefix_set_id), | |
| 1521 write_failure_type); | |
| 1522 } | |
| 1523 | 1513 |
| 1524 // Gather statistics. | 1514 // Gather statistics. |
| 1525 if (got_counters && metric->GetIOCounters(&io_after)) { | 1515 if (got_counters && metric->GetIOCounters(&io_after)) { |
| 1526 UMA_HISTOGRAM_COUNTS("SB2.BuildReadKilobytes", | 1516 UMA_HISTOGRAM_COUNTS("SB2.BuildReadKilobytes", |
| 1527 static_cast<int>(io_after.ReadTransferCount - | 1517 static_cast<int>(io_after.ReadTransferCount - |
| 1528 io_before.ReadTransferCount) / 1024); | 1518 io_before.ReadTransferCount) / 1024); |
| 1529 UMA_HISTOGRAM_COUNTS("SB2.BuildWriteKilobytes", | 1519 UMA_HISTOGRAM_COUNTS("SB2.BuildWriteKilobytes", |
| 1530 static_cast<int>(io_after.WriteTransferCount - | 1520 static_cast<int>(io_after.WriteTransferCount - |
| 1531 io_before.WriteTransferCount) / 1024); | 1521 io_before.WriteTransferCount) / 1024); |
| 1532 UMA_HISTOGRAM_COUNTS("SB2.BuildReadOperations", | 1522 UMA_HISTOGRAM_COUNTS("SB2.BuildReadOperations", |
| 1533 static_cast<int>(io_after.ReadOperationCount - | 1523 static_cast<int>(io_after.ReadOperationCount - |
| 1534 io_before.ReadOperationCount)); | 1524 io_before.ReadOperationCount)); |
| 1535 UMA_HISTOGRAM_COUNTS("SB2.BuildWriteOperations", | 1525 UMA_HISTOGRAM_COUNTS("SB2.BuildWriteOperations", |
| 1536 static_cast<int>(io_after.WriteOperationCount - | 1526 static_cast<int>(io_after.WriteOperationCount - |
| 1537 io_before.WriteOperationCount)); | 1527 io_before.WriteOperationCount)); |
| 1538 } | 1528 } |
| 1539 | 1529 |
| 1540 const int64 file_size = GetFileSizeOrZero(db_filename); | 1530 RecordFileSizeHistogram(db_filename); |
| 1541 UMA_HISTOGRAM_COUNTS("SB2.DatabaseKilobytes", | |
| 1542 static_cast<int>(file_size / 1024)); | |
| 1543 | 1531 |
| 1544 #if defined(OS_MACOSX) | 1532 #if defined(OS_MACOSX) |
| 1545 base::mac::SetFileBackupExclusion(db_filename); | 1533 base::mac::SetFileBackupExclusion(db_filename); |
| 1546 #endif | 1534 #endif |
| 1547 } | 1535 } |
| 1548 | 1536 |
| 1549 void SafeBrowsingDatabaseNew::UpdateIpBlacklistStore() { | 1537 void SafeBrowsingDatabaseNew::UpdateIpBlacklistStore() { |
| 1550 DCHECK(thread_checker_.CalledOnValidThread()); | 1538 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1551 | 1539 |
| 1552 // Note: prefixes will not be empty. The current data store implementation | 1540 // Note: prefixes will not be empty. The current data store implementation |
| 1553 // stores all full-length hashes as both full and prefix hashes. | 1541 // stores all full-length hashes as both full and prefix hashes. |
| 1554 PrefixSetBuilder builder; | 1542 PrefixSetBuilder builder; |
| 1555 std::vector<SBAddFullHash> full_hashes; | 1543 std::vector<SBAddFullHash> full_hashes; |
| 1556 if (!ip_blacklist_store_->FinishUpdate(&builder, &full_hashes)) { | 1544 if (!ip_blacklist_store_->FinishUpdate(&builder, &full_hashes)) { |
| 1557 RecordFailure(FAILURE_IP_BLACKLIST_UPDATE_FINISH); | 1545 RecordFailure(FAILURE_IP_BLACKLIST_UPDATE_FINISH); |
| 1558 LoadIpBlacklist(std::vector<SBAddFullHash>()); // Clear the list. | 1546 LoadIpBlacklist(std::vector<SBAddFullHash>()); // Clear the list. |
| 1559 return; | 1547 return; |
| 1560 } | 1548 } |
| 1561 | 1549 |
| 1550 const base::FilePath ip_blacklist_filename = |
| 1551 IpBlacklistDBFilename(filename_base_); |
| 1552 |
| 1553 RecordFileSizeHistogram(ip_blacklist_filename); |
| 1554 |
| 1562 #if defined(OS_MACOSX) | 1555 #if defined(OS_MACOSX) |
| 1563 base::mac::SetFileBackupExclusion(IpBlacklistDBFilename(filename_base_)); | 1556 base::mac::SetFileBackupExclusion(ip_blacklist_filename); |
| 1564 #endif | 1557 #endif |
| 1565 | 1558 |
| 1566 LoadIpBlacklist(full_hashes); | 1559 LoadIpBlacklist(full_hashes); |
| 1567 } | 1560 } |
| 1568 | 1561 |
| 1569 void SafeBrowsingDatabaseNew::HandleCorruptDatabase() { | 1562 void SafeBrowsingDatabaseNew::HandleCorruptDatabase() { |
| 1570 DCHECK(thread_checker_.CalledOnValidThread()); | 1563 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1571 | 1564 |
| 1572 // Reset the database after the current task has unwound (but only | 1565 // Reset the database after the current task has unwound (but only |
| 1573 // reset once within the scope of a given task). | 1566 // reset once within the scope of a given task). |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1696 | 1689 |
| 1697 const bool r11 = | 1690 const bool r11 = |
| 1698 base::DeleteFile(UnwantedSoftwareDBFilename(filename_base_), false); | 1691 base::DeleteFile(UnwantedSoftwareDBFilename(filename_base_), false); |
| 1699 if (!r11) | 1692 if (!r11) |
| 1700 RecordFailure(FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_DELETE); | 1693 RecordFailure(FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_DELETE); |
| 1701 | 1694 |
| 1702 return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10 && r11; | 1695 return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10 && r11; |
| 1703 } | 1696 } |
| 1704 | 1697 |
| 1705 void SafeBrowsingDatabaseNew::WritePrefixSet(const base::FilePath& db_filename, | 1698 void SafeBrowsingDatabaseNew::WritePrefixSet(const base::FilePath& db_filename, |
| 1706 const PrefixSet* prefix_set, | 1699 PrefixSetId prefix_set_id, |
| 1707 FailureType write_failure_type) { | 1700 FailureType write_failure_type) { |
| 1708 DCHECK(thread_checker_.CalledOnValidThread()); | 1701 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1709 | 1702 |
| 1703 // Do not grab the lock to avoid contention while writing to disk. This is |
| 1704 // safe as only this thread can ever modify |state_manager_|'s prefix sets |
| 1705 // anyways. |
| 1706 scoped_ptr<ReadTransaction> txn = |
| 1707 state_manager_.BeginReadTransactionNoLockOnMainThread(); |
| 1708 const PrefixSet* prefix_set = txn->GetPrefixSet(prefix_set_id); |
| 1709 |
| 1710 if (!prefix_set) | 1710 if (!prefix_set) |
| 1711 return; | 1711 return; |
| 1712 | 1712 |
| 1713 const base::FilePath prefix_set_filename = PrefixSetForFilename(db_filename); | 1713 const base::FilePath prefix_set_filename = PrefixSetForFilename(db_filename); |
| 1714 | 1714 |
| 1715 const base::TimeTicks before = base::TimeTicks::Now(); | 1715 const base::TimeTicks before = base::TimeTicks::Now(); |
| 1716 const bool write_ok = prefix_set->WriteFile(prefix_set_filename); | 1716 const bool write_ok = prefix_set->WriteFile(prefix_set_filename); |
| 1717 UMA_HISTOGRAM_TIMES("SB2.PrefixSetWrite", base::TimeTicks::Now() - before); | 1717 UMA_HISTOGRAM_TIMES("SB2.PrefixSetWrite", base::TimeTicks::Now() - before); |
| 1718 | 1718 |
| 1719 const int64 file_size = GetFileSizeOrZero(prefix_set_filename); | 1719 RecordFileSizeHistogram(prefix_set_filename); |
| 1720 UMA_HISTOGRAM_COUNTS("SB2.PrefixSetKilobytes", | |
| 1721 static_cast<int>(file_size / 1024)); | |
| 1722 | 1720 |
| 1723 if (!write_ok) | 1721 if (!write_ok) |
| 1724 RecordFailure(write_failure_type); | 1722 RecordFailure(write_failure_type); |
| 1725 | 1723 |
| 1726 #if defined(OS_MACOSX) | 1724 #if defined(OS_MACOSX) |
| 1727 base::mac::SetFileBackupExclusion(prefix_set_filename); | 1725 base::mac::SetFileBackupExclusion(prefix_set_filename); |
| 1728 #endif | 1726 #endif |
| 1729 } | 1727 } |
| 1730 | 1728 |
| 1731 void SafeBrowsingDatabaseNew::LoadWhitelist( | 1729 void SafeBrowsingDatabaseNew::LoadWhitelist( |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1807 bool SafeBrowsingDatabaseNew::IsCsdWhitelistKillSwitchOn() { | 1805 bool SafeBrowsingDatabaseNew::IsCsdWhitelistKillSwitchOn() { |
| 1808 return state_manager_.BeginReadTransaction() | 1806 return state_manager_.BeginReadTransaction() |
| 1809 ->GetSBWhitelist(SBWhitelistId::CSD) | 1807 ->GetSBWhitelist(SBWhitelistId::CSD) |
| 1810 ->second; | 1808 ->second; |
| 1811 } | 1809 } |
| 1812 | 1810 |
| 1813 SafeBrowsingDatabaseNew::PrefixGetHashCache* | 1811 SafeBrowsingDatabaseNew::PrefixGetHashCache* |
| 1814 SafeBrowsingDatabaseNew::GetUnsynchronizedPrefixGetHashCacheForTesting() { | 1812 SafeBrowsingDatabaseNew::GetUnsynchronizedPrefixGetHashCacheForTesting() { |
| 1815 return state_manager_.BeginReadTransaction()->prefix_gethash_cache(); | 1813 return state_manager_.BeginReadTransaction()->prefix_gethash_cache(); |
| 1816 } | 1814 } |
| 1815 |
| 1816 void SafeBrowsingDatabaseNew::RecordFileSizeHistogram( |
| 1817 const base::FilePath& file_path) { |
| 1818 const int64 file_size = GetFileSizeOrZero(file_path); |
| 1819 const int file_size_kilobytes = static_cast<int>(file_size / 1024); |
| 1820 |
| 1821 base::FilePath::StringType filename = file_path.BaseName().value(); |
| 1822 |
| 1823 // Default to logging DB sizes unless |file_path| points at PrefixSet storage. |
| 1824 std::string histogram_name("SB2.DatabaseKilobytes"); |
| 1825 if (EndsWith(filename, kPrefixSetFileSuffix, true)) { |
| 1826 histogram_name = "SB2.PrefixSetKilobytes"; |
| 1827 // Clear the PrefixSet suffix to have the histogram suffix selector below |
| 1828 // work the same for PrefixSet-based storage as it does for simple safe |
| 1829 // browsing stores. |
| 1830 // The size of the kPrefixSetFileSuffix is the size of its array minus 1 as |
| 1831 // the array includes the terminating '\0'. |
| 1832 const size_t kPrefixSetSuffixSize = arraysize(kPrefixSetFileSuffix) - 1; |
| 1833 filename.erase(filename.size() - kPrefixSetSuffixSize); |
| 1834 } |
| 1835 |
| 1836 // Changes to histogram suffixes below need to be mirrored in the |
| 1837 // SafeBrowsingLists suffix enum in histograms.xml. |
| 1838 if (EndsWith(filename, kBrowseDBFile, true)) |
| 1839 histogram_name.append(".Browse"); |
| 1840 else if (EndsWith(filename, kDownloadDBFile, true)) |
| 1841 histogram_name.append(".Download"); |
| 1842 else if (EndsWith(filename, kCsdWhitelistDBFile, true)) |
| 1843 histogram_name.append(".CsdWhitelist"); |
| 1844 else if (EndsWith(filename, kDownloadWhitelistDBFile, true)) |
| 1845 histogram_name.append(".DownloadWhitelist"); |
| 1846 else if (EndsWith(filename, kExtensionBlacklistDBFile, true)) |
| 1847 histogram_name.append(".ExtensionBlacklist"); |
| 1848 else if (EndsWith(filename, kSideEffectFreeWhitelistDBFile, true)) |
| 1849 histogram_name.append(".SideEffectFreeWhitelist"); |
| 1850 else if (EndsWith(filename, kIPBlacklistDBFile, true)) |
| 1851 histogram_name.append(".IPBlacklist"); |
| 1852 else if (EndsWith(filename, kUnwantedSoftwareDBFile, true)) |
| 1853 histogram_name.append(".UnwantedSoftware"); |
| 1854 else |
| 1855 NOTREACHED(); // Add support for new lists above. |
| 1856 |
| 1857 // Histogram properties as in UMA_HISTOGRAM_COUNTS macro. |
| 1858 base::HistogramBase* histogram_pointer = base::Histogram::FactoryGet( |
| 1859 histogram_name, 1, 1000000, 50, |
| 1860 base::HistogramBase::kUmaTargetedHistogramFlag); |
| 1861 |
| 1862 histogram_pointer->Add(file_size_kilobytes); |
| 1863 } |
| OLD | NEW |