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

Side by Side Diff: chrome/browser/signin/force_signin_verifier.cc

Issue 2802373002: Add ForceSigninVerifier. (Closed)
Patch Set: rogers' comments Created 3 years, 8 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
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <string>
6
7 #include "chrome/browser/profiles/profile.h"
8 #include "chrome/browser/signin/force_signin_verifier.h"
9 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
10 #include "chrome/browser/signin/signin_manager_factory.h"
11 #include "components/signin/core/browser/signin_manager.h"
12 #include "google_apis/gaia/gaia_constants.h"
13
14 namespace {
15 const net::BackoffEntry::Policy kBackoffPolicy = {
16 0, // Number of initial errors to ignore before applying
17 // exponential back-off rules.
18 2000, // Initial delay in ms.
19 2, // Factor by which the waiting time will be multiplied.
20 0.2, // Fuzzing percentage.
21 4 * 60 * 1000, // Maximum amount of time to delay th request in ms.
22 -1, // Never discard the entry.
23 false // Do not always use initial delay.
24 };
25
26 } // namespace
27
28 ForceSigninVerifier::ForceSigninVerifier(Profile* profile)
29 : OAuth2TokenService::Consumer("force_signin_verifier"),
30 has_token_verified_(false),
31 backoff_entry_(&kBackoffPolicy),
32 oauth2_token_service_(
33 ProfileOAuth2TokenServiceFactory::GetForProfile(profile)),
34 signin_manager_(SigninManagerFactory::GetForProfile(profile)),
35 token_request_time_(base::Time::Now()) {
36 net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
37 SendRequest();
38 }
39
40 ForceSigninVerifier::~ForceSigninVerifier() {
41 Cancel();
42 }
43
44 void ForceSigninVerifier::OnGetTokenSuccess(
45 const OAuth2TokenService::Request* request,
46 const std::string& access_token,
47 const base::Time& expiration_time) {
48 has_token_verified_ = true;
49 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
50 Cancel();
51 }
52
53 void ForceSigninVerifier::OnGetTokenFailure(
54 const OAuth2TokenService::Request* request,
55 const GoogleServiceAuthError& error) {
56 if (error.IsPersistentError()) {
57 has_token_verified_ = true;
58 ShowDialog();
59 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
60 Cancel();
61 } else {
62 backoff_entry_.InformOfRequest(false);
63 backoff_request_timer_.Start(
64 FROM_HERE, backoff_entry_.GetTimeUntilRelease(),
65 base::Bind(&ForceSigninVerifier::SendRequest, base::Unretained(this)));
66 access_token_request_.reset();
67 }
68 }
69
70 void ForceSigninVerifier::OnNetworkChanged(
71 net::NetworkChangeNotifier::ConnectionType type) {
72 // Try again immediately once the network is back and cancel any pending
73 // request.
74 backoff_entry_.Reset();
75 if (backoff_request_timer_.IsRunning())
76 backoff_request_timer_.Stop();
77
78 if (type != net::NetworkChangeNotifier::ConnectionType::CONNECTION_NONE)
79 SendRequest();
80 }
81
82 void ForceSigninVerifier::Cancel() {
83 backoff_entry_.Reset();
84 backoff_request_timer_.Stop();
85 access_token_request_.reset();
86 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
87 }
88
89 bool ForceSigninVerifier::HasTokenBeenVerified() {
90 return has_token_verified_;
91 }
92
93 void ForceSigninVerifier::SendRequest() {
94 if (!ShouldSendRequest())
95 return;
96
97 std::string account_id = signin_manager_->GetAuthenticatedAccountId();
98 OAuth2TokenService::ScopeSet oauth2_scopes;
99 oauth2_scopes.insert(GaiaConstants::kChromeSyncOAuth2Scope);
100 access_token_request_ =
101 oauth2_token_service_->StartRequest(account_id, oauth2_scopes, this);
102 }
103
104 bool ForceSigninVerifier::ShouldSendRequest() {
105 return !has_token_verified_ && access_token_request_.get() == nullptr &&
106 !net::NetworkChangeNotifier::IsOffline() &&
107 signin_manager_->IsAuthenticated();
108 }
109
110 void ForceSigninVerifier::ShowDialog() {
111 // TODO(zmin): Show app modal dialog.
112 }
113
114 OAuth2TokenService::Request* ForceSigninVerifier::GetRequestForTesting() {
115 return access_token_request_.get();
116 }
117
118 net::BackoffEntry* ForceSigninVerifier::GetBackoffEntryForTesting() {
119 return &backoff_entry_;
120 }
121
122 base::OneShotTimer* ForceSigninVerifier::GetOneShotTimerForTesting() {
123 return &backoff_request_timer_;
124 }
OLDNEW
« no previous file with comments | « chrome/browser/signin/force_signin_verifier.h ('k') | chrome/browser/signin/force_signin_verifier_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698