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