| 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 #include "remoting/protocol/jingle_stream_connector.h" | 5 #include "remoting/protocol/jingle_stream_connector.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "jingle/glue/channel_socket_adapter.h" | 8 #include "jingle/glue/channel_socket_adapter.h" |
| 9 #include "jingle/glue/pseudotcp_adapter.h" | 9 #include "jingle/glue/pseudotcp_adapter.h" |
| 10 #include "net/base/cert_status_flags.h" | 10 #include "net/base/cert_status_flags.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 JingleStreamConnector::JingleStreamConnector( | 65 JingleStreamConnector::JingleStreamConnector( |
| 66 JingleSession* session, | 66 JingleSession* session, |
| 67 const std::string& name, | 67 const std::string& name, |
| 68 const Session::StreamChannelCallback& callback) | 68 const Session::StreamChannelCallback& callback) |
| 69 : session_(session), | 69 : session_(session), |
| 70 name_(name), | 70 name_(name), |
| 71 callback_(callback), | 71 callback_(callback), |
| 72 initiator_(false), | 72 initiator_(false), |
| 73 local_private_key_(NULL), | 73 local_private_key_(NULL), |
| 74 raw_channel_(NULL), | 74 raw_channel_(NULL), |
| 75 ssl_client_socket_(NULL), | |
| 76 ssl_server_socket_(NULL), | |
| 77 ALLOW_THIS_IN_INITIALIZER_LIST(tcp_connect_callback_( | 75 ALLOW_THIS_IN_INITIALIZER_LIST(tcp_connect_callback_( |
| 78 this, &JingleStreamConnector::OnTCPConnect)), | 76 this, &JingleStreamConnector::OnTCPConnect)), |
| 79 ALLOW_THIS_IN_INITIALIZER_LIST(ssl_connect_callback_( | 77 ALLOW_THIS_IN_INITIALIZER_LIST(ssl_connect_callback_( |
| 80 this, &JingleStreamConnector::OnSSLConnect)) { | 78 this, &JingleStreamConnector::OnSSLConnect)) { |
| 81 } | 79 } |
| 82 | 80 |
| 83 JingleStreamConnector::~JingleStreamConnector() { | 81 JingleStreamConnector::~JingleStreamConnector() { |
| 84 } | 82 } |
| 85 | 83 |
| 86 void JingleStreamConnector::Connect(bool initiator, | 84 void JingleStreamConnector::Connect(bool initiator, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 115 // error. | 113 // error. |
| 116 | 114 |
| 117 // Set options for the TCP layer. | 115 // Set options for the TCP layer. |
| 118 jingle_glue::PseudoTcpAdapter* adapter = | 116 jingle_glue::PseudoTcpAdapter* adapter = |
| 119 new jingle_glue::PseudoTcpAdapter(socket); | 117 new jingle_glue::PseudoTcpAdapter(socket); |
| 120 adapter->SetAckDelay(kTcpAckDelayMilliseconds); | 118 adapter->SetAckDelay(kTcpAckDelayMilliseconds); |
| 121 adapter->SetNoDelay(true); | 119 adapter->SetNoDelay(true); |
| 122 adapter->SetReceiveBufferSize(kTcpReceiveBufferSize); | 120 adapter->SetReceiveBufferSize(kTcpReceiveBufferSize); |
| 123 adapter->SetSendBufferSize(kTcpSendBufferSize); | 121 adapter->SetSendBufferSize(kTcpSendBufferSize); |
| 124 | 122 |
| 125 socket_.reset(adapter); | 123 tcp_socket_.reset(adapter); |
| 126 int result = socket_->Connect(&tcp_connect_callback_); | 124 int result = tcp_socket_->Connect(&tcp_connect_callback_); |
| 127 if (result == net::ERR_IO_PENDING) { | 125 if (result == net::ERR_IO_PENDING) { |
| 128 return true; | 126 return true; |
| 129 } else if (result == net::OK) { | 127 } else if (result == net::OK) { |
| 130 tcp_connect_callback_.Run(result); | 128 tcp_connect_callback_.Run(result); |
| 131 return true; | 129 return true; |
| 132 } | 130 } |
| 133 | 131 |
| 134 return false; | 132 return false; |
| 135 } | 133 } |
| 136 | 134 |
| 137 bool JingleStreamConnector::EstablishSSLConnection() { | 135 bool JingleStreamConnector::EstablishSSLConnection() { |
| 138 DCHECK(socket_->IsConnected()); | 136 DCHECK(tcp_socket_->IsConnected()); |
| 139 | 137 |
| 140 int result; | 138 int result; |
| 141 if (initiator_) { | 139 if (initiator_) { |
| 142 cert_verifier_.reset(new net::CertVerifier()); | 140 cert_verifier_.reset(new net::CertVerifier()); |
| 143 | 141 |
| 144 // Create client SSL socket. | 142 // Create client SSL socket. |
| 145 ssl_client_socket_ = CreateSSLClientSocket( | 143 net::SSLClientSocket* socket = CreateSSLClientSocket( |
| 146 socket_.release(), remote_cert_, cert_verifier_.get()); | 144 tcp_socket_.release(), remote_cert_, cert_verifier_.get()); |
| 147 socket_.reset(ssl_client_socket_); | 145 socket_.reset(socket); |
| 148 | 146 |
| 149 result = ssl_client_socket_->Connect(&ssl_connect_callback_); | 147 result = socket->Connect(&ssl_connect_callback_); |
| 150 } else { | 148 } else { |
| 151 scoped_refptr<net::X509Certificate> cert = | 149 scoped_refptr<net::X509Certificate> cert = |
| 152 net::X509Certificate::CreateFromBytes( | 150 net::X509Certificate::CreateFromBytes( |
| 153 local_cert_.data(), local_cert_.length()); | 151 local_cert_.data(), local_cert_.length()); |
| 154 if (!cert) { | 152 if (!cert) { |
| 155 LOG(ERROR) << "Failed to parse X509Certificate"; | 153 LOG(ERROR) << "Failed to parse X509Certificate"; |
| 156 return false; | 154 return false; |
| 157 } | 155 } |
| 158 | 156 |
| 159 // Create server SSL socket. | 157 // Create server SSL socket. |
| 160 net::SSLConfig ssl_config; | 158 net::SSLConfig ssl_config; |
| 161 ssl_server_socket_ = net::CreateSSLServerSocket( | 159 net::SSLServerSocket* socket = net::CreateSSLServerSocket( |
| 162 socket_.release(), cert, local_private_key_, ssl_config); | 160 tcp_socket_.release(), cert, local_private_key_, ssl_config); |
| 163 socket_.reset(ssl_server_socket_); | 161 socket_.reset(socket); |
| 164 | 162 |
| 165 result = ssl_server_socket_->Handshake(&ssl_connect_callback_); | 163 result = socket->Handshake(&ssl_connect_callback_); |
| 166 } | 164 } |
| 167 | 165 |
| 168 if (result == net::ERR_IO_PENDING) { | 166 if (result == net::ERR_IO_PENDING) { |
| 169 return true; | 167 return true; |
| 170 } else if (result != net::OK) { | 168 } else if (result != net::OK) { |
| 171 LOG(ERROR) << "Failed to establish SSL connection"; | 169 LOG(ERROR) << "Failed to establish SSL connection"; |
| 172 return false; | 170 return false; |
| 173 } | 171 } |
| 174 | 172 |
| 175 // Reach here if net::OK is received. | 173 // Reach here if net::OK is received. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 198 NotifyError(); | 196 NotifyError(); |
| 199 return; | 197 return; |
| 200 } | 198 } |
| 201 | 199 |
| 202 DCHECK(socket_->IsConnected()); | 200 DCHECK(socket_->IsConnected()); |
| 203 AuthenticateChannel(); | 201 AuthenticateChannel(); |
| 204 } | 202 } |
| 205 | 203 |
| 206 void JingleStreamConnector::AuthenticateChannel() { | 204 void JingleStreamConnector::AuthenticateChannel() { |
| 207 if (initiator_) { | 205 if (initiator_) { |
| 208 authenticator_.reset(new ClientChannelAuthenticator(ssl_client_socket_)); | 206 authenticator_.reset( |
| 207 new ClientChannelAuthenticator(session_->shared_secret())); |
| 209 } else { | 208 } else { |
| 210 authenticator_.reset(new HostChannelAuthenticator(ssl_server_socket_)); | 209 authenticator_.reset( |
| 210 new HostChannelAuthenticator(session_->shared_secret())); |
| 211 } | 211 } |
| 212 | 212 authenticator_->Authenticate(socket_.get(), base::Bind( |
| 213 authenticator_->Authenticate( | 213 &JingleStreamConnector::OnAuthenticationDone, base::Unretained(this))); |
| 214 session_->shared_secret(), | |
| 215 base::Bind(&JingleStreamConnector::OnAuthenticationDone, | |
| 216 base::Unretained(this))); | |
| 217 } | 214 } |
| 218 | 215 |
| 219 void JingleStreamConnector::OnAuthenticationDone( | 216 void JingleStreamConnector::OnAuthenticationDone( |
| 220 ChannelAuthenticator::Result result) { | 217 ChannelAuthenticator::Result result) { |
| 221 switch (result) { | 218 switch (result) { |
| 222 case ChannelAuthenticator::SUCCESS: | 219 case ChannelAuthenticator::SUCCESS: |
| 223 NotifyDone(socket_.release()); | 220 NotifyDone(socket_.release()); |
| 224 break; | 221 break; |
| 225 | 222 |
| 226 case ChannelAuthenticator::FAILURE: | 223 case ChannelAuthenticator::FAILURE: |
| 227 NotifyError(); | 224 NotifyError(); |
| 228 break; | 225 break; |
| 229 } | 226 } |
| 230 } | 227 } |
| 231 | 228 |
| 232 void JingleStreamConnector::NotifyDone(net::StreamSocket* socket) { | 229 void JingleStreamConnector::NotifyDone(net::StreamSocket* socket) { |
| 233 session_->OnChannelConnectorFinished(name_, this); | 230 session_->OnChannelConnectorFinished(name_, this); |
| 234 callback_.Run(socket); | 231 callback_.Run(socket); |
| 235 delete this; | 232 delete this; |
| 236 } | 233 } |
| 237 | 234 |
| 238 void JingleStreamConnector::NotifyError() { | 235 void JingleStreamConnector::NotifyError() { |
| 239 socket_.reset(); | 236 socket_.reset(); |
| 240 NotifyDone(NULL); | 237 NotifyDone(NULL); |
| 241 } | 238 } |
| 242 | 239 |
| 243 } // namespace protocol | 240 } // namespace protocol |
| 244 } // namespace remoting | 241 } // namespace remoting |
| OLD | NEW |