Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: remoting/host/signaling_connector.cc

Issue 10873050: [Chromoting] Hook up host talkgadget policy checks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleanup logging Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/signaling_connector.h" 5 #include "remoting/host/signaling_connector.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "net/url_request/url_fetcher.h"
9 #include "remoting/host/chromoting_host_context.h" 10 #include "remoting/host/chromoting_host_context.h"
11 #include "remoting/host/connection_block_checker.h"
12 #include "remoting/host/constants.h"
10 #include "remoting/host/url_request_context.h" 13 #include "remoting/host/url_request_context.h"
11 14
12 namespace remoting { 15 namespace remoting {
13 16
14 namespace { 17 namespace {
15 18
16 // The delay between reconnect attempts will increase exponentially up 19 // The delay between reconnect attempts will increase exponentially up
17 // to the maximum specified here. 20 // to the maximum specified here.
18 const int kMaxReconnectDelaySeconds = 10 * 60; 21 const int kMaxReconnectDelaySeconds = 10 * 60;
19 22
20 // Time when we we try to update OAuth token before its expiration. 23 // Time when we we try to update OAuth token before its expiration.
21 const int kTokenUpdateTimeBeforeExpirySeconds = 60; 24 const int kTokenUpdateTimeBeforeExpirySeconds = 60;
22 25
23 } // namespace 26 } // namespace
24 27
25 SignalingConnector::OAuthCredentials::OAuthCredentials( 28 SignalingConnector::OAuthCredentials::OAuthCredentials(
26 const std::string& login_value, 29 const std::string& login_value,
27 const std::string& refresh_token_value, 30 const std::string& refresh_token_value,
28 const OAuthClientInfo& client_info_value) 31 const OAuthClientInfo& client_info_value)
29 : login(login_value), 32 : login(login_value),
30 refresh_token(refresh_token_value), 33 refresh_token(refresh_token_value),
31 client_info(client_info_value) { 34 client_info(client_info_value) {
32 } 35 }
33 36
34 SignalingConnector::SignalingConnector( 37 SignalingConnector::SignalingConnector(
35 XmppSignalStrategy* signal_strategy, 38 XmppSignalStrategy* signal_strategy,
39 ChromotingHostContext* context,
40 std::string talkgadget_prefix,
36 const base::Closure& auth_failed_callback) 41 const base::Closure& auth_failed_callback)
37 : signal_strategy_(signal_strategy), 42 : signal_strategy_(signal_strategy),
43 context_(context),
38 auth_failed_callback_(auth_failed_callback), 44 auth_failed_callback_(auth_failed_callback),
39 reconnect_attempts_(0), 45 reconnect_attempts_(0),
40 refreshing_oauth_token_(false) { 46 refreshing_oauth_token_(false) {
41 DCHECK(!auth_failed_callback_.is_null()); 47 DCHECK(!auth_failed_callback_.is_null());
42 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); 48 net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
43 net::NetworkChangeNotifier::AddIPAddressObserver(this); 49 net::NetworkChangeNotifier::AddIPAddressObserver(this);
44 signal_strategy_->AddListener(this); 50 signal_strategy_->AddListener(this);
51 connection_block_checker_.reset(
52 new ConnectionBlockChecker(context_, talkgadget_prefix,
53 base::Bind(&SignalingConnector::OnConnectionBlockCheckerDone,
54 base::Unretained(this))));
45 ScheduleTryReconnect(); 55 ScheduleTryReconnect();
46 } 56 }
47 57
48 SignalingConnector::~SignalingConnector() { 58 SignalingConnector::~SignalingConnector() {
49 signal_strategy_->RemoveListener(this); 59 signal_strategy_->RemoveListener(this);
50 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); 60 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
51 net::NetworkChangeNotifier::RemoveIPAddressObserver(this); 61 net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
52 } 62 }
53 63
54 void SignalingConnector::EnableOAuth( 64 void SignalingConnector::EnableOAuth(
55 scoped_ptr<OAuthCredentials> oauth_credentials, 65 scoped_ptr<OAuthCredentials> oauth_credentials) {
56 net::URLRequestContextGetter* url_context) {
57 oauth_credentials_ = oauth_credentials.Pass(); 66 oauth_credentials_ = oauth_credentials.Pass();
58 gaia_oauth_client_.reset(new GaiaOAuthClient( 67 gaia_oauth_client_.reset(new GaiaOAuthClient(
59 OAuthProviderInfo::GetDefault(), url_context)); 68 OAuthProviderInfo::GetDefault(), context_->url_request_context_getter()));
60 } 69 }
61 70
62 void SignalingConnector::OnSignalStrategyStateChange( 71 void SignalingConnector::OnSignalStrategyStateChange(
63 SignalStrategy::State state) { 72 SignalStrategy::State state) {
64 DCHECK(CalledOnValidThread()); 73 DCHECK(CalledOnValidThread());
65 74
66 if (state == SignalStrategy::CONNECTED) { 75 if (state == SignalStrategy::CONNECTED) {
67 LOG(INFO) << "Signaling connected."; 76 LOG(INFO) << "Signaling connected.";
68 reconnect_attempts_ = 0; 77 reconnect_attempts_ = 0;
69 } else if (state == SignalStrategy::DISCONNECTED) { 78 } else if (state == SignalStrategy::DISCONNECTED) {
70 LOG(INFO) << "Signaling disconnected."; 79 LOG(INFO) << "Signaling disconnected.";
71 reconnect_attempts_++; 80 reconnect_attempts_++;
72 81
73 // If authentication failed then we have an invalid OAuth token, 82 // If authentication failed then we have an invalid OAuth token,
74 // inform the upper layer about it. 83 // inform the upper layer about it.
75 if (signal_strategy_->GetError() == SignalStrategy::AUTHENTICATION_FAILED) { 84 if (signal_strategy_->GetError() == SignalStrategy::AUTHENTICATION_FAILED) {
76 auth_failed_callback_.Run(); 85 auth_failed_callback_.Run();
77 } else { 86 } else {
78 ScheduleTryReconnect(); 87 ScheduleTryReconnect();
79 } 88 }
80 } 89 }
81 } 90 }
82 91
83 bool SignalingConnector::OnSignalStrategyIncomingStanza( 92 bool SignalingConnector::OnSignalStrategyIncomingStanza(
84 const buzz::XmlElement* stanza) { 93 const buzz::XmlElement* stanza) {
85 return false; 94 return false;
86 } 95 }
87 96
88 void SignalingConnector::OnIPAddressChanged() {
89 DCHECK(CalledOnValidThread());
90 LOG(INFO) << "IP address has changed.";
91 ResetAndTryReconnect();
92 }
93
94 void SignalingConnector::OnConnectionTypeChanged( 97 void SignalingConnector::OnConnectionTypeChanged(
95 net::NetworkChangeNotifier::ConnectionType type) { 98 net::NetworkChangeNotifier::ConnectionType type) {
96 DCHECK(CalledOnValidThread()); 99 DCHECK(CalledOnValidThread());
97 if (type != net::NetworkChangeNotifier::CONNECTION_NONE) { 100 if (type != net::NetworkChangeNotifier::CONNECTION_NONE) {
98 LOG(INFO) << "Network state changed to online."; 101 LOG(INFO) << "Network state changed to online.";
99 ResetAndTryReconnect(); 102 ResetAndTryReconnect();
100 } 103 }
101 } 104 }
102 105
106 void SignalingConnector::OnIPAddressChanged() {
107 DCHECK(CalledOnValidThread());
108 LOG(INFO) << "IP address has changed.";
109 ResetAndTryReconnect();
110 }
111
103 void SignalingConnector::OnRefreshTokenResponse(const std::string& user_email, 112 void SignalingConnector::OnRefreshTokenResponse(const std::string& user_email,
104 const std::string& access_token, 113 const std::string& access_token,
105 int expires_seconds) { 114 int expires_seconds) {
106 DCHECK(CalledOnValidThread()); 115 DCHECK(CalledOnValidThread());
107 DCHECK(oauth_credentials_.get()); 116 DCHECK(oauth_credentials_.get());
108 LOG(INFO) << "Received OAuth token."; 117 LOG(INFO) << "Received OAuth token.";
109 118
110 if (user_email != oauth_credentials_->login) { 119 if (user_email != oauth_credentials_->login) {
111 LOG(ERROR) << "OAuth token and email address do not refer to " 120 LOG(ERROR) << "OAuth token and email address do not refer to "
112 "the same account."; 121 "the same account.";
(...skipping 27 matching lines...) Expand all
140 << response_code; 149 << response_code;
141 refreshing_oauth_token_ = false; 150 refreshing_oauth_token_ = false;
142 reconnect_attempts_++; 151 reconnect_attempts_++;
143 ScheduleTryReconnect(); 152 ScheduleTryReconnect();
144 } 153 }
145 154
146 void SignalingConnector::ScheduleTryReconnect() { 155 void SignalingConnector::ScheduleTryReconnect() {
147 DCHECK(CalledOnValidThread()); 156 DCHECK(CalledOnValidThread());
148 if (timer_.IsRunning() || net::NetworkChangeNotifier::IsOffline()) 157 if (timer_.IsRunning() || net::NetworkChangeNotifier::IsOffline())
149 return; 158 return;
150 int delay_s = std::min(1 << (reconnect_attempts_ * 2), 159 int delay_s = std::min(1 << reconnect_attempts_,
151 kMaxReconnectDelaySeconds); 160 kMaxReconnectDelaySeconds);
152 timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(delay_s), 161 timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(delay_s),
153 this, &SignalingConnector::TryReconnect); 162 this, &SignalingConnector::TryReconnect);
154 } 163 }
155 164
156 void SignalingConnector::ResetAndTryReconnect() { 165 void SignalingConnector::ResetAndTryReconnect() {
157 DCHECK(CalledOnValidThread()); 166 DCHECK(CalledOnValidThread());
158 signal_strategy_->Disconnect(); 167 signal_strategy_->Disconnect();
159 reconnect_attempts_ = 0; 168 reconnect_attempts_ = 0;
160 timer_.Stop(); 169 timer_.Stop();
161 ScheduleTryReconnect(); 170 ScheduleTryReconnect();
162 } 171 }
163 172
164 void SignalingConnector::TryReconnect() { 173 void SignalingConnector::TryReconnect() {
165 DCHECK(CalledOnValidThread()); 174 DCHECK(CalledOnValidThread());
175 DCHECK(connection_block_checker_.get());
176
177 // This will check if this machine is allowed to access the chromoting
178 // host talkgadget. OnConnectionBlockCheckerDone will be called with the
Sergey Ulanov 2012/08/29 20:10:29 You would need this comment if callback was passed
garykac 2012/08/29 22:30:51 Done.
179 // result of this check.
180 connection_block_checker_->CheckStatus();
181 }
182
183 void SignalingConnector::OnConnectionBlockCheckerDone(bool allow) {
184 DCHECK(CalledOnValidThread());
185
186 // Access to the host talkgadget is blocked. Don't allow the connection, but
187 // schedule a reconnect in case this is a transient problem.
188 if (!allow) {
189 reconnect_attempts_++;
190 LOG(INFO) << "Scheduling reconnect. Attempt " << reconnect_attempts_;
191 ScheduleTryReconnect();
192 return;
193 }
194
166 if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) { 195 if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) {
167 bool need_new_auth_token = oauth_credentials_.get() && 196 bool need_new_auth_token = oauth_credentials_.get() &&
168 (auth_token_expiry_time_.is_null() || 197 (auth_token_expiry_time_.is_null() ||
169 base::Time::Now() >= auth_token_expiry_time_); 198 base::Time::Now() >= auth_token_expiry_time_);
170 if (need_new_auth_token) { 199 if (need_new_auth_token) {
171 RefreshOAuthToken(); 200 RefreshOAuthToken();
172 } else { 201 } else {
173 LOG(INFO) << "Attempting to connect signaling."; 202 LOG(INFO) << "Attempting to connect signaling.";
174 signal_strategy_->Connect(); 203 signal_strategy_->Connect();
175 } 204 }
176 } 205 }
177 } 206 }
178 207
179 void SignalingConnector::RefreshOAuthToken() { 208 void SignalingConnector::RefreshOAuthToken() {
180 DCHECK(CalledOnValidThread()); 209 DCHECK(CalledOnValidThread());
181 LOG(INFO) << "Refreshing OAuth token."; 210 LOG(INFO) << "Refreshing OAuth token.";
182 DCHECK(!refreshing_oauth_token_); 211 DCHECK(!refreshing_oauth_token_);
183 212
184 refreshing_oauth_token_ = true; 213 refreshing_oauth_token_ = true;
185 gaia_oauth_client_->RefreshToken( 214 gaia_oauth_client_->RefreshToken(
186 oauth_credentials_->client_info, 215 oauth_credentials_->client_info,
187 oauth_credentials_->refresh_token, this); 216 oauth_credentials_->refresh_token, this);
188 } 217 }
189 218
190 } // namespace remoting 219 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698