Index: remoting/protocol/jingle_session.cc |
diff --git a/remoting/protocol/jingle_session.cc b/remoting/protocol/jingle_session.cc |
index 0d6dc4f21ecb77fa4dfa262f461652b634a2bf75..8abada22e307f6563f067522d7986d2b36ce979b 100644 |
--- a/remoting/protocol/jingle_session.cc |
+++ b/remoting/protocol/jingle_session.cc |
@@ -45,6 +45,8 @@ JingleSession::JingleSession( |
jid_ = cricket_session_->remote_name(); |
cricket_session_->SignalState.connect(this, &JingleSession::OnSessionState); |
cricket_session_->SignalError.connect(this, &JingleSession::OnSessionError); |
+ cricket_session_->SignalInfoMessage.connect( |
+ this, &JingleSession::OnSessionInfoMessage); |
cricket_session_->SignalReceivedTerminateReason.connect( |
this, &JingleSession::OnTerminateReason); |
} |
@@ -246,6 +248,25 @@ void JingleSession::OnSessionError( |
} |
} |
+void JingleSession::OnSessionInfoMessage(cricket::Session* session, |
+ const buzz::XmlElement* message) { |
+ DCHECK_EQ(cricket_session_,session); |
+ |
+ const buzz::XmlElement* auth_message = |
+ Authenticator::FindAuthenticatorMessage(message); |
+ if (auth_message) { |
+ if (state_ != CONNECTED || |
+ authenticator_->state() != Authenticator::WAITING_MESSAGE) { |
+ LOG(WARNING) << "Received unexpected authenticator message " |
+ << auth_message->Str(); |
+ return; |
+ } |
+ |
+ authenticator_->ProcessMessage(auth_message); |
+ ProcessAuthenticationStep(); |
+ } |
+} |
+ |
void JingleSession::OnTerminateReason(cricket::Session* session, |
const std::string& reason) { |
terminate_reason_ = reason; |
@@ -294,16 +315,10 @@ bool JingleSession::InitializeConfigFromDescription( |
return false; |
} |
- DCHECK(authenticator_->state() == Authenticator::WAITING_MESSAGE); |
+ DCHECK_EQ(authenticator_->state(), Authenticator::WAITING_MESSAGE); |
authenticator_->ProcessMessage(auth_message); |
- // Support for more than two auth message is not implemented yet. |
- DCHECK(authenticator_->state() != Authenticator::WAITING_MESSAGE && |
- authenticator_->state() != Authenticator::MESSAGE_READY); |
- |
- if (authenticator_->state() != Authenticator::ACCEPTED) { |
- return false; |
- } |
+ // Initialize session configuration. |
SessionConfig config; |
if (!content_description->config()->GetFinalConfig(&config)) { |
LOG(ERROR) << "Connection response does not specify configuration"; |
@@ -333,8 +348,12 @@ void JingleSession::OnAccept() { |
SetState(CONNECTED); |
- if (authenticator_->state() == Authenticator::ACCEPTED) |
+ // Process authentication. |
+ if (authenticator_->state() == Authenticator::ACCEPTED) { |
SetState(AUTHENTICATED); |
+ } else { |
+ ProcessAuthenticationStep(); |
+ } |
} |
void JingleSession::OnTerminate() { |
@@ -398,8 +417,6 @@ void JingleSession::AcceptConnection() { |
DCHECK(authenticator_->state() == Authenticator::WAITING_MESSAGE); |
authenticator_->ProcessMessage(auth_message); |
- // Support for more than two auth message is not implemented yet. |
- DCHECK(authenticator_->state() != Authenticator::WAITING_MESSAGE); |
if (authenticator_->state() == Authenticator::REJECTED) { |
CloseInternal(net::ERR_CONNECTION_FAILED, AUTHENTICATION_FAILED); |
return; |
@@ -412,11 +429,29 @@ void JingleSession::AcceptConnection() { |
buzz::XmlElement* auth_reply = NULL; |
if (authenticator_->state() == Authenticator::MESSAGE_READY) |
auth_reply = authenticator_->GetNextMessage(); |
- DCHECK_EQ(authenticator_->state(), Authenticator::ACCEPTED); |
+ DCHECK_NE(authenticator_->state(), Authenticator::MESSAGE_READY); |
cricket_session_->Accept( |
CreateSessionDescription(candidate_config, auth_reply)); |
} |
+void JingleSession::ProcessAuthenticationStep() { |
+ DCHECK_EQ(state_, CONNECTED); |
+ |
+ if (authenticator_->state() == Authenticator::MESSAGE_READY) { |
+ buzz::XmlElement* auth_message = authenticator_->GetNextMessage(); |
+ cricket::XmlElements message; |
+ message.push_back(auth_message); |
+ cricket_session_->SendInfoMessage(message); |
+ } |
+ DCHECK_NE(authenticator_->state(), Authenticator::MESSAGE_READY); |
+ |
+ if (authenticator_->state() == Authenticator::ACCEPTED) { |
+ SetState(AUTHENTICATED); |
+ } else if (authenticator_->state() == Authenticator::REJECTED) { |
+ CloseInternal(net::ERR_CONNECTION_ABORTED, AUTHENTICATION_FAILED); |
+ } |
+} |
+ |
void JingleSession::AddChannelConnector( |
const std::string& name, JingleChannelConnector* connector) { |
DCHECK(channel_connectors_.find(name) == channel_connectors_.end()); |