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 |