summaryrefslogtreecommitdiffstats
path: root/net/socket
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-13 17:20:18 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-13 17:20:18 +0000
commitc940d37d3a861790ab8aece6ba5df75a65d60427 (patch)
tree03f3dea92ecf9f27e16c9450b40c3e850bd2352e /net/socket
parent7ec9b3d8a08c1127d82b605f5159d0a4c1a3e02b (diff)
downloadchromium_src-c940d37d3a861790ab8aece6ba5df75a65d60427.zip
chromium_src-c940d37d3a861790ab8aece6ba5df75a65d60427.tar.gz
chromium_src-c940d37d3a861790ab8aece6ba5df75a65d60427.tar.bz2
Fix a problem that cert trust change needs a chrome restart to be effective.
This seems to be caused by CertVerifier's verification result cache. - Added a new OnCertTrustChanged to CertDatabase::Observer; - For NSS cert database, SetCertTrust triggers OnCertTrustChanged; - Clear CertVerifier's result cache when OnCertDatabaseChanged is fired; BUG=chromium-os:7988 TEST=Verify #2 issue in chromium-os:7988 where cert trust change only takes effect after chrome restart. Review URL: http://codereview.chromium.org/6816035 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81433 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket')
-rw-r--r--net/socket/client_socket_factory.cc11
-rw-r--r--net/socket/client_socket_pool_manager.cc16
-rw-r--r--net/socket/client_socket_pool_manager.h3
3 files changed, 26 insertions, 4 deletions
diff --git a/net/socket/client_socket_factory.cc b/net/socket/client_socket_factory.cc
index 1f8a76c..966dc69 100644
--- a/net/socket/client_socket_factory.cc
+++ b/net/socket/client_socket_factory.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 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.
@@ -41,7 +41,14 @@ class DefaultClientSocketFactory : public ClientSocketFactory,
CertDatabase::RemoveObserver(this);
}
- virtual void OnUserCertAdded(X509Certificate* cert) {
+ virtual void OnUserCertAdded(const X509Certificate* cert) {
+ ClearSSLSessionCache();
+ }
+
+ virtual void OnCertTrustChanged(const X509Certificate* cert) {
+ // Per wtc, we actually only need to flush when trust is reduced.
+ // Always flush now because OnCertTrustChanged does not tell us this.
+ // See comments in ClientSocketPoolManager::OnCertTrustChanged.
ClearSSLSessionCache();
}
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
index d9a2225..de29bd5 100644
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -580,7 +580,21 @@ Value* ClientSocketPoolManager::SocketPoolInfoToValue() const {
return list;
}
-void ClientSocketPoolManager::OnUserCertAdded(X509Certificate* cert) {
+void ClientSocketPoolManager::OnUserCertAdded(const X509Certificate* cert) {
+ FlushSocketPools();
+}
+
+void ClientSocketPoolManager::OnCertTrustChanged(const X509Certificate* cert) {
+ // We should flush the socket pools if we removed trust from a
+ // cert, because a previously trusted server may have become
+ // untrusted.
+ //
+ // We should not flush the socket pools if we added trust to a
+ // cert.
+ //
+ // Since the OnCertTrustChanged method doesn't tell us what
+ // kind of trust change it is, we have to flush the socket
+ // pools to be safe.
FlushSocketPools();
}
diff --git a/net/socket/client_socket_pool_manager.h b/net/socket/client_socket_pool_manager.h
index ca580e4..54b13f7 100644
--- a/net/socket/client_socket_pool_manager.h
+++ b/net/socket/client_socket_pool_manager.h
@@ -150,7 +150,8 @@ class ClientSocketPoolManager : public base::NonThreadSafe,
Value* SocketPoolInfoToValue() const;
// CertDatabase::Observer methods:
- virtual void OnUserCertAdded(X509Certificate* cert);
+ virtual void OnUserCertAdded(const X509Certificate* cert);
+ virtual void OnCertTrustChanged(const X509Certificate* cert);
private:
friend class HttpNetworkSessionPeer;