| Index: remoting/host/chromoting_host.cc
|
| diff --git a/remoting/host/chromoting_host.cc b/remoting/host/chromoting_host.cc
|
| index 43bcabbd71843c9cf635d06e86a8ca8b94664763..4eb7de8f8eba38e788b40ba1f4fdaf41fc87e5b5 100644
|
| --- a/remoting/host/chromoting_host.cc
|
| +++ b/remoting/host/chromoting_host.cc
|
| @@ -79,8 +79,6 @@ ChromotingHost::ChromotingHost(
|
| signal_strategy_(signal_strategy),
|
| started_(false),
|
| login_backoff_(&kDefaultBackoffPolicy),
|
| - authenticating_client_(false),
|
| - reject_authenticating_client_(false),
|
| enable_curtaining_(false),
|
| weak_factory_(this) {
|
| DCHECK(network_task_runner_->BelongsToCurrentThread());
|
| @@ -133,11 +131,6 @@ void ChromotingHost::AddExtension(scoped_ptr<HostExtension> extension) {
|
| extensions_.push_back(extension.release());
|
| }
|
|
|
| -void ChromotingHost::RejectAuthenticatingClient() {
|
| - DCHECK(authenticating_client_);
|
| - reject_authenticating_client_ = true;
|
| -}
|
| -
|
| void ChromotingHost::SetAuthenticatorFactory(
|
| scoped_ptr<protocol::AuthenticatorFactory> authenticator_factory) {
|
| DCHECK(CalledOnValidThread());
|
| @@ -183,7 +176,7 @@ void ChromotingHost::OnSessionAuthenticating(ClientSession* client) {
|
| login_backoff_.InformOfRequest(false);
|
| }
|
|
|
| -bool ChromotingHost::OnSessionAuthenticated(ClientSession* client) {
|
| +void ChromotingHost::OnSessionAuthenticated(ClientSession* client) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| login_backoff_.Reset();
|
| @@ -192,10 +185,16 @@ bool ChromotingHost::OnSessionAuthenticated(ClientSession* client) {
|
| // is called to avoid it becoming invalid when the client is removed from
|
| // the list.
|
| ClientList::iterator it = clients_.begin();
|
| + base::WeakPtr<ChromotingHost> self = weak_factory_.GetWeakPtr();
|
| while (it != clients_.end()) {
|
| ClientSession* other_client = *it++;
|
| - if (other_client != client)
|
| + if (other_client != client) {
|
| other_client->DisconnectSession(protocol::OK);
|
| +
|
| + // Quit if the host was destroyed.
|
| + if (!self)
|
| + return;
|
| + }
|
| }
|
|
|
| // Disconnects above must have destroyed all other clients.
|
| @@ -204,14 +203,8 @@ bool ChromotingHost::OnSessionAuthenticated(ClientSession* client) {
|
| // Notify observers that there is at least one authenticated client.
|
| const std::string& jid = client->client_jid();
|
|
|
| - reject_authenticating_client_ = false;
|
| -
|
| - authenticating_client_ = true;
|
| FOR_EACH_OBSERVER(HostStatusObserver, status_observers_,
|
| OnClientAuthenticated(jid));
|
| - authenticating_client_ = false;
|
| -
|
| - return !reject_authenticating_client_;
|
| }
|
|
|
| void ChromotingHost::OnSessionChannelsConnected(ClientSession* client) {
|
| @@ -236,13 +229,15 @@ void ChromotingHost::OnSessionClosed(ClientSession* client) {
|
| ClientList::iterator it = std::find(clients_.begin(), clients_.end(), client);
|
| CHECK(it != clients_.end());
|
|
|
| - if (client->is_authenticated()) {
|
| - FOR_EACH_OBSERVER(HostStatusObserver, status_observers_,
|
| - OnClientDisconnected(client->client_jid()));
|
| - }
|
| -
|
| + bool was_authenticated = client->is_authenticated();
|
| + std::string jid = client->client_jid();
|
| clients_.erase(it);
|
| delete client;
|
| +
|
| + if (was_authenticated) {
|
| + FOR_EACH_OBSERVER(HostStatusObserver, status_observers_,
|
| + OnClientDisconnected(jid));
|
| + }
|
| }
|
|
|
| void ChromotingHost::OnSessionRouteChange(
|
|
|