Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/host/chromoting_host.h" | 5 #include "remoting/host/chromoting_host.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 session_manager_(session_manager.Pass()), | 72 session_manager_(session_manager.Pass()), |
| 73 audio_task_runner_(audio_task_runner), | 73 audio_task_runner_(audio_task_runner), |
| 74 input_task_runner_(input_task_runner), | 74 input_task_runner_(input_task_runner), |
| 75 video_capture_task_runner_(video_capture_task_runner), | 75 video_capture_task_runner_(video_capture_task_runner), |
| 76 video_encode_task_runner_(video_encode_task_runner), | 76 video_encode_task_runner_(video_encode_task_runner), |
| 77 network_task_runner_(network_task_runner), | 77 network_task_runner_(network_task_runner), |
| 78 ui_task_runner_(ui_task_runner), | 78 ui_task_runner_(ui_task_runner), |
| 79 signal_strategy_(signal_strategy), | 79 signal_strategy_(signal_strategy), |
| 80 started_(false), | 80 started_(false), |
| 81 login_backoff_(&kDefaultBackoffPolicy), | 81 login_backoff_(&kDefaultBackoffPolicy), |
| 82 authenticating_client_(false), | |
| 83 reject_authenticating_client_(false), | |
| 84 enable_curtaining_(false), | 82 enable_curtaining_(false), |
| 85 weak_factory_(this) { | 83 weak_factory_(this) { |
| 86 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 84 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 87 DCHECK(signal_strategy); | 85 DCHECK(signal_strategy); |
| 88 | 86 |
| 89 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); | 87 jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); |
| 90 } | 88 } |
| 91 | 89 |
| 92 ChromotingHost::~ChromotingHost() { | 90 ChromotingHost::~ChromotingHost() { |
| 93 DCHECK(CalledOnValidThread()); | 91 DCHECK(CalledOnValidThread()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 126 | 124 |
| 127 void ChromotingHost::RemoveStatusObserver(HostStatusObserver* observer) { | 125 void ChromotingHost::RemoveStatusObserver(HostStatusObserver* observer) { |
| 128 DCHECK(CalledOnValidThread()); | 126 DCHECK(CalledOnValidThread()); |
| 129 status_observers_.RemoveObserver(observer); | 127 status_observers_.RemoveObserver(observer); |
| 130 } | 128 } |
| 131 | 129 |
| 132 void ChromotingHost::AddExtension(scoped_ptr<HostExtension> extension) { | 130 void ChromotingHost::AddExtension(scoped_ptr<HostExtension> extension) { |
| 133 extensions_.push_back(extension.release()); | 131 extensions_.push_back(extension.release()); |
| 134 } | 132 } |
| 135 | 133 |
| 136 void ChromotingHost::RejectAuthenticatingClient() { | |
| 137 DCHECK(authenticating_client_); | |
| 138 reject_authenticating_client_ = true; | |
| 139 } | |
| 140 | |
| 141 void ChromotingHost::SetAuthenticatorFactory( | 134 void ChromotingHost::SetAuthenticatorFactory( |
| 142 scoped_ptr<protocol::AuthenticatorFactory> authenticator_factory) { | 135 scoped_ptr<protocol::AuthenticatorFactory> authenticator_factory) { |
| 143 DCHECK(CalledOnValidThread()); | 136 DCHECK(CalledOnValidThread()); |
| 144 session_manager_->set_authenticator_factory(authenticator_factory.Pass()); | 137 session_manager_->set_authenticator_factory(authenticator_factory.Pass()); |
| 145 } | 138 } |
| 146 | 139 |
| 147 void ChromotingHost::SetEnableCurtaining(bool enable) { | 140 void ChromotingHost::SetEnableCurtaining(bool enable) { |
| 148 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 141 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 149 | 142 |
| 150 if (enable_curtaining_ == enable) | 143 if (enable_curtaining_ == enable) |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 176 // connection attempts as well as sequential ones. | 169 // connection attempts as well as sequential ones. |
| 177 if (login_backoff_.ShouldRejectRequest()) { | 170 if (login_backoff_.ShouldRejectRequest()) { |
| 178 LOG(WARNING) << "Disconnecting client " << client->client_jid() << " due to" | 171 LOG(WARNING) << "Disconnecting client " << client->client_jid() << " due to" |
| 179 " an overload of failed login attempts."; | 172 " an overload of failed login attempts."; |
| 180 client->DisconnectSession(protocol::HOST_OVERLOAD); | 173 client->DisconnectSession(protocol::HOST_OVERLOAD); |
| 181 return; | 174 return; |
| 182 } | 175 } |
| 183 login_backoff_.InformOfRequest(false); | 176 login_backoff_.InformOfRequest(false); |
| 184 } | 177 } |
| 185 | 178 |
| 186 bool ChromotingHost::OnSessionAuthenticated(ClientSession* client) { | 179 void ChromotingHost::OnSessionAuthenticated(ClientSession* client) { |
| 187 DCHECK(CalledOnValidThread()); | 180 DCHECK(CalledOnValidThread()); |
| 188 | 181 |
| 189 login_backoff_.Reset(); | 182 login_backoff_.Reset(); |
| 190 | 183 |
| 191 // Disconnect all other clients. |it| should be advanced before Disconnect() | 184 // Disconnect all other clients. |it| should be advanced before Disconnect() |
| 192 // is called to avoid it becoming invalid when the client is removed from | 185 // is called to avoid it becoming invalid when the client is removed from |
| 193 // the list. | 186 // the list. |
| 194 ClientList::iterator it = clients_.begin(); | 187 ClientList::iterator it = clients_.begin(); |
| 188 base::WeakPtr<ChromotingHost> self = weak_factory_.GetWeakPtr(); | |
| 195 while (it != clients_.end()) { | 189 while (it != clients_.end()) { |
| 196 ClientSession* other_client = *it++; | 190 ClientSession* other_client = *it++; |
| 197 if (other_client != client) | 191 if (other_client != client) { |
|
Lambros
2015/11/23 22:44:48
nit: remove a space before {
Sergey Ulanov
2015/11/23 22:59:44
Done.
| |
| 198 other_client->DisconnectSession(protocol::OK); | 192 other_client->DisconnectSession(protocol::OK); |
| 193 | |
| 194 // Quit if the host was destroyed. | |
| 195 if (!self) | |
| 196 return; | |
| 197 } | |
| 199 } | 198 } |
| 200 | 199 |
| 201 // Disconnects above must have destroyed all other clients. | 200 // Disconnects above must have destroyed all other clients. |
| 202 DCHECK_EQ(clients_.size(), 1U); | 201 DCHECK_EQ(clients_.size(), 1U); |
| 203 | 202 |
| 204 // Notify observers that there is at least one authenticated client. | 203 // Notify observers that there is at least one authenticated client. |
| 205 const std::string& jid = client->client_jid(); | 204 const std::string& jid = client->client_jid(); |
| 206 | 205 |
| 207 reject_authenticating_client_ = false; | |
| 208 | |
| 209 authenticating_client_ = true; | |
| 210 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, | 206 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, |
| 211 OnClientAuthenticated(jid)); | 207 OnClientAuthenticated(jid)); |
| 212 authenticating_client_ = false; | |
| 213 | |
| 214 return !reject_authenticating_client_; | |
| 215 } | 208 } |
| 216 | 209 |
| 217 void ChromotingHost::OnSessionChannelsConnected(ClientSession* client) { | 210 void ChromotingHost::OnSessionChannelsConnected(ClientSession* client) { |
| 218 DCHECK(CalledOnValidThread()); | 211 DCHECK(CalledOnValidThread()); |
| 219 | 212 |
| 220 // Notify observers. | 213 // Notify observers. |
| 221 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, | 214 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, |
| 222 OnClientConnected(client->client_jid())); | 215 OnClientConnected(client->client_jid())); |
| 223 } | 216 } |
| 224 | 217 |
| 225 void ChromotingHost::OnSessionAuthenticationFailed(ClientSession* client) { | 218 void ChromotingHost::OnSessionAuthenticationFailed(ClientSession* client) { |
| 226 DCHECK(CalledOnValidThread()); | 219 DCHECK(CalledOnValidThread()); |
| 227 | 220 |
| 228 // Notify observers. | 221 // Notify observers. |
| 229 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, | 222 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, |
| 230 OnAccessDenied(client->client_jid())); | 223 OnAccessDenied(client->client_jid())); |
| 231 } | 224 } |
| 232 | 225 |
| 233 void ChromotingHost::OnSessionClosed(ClientSession* client) { | 226 void ChromotingHost::OnSessionClosed(ClientSession* client) { |
| 234 DCHECK(CalledOnValidThread()); | 227 DCHECK(CalledOnValidThread()); |
| 235 | 228 |
| 236 ClientList::iterator it = std::find(clients_.begin(), clients_.end(), client); | 229 ClientList::iterator it = std::find(clients_.begin(), clients_.end(), client); |
| 237 CHECK(it != clients_.end()); | 230 CHECK(it != clients_.end()); |
| 238 | 231 |
| 239 if (client->is_authenticated()) { | 232 bool was_authenticated = client->is_authenticated(); |
| 240 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, | 233 std::string jid = client->client_jid(); |
| 241 OnClientDisconnected(client->client_jid())); | |
| 242 } | |
| 243 | |
| 244 clients_.erase(it); | 234 clients_.erase(it); |
| 245 delete client; | 235 delete client; |
| 236 | |
| 237 if (was_authenticated) { | |
| 238 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, | |
| 239 OnClientDisconnected(jid)); | |
| 240 } | |
| 246 } | 241 } |
| 247 | 242 |
| 248 void ChromotingHost::OnSessionRouteChange( | 243 void ChromotingHost::OnSessionRouteChange( |
| 249 ClientSession* session, | 244 ClientSession* session, |
| 250 const std::string& channel_name, | 245 const std::string& channel_name, |
| 251 const protocol::TransportRoute& route) { | 246 const protocol::TransportRoute& route) { |
| 252 DCHECK(CalledOnValidThread()); | 247 DCHECK(CalledOnValidThread()); |
| 253 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, | 248 FOR_EACH_OBSERVER(HostStatusObserver, status_observers_, |
| 254 OnClientRouteChange(session->client_jid(), channel_name, | 249 OnClientRouteChange(session->client_jid(), channel_name, |
| 255 route)); | 250 route)); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 DCHECK(CalledOnValidThread()); | 301 DCHECK(CalledOnValidThread()); |
| 307 | 302 |
| 308 while (!clients_.empty()) { | 303 while (!clients_.empty()) { |
| 309 size_t size = clients_.size(); | 304 size_t size = clients_.size(); |
| 310 clients_.front()->DisconnectSession(protocol::OK); | 305 clients_.front()->DisconnectSession(protocol::OK); |
| 311 CHECK_EQ(clients_.size(), size - 1); | 306 CHECK_EQ(clients_.size(), size - 1); |
| 312 } | 307 } |
| 313 } | 308 } |
| 314 | 309 |
| 315 } // namespace remoting | 310 } // namespace remoting |
| OLD | NEW |