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

Unified Diff: chrome/browser/signin/force_signin_verifier.cc

Issue 2944713003: After signin token check failed, show force reauth dialog and start window closing countdown. (Closed)
Patch Set: cr Created 3 years, 6 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 side-by-side diff with in-line comments
Download patch
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..fed8206892e6581f3132487d91f17ed346ad4b4b 100644
--- a/chrome/browser/signin/force_signin_verifier.cc
+++ b/chrome/browser/signin/force_signin_verifier.cc
@@ -4,12 +4,16 @@
#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"
+#include "ui/views/widget/widget.h"
sky 2017/06/22 14:52:02 This code shouldn't use views either. Remember, ke
zmin 2017/06/23 00:58:40 Ok, I have created a separate class wrap the dialo
+#include "ui/views/widget/widget_deletion_observer.h"
namespace {
const net::BackoffEntry::Policy kBackoffPolicy = {
@@ -23,22 +27,36 @@ 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_(
ProfileOAuth2TokenServiceFactory::GetForProfile(profile)),
signin_manager_(SigninManagerFactory::GetForProfile(profile)),
- token_request_time_(base::Time::Now()) {
+ token_request_time_(base::Time::Now()),
+ reauth_dialog_(nullptr) {
net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
SendRequest();
}
ForceSigninVerifier::~ForceSigninVerifier() {
Cancel();
+ if (dialog_observer_.get() && dialog_observer_->IsWidgetAlive())
+ reauth_dialog_->Close();
}
void ForceSigninVerifier::OnGetTokenSuccess(
@@ -90,6 +108,10 @@ bool ForceSigninVerifier::HasTokenBeenVerified() {
return has_token_verified_;
}
+void ForceSigninVerifier::AbortSignoutCountdownIfExisted() {
+ window_close_timer_.Stop();
+}
+
void ForceSigninVerifier::SendRequest() {
if (!ShouldSendRequest())
return;
@@ -107,8 +129,42 @@ 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();
+ reauth_dialog_ = chrome::ShowForcedReauthenticationDialog(
+ profile_, signin_manager_, countdown_duration);
+ dialog_observer_ =
+ base::MakeUnique<views::WidgetDeletionObserver>(reauth_dialog_);
+#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;
+ dialog_observer_.reset();
+ signin_manager_->SignOut(
+ signin_metrics::AUTHENTICATION_FAILED_WITH_FORCE_SIGNIN,
+ signin_metrics::SignoutDelete::IGNORE_METRIC);
}
OAuth2TokenService::Request* ForceSigninVerifier::GetRequestForTesting() {
@@ -122,3 +178,7 @@ net::BackoffEntry* ForceSigninVerifier::GetBackoffEntryForTesting() {
base::OneShotTimer* ForceSigninVerifier::GetOneShotTimerForTesting() {
return &backoff_request_timer_;
}
+
+base::OneShotTimer* ForceSigninVerifier::GetWindowCloseTimerForTesting() {
+ return &window_close_timer_;
+}

Powered by Google App Engine
This is Rietveld 408576698