Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Unified Diff: chromeos/network/client_cert_resolver.cc

Issue 1443043002: Execute ClientCertResolver on network disconnection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changed SimpleTestClock ownership Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chromeos/network/client_cert_resolver.h ('k') | chromeos/network/client_cert_resolver_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chromeos/network/client_cert_resolver.cc
diff --git a/chromeos/network/client_cert_resolver.cc b/chromeos/network/client_cert_resolver.cc
index a0545c989c141b191b67b0961f1728d4393de354..3d438d8843c018caac5ec1a9018a0ce0ec639532 100644
--- a/chromeos/network/client_cert_resolver.cc
+++ b/chromeos/network/client_cert_resolver.cc
@@ -16,6 +16,7 @@
#include "base/stl_util.h"
#include "base/task_runner.h"
#include "base/threading/worker_pool.h"
+#include "base/time/clock.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/shill_service_client.h"
#include "chromeos/network/managed_network_configuration_handler.h"
@@ -62,7 +63,8 @@ bool ContainsValue(const std::vector<T>& vector, const T& value) {
// Returns true if a private key for certificate |cert| is installed.
bool HasPrivateKey(const net::X509Certificate& cert) {
- PK11SlotInfo* slot = PK11_KeyForCertExists(cert.os_cert_handle(), NULL, NULL);
+ PK11SlotInfo* slot =
+ PK11_KeyForCertExists(cert.os_cert_handle(), nullptr, nullptr);
if (!slot)
return false;
@@ -156,14 +158,15 @@ std::string GetPEMEncodedIssuer(const net::X509Certificate& cert) {
}
std::vector<CertAndIssuer> CreateSortedCertAndIssuerList(
- const net::CertificateList& certs) {
+ const net::CertificateList& certs,
+ base::Time now) {
// Filter all client certs and determines each certificate's issuer, which is
// required for the pattern matching.
std::vector<CertAndIssuer> client_certs;
for (net::CertificateList::const_iterator it = certs.begin();
it != certs.end(); ++it) {
const net::X509Certificate& cert = **it;
- if (cert.valid_expiry().is_null() || cert.HasExpired() ||
+ if (cert.valid_expiry().is_null() || now > cert.valid_expiry() ||
!HasPrivateKey(cert) ||
!CertLoader::IsCertificateHardwareBacked(&cert)) {
continue;
@@ -180,8 +183,10 @@ std::vector<CertAndIssuer> CreateSortedCertAndIssuerList(
// be run on a worker thread.
void FindCertificateMatches(const net::CertificateList& certs,
std::vector<NetworkAndCertPattern>* networks,
+ base::Time now,
NetworkCertMatches* matches) {
- std::vector<CertAndIssuer> client_certs(CreateSortedCertAndIssuerList(certs));
+ std::vector<CertAndIssuer> client_certs(
+ CreateSortedCertAndIssuerList(certs, now));
for (std::vector<NetworkAndCertPattern>::const_iterator it =
networks->begin();
@@ -236,10 +241,10 @@ bool ClientCertificatesLoaded() {
ClientCertResolver::ClientCertResolver()
: resolve_task_running_(false),
network_properties_changed_(false),
- network_state_handler_(NULL),
- managed_network_config_handler_(NULL),
- weak_ptr_factory_(this) {
-}
+ network_state_handler_(nullptr),
+ managed_network_config_handler_(nullptr),
+ testing_clock_(nullptr),
+ weak_ptr_factory_(this) {}
ClientCertResolver::~ClientCertResolver() {
if (network_state_handler_)
@@ -287,8 +292,8 @@ bool ClientCertResolver::ResolveCertificatePatternSync(
const CertificatePattern& pattern,
base::DictionaryValue* shill_properties) {
// Prepare and sort the list of known client certs.
- std::vector<CertAndIssuer> client_certs(
- CreateSortedCertAndIssuerList(CertLoader::Get()->cert_list()));
+ std::vector<CertAndIssuer> client_certs(CreateSortedCertAndIssuerList(
+ CertLoader::Get()->cert_list(), base::Time::Now()));
// Search for a certificate matching the pattern.
std::vector<CertAndIssuer>::iterator cert_it = std::find_if(
@@ -314,6 +319,10 @@ bool ClientCertResolver::ResolveCertificatePatternSync(
return true;
}
+void ClientCertResolver::SetClockForTesting(base::Clock* clock) {
+ testing_clock_ = clock;
+}
+
void ClientCertResolver::NetworkListChanged() {
VLOG(2) << "NetworkListChanged.";
if (!ClientCertificatesLoaded())
@@ -346,6 +355,14 @@ void ClientCertResolver::NetworkListChanged() {
ResolveNetworks(networks_to_check);
}
+void ClientCertResolver::NetworkConnectionStateChanged(
+ const NetworkState* network) {
+ if (!ClientCertificatesLoaded())
+ return;
+ if (!network->IsConnectedState() && !network->IsConnectingState())
+ ResolveNetworks(NetworkStateHandler::NetworkStateList(1, network));
+}
+
void ClientCertResolver::OnCertificatesLoaded(
const net::CertificateList& cert_list,
bool initial_load) {
@@ -448,13 +465,10 @@ void ClientCertResolver::ResolveNetworks(
NetworkCertMatches* matches = new NetworkCertMatches;
task_runner->PostTaskAndReply(
FROM_HERE,
- base::Bind(&FindCertificateMatches,
- CertLoader::Get()->cert_list(),
- base::Owned(networks_to_resolve.release()),
- matches),
+ base::Bind(&FindCertificateMatches, CertLoader::Get()->cert_list(),
+ base::Owned(networks_to_resolve.release()), Now(), matches),
base::Bind(&ClientCertResolver::ConfigureCertificates,
- weak_ptr_factory_.GetWeakPtr(),
- base::Owned(matches)));
+ weak_ptr_factory_.GetWeakPtr(), base::Owned(matches)));
}
void ClientCertResolver::ResolvePendingNetworks() {
@@ -512,4 +526,10 @@ void ClientCertResolver::NotifyResolveRequestCompleted() {
FOR_EACH_OBSERVER(Observer, observers_, ResolveRequestCompleted(changed));
}
+base::Time ClientCertResolver::Now() const {
+ if (testing_clock_)
+ return testing_clock_->Now();
+ return base::Time::Now();
+}
+
} // namespace chromeos
« no previous file with comments | « chromeos/network/client_cert_resolver.h ('k') | chromeos/network/client_cert_resolver_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698