Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived | 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived |
| 6 // from AuthCertificateCallback() in | 6 // from AuthCertificateCallback() in |
| 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. | 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. |
| 8 | 8 |
| 9 /* ***** BEGIN LICENSE BLOCK ***** | 9 /* ***** BEGIN LICENSE BLOCK ***** |
| 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 439 transport_send_busy_(false), | 439 transport_send_busy_(false), |
| 440 transport_recv_busy_(false), | 440 transport_recv_busy_(false), |
| 441 corked_(false), | 441 corked_(false), |
| 442 ALLOW_THIS_IN_INITIALIZER_LIST(handshake_io_callback_( | 442 ALLOW_THIS_IN_INITIALIZER_LIST(handshake_io_callback_( |
| 443 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete, | 443 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete, |
| 444 base::Unretained(this)))), | 444 base::Unretained(this)))), |
| 445 transport_(transport_socket), | 445 transport_(transport_socket), |
| 446 host_and_port_(host_and_port), | 446 host_and_port_(host_and_port), |
| 447 ssl_config_(ssl_config), | 447 ssl_config_(ssl_config), |
| 448 old_user_connect_callback_(NULL), | 448 old_user_connect_callback_(NULL), |
| 449 user_read_callback_(NULL), | 449 old_user_read_callback_(NULL), |
| 450 user_write_callback_(NULL), | 450 user_write_callback_(NULL), |
| 451 user_read_buf_len_(0), | 451 user_read_buf_len_(0), |
| 452 user_write_buf_len_(0), | 452 user_write_buf_len_(0), |
| 453 server_cert_nss_(NULL), | 453 server_cert_nss_(NULL), |
| 454 server_cert_verify_result_(NULL), | 454 server_cert_verify_result_(NULL), |
| 455 ssl_connection_status_(0), | 455 ssl_connection_status_(0), |
| 456 client_auth_cert_needed_(false), | 456 client_auth_cert_needed_(false), |
| 457 cert_verifier_(context.cert_verifier), | 457 cert_verifier_(context.cert_verifier), |
| 458 ob_cert_xtn_negotiated_(false), | 458 ob_cert_xtn_negotiated_(false), |
| 459 origin_bound_cert_service_(context.origin_bound_cert_service), | 459 origin_bound_cert_service_(context.origin_bound_cert_service), |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 560 SSLClientSocket::NextProtoStatus | 560 SSLClientSocket::NextProtoStatus |
| 561 SSLClientSocketNSS::GetNextProto(std::string* proto) { | 561 SSLClientSocketNSS::GetNextProto(std::string* proto) { |
| 562 *proto = next_proto_; | 562 *proto = next_proto_; |
| 563 return next_proto_status_; | 563 return next_proto_status_; |
| 564 } | 564 } |
| 565 | 565 |
| 566 int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) { | 566 int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) { |
| 567 EnterFunction(""); | 567 EnterFunction(""); |
| 568 DCHECK(transport_.get()); | 568 DCHECK(transport_.get()); |
| 569 DCHECK(next_handshake_state_ == STATE_NONE); | 569 DCHECK(next_handshake_state_ == STATE_NONE); |
| 570 DCHECK(!user_read_callback_); | 570 DCHECK(!old_user_read_callback_); |
|
csilv
2011/12/07 00:03:48
this should probably also check user_read_callback
James Hawkins
2011/12/07 00:19:37
Done.
| |
| 571 DCHECK(!user_write_callback_); | 571 DCHECK(!user_write_callback_); |
| 572 DCHECK(!old_user_connect_callback_); | 572 DCHECK(!old_user_connect_callback_); |
|
csilv
2011/12/07 00:03:48
this should probably also check user_connect_callb
James Hawkins
2011/12/07 00:19:37
Done.
| |
| 573 DCHECK(!user_read_buf_); | 573 DCHECK(!user_read_buf_); |
| 574 DCHECK(!user_write_buf_); | 574 DCHECK(!user_write_buf_); |
| 575 | 575 |
| 576 EnsureThreadIdAssigned(); | 576 EnsureThreadIdAssigned(); |
| 577 | 577 |
| 578 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 578 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 579 | 579 |
| 580 int rv = Init(); | 580 int rv = Init(); |
| 581 if (rv != OK) { | 581 if (rv != OK) { |
| 582 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 582 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 608 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 608 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| 609 } | 609 } |
| 610 | 610 |
| 611 LeaveFunction(""); | 611 LeaveFunction(""); |
| 612 return rv > OK ? OK : rv; | 612 return rv > OK ? OK : rv; |
| 613 } | 613 } |
| 614 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { | 614 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { |
| 615 EnterFunction(""); | 615 EnterFunction(""); |
| 616 DCHECK(transport_.get()); | 616 DCHECK(transport_.get()); |
| 617 DCHECK(next_handshake_state_ == STATE_NONE); | 617 DCHECK(next_handshake_state_ == STATE_NONE); |
| 618 DCHECK(!user_read_callback_); | 618 DCHECK(!old_user_read_callback_); |
|
csilv
2011/12/07 00:03:48
this should probably also check user_read_callback
James Hawkins
2011/12/07 00:19:37
Done.
| |
| 619 DCHECK(!user_write_callback_); | 619 DCHECK(!user_write_callback_); |
| 620 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 620 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); |
| 621 DCHECK(!user_read_buf_); | 621 DCHECK(!user_read_buf_); |
| 622 DCHECK(!user_write_buf_); | 622 DCHECK(!user_write_buf_); |
| 623 | 623 |
| 624 EnsureThreadIdAssigned(); | 624 EnsureThreadIdAssigned(); |
| 625 | 625 |
| 626 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 626 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 627 | 627 |
| 628 int rv = Init(); | 628 int rv = Init(); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 679 if (nss_fd_ != NULL) { | 679 if (nss_fd_ != NULL) { |
| 680 PR_Close(nss_fd_); | 680 PR_Close(nss_fd_); |
| 681 nss_fd_ = NULL; | 681 nss_fd_ = NULL; |
| 682 } | 682 } |
| 683 | 683 |
| 684 // Reset object state | 684 // Reset object state |
| 685 transport_send_busy_ = false; | 685 transport_send_busy_ = false; |
| 686 transport_recv_busy_ = false; | 686 transport_recv_busy_ = false; |
| 687 old_user_connect_callback_ = NULL; | 687 old_user_connect_callback_ = NULL; |
| 688 user_connect_callback_.Reset(); | 688 user_connect_callback_.Reset(); |
| 689 user_read_callback_ = NULL; | 689 old_user_read_callback_ = NULL; |
| 690 user_read_callback_.Reset(); | |
| 690 user_write_callback_ = NULL; | 691 user_write_callback_ = NULL; |
| 691 user_read_buf_ = NULL; | 692 user_read_buf_ = NULL; |
| 692 user_read_buf_len_ = 0; | 693 user_read_buf_len_ = 0; |
| 693 user_write_buf_ = NULL; | 694 user_write_buf_ = NULL; |
| 694 user_write_buf_len_ = 0; | 695 user_write_buf_len_ = 0; |
| 695 server_cert_ = NULL; | 696 server_cert_ = NULL; |
| 696 if (server_cert_nss_) { | 697 if (server_cert_nss_) { |
| 697 CERT_DestroyCertificate(server_cert_nss_); | 698 CERT_DestroyCertificate(server_cert_nss_); |
| 698 server_cert_nss_ = NULL; | 699 server_cert_nss_ = NULL; |
| 699 } | 700 } |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 799 } | 800 } |
| 800 NOTREACHED(); | 801 NOTREACHED(); |
| 801 return base::TimeDelta::FromMicroseconds(-1); | 802 return base::TimeDelta::FromMicroseconds(-1); |
| 802 } | 803 } |
| 803 | 804 |
| 804 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, | 805 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, |
| 805 OldCompletionCallback* callback) { | 806 OldCompletionCallback* callback) { |
| 806 EnterFunction(buf_len); | 807 EnterFunction(buf_len); |
| 807 DCHECK(completed_handshake_); | 808 DCHECK(completed_handshake_); |
| 808 DCHECK(next_handshake_state_ == STATE_NONE); | 809 DCHECK(next_handshake_state_ == STATE_NONE); |
| 809 DCHECK(!user_read_callback_); | 810 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); |
| 810 DCHECK(!old_user_connect_callback_); | 811 DCHECK(!old_user_connect_callback_); |
|
csilv
2011/12/07 00:03:48
this should probabably also check user_connect_cal
James Hawkins
2011/12/07 00:19:37
Done.
| |
| 811 DCHECK(!user_read_buf_); | 812 DCHECK(!user_read_buf_); |
| 812 DCHECK(nss_bufs_); | 813 DCHECK(nss_bufs_); |
| 814 | |
| 815 user_read_buf_ = buf; | |
| 816 user_read_buf_len_ = buf_len; | |
| 817 | |
| 818 int rv = DoReadLoop(OK); | |
| 819 | |
| 820 if (rv == ERR_IO_PENDING) { | |
| 821 old_user_read_callback_ = callback; | |
| 822 } else { | |
| 823 user_read_buf_ = NULL; | |
| 824 user_read_buf_len_ = 0; | |
| 825 } | |
| 826 LeaveFunction(rv); | |
| 827 return rv; | |
| 828 } | |
| 829 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, | |
| 830 const CompletionCallback& callback) { | |
| 831 EnterFunction(buf_len); | |
| 832 DCHECK(completed_handshake_); | |
| 833 DCHECK(next_handshake_state_ == STATE_NONE); | |
| 834 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | |
| 835 DCHECK(!old_user_connect_callback_); | |
|
csilv
2011/12/07 00:03:48
this should probabably also check user_connect_cal
James Hawkins
2011/12/07 00:19:37
Done.
| |
| 836 DCHECK(!user_read_buf_); | |
| 837 DCHECK(nss_bufs_); | |
| 813 | 838 |
| 814 user_read_buf_ = buf; | 839 user_read_buf_ = buf; |
| 815 user_read_buf_len_ = buf_len; | 840 user_read_buf_len_ = buf_len; |
| 816 | 841 |
| 817 int rv = DoReadLoop(OK); | 842 int rv = DoReadLoop(OK); |
| 818 | 843 |
| 819 if (rv == ERR_IO_PENDING) { | 844 if (rv == ERR_IO_PENDING) { |
| 820 user_read_callback_ = callback; | 845 user_read_callback_ = callback; |
| 821 } else { | 846 } else { |
| 822 user_read_buf_ = NULL; | 847 user_read_buf_ = NULL; |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1184 } | 1209 } |
| 1185 #endif | 1210 #endif |
| 1186 | 1211 |
| 1187 if (ssl_config_.ssl3_fallback) | 1212 if (ssl_config_.ssl3_fallback) |
| 1188 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK; | 1213 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK; |
| 1189 } | 1214 } |
| 1190 | 1215 |
| 1191 void SSLClientSocketNSS::DoReadCallback(int rv) { | 1216 void SSLClientSocketNSS::DoReadCallback(int rv) { |
| 1192 EnterFunction(rv); | 1217 EnterFunction(rv); |
| 1193 DCHECK(rv != ERR_IO_PENDING); | 1218 DCHECK(rv != ERR_IO_PENDING); |
| 1194 DCHECK(user_read_callback_); | 1219 DCHECK(old_user_read_callback_ || user_read_callback_.is_null()); |
| 1195 | 1220 |
| 1196 // Since Run may result in Read being called, clear |user_read_callback_| | 1221 // Since Run may result in Read being called, clear |old_user_read_callback_| |
| 1197 // up front. | 1222 // up front. |
| 1198 OldCompletionCallback* c = user_read_callback_; | 1223 if (old_user_read_callback_) { |
| 1199 user_read_callback_ = NULL; | 1224 OldCompletionCallback* c = old_user_read_callback_; |
| 1200 user_read_buf_ = NULL; | 1225 old_user_read_callback_ = NULL; |
| 1201 user_read_buf_len_ = 0; | 1226 user_read_buf_ = NULL; |
| 1202 c->Run(rv); | 1227 user_read_buf_len_ = 0; |
| 1228 c->Run(rv); | |
| 1229 } else { | |
| 1230 CompletionCallback c = user_read_callback_; | |
| 1231 user_read_callback_.Reset(); | |
| 1232 user_read_buf_ = NULL; | |
| 1233 user_read_buf_len_ = 0; | |
| 1234 c.Run(rv); | |
| 1235 } | |
| 1203 LeaveFunction(""); | 1236 LeaveFunction(""); |
| 1204 } | 1237 } |
| 1205 | 1238 |
| 1206 void SSLClientSocketNSS::DoWriteCallback(int rv) { | 1239 void SSLClientSocketNSS::DoWriteCallback(int rv) { |
| 1207 EnterFunction(rv); | 1240 EnterFunction(rv); |
| 1208 DCHECK(rv != ERR_IO_PENDING); | 1241 DCHECK(rv != ERR_IO_PENDING); |
| 1209 DCHECK(user_write_callback_); | 1242 DCHECK(user_write_callback_); |
| 1210 | 1243 |
| 1211 // Since Run may result in Write being called, clear |user_write_callback_| | 1244 // Since Run may result in Write being called, clear |user_write_callback_| |
| 1212 // up front. | 1245 // up front. |
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1820 // http://crbug.com/15630 for more info. | 1853 // http://crbug.com/15630 for more info. |
| 1821 | 1854 |
| 1822 // TODO(hclam): Skip logging if server cert was expected to be bad because | 1855 // TODO(hclam): Skip logging if server cert was expected to be bad because |
| 1823 // |server_cert_verify_results_| doesn't contain all the information about | 1856 // |server_cert_verify_results_| doesn't contain all the information about |
| 1824 // the cert. | 1857 // the cert. |
| 1825 if (result == OK) | 1858 if (result == OK) |
| 1826 LogConnectionTypeMetrics(); | 1859 LogConnectionTypeMetrics(); |
| 1827 | 1860 |
| 1828 completed_handshake_ = true; | 1861 completed_handshake_ = true; |
| 1829 | 1862 |
| 1830 if (user_read_callback_) { | 1863 if (old_user_read_callback_ || !user_read_callback_.is_null()) { |
| 1831 int rv = DoReadLoop(OK); | 1864 int rv = DoReadLoop(OK); |
| 1832 if (rv != ERR_IO_PENDING) | 1865 if (rv != ERR_IO_PENDING) |
| 1833 DoReadCallback(rv); | 1866 DoReadCallback(rv); |
| 1834 } | 1867 } |
| 1835 | 1868 |
| 1836 // Exit DoHandshakeLoop and return the result to the caller to Connect. | 1869 // Exit DoHandshakeLoop and return the result to the caller to Connect. |
| 1837 DCHECK(next_handshake_state_ == STATE_NONE); | 1870 DCHECK(next_handshake_state_ == STATE_NONE); |
| 1838 return result; | 1871 return result; |
| 1839 } | 1872 } |
| 1840 | 1873 |
| (...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2673 valid_thread_id_ = base::PlatformThread::CurrentId(); | 2706 valid_thread_id_ = base::PlatformThread::CurrentId(); |
| 2674 } | 2707 } |
| 2675 | 2708 |
| 2676 bool SSLClientSocketNSS::CalledOnValidThread() const { | 2709 bool SSLClientSocketNSS::CalledOnValidThread() const { |
| 2677 EnsureThreadIdAssigned(); | 2710 EnsureThreadIdAssigned(); |
| 2678 base::AutoLock auto_lock(lock_); | 2711 base::AutoLock auto_lock(lock_); |
| 2679 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 2712 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
| 2680 } | 2713 } |
| 2681 | 2714 |
| 2682 } // namespace net | 2715 } // namespace net |
| OLD | NEW |