Index: net/socket/ssl_client_socket_nss.cc |
=================================================================== |
--- net/socket/ssl_client_socket_nss.cc (revision 142108) |
+++ net/socket/ssl_client_socket_nss.cc (working copy) |
@@ -382,11 +382,16 @@ |
CERT_DestroyCertificate(certs[i]); |
} |
+// Helper functions to make it possible to log events from within the |
+// SSLClientSocketNSS::Core. |
+void AddLogEvent(BoundNetLog* net_log, NetLog::EventType event_type) { |
+ if (!net_log) |
+ return; |
+ net_log->AddEvent(event_type); |
+} |
+ |
// Helper function to make it possible to log events from within the |
-// SSLClientSocketNSS::Core. Can't use Bind with BoundNetLog::AddEntry directly |
-// on Windows because it is overloaded. |
-// TODO(mmenke): Other than shutdown, NetLog is threadsafe. Figure out if this |
-// is needed. |
+// SSLClientSocketNSS::Core. |
void AddLogEventWithCallback(BoundNetLog* net_log, |
NetLog::EventType event_type, |
const NetLog::ParametersCallback& callback) { |
@@ -395,18 +400,6 @@ |
net_log->AddEvent(event_type, callback); |
} |
-// Helper functions to make it possible to log events from within the |
-// SSLClientSocketNSS::Core. Can't use Bind with BoundNetLog::AddEntry directly |
-// on Windows because it is overloaded. |
-// TODO(mmenke): This function is deprecated, delete it. |
-void AddLogEvent(BoundNetLog* net_log, |
- NetLog::EventType event_type, |
- const scoped_refptr<NetLog::EventParameters>& event_params) { |
- if (!net_log) |
- return; |
- net_log->AddEvent(event_type, event_params); |
-} |
- |
// Helper function to make it easier to call BoundNetLog::AddByteTransferEvent |
// from within the SSLClientSocketNSS::Core. |
// AddByteTransferEvent expects to receive a const char*, which within the |
@@ -911,6 +904,10 @@ |
void PostOrRunCallback(const tracked_objects::Location& location, |
const base::Closure& callback); |
+ // Uses PostOrRunCallback and |weak_net_log_| to try and log a |
+ // SSL_CLIENT_CERT_PROVIDED event, with the indicated count. |
+ void AddCertProvidedEvent(int cert_count); |
+ |
//////////////////////////////////////////////////////////////////////////// |
// Members that are ONLY accessed on the network task runner: |
//////////////////////////////////////////////////////////////////////////// |
@@ -1318,8 +1315,7 @@ |
core->PostOrRunCallback( |
FROM_HERE, |
base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED, |
- scoped_refptr<NetLog::EventParameters>())); |
+ NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED)); |
const SECItem* cert_types = SSL_GetRequestedClientCertificateTypes(socket); |
@@ -1362,12 +1358,7 @@ |
if (!user_cert) { |
// Importing the certificate can fail for reasons including a serial |
// number collision. See crbug.com/97355. |
- core->PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", 0)))); |
+ core->AddCertProvidedEvent(0); |
return SECFailure; |
} |
CERTCertList* cert_chain = CERT_NewCertList(); |
@@ -1385,12 +1376,7 @@ |
db_handle, &der_cert, NULL, PR_FALSE, PR_TRUE); |
if (!intermediate) { |
CERT_DestroyCertList(cert_chain); |
- core->PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", 0)))); |
+ core->AddCertProvidedEvent(0); |
return SECFailure; |
} |
CERT_AddCertToListTail(cert_chain, intermediate); |
@@ -1408,25 +1394,14 @@ |
*result_certs = cert_chain; |
int cert_count = 1 + intermediates.size(); |
- core->PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", |
- cert_count)))); |
+ core->AddCertProvidedEvent(cert_count); |
return SECSuccess; |
} |
LOG(WARNING) << "Client cert found without private key"; |
} |
// Send no client certificate. |
- core->PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", 0)))); |
+ core->AddCertProvidedEvent(0); |
return SECFailure; |
} |
@@ -1443,12 +1418,7 @@ |
if (!my_cert_store) { |
PLOG(ERROR) << "Could not open the \"MY\" system certificate store"; |
- core->PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", 0)))); |
+ core->AddCertProvidedEvent(0); |
return SECFailure; |
} |
@@ -1588,13 +1558,7 @@ |
cert_count = CFArrayGetCount(chain); |
CFRelease(chain); |
} |
- core->PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", |
- cert_count)))); |
+ core->AddCertProvidedEvent(cert_count); |
return SECSuccess; |
} |
OSSTATUS_LOG(WARNING, os_error) |
@@ -1612,12 +1576,7 @@ |
} |
// Send no client certificate. |
- core->PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", 0)))); |
+ core->AddCertProvidedEvent(0); |
return SECFailure; |
} |
@@ -1670,8 +1629,7 @@ |
core->PostOrRunCallback( |
FROM_HERE, |
base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED, |
- scoped_refptr<NetLog::EventParameters>())); |
+ NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED)); |
const SECItem* cert_types = SSL_GetRequestedClientCertificateTypes(socket); |
@@ -1699,24 +1657,14 @@ |
*result_private_key = privkey; |
// A cert_count of -1 means the number of certificates is unknown. |
// NSS will construct the certificate chain. |
- core->PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", -1)))); |
+ core->AddCertProvidedEvent(-1); |
return SECSuccess; |
} |
LOG(WARNING) << "Client cert found without private key"; |
} |
// Send no client certificate. |
- core->PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, core->weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", 0)))); |
+ core->AddCertProvidedEvent(0); |
return SECFailure; |
} |
@@ -1964,9 +1912,9 @@ |
int rv = ERR_UNEXPECTED; |
PostOrRunCallback( |
FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
+ base::Bind(&AddLogEventWithCallback, weak_net_log_, |
NetLog::TYPE_SSL_READ_ERROR, |
- make_scoped_refptr(new SSLErrorParams(rv, 0)))); |
+ CreateNetLogSSLErrorCallback(rv, 0))); |
return rv; |
} |
@@ -1993,9 +1941,9 @@ |
int rv = ERR_UNEXPECTED; |
PostOrRunCallback( |
FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
+ base::Bind(&AddLogEventWithCallback, weak_net_log_, |
NetLog::TYPE_SSL_READ_ERROR, |
- make_scoped_refptr(new SSLErrorParams(rv, 0)))); |
+ CreateNetLogSSLErrorCallback(rv, 0))); |
return rv; |
} |
@@ -2028,9 +1976,9 @@ |
net_error = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; |
PostOrRunCallback( |
FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
+ base::Bind(&AddLogEventWithCallback, weak_net_log_, |
NetLog::TYPE_SSL_HANDSHAKE_ERROR, |
- make_scoped_refptr(new SSLErrorParams(net_error, 0)))); |
+ CreateNetLogSSLErrorCallback(net_error, 0))); |
// If the handshake already succeeded (because the server requests but |
// doesn't require a client cert), we need to invalidate the SSL session |
@@ -2048,10 +1996,9 @@ |
net_error = ERR_SSL_PROTOCOL_ERROR; |
PostOrRunCallback( |
FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
+ base::Bind(&AddLogEventWithCallback, weak_net_log_, |
NetLog::TYPE_SSL_HANDSHAKE_ERROR, |
- make_scoped_refptr( |
- new SSLErrorParams(net_error, 0)))); |
+ CreateNetLogSSLErrorCallback(net_error, 0))); |
} else { |
#if defined(SSL_ENABLE_OCSP_STAPLING) |
// TODO(agl): figure out how to plumb an OCSP response into the Mac |
@@ -2126,10 +2073,9 @@ |
} else { |
PostOrRunCallback( |
FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
+ base::Bind(&AddLogEventWithCallback, weak_net_log_, |
NetLog::TYPE_SSL_HANDSHAKE_ERROR, |
- make_scoped_refptr( |
- new SSLErrorParams(net_error, prerr)))); |
+ CreateNetLogSSLErrorCallback(net_error, prerr))); |
} |
} |
@@ -2165,13 +2111,7 @@ |
CERTCertificateList* cert_chain = |
CERT_CertChainFromCert(cert, certUsageSSLClient, PR_FALSE); |
- PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", |
- cert_chain->len)))); |
+ AddCertProvidedEvent(cert_chain->len); |
rv = SSL_RestartHandshakeAfterCertReq(nss_fd_, cert, key, cert_chain); |
if (rv != SECSuccess) |
@@ -2193,9 +2133,9 @@ |
rv = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; |
PostOrRunCallback( |
FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
+ base::Bind(&AddLogEventWithCallback, weak_net_log_, |
NetLog::TYPE_SSL_READ_ERROR, |
- make_scoped_refptr(new SSLErrorParams(rv, 0)))); |
+ CreateNetLogSSLErrorCallback(rv, 0))); |
return rv; |
} |
if (rv >= 0) { |
@@ -2213,9 +2153,9 @@ |
rv = HandleNSSError(prerr, false); |
PostOrRunCallback( |
FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
+ base::Bind(&AddLogEventWithCallback, weak_net_log_, |
NetLog::TYPE_SSL_READ_ERROR, |
- make_scoped_refptr(new SSLErrorParams(rv, prerr)))); |
+ CreateNetLogSSLErrorCallback(rv, prerr))); |
return rv; |
} |
@@ -2240,9 +2180,9 @@ |
rv = HandleNSSError(prerr, false); |
PostOrRunCallback( |
FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
+ base::Bind(&AddLogEventWithCallback, weak_net_log_, |
NetLog::TYPE_SSL_WRITE_ERROR, |
- make_scoped_refptr(new SSLErrorParams(rv, prerr)))); |
+ CreateNetLogSSLErrorCallback(rv, prerr))); |
return rv; |
} |
@@ -2486,13 +2426,7 @@ |
} |
int cert_count = (rv == SECSuccess) ? 1 : 0; |
- PostOrRunCallback( |
- FROM_HERE, |
- base::Bind(&AddLogEvent, weak_net_log_, |
- NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
- make_scoped_refptr( |
- new NetLogIntegerParameter("cert_count", |
- cert_count)))); |
+ AddCertProvidedEvent(cert_count); |
return rv; |
} |
@@ -2697,7 +2631,7 @@ |
if (detached_) |
return ERR_FAILED; |
- weak_net_log_->BeginEvent(NetLog::TYPE_SSL_GET_DOMAIN_BOUND_CERT, NULL); |
+ weak_net_log_->BeginEvent(NetLog::TYPE_SSL_GET_DOMAIN_BOUND_CERT); |
int rv = server_bound_cert_service_->GetDomainBoundCert( |
origin, |
@@ -2810,6 +2744,14 @@ |
task.Run(); |
} |
+void SSLClientSocketNSS::Core::AddCertProvidedEvent(int cert_count) { |
+ PostOrRunCallback( |
+ FROM_HERE, |
+ base::Bind(&AddLogEventWithCallback, weak_net_log_, |
+ NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
+ NetLog::IntegerCallback("cert_count", cert_count))); |
+} |
+ |
SSLClientSocketNSS::SSLClientSocketNSS( |
base::SingleThreadTaskRunner* nss_task_runner, |
ClientSocketHandle* transport_socket, |
@@ -2942,7 +2884,7 @@ |
EnsureThreadIdAssigned(); |
- net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
+ net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT); |
int rv = Init(); |
if (rv != OK) { |
@@ -3529,7 +3471,7 @@ |
// server then it will have optimistically started a verification of that |
// chain. So, if the prediction was correct, we should wait for that |
// verification to finish rather than start our own. |
- net_log_.AddEvent(NetLog::TYPE_SSL_VERIFICATION_MERGED, NULL); |
+ net_log_.AddEvent(NetLog::TYPE_SSL_VERIFICATION_MERGED); |
UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 1 /* true */, 2); |
base::TimeTicks end_time = ssl_host_info_->verification_end_time(); |
if (end_time.is_null()) |