Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: remoting/protocol/jingle_stream_connector.cc

Issue 8527018: Refactor ChannelAuthenticator so that it can be used with Authenticator. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « remoting/protocol/jingle_stream_connector.h ('k') | remoting/protocol/pepper_stream_channel.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « remoting/protocol/jingle_stream_connector.h ('k') | remoting/protocol/pepper_stream_channel.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698