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_session.h" | 5 #include "remoting/protocol/jingle_session.h" |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
9 #include "crypto/hmac.h" | 9 #include "crypto/hmac.h" |
10 #include "crypto/rsa_private_key.h" | 10 #include "crypto/rsa_private_key.h" |
11 #include "jingle/glue/channel_socket_adapter.h" | 11 #include "jingle/glue/channel_socket_adapter.h" |
12 #include "jingle/glue/pseudotcp_adapter.h" | 12 #include "jingle/glue/pseudotcp_adapter.h" |
13 #include "net/base/cert_status_flags.h" | 13 #include "net/base/cert_status_flags.h" |
14 #include "net/base/cert_verifier.h" | 14 #include "net/base/cert_verifier.h" |
15 #include "net/base/host_port_pair.h" | 15 #include "net/base/host_port_pair.h" |
16 #include "net/base/net_errors.h" | 16 #include "net/base/net_errors.h" |
17 #include "net/base/ssl_config_service.h" | 17 #include "net/base/ssl_config_service.h" |
18 #include "net/base/x509_certificate.h" | 18 #include "net/base/x509_certificate.h" |
19 #include "net/socket/client_socket_factory.h" | 19 #include "net/socket/client_socket_factory.h" |
20 #include "net/socket/ssl_client_socket.h" | 20 #include "net/socket/ssl_client_socket.h" |
21 #include "net/socket/ssl_server_socket.h" | 21 #include "net/socket/ssl_server_socket.h" |
22 #include "remoting/base/constants.h" | 22 #include "remoting/base/constants.h" |
23 #include "remoting/protocol/jingle_session_manager.h" | 23 #include "remoting/protocol/jingle_session_manager.h" |
24 #include "remoting/protocol/socket_wrapper.h" | |
25 #include "third_party/libjingle/source/talk/base/thread.h" | 24 #include "third_party/libjingle/source/talk/base/thread.h" |
26 #include "third_party/libjingle/source/talk/p2p/base/session.h" | 25 #include "third_party/libjingle/source/talk/p2p/base/session.h" |
27 #include "third_party/libjingle/source/talk/p2p/base/p2ptransportchannel.h" | 26 #include "third_party/libjingle/source/talk/p2p/base/p2ptransportchannel.h" |
28 | 27 |
29 using cricket::BaseSession; | 28 using cricket::BaseSession; |
30 | 29 |
31 namespace remoting { | 30 namespace remoting { |
32 | 31 |
33 namespace protocol { | 32 namespace protocol { |
34 | 33 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 DCHECK(CalledOnValidThread()); | 180 DCHECK(CalledOnValidThread()); |
182 return EncryptMasterKey(peer_public_key_, master_key_); | 181 return EncryptMasterKey(peer_public_key_, master_key_); |
183 } | 182 } |
184 | 183 |
185 void JingleSession::CloseInternal(int result, bool failed) { | 184 void JingleSession::CloseInternal(int result, bool failed) { |
186 DCHECK(CalledOnValidThread()); | 185 DCHECK(CalledOnValidThread()); |
187 | 186 |
188 if (!closed_ && !closing_) { | 187 if (!closed_ && !closing_) { |
189 closing_ = true; | 188 closing_ = true; |
190 | 189 |
191 if (control_channel_.get()) | 190 // Inform the StateChangeCallback, so calling code knows not to touch any |
192 control_channel_->Close(result); | 191 // channels. |
| 192 if (failed) |
| 193 SetState(FAILED); |
| 194 else |
| 195 SetState(CLOSED); |
| 196 |
| 197 // Now tear down the remoting channel resources. |
| 198 control_channel_.reset(); |
193 control_socket_.reset(); | 199 control_socket_.reset(); |
194 control_ssl_socket_.reset(); | 200 control_ssl_socket_.reset(); |
195 if (control_socket_wrapper_.get()) | 201 event_channel_.reset(); |
196 control_socket_wrapper_->Disconnect(); | |
197 | |
198 if (event_channel_.get()) | |
199 event_channel_->Close(result); | |
200 event_socket_.reset(); | 202 event_socket_.reset(); |
201 event_ssl_socket_.reset(); | 203 event_ssl_socket_.reset(); |
202 if (event_socket_wrapper_.get()) | 204 video_channel_.reset(); |
203 event_socket_wrapper_->Disconnect(); | |
204 | |
205 if (video_channel_.get()) | |
206 video_channel_->Close(result); | |
207 video_socket_.reset(); | 205 video_socket_.reset(); |
208 video_ssl_socket_.reset(); | 206 video_ssl_socket_.reset(); |
209 if (video_socket_wrapper_.get()) | 207 video_rtp_channel_.reset(); |
210 video_socket_wrapper_->Disconnect(); | 208 video_rtcp_channel_.reset(); |
211 | 209 |
212 if (video_rtp_channel_.get()) | 210 // Tear down the cricket session, including the cricket transport channels. |
213 video_rtp_channel_->Close(result); | |
214 if (video_rtcp_channel_.get()) | |
215 video_rtcp_channel_->Close(result); | |
216 | |
217 if (cricket_session_) { | 211 if (cricket_session_) { |
218 cricket_session_->Terminate(); | 212 cricket_session_->Terminate(); |
219 cricket_session_->SignalState.disconnect(this); | 213 cricket_session_->SignalState.disconnect(this); |
220 } | 214 } |
221 | 215 |
222 if (failed) | |
223 SetState(FAILED); | |
224 else | |
225 SetState(CLOSED); | |
226 | |
227 closed_ = true; | 216 closed_ = true; |
228 } | 217 } |
229 cert_verifier_.reset(); | 218 cert_verifier_.reset(); |
230 } | 219 } |
231 | 220 |
232 bool JingleSession::HasSession(cricket::Session* cricket_session) { | 221 bool JingleSession::HasSession(cricket::Session* cricket_session) { |
233 DCHECK(CalledOnValidThread()); | 222 DCHECK(CalledOnValidThread()); |
234 return cricket_session_ == cricket_session; | 223 return cricket_session_ == cricket_session; |
235 } | 224 } |
236 | 225 |
(...skipping 11 matching lines...) Expand all Loading... |
248 } | 237 } |
249 | 238 |
250 void JingleSession::SetStateChangeCallback(StateChangeCallback* callback) { | 239 void JingleSession::SetStateChangeCallback(StateChangeCallback* callback) { |
251 DCHECK(CalledOnValidThread()); | 240 DCHECK(CalledOnValidThread()); |
252 DCHECK(callback); | 241 DCHECK(callback); |
253 state_change_callback_.reset(callback); | 242 state_change_callback_.reset(callback); |
254 } | 243 } |
255 | 244 |
256 net::Socket* JingleSession::control_channel() { | 245 net::Socket* JingleSession::control_channel() { |
257 DCHECK(CalledOnValidThread()); | 246 DCHECK(CalledOnValidThread()); |
258 return control_socket_wrapper_.get(); | 247 return control_ssl_socket_.get(); |
259 } | 248 } |
260 | 249 |
261 net::Socket* JingleSession::event_channel() { | 250 net::Socket* JingleSession::event_channel() { |
262 DCHECK(CalledOnValidThread()); | 251 DCHECK(CalledOnValidThread()); |
263 return event_socket_wrapper_.get(); | 252 return event_ssl_socket_.get(); |
264 } | 253 } |
265 | 254 |
266 // TODO(sergeyu): Remove this method after we switch to RTP. | 255 // TODO(sergeyu): Remove this method after we switch to RTP. |
267 net::Socket* JingleSession::video_channel() { | 256 net::Socket* JingleSession::video_channel() { |
268 DCHECK(CalledOnValidThread()); | 257 DCHECK(CalledOnValidThread()); |
269 return video_socket_wrapper_.get(); | 258 return video_ssl_socket_.get(); |
270 } | 259 } |
271 | 260 |
272 net::Socket* JingleSession::video_rtp_channel() { | 261 net::Socket* JingleSession::video_rtp_channel() { |
273 DCHECK(CalledOnValidThread()); | 262 DCHECK(CalledOnValidThread()); |
274 return video_rtp_channel_.get(); | 263 return video_rtp_channel_.get(); |
275 } | 264 } |
276 | 265 |
277 net::Socket* JingleSession::video_rtcp_channel() { | 266 net::Socket* JingleSession::video_rtcp_channel() { |
278 DCHECK(CalledOnValidThread()); | 267 DCHECK(CalledOnValidThread()); |
279 return video_rtcp_channel_.get(); | 268 return video_rtcp_channel_.get(); |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 void JingleSession::OnSSLConnect(int result) { | 635 void JingleSession::OnSSLConnect(int result) { |
647 DCHECK(CalledOnValidThread()); | 636 DCHECK(CalledOnValidThread()); |
648 | 637 |
649 DCHECK(!closed_); | 638 DCHECK(!closed_); |
650 if (result != net::OK) { | 639 if (result != net::OK) { |
651 LOG(ERROR) << "Error during SSL connection: " << result; | 640 LOG(ERROR) << "Error during SSL connection: " << result; |
652 CloseInternal(result, true); | 641 CloseInternal(result, true); |
653 return; | 642 return; |
654 } | 643 } |
655 | 644 |
656 if (control_ssl_socket_.get() && control_ssl_socket_->IsConnected()) { | 645 if (event_ssl_socket_.get() && event_ssl_socket_->IsConnected() && |
657 control_socket_wrapper_.reset( | 646 control_ssl_socket_.get() && control_ssl_socket_->IsConnected() && |
658 new SocketWrapper(control_ssl_socket_.release())); | 647 video_ssl_socket_.get() && video_ssl_socket_->IsConnected()) { |
659 } | |
660 if (event_ssl_socket_.get() && event_ssl_socket_->IsConnected()) { | |
661 event_socket_wrapper_.reset( | |
662 new SocketWrapper(event_ssl_socket_.release())); | |
663 } | |
664 if (video_ssl_socket_.get() && video_ssl_socket_->IsConnected()) { | |
665 video_socket_wrapper_.reset( | |
666 new SocketWrapper(video_ssl_socket_.release())); | |
667 } | |
668 | |
669 if (event_socket_wrapper_.get() && | |
670 control_socket_wrapper_.get() && | |
671 video_socket_wrapper_.get()) { | |
672 SetState(CONNECTED); | 648 SetState(CONNECTED); |
673 } | 649 } |
674 } | 650 } |
675 | 651 |
676 void JingleSession::SetState(State new_state) { | 652 void JingleSession::SetState(State new_state) { |
677 DCHECK(CalledOnValidThread()); | 653 DCHECK(CalledOnValidThread()); |
678 | 654 |
679 if (new_state != state_) { | 655 if (new_state != state_) { |
680 DCHECK_NE(state_, CLOSED); | 656 DCHECK_NE(state_, CLOSED); |
681 DCHECK_NE(state_, FAILED); | 657 DCHECK_NE(state_, FAILED); |
682 | 658 |
683 state_ = new_state; | 659 state_ = new_state; |
684 if (!closed_ && state_change_callback_.get()) | 660 if (!closed_ && state_change_callback_.get()) |
685 state_change_callback_->Run(new_state); | 661 state_change_callback_->Run(new_state); |
686 } | 662 } |
687 } | 663 } |
688 | 664 |
689 } // namespace protocol | 665 } // namespace protocol |
690 | 666 |
691 } // namespace remoting | 667 } // namespace remoting |
OLD | NEW |