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

Side by Side Diff: chrome/browser/extensions/app_notify_channel_setup.cc

Issue 8822006: Fix the app notify channel setup for the case where the user may have explicitly revoked permissi... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/extensions/app_notify_channel_setup.h" 5 #include "chrome/browser/extensions/app_notify_channel_setup.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 AppNotifyChannelUI* ui, 74 AppNotifyChannelUI* ui,
75 base::WeakPtr<AppNotifyChannelSetup::Delegate> delegate) 75 base::WeakPtr<AppNotifyChannelSetup::Delegate> delegate)
76 : profile_(profile), 76 : profile_(profile),
77 extension_id_(extension_id), 77 extension_id_(extension_id),
78 client_id_(client_id), 78 client_id_(client_id),
79 requestor_url_(requestor_url), 79 requestor_url_(requestor_url),
80 return_route_id_(return_route_id), 80 return_route_id_(return_route_id),
81 callback_id_(callback_id), 81 callback_id_(callback_id),
82 delegate_(delegate), 82 delegate_(delegate),
83 ui_(ui), 83 ui_(ui),
84 state_(INITIAL) {} 84 state_(INITIAL),
85 oauth2_access_token_failure_(false) {}
85 86
86 AppNotifyChannelSetup::~AppNotifyChannelSetup() {} 87 AppNotifyChannelSetup::~AppNotifyChannelSetup() {}
87 88
88 void AppNotifyChannelSetup::Start() { 89 void AppNotifyChannelSetup::Start() {
89 if (g_interceptor_for_tests) { 90 if (g_interceptor_for_tests) {
90 std::string channel_id; 91 std::string channel_id;
91 std::string error; 92 std::string error;
92 g_interceptor_for_tests->DoIntercept(this, &channel_id, &error); 93 g_interceptor_for_tests->DoIntercept(this, &channel_id, &error);
93 delegate_->AppNotifyChannelSetupComplete(channel_id, error, this); 94 delegate_->AppNotifyChannelSetupComplete(channel_id, error, this);
94 return; 95 return;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 fetcher->SetExtraRequestHeaders(MakeAuthorizationHeader(auth_token)); 141 fetcher->SetExtraRequestHeaders(MakeAuthorizationHeader(auth_token));
141 if (!body.empty()) { 142 if (!body.empty()) {
142 fetcher->SetUploadData("application/x-www-form-urlencoded", body); 143 fetcher->SetUploadData("application/x-www-form-urlencoded", body);
143 } 144 }
144 return fetcher; 145 return fetcher;
145 } 146 }
146 147
147 bool AppNotifyChannelSetup::ShouldPromptForLogin() const { 148 bool AppNotifyChannelSetup::ShouldPromptForLogin() const {
148 std::string username = profile_->GetPrefs()->GetString( 149 std::string username = profile_->GetPrefs()->GetString(
149 prefs::kGoogleServicesUsername); 150 prefs::kGoogleServicesUsername);
150 // Prompt for login if either the user has not logged in at all or 151 // Prompt for login if either:
151 // if the user is logged in but there is no OAuth2 login token. 152 // 1. the user has not logged in at all or
152 // The latter happens for users who are already logged in before the 153 // 2. if the user is logged in but there is no OAuth2 login token.
153 // code to generate OAuth2 login token is released. 154 // The latter happens for users who are already logged in before the
155 // code to generate OAuth2 login token is released.
156 // 3. If the OAuth2 login token does not work anymore.
157 // This can happen if the user explicitly revoked access to Google Chrome
158 // from Google Accounts page.
154 return username.empty() || 159 return username.empty() ||
155 !profile_->GetTokenService()->HasOAuthLoginToken(); 160 !profile_->GetTokenService()->HasOAuthLoginToken() ||
161 oauth2_access_token_failure_;
156 } 162 }
157 163
158 void AppNotifyChannelSetup::BeginLogin() { 164 void AppNotifyChannelSetup::BeginLogin() {
159 CHECK_EQ(INITIAL, state_); 165 CHECK_EQ(INITIAL, state_);
160 state_ = LOGIN_STARTED; 166 state_ = LOGIN_STARTED;
161 if (ShouldPromptForLogin()) { 167 if (ShouldPromptForLogin()) {
162 ui_->PromptSyncSetup(this); 168 ui_->PromptSyncSetup(this);
163 // We'll get called back in OnSyncSetupResult 169 // We'll get called back in OnSyncSetupResult
164 } else { 170 } else {
165 EndLogin(true); 171 EndLogin(true);
(...skipping 25 matching lines...) Expand all
191 GaiaUrls::GetInstance()->oauth2_chrome_client_secret(), 197 GaiaUrls::GetInstance()->oauth2_chrome_client_secret(),
192 profile_->GetTokenService()->GetOAuth2LoginRefreshToken(), 198 profile_->GetTokenService()->GetOAuth2LoginRefreshToken(),
193 scopes); 199 scopes);
194 } 200 }
195 201
196 void AppNotifyChannelSetup::EndGetAccessToken(bool success) { 202 void AppNotifyChannelSetup::EndGetAccessToken(bool success) {
197 CHECK_EQ(FETCH_ACCESS_TOKEN_STARTED, state_); 203 CHECK_EQ(FETCH_ACCESS_TOKEN_STARTED, state_);
198 if (success) { 204 if (success) {
199 state_ = FETCH_ACCESS_TOKEN_DONE; 205 state_ = FETCH_ACCESS_TOKEN_DONE;
200 BeginRecordGrant(); 206 BeginRecordGrant();
207 } else if (!oauth2_access_token_failure_) {
208 oauth2_access_token_failure_ = true;
209 // If access token generation fails, then it means somehow the
210 // OAuth2 login scoped token became invalid. One way this cna happen
211 // is if a user explicitly revoked access to Google Chrome from
212 // Google Accounts page. In such a case, we should try to show the
213 // login setup again to the user, but only if we have not already
214 // done so once (to avoid infinite loop).
215 state_ = INITIAL;
216 BeginLogin();
201 } else { 217 } else {
202 state_ = ERROR_STATE; 218 state_ = ERROR_STATE;
203 ReportResult("", kChannelSetupInternalError); 219 ReportResult("", kChannelSetupInternalError);
204 } 220 }
205 } 221 }
206 222
207 void AppNotifyChannelSetup::BeginRecordGrant() { 223 void AppNotifyChannelSetup::BeginRecordGrant() {
208 CHECK_EQ(FETCH_ACCESS_TOKEN_DONE, state_); 224 CHECK_EQ(FETCH_ACCESS_TOKEN_DONE, state_);
209 state_ = RECORD_GRANT_STARTED; 225 state_ = RECORD_GRANT_STARTED;
210 226
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 DictionaryValue* dict = static_cast<DictionaryValue*>(value.get()); 353 DictionaryValue* dict = static_cast<DictionaryValue*>(value.get());
338 if (!dict->Get("id", &channel_id_value)) 354 if (!dict->Get("id", &channel_id_value))
339 return false; 355 return false;
340 if (channel_id_value->GetType() != base::Value::TYPE_STRING) 356 if (channel_id_value->GetType() != base::Value::TYPE_STRING)
341 return false; 357 return false;
342 358
343 StringValue* channel_id = static_cast<StringValue*>(channel_id_value); 359 StringValue* channel_id = static_cast<StringValue*>(channel_id_value);
344 channel_id->GetAsString(result); 360 channel_id->GetAsString(result);
345 return true; 361 return true;
346 } 362 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/app_notify_channel_setup.h ('k') | chrome/browser/extensions/app_notify_channel_setup_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698