Index: remoting/protocol/pepper_stream_channel.cc |
diff --git a/remoting/protocol/pepper_stream_channel.cc b/remoting/protocol/pepper_stream_channel.cc |
index 84abe257489743633feb4aee0c823edda4666e0f..e51d265f6d79fd0f607b41cf2305b895ff17dd7b 100644 |
--- a/remoting/protocol/pepper_stream_channel.cc |
+++ b/remoting/protocol/pepper_stream_channel.cc |
@@ -35,33 +35,6 @@ const int kTcpAckDelayMilliseconds = 10; |
const int kTcpReceiveBufferSize = 256 * 1024; |
const int kTcpSendBufferSize = kTcpReceiveBufferSize + 30 * 1024; |
-// Helper method to create a SSL client socket. |
-net::SSLClientSocket* CreateSSLClientSocket( |
- net::StreamSocket* socket, const std::string& der_cert, |
- net::CertVerifier* cert_verifier) { |
- net::SSLConfig ssl_config; |
- |
- // Certificate provided by the host doesn't need authority. |
- net::SSLConfig::CertAndStatus cert_and_status; |
- cert_and_status.cert_status = net::CERT_STATUS_AUTHORITY_INVALID; |
- cert_and_status.der_cert = der_cert; |
- ssl_config.allowed_bad_certs.push_back(cert_and_status); |
- |
- // Revocation checking is not needed because we use self-signed |
- // certs. Disable it so that SSL layer doesn't try to initialize |
- // OCSP (OCSP works only on IO thread). |
- ssl_config.rev_checking_enabled = false; |
- |
- // SSLClientSocket takes ownership of the |socket|. |
- net::HostPortPair host_and_port("chromoting", 0); |
- net::SSLClientSocketContext context; |
- context.cert_verifier = cert_verifier; |
- net::SSLClientSocket* ssl_socket = |
- net::ClientSocketFactory::GetDefaultFactory()->CreateSSLClientSocket( |
- socket, host_and_port, ssl_config, NULL, context); |
- return ssl_socket; |
-} |
- |
} // namespace |
PepperStreamChannel::PepperStreamChannel( |
@@ -73,11 +46,8 @@ PepperStreamChannel::PepperStreamChannel( |
callback_(callback), |
channel_(NULL), |
connected_(false), |
- ssl_client_socket_(NULL), |
ALLOW_THIS_IN_INITIALIZER_LIST(p2p_connect_callback_( |
- this, &PepperStreamChannel::OnP2PConnect)), |
- ALLOW_THIS_IN_INITIALIZER_LIST(ssl_connect_callback_( |
- this, &PepperStreamChannel::OnSSLConnect)) { |
+ this, &PepperStreamChannel::OnP2PConnect)) { |
} |
PepperStreamChannel::~PepperStreamChannel() { |
@@ -90,10 +60,10 @@ PepperStreamChannel::~PepperStreamChannel() { |
void PepperStreamChannel::Connect(pp::Instance* pp_instance, |
const TransportConfig& transport_config, |
- const std::string& remote_cert) { |
+ ChannelAuthenticator* authenticator) { |
DCHECK(CalledOnValidThread()); |
- remote_cert_ = remote_cert; |
+ authenticator_.reset(authenticator); |
pp::Transport_Dev* transport = |
new pp::Transport_Dev(pp_instance, name_.c_str(), |
@@ -197,69 +167,23 @@ void PepperStreamChannel::OnChannelNewLocalCandidate( |
void PepperStreamChannel::OnP2PConnect(int result) { |
DCHECK(CalledOnValidThread()); |
- if (result != net::OK || !EstablishSSLConnection()) |
+ if (result != net::OK) |
NotifyConnectFailed(); |
-} |
- |
-bool PepperStreamChannel::EstablishSSLConnection() { |
- DCHECK(CalledOnValidThread()); |
- |
- cert_verifier_.reset(new net::CertVerifier()); |
- |
- // Create client SSL socket. |
- ssl_client_socket_ = CreateSSLClientSocket( |
- owned_channel_.release(), remote_cert_, cert_verifier_.get()); |
- socket_.reset(ssl_client_socket_); |
- int result = ssl_client_socket_->Connect(&ssl_connect_callback_); |
- |
- if (result == net::ERR_IO_PENDING) { |
- return true; |
- } else if (result != net::OK) { |
- LOG(ERROR) << "Failed to establish SSL connection"; |
- return false; |
- } |
- |
- // Reach here if net::OK is received. |
- ssl_connect_callback_.Run(net::OK); |
- return true; |
+ authenticator_->SecureAndAuthenticate(owned_channel_.release(), base::Bind( |
+ &PepperStreamChannel::OnAuthenticationDone, base::Unretained(this))); |
} |
-void PepperStreamChannel::OnSSLConnect(int result) { |
- DCHECK(CalledOnValidThread()); |
- if (result != net::OK) { |
- LOG(ERROR) << "Error during SSL connection: " << result; |
+void PepperStreamChannel::OnAuthenticationDone( |
+ net::Error error, net::StreamSocket* socket) { |
+ DCHECK(CalledOnValidThread()); |
+ if (error != net::OK) { |
NotifyConnectFailed(); |
return; |
} |
- DCHECK(socket_->IsConnected()); |
- AuthenticateChannel(); |
-} |
- |
-void PepperStreamChannel::AuthenticateChannel() { |
- DCHECK(CalledOnValidThread()); |
- |
- authenticator_.reset( |
- new ClientChannelAuthenticator(session_->shared_secret())); |
- authenticator_->Authenticate(ssl_client_socket_, base::Bind( |
- &PepperStreamChannel::OnAuthenticationDone, base::Unretained(this))); |
-} |
- |
-void PepperStreamChannel::OnAuthenticationDone( |
- ChannelAuthenticator::Result result) { |
- DCHECK(CalledOnValidThread()); |
- |
- switch (result) { |
- case ChannelAuthenticator::SUCCESS: |
- NotifyConnected(socket_.release()); |
- break; |
- |
- case ChannelAuthenticator::FAILURE: |
- NotifyConnectFailed(); |
- break; |
- } |
+ NotifyConnected(socket); |
} |
void PepperStreamChannel::NotifyConnected(net::StreamSocket* socket) { |
@@ -271,7 +195,7 @@ void PepperStreamChannel::NotifyConnected(net::StreamSocket* socket) { |
void PepperStreamChannel::NotifyConnectFailed() { |
channel_ = NULL; |
owned_channel_.reset(); |
- socket_.reset(); |
+ authenticator_.reset(); |
NotifyConnected(NULL); |
} |