safe_browsing_database.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/safe_browsing/safe_browsing_database.h" 6 7#include "base/file_util.h" 8#include "base/histogram.h" 9#include "chrome/browser/safe_browsing/bloom_filter.h" 10#include "chrome/browser/safe_browsing/safe_browsing_database_bloom.h" 11 12using base::TimeTicks; 13 14// Filename suffix for the bloom filter. 15static const FilePath::CharType kBloomFilterFile[] = 16 FILE_PATH_LITERAL(" Filter 2"); 17 18// Factory method. 19SafeBrowsingDatabase* SafeBrowsingDatabase::Create() { 20 return new SafeBrowsingDatabaseBloom; 21} 22 23SafeBrowsingDatabase::~SafeBrowsingDatabase() { 24} 25 26// static 27FilePath SafeBrowsingDatabase::BloomFilterFilename( 28 const FilePath& db_filename) { 29 return FilePath(db_filename.value() + kBloomFilterFile); 30} 31 32void SafeBrowsingDatabase::LoadBloomFilter() { 33 DCHECK(!bloom_filter_filename_.empty()); 34 35 // If we're missing either of the database or filter files, we wait until the 36 // next update to generate a new filter. 37 // TODO(paulg): Investigate how often the filter file is missing and how 38 // expensive it would be to regenerate it. 39 int64 size_64; 40 if (!file_util::GetFileSize(filename_, &size_64) || size_64 == 0) 41 return; 42 43 if (!file_util::GetFileSize(bloom_filter_filename_, &size_64) || 44 size_64 == 0) { 45 UMA_HISTOGRAM_COUNTS("SB2.FilterMissing", 1); 46 return; 47 } 48 49 // We have a bloom filter file, so use that as our filter. 50 TimeTicks before = TimeTicks::Now(); 51 bloom_filter_ = BloomFilter::LoadFile(bloom_filter_filename_); 52 SB_DLOG(INFO) << "SafeBrowsingDatabase read bloom filter in " 53 << (TimeTicks::Now() - before).InMilliseconds() << " ms"; 54 55 if (!bloom_filter_.get()) 56 UMA_HISTOGRAM_COUNTS("SB2.FilterReadFail", 1); 57} 58 59void SafeBrowsingDatabase::DeleteBloomFilter() { 60 file_util::Delete(bloom_filter_filename_, false); 61} 62 63void SafeBrowsingDatabase::WriteBloomFilter() { 64 if (!bloom_filter_.get()) 65 return; 66 67 TimeTicks before = TimeTicks::Now(); 68 bool write_ok = bloom_filter_->WriteFile(bloom_filter_filename_); 69 SB_DLOG(INFO) << "SafeBrowsingDatabase wrote bloom filter in " << 70 (TimeTicks::Now() - before).InMilliseconds() << " ms"; 71 72 if (!write_ok) 73 UMA_HISTOGRAM_COUNTS("SB2.FilterWriteFail", 1); 74} 75