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 |