1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/hashed_ad_network_database.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <algorithm> // std::binary_search 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector> 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/basictypes.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/logging.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/macros.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/stl_util.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/activity_log/hashed_ad_networks.h" 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "crypto/sha2.h" 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "url/gurl.h" 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace extensions { 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef char shorthash[8]; 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool CompareEntries(const char* entry1, const char* entry2) { 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return strcmp(entry1, entry2) < 0; 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)HashedAdNetworkDatabase::HashedAdNetworkDatabase() 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : entries_(kHashedAdNetworks), 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_entries_(kNumHashedAdNetworks) { 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)HashedAdNetworkDatabase::~HashedAdNetworkDatabase() { 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool HashedAdNetworkDatabase::IsAdNetwork(const GURL& url) const { 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The list should be sorted. Check once in debug builds. 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if DCHECK_IS_ON 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool is_sorted = false; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!is_sorted) { 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> list; 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (int i = 0; i < num_entries_; ++i) 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) list.push_back(std::string(entries_[i])); 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_sorted = base::STLIsSorted(list); 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(is_sorted); 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) shorthash hash; 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) crypto::SHA256HashString(url.host(), hash, sizeof(shorthash)); 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string hex_encoded = base::HexEncode(hash, sizeof(shorthash)); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return std::binary_search(entries_, 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) entries_ + num_entries_, 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) hex_encoded.c_str(), 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CompareEntries); 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace extensions 62