Index: chrome/browser/signin/force_signin_verifier.cc |
diff --git a/chrome/browser/signin/force_signin_verifier.cc b/chrome/browser/signin/force_signin_verifier.cc |
index 9afd37813e60a95759bb6d5224e99398dbbdbac5..a6afff87ba80e28441c7a5d9868fd9dd85a34158 100644 |
--- a/chrome/browser/signin/force_signin_verifier.cc |
+++ b/chrome/browser/signin/force_signin_verifier.cc |
@@ -4,10 +4,12 @@ |
#include <string> |
+#include "base/bind.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/signin/force_signin_verifier.h" |
#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
#include "chrome/browser/signin/signin_manager_factory.h" |
+#include "chrome/browser/ui/browser_dialogs.h" |
#include "components/signin/core/browser/signin_manager.h" |
#include "google_apis/gaia/gaia_constants.h" |
@@ -23,10 +25,21 @@ const net::BackoffEntry::Policy kBackoffPolicy = { |
false // Do not always use initial delay. |
}; |
+// The duration of window closing countdown when verification failed. Use the |
+// short countdown if the verfication is finished in |
+// |kShortCountdownVerificationTimeLimitInSeconds|, otherwise use the normal |
+// countdown. |
+const int kShortCountdownVerificationTimeLimitInSeconds = 3; |
+const int kWindowClosingNormalCountdownDurationInSecond = 300; |
+const int kWindowClosingShortCountdownDurationInSecond = 30; |
+ |
} // namespace |
ForceSigninVerifier::ForceSigninVerifier(Profile* profile) |
: OAuth2TokenService::Consumer("force_signin_verifier"), |
+#if !defined(OS_MACOSX) |
+ profile_(profile), |
+#endif |
has_token_verified_(false), |
backoff_entry_(&kBackoffPolicy), |
oauth2_token_service_( |
@@ -39,6 +52,9 @@ ForceSigninVerifier::ForceSigninVerifier(Profile* profile) |
ForceSigninVerifier::~ForceSigninVerifier() { |
Cancel(); |
+#if !defined(OS_MACOSX) |
+ chrome::HideForcedReauthenticationDialog(profile_); |
+#endif |
} |
void ForceSigninVerifier::OnGetTokenSuccess( |
@@ -90,6 +106,10 @@ bool ForceSigninVerifier::HasTokenBeenVerified() { |
return has_token_verified_; |
} |
+void ForceSigninVerifier::AbortSignoutCountdownIfExisted() { |
+ window_close_timer_.Stop(); |
+} |
+ |
void ForceSigninVerifier::SendRequest() { |
if (!ShouldSendRequest()) |
return; |
@@ -107,8 +127,39 @@ bool ForceSigninVerifier::ShouldSendRequest() { |
signin_manager_->IsAuthenticated(); |
} |
+base::TimeDelta ForceSigninVerifier::StartCountdown() { |
+ base::TimeDelta countdown_duration; |
+ if (base::Time::Now() - token_request_time_ > |
+ base::TimeDelta::FromSeconds( |
+ kShortCountdownVerificationTimeLimitInSeconds)) { |
+ countdown_duration = base::TimeDelta::FromSeconds( |
+ kWindowClosingNormalCountdownDurationInSecond); |
+ } else { |
+ countdown_duration = base::TimeDelta::FromSeconds( |
+ kWindowClosingShortCountdownDurationInSecond); |
+ } |
+ |
+ window_close_timer_.Start(FROM_HERE, countdown_duration, this, |
+ &ForceSigninVerifier::CloseAllBrowserWindows); |
+ return countdown_duration; |
+} |
+ |
void ForceSigninVerifier::ShowDialog() { |
- // TODO(zmin): Show app modal dialog. |
+#if !defined(OS_MACOSX) |
+ base::TimeDelta countdown_duration = StartCountdown(); |
+ chrome::ShowForcedReauthenticationDialog(profile_, signin_manager_, |
+ countdown_duration); |
+#endif |
+} |
+ |
+void ForceSigninVerifier::CloseAllBrowserWindows() { |
+ // Do not close window if there is ongoing reauth. If it fails later, the |
+ // signin process should take care of the signout. |
+ if (signin_manager_->AuthInProgress()) |
+ return; |
+ signin_manager_->SignOut( |
+ signin_metrics::AUTHENTICATION_FAILED_WITH_FORCE_SIGNIN, |
+ signin_metrics::SignoutDelete::IGNORE_METRIC); |
} |
OAuth2TokenService::Request* ForceSigninVerifier::GetRequestForTesting() { |
@@ -122,3 +173,7 @@ net::BackoffEntry* ForceSigninVerifier::GetBackoffEntryForTesting() { |
base::OneShotTimer* ForceSigninVerifier::GetOneShotTimerForTesting() { |
return &backoff_request_timer_; |
} |
+ |
+base::OneShotTimer* ForceSigninVerifier::GetWindowCloseTimerForTesting() { |
+ return &window_close_timer_; |
+} |