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 |