Index: remoting/protocol/pepper_session.cc |
diff --git a/remoting/protocol/pepper_session.cc b/remoting/protocol/pepper_session.cc |
index 138993be57fb93d4777eee31917731cd47266a51..735d7adae2e5f37e5e09901ef7b49219d3908fab 100644 |
--- a/remoting/protocol/pepper_session.cc |
+++ b/remoting/protocol/pepper_session.cc |
@@ -10,6 +10,7 @@ |
#include "base/string_number_conversions.h" |
#include "remoting/base/constants.h" |
#include "remoting/jingle_glue/iq_sender.h" |
+#include "remoting/protocol/authenticator.h" |
#include "remoting/protocol/content_description.h" |
#include "remoting/protocol/jingle_messages.h" |
#include "remoting/protocol/pepper_session_manager.h" |
@@ -56,15 +57,15 @@ Session::Error PepperSession::error() { |
void PepperSession::StartConnection( |
const std::string& peer_jid, |
- const std::string& peer_public_key, |
- const std::string& client_token, |
+ Authenticator* authenticator, |
CandidateSessionConfig* config, |
const StateChangeCallback& state_change_callback) { |
DCHECK(CalledOnValidThread()); |
+ DCHECK(authenticator); |
+ DCHECK_EQ(authenticator->state(), Authenticator::MESSAGE_READY); |
peer_jid_ = peer_jid; |
- peer_public_key_ = peer_public_key; |
- initiator_token_ = client_token; |
+ authenticator_.reset(authenticator); |
candidate_config_.reset(config); |
state_change_callback_ = state_change_callback; |
@@ -79,7 +80,8 @@ void PepperSession::StartConnection( |
session_id_); |
message.from = session_manager_->local_jid_; |
message.description.reset( |
- new ContentDescription(candidate_config_->Clone(), initiator_token_, "")); |
+ new ContentDescription(candidate_config_->Clone(), |
+ authenticator_->GetNextMessage())); |
initiate_request_.reset(session_manager_->iq_sender()->SendIq( |
message.ToXml(), |
base::Bind(&PepperSession::OnSessionInitiateResponse, |
@@ -112,12 +114,14 @@ void PepperSession::CreateStreamChannel( |
const StreamChannelCallback& callback) { |
DCHECK(!channels_[name]); |
- PepperStreamChannel* channel = new PepperStreamChannel(this, name, callback); |
+ ChannelAuthenticator* channel_authenticator = |
+ authenticator_->CreateChannelAuthenticator(); |
+ PepperStreamChannel* channel = new PepperStreamChannel( |
+ this, name, callback); |
channels_[name] = channel; |
channel->Connect(session_manager_->pp_instance_, |
session_manager_->transport_config_, |
- new V1ClientChannelAuthenticator( |
- remote_cert_, shared_secret_)); |
+ channel_authenticator); |
} |
void PepperSession::CreateDatagramChannel( |
@@ -156,37 +160,6 @@ void PepperSession::set_config(const SessionConfig& config) { |
NOTREACHED(); |
} |
-const std::string& PepperSession::initiator_token() { |
- DCHECK(CalledOnValidThread()); |
- return initiator_token_; |
-} |
- |
-void PepperSession::set_initiator_token(const std::string& initiator_token) { |
- DCHECK(CalledOnValidThread()); |
- initiator_token_ = initiator_token; |
-} |
- |
-const std::string& PepperSession::receiver_token() { |
- DCHECK(CalledOnValidThread()); |
- return receiver_token_; |
-} |
- |
-void PepperSession::set_receiver_token(const std::string& receiver_token) { |
- DCHECK(CalledOnValidThread()); |
- // set_receiver_token() should not be called on the client side. |
- NOTREACHED(); |
-} |
- |
-void PepperSession::set_shared_secret(const std::string& secret) { |
- DCHECK(CalledOnValidThread()); |
- shared_secret_ = secret; |
-} |
- |
-const std::string& PepperSession::shared_secret() { |
- DCHECK(CalledOnValidThread()); |
- return shared_secret_; |
-} |
- |
void PepperSession::Close() { |
DCHECK(CalledOnValidThread()); |
@@ -237,6 +210,26 @@ void PepperSession::OnAccept(const JingleMessage& message, |
return; |
} |
+ const buzz::XmlElement* auth_message = |
+ message.description->authenticator_message(); |
+ if (!auth_message) { |
+ DLOG(WARNING) << "Received session-accept without authentication message " |
+ << auth_message->Str(); |
+ OnError(INCOMPATIBLE_PROTOCOL); |
+ return; |
+ } |
+ |
+ 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 && |
+ authenticator_->state() != Authenticator::MESSAGE_READY); |
+ |
+ if (authenticator_->state() == Authenticator::REJECTED) { |
+ OnError(AUTHENTICATION_FAILED); |
+ return; |
+ } |
+ |
if (!InitializeConfigFromDescription(message.description.get())) { |
OnError(INCOMPATIBLE_PROTOCOL); |
return; |
@@ -297,12 +290,6 @@ bool PepperSession::InitializeConfigFromDescription( |
const ContentDescription* description) { |
DCHECK(description); |
- remote_cert_ = description->certificate(); |
- if (remote_cert_.empty()) { |
- LOG(ERROR) << "session-accept does not specify certificate"; |
- return false; |
- } |
- |
if (!description->config()->GetFinalConfig(&config_)) { |
LOG(ERROR) << "session-accept does not specify configuration"; |
return false; |