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

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: Remove extra LOGs 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/constants.h"
10 #include "remoting/host/url_request_context.h" 12 #include "remoting/host/url_request_context.h"
11 13
12 namespace remoting { 14 namespace remoting {
13 15
14 namespace { 16 namespace {
15 17
16 // The delay between reconnect attempts will increase exponentially up 18 // The delay between reconnect attempts will increase exponentially up
17 // to the maximum specified here. 19 // to the maximum specified here.
18 const int kMaxReconnectDelaySeconds = 10 * 60; 20 const int kMaxReconnectDelaySeconds = 10 * 60;
19 21
20 // Time when we we try to update OAuth token before its expiration. 22 // Time when we we try to update OAuth token before its expiration.
21 const int kTokenUpdateTimeBeforeExpirySeconds = 60; 23 const int kTokenUpdateTimeBeforeExpirySeconds = 60;
22 24
23 } // namespace 25 } // namespace
24 26
25 SignalingConnector::OAuthCredentials::OAuthCredentials( 27 SignalingConnector::OAuthCredentials::OAuthCredentials(
26 const std::string& login_value, 28 const std::string& login_value,
27 const std::string& refresh_token_value, 29 const std::string& refresh_token_value,
28 const OAuthClientInfo& client_info_value) 30 const OAuthClientInfo& client_info_value)
29 : login(login_value), 31 : login(login_value),
30 refresh_token(refresh_token_value), 32 refresh_token(refresh_token_value),
31 client_info(client_info_value) { 33 client_info(client_info_value) {
32 } 34 }
33 35
34 SignalingConnector::SignalingConnector( 36 SignalingConnector::SignalingConnector(
35 XmppSignalStrategy* signal_strategy, 37 XmppSignalStrategy* signal_strategy,
38 ChromotingHostContext* context,
39 std::string talkgadget_prefix,
36 const base::Closure& auth_failed_callback) 40 const base::Closure& auth_failed_callback)
37 : signal_strategy_(signal_strategy), 41 : signal_strategy_(signal_strategy),
42 context_(context),
38 auth_failed_callback_(auth_failed_callback), 43 auth_failed_callback_(auth_failed_callback),
44 talkgadget_prefix_(talkgadget_prefix),
45 found_talkgadget_(false),
39 reconnect_attempts_(0), 46 reconnect_attempts_(0),
40 refreshing_oauth_token_(false) { 47 refreshing_oauth_token_(false) {
41 DCHECK(!auth_failed_callback_.is_null()); 48 DCHECK(!auth_failed_callback_.is_null());
42 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); 49 net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
43 net::NetworkChangeNotifier::AddIPAddressObserver(this); 50 net::NetworkChangeNotifier::AddIPAddressObserver(this);
44 signal_strategy_->AddListener(this); 51 signal_strategy_->AddListener(this);
45 ScheduleTryReconnect(); 52 ScheduleTryReconnect();
46 } 53 }
47 54
48 SignalingConnector::~SignalingConnector() { 55 SignalingConnector::~SignalingConnector() {
49 signal_strategy_->RemoveListener(this); 56 signal_strategy_->RemoveListener(this);
50 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); 57 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
51 net::NetworkChangeNotifier::RemoveIPAddressObserver(this); 58 net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
52 } 59 }
53 60
54 void SignalingConnector::EnableOAuth( 61 void SignalingConnector::EnableOAuth(
55 scoped_ptr<OAuthCredentials> oauth_credentials, 62 scoped_ptr<OAuthCredentials> oauth_credentials) {
56 net::URLRequestContextGetter* url_context) {
57 oauth_credentials_ = oauth_credentials.Pass(); 63 oauth_credentials_ = oauth_credentials.Pass();
58 gaia_oauth_client_.reset(new GaiaOAuthClient( 64 gaia_oauth_client_.reset(new GaiaOAuthClient(
59 OAuthProviderInfo::GetDefault(), url_context)); 65 OAuthProviderInfo::GetDefault(), context_->url_request_context_getter()));
60 } 66 }
61 67
68 // SignalStrategy::Listener interface.
62 void SignalingConnector::OnSignalStrategyStateChange( 69 void SignalingConnector::OnSignalStrategyStateChange(
63 SignalStrategy::State state) { 70 SignalStrategy::State state) {
64 DCHECK(CalledOnValidThread()); 71 DCHECK(CalledOnValidThread());
65 72
66 if (state == SignalStrategy::CONNECTED) { 73 if (state == SignalStrategy::CONNECTED) {
67 LOG(INFO) << "Signaling connected."; 74 LOG(INFO) << "Signaling connected.";
68 reconnect_attempts_ = 0; 75 reconnect_attempts_ = 0;
69 } else if (state == SignalStrategy::DISCONNECTED) { 76 } else if (state == SignalStrategy::DISCONNECTED) {
70 LOG(INFO) << "Signaling disconnected."; 77 LOG(INFO) << "Signaling disconnected.";
71 reconnect_attempts_++; 78 reconnect_attempts_++;
72 79
73 // If authentication failed then we have an invalid OAuth token, 80 // If authentication failed then we have an invalid OAuth token,
74 // inform the upper layer about it. 81 // inform the upper layer about it.
75 if (signal_strategy_->GetError() == SignalStrategy::AUTHENTICATION_FAILED) { 82 if (signal_strategy_->GetError() == SignalStrategy::AUTHENTICATION_FAILED) {
76 auth_failed_callback_.Run(); 83 auth_failed_callback_.Run();
77 } else { 84 } else {
78 ScheduleTryReconnect(); 85 ScheduleTryReconnect();
79 } 86 }
80 } 87 }
81 } 88 }
82 89
83 bool SignalingConnector::OnSignalStrategyIncomingStanza( 90 bool SignalingConnector::OnSignalStrategyIncomingStanza(
84 const buzz::XmlElement* stanza) { 91 const buzz::XmlElement* stanza) {
85 return false; 92 return false;
86 } 93 }
87 94
88 void SignalingConnector::OnIPAddressChanged() { 95 // net::URLFetcherDelegate interface.
Sergey Ulanov 2012/08/24 19:43:33 I don't think we need to duplicate this comment fr
garykac 2012/08/27 22:34:57 Done.
89 DCHECK(CalledOnValidThread()); 96 void SignalingConnector::OnURLFetchComplete(const net::URLFetcher* source) {
90 LOG(INFO) << "IP address has changed."; 97 int response = source->GetResponseCode();
91 ResetAndTryReconnect(); 98 if (response == 200) {
99 found_talkgadget_ = true;
100 url_fetcher_.reset(NULL);
101 TryReconnect();
102 return;
103 }
104 LOG(INFO) << "Failed to find talkgadget. Scheduling a reconnect.";
105 reconnect_attempts_++;
106 ScheduleTryReconnect();
Sergey Ulanov 2012/08/24 19:43:33 If we know we are blocked then there isn't point i
garykac 2012/08/27 22:34:57 Not being able to reach the talkgadget could be fo
92 } 107 }
93 108
109 // NetworkChangeNotifier::ConnectionTypeObserver interface.
94 void SignalingConnector::OnConnectionTypeChanged( 110 void SignalingConnector::OnConnectionTypeChanged(
95 net::NetworkChangeNotifier::ConnectionType type) { 111 net::NetworkChangeNotifier::ConnectionType type) {
96 DCHECK(CalledOnValidThread()); 112 DCHECK(CalledOnValidThread());
97 if (type != net::NetworkChangeNotifier::CONNECTION_NONE) { 113 if (type != net::NetworkChangeNotifier::CONNECTION_NONE) {
98 LOG(INFO) << "Network state changed to online."; 114 LOG(INFO) << "Network state changed to online.";
99 ResetAndTryReconnect(); 115 ResetAndTryReconnect();
100 } 116 }
101 } 117 }
102 118
119 // NetworkChangeNotifier::IPAddressObserver interface.
120 void SignalingConnector::OnIPAddressChanged() {
121 DCHECK(CalledOnValidThread());
122 LOG(INFO) << "IP address has changed.";
123 ResetAndTryReconnect();
124 }
125
126 // GaiaOAuthClient::Delegate interface.
103 void SignalingConnector::OnRefreshTokenResponse(const std::string& user_email, 127 void SignalingConnector::OnRefreshTokenResponse(const std::string& user_email,
104 const std::string& access_token, 128 const std::string& access_token,
105 int expires_seconds) { 129 int expires_seconds) {
106 DCHECK(CalledOnValidThread()); 130 DCHECK(CalledOnValidThread());
107 DCHECK(oauth_credentials_.get()); 131 DCHECK(oauth_credentials_.get());
108 LOG(INFO) << "Received OAuth token."; 132 LOG(INFO) << "Received OAuth token.";
109 133
110 if (user_email != oauth_credentials_->login) { 134 if (user_email != oauth_credentials_->login) {
111 LOG(ERROR) << "OAuth token and email address do not refer to " 135 LOG(ERROR) << "OAuth token and email address do not refer to "
112 "the same account."; 136 "the same account.";
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 void SignalingConnector::ResetAndTryReconnect() { 180 void SignalingConnector::ResetAndTryReconnect() {
157 DCHECK(CalledOnValidThread()); 181 DCHECK(CalledOnValidThread());
158 signal_strategy_->Disconnect(); 182 signal_strategy_->Disconnect();
159 reconnect_attempts_ = 0; 183 reconnect_attempts_ = 0;
160 timer_.Stop(); 184 timer_.Stop();
161 ScheduleTryReconnect(); 185 ScheduleTryReconnect();
162 } 186 }
163 187
164 void SignalingConnector::TryReconnect() { 188 void SignalingConnector::TryReconnect() {
165 DCHECK(CalledOnValidThread()); 189 DCHECK(CalledOnValidThread());
190
191 if (!found_talkgadget_) {
192 std::string talkgadget_url("https://");
193 if (talkgadget_prefix_.empty()) {
194 talkgadget_url += kDefaultHostTalkGadgetPrefix;
195 } else {
196 talkgadget_url += talkgadget_prefix_;
197 }
198 talkgadget_url += kTalkGadgetURL;
199 LOG(INFO) << "Verifying connection to " << talkgadget_url;
200 url_fetcher_.reset(net::URLFetcher::Create(GURL(talkgadget_url),
201 net::URLFetcher::GET, this));
202 url_fetcher_->SetRequestContext(context_->url_request_context_getter());
203 url_fetcher_->Start();
204 return;
205 }
206
166 if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) { 207 if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) {
208
167 bool need_new_auth_token = oauth_credentials_.get() && 209 bool need_new_auth_token = oauth_credentials_.get() &&
168 (auth_token_expiry_time_.is_null() || 210 (auth_token_expiry_time_.is_null() ||
169 base::Time::Now() >= auth_token_expiry_time_); 211 base::Time::Now() >= auth_token_expiry_time_);
170 if (need_new_auth_token) { 212 if (need_new_auth_token) {
171 RefreshOAuthToken(); 213 RefreshOAuthToken();
172 } else { 214 } else {
173 LOG(INFO) << "Attempting to connect signaling."; 215 LOG(INFO) << "Attempting to connect signaling.";
174 signal_strategy_->Connect(); 216 signal_strategy_->Connect();
175 } 217 }
176 } 218 }
177 } 219 }
178 220
179 void SignalingConnector::RefreshOAuthToken() { 221 void SignalingConnector::RefreshOAuthToken() {
180 DCHECK(CalledOnValidThread()); 222 DCHECK(CalledOnValidThread());
181 LOG(INFO) << "Refreshing OAuth token."; 223 LOG(INFO) << "Refreshing OAuth token.";
182 DCHECK(!refreshing_oauth_token_); 224 DCHECK(!refreshing_oauth_token_);
183 225
184 refreshing_oauth_token_ = true; 226 refreshing_oauth_token_ = true;
185 gaia_oauth_client_->RefreshToken( 227 gaia_oauth_client_->RefreshToken(
186 oauth_credentials_->client_info, 228 oauth_credentials_->client_info,
187 oauth_credentials_->refresh_token, this); 229 oauth_credentials_->refresh_token, this);
188 } 230 }
189 231
190 } // namespace remoting 232 } // namespace remoting
OLDNEW
« remoting/host/signaling_connector.h ('K') | « remoting/host/signaling_connector.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698