blob: 338209502944d0da2ee45540dc55dc5b71889910 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/certificate_transparency/sth_distributor.h"
#include "base/metrics/histogram_macros.h"
#include "base/time/time.h"
#include "net/cert/signed_tree_head.h"
namespace {
const uint8_t kPilotLogID[] = {0xa4, 0xb9, 0x09, 0x90, 0xb4, 0x18, 0x58, 0x14,
0x87, 0xbb, 0x13, 0xa2, 0xcc, 0x67, 0x70, 0x0a,
0x3c, 0x35, 0x98, 0x04, 0xf9, 0x1b, 0xdf, 0xb8,
0xe3, 0x77, 0xcd, 0x0e, 0xc8, 0x0d, 0xdc, 0x10};
}
namespace certificate_transparency {
STHDistributor::STHDistributor()
: observer_list_(base::ObserverListPolicy::EXISTING_ONLY) {}
STHDistributor::~STHDistributor() = default;
void STHDistributor::NewSTHObserved(const net::ct::SignedTreeHead& sth) {
auto it = std::find_if(observed_sths_.begin(), observed_sths_.end(),
[&sth](const net::ct::SignedTreeHead& other) {
return sth.log_id == other.log_id;
});
if (it == observed_sths_.end())
observed_sths_.push_back(sth);
else
*it = sth;
for (auto& observer : observer_list_)
observer.NewSTHObserved(sth);
if (sth.log_id.compare(0, sth.log_id.size(),
reinterpret_cast<const char*>(kPilotLogID),
sizeof(kPilotLogID)) != 0)
return;
const base::TimeDelta sth_age = base::Time::Now() - sth.timestamp;
UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertificateTransparency.PilotSTHAge", sth_age,
base::TimeDelta::FromHours(1),
base::TimeDelta::FromDays(4), 100);
}
void STHDistributor::RegisterObserver(STHObserver* observer) {
observer_list_.AddObserver(observer);
// Make a local copy, because notifying the |observer| of a
// new STH may result in this class being notified of a
// (different) new STH, thus invalidating the iterator.
std::vector<net::ct::SignedTreeHead> local_sths(observed_sths_);
for (const auto& sth : local_sths)
observer->NewSTHObserved(sth);
}
void STHDistributor::UnregisterObserver(STHObserver* observer) {
observer_list_.RemoveObserver(observer);
}
} // namespace certificate_transparency