From 92c283da4ded9fd1d8301f7e7c6a842bd9a857ea Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Fri, 7 Mar 2014 16:14:05 -0500 Subject: [PATCH] gdm: Move the verificationStatus state machine to ShellUserVerifier The idea here is that the ShellUserVerifier does all the logic of identifying the user, and the AuthPrompt is simply the UI on top of it. Thus, it makes sense for more of the state machine to be driven by the ShellUserVerifier. This will become more apparent in the next commit. --- js/gdm/authPrompt.js | 32 +++++++------------------------- js/gdm/loginDialog.js | 8 ++++---- js/gdm/util.js | 13 ++++++++++++- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js index 4a4f761e6..1756a67a4 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -24,13 +24,6 @@ const AuthPromptMode = { UNLOCK_OR_LOG_IN: 1 }; -const AuthPromptStatus = { - NOT_VERIFYING: 0, - VERIFYING: 1, - VERIFICATION_FAILED: 2, - VERIFICATION_SUCCEEDED: 3 -}; - const BeginRequestType = { PROVIDE_USERNAME: 0, DONT_PROVIDE_USERNAME: 1 @@ -40,8 +33,6 @@ const AuthPrompt = new Lang.Class({ Name: 'AuthPrompt', _init: function(gdmClient, mode) { - this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; - this._gdmClient = gdmClient; this._mode = mode; @@ -56,7 +47,6 @@ const AuthPrompt = new Lang.Class({ this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion)); this._userVerifier.connect('show-message', Lang.bind(this, this._onShowMessage)); this._userVerifier.connect('verification-failed', Lang.bind(this, this._onVerificationFailed)); - this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete)); this._userVerifier.connect('reset', Lang.bind(this, this._onReset)); this._userVerifier.connect('smartcard-status-changed', Lang.bind(this, this._onSmartcardStatusChanged)); this._userVerifier.connect('ovirt-user-authenticated', Lang.bind(this, this._onOVirtUserAuthenticated)); @@ -133,6 +123,10 @@ const AuthPrompt = new Lang.Class({ this._defaultButtonWell.add_child(this._spinner.actor); }, + get verificationStatus() { + return this._userVerifier.verificationStatus; + }, + _onDestroy: function() { this._userVerifier.clear(); this._userVerifier.disconnectAll(); @@ -222,7 +216,7 @@ const AuthPrompt = new Lang.Class({ }, _onOVirtUserAuthenticated: function() { - if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) + if (this.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_SUCCEEDED) this.reset(); }, @@ -237,11 +231,11 @@ const AuthPrompt = new Lang.Class({ // 2) Don't reset if we've already succeeded at verification and // the user is getting logged in. if (this._userVerifier.serviceIsDefault(GdmUtil.SMARTCARD_SERVICE_NAME) && - this.verificationStatus == AuthPromptStatus.VERIFYING && + this.verificationStatus == GdmUtil.VerificationStatus.VERIFYING && this.smartcardDetected) return; - if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) + if (this.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_SUCCEEDED) this.reset(); }, @@ -256,17 +250,11 @@ const AuthPrompt = new Lang.Class({ this.updateSensitivity(true); this.setActorInDefaultButtonWell(null); - this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; this.emit('failed'); }, - _onVerificationComplete: function() { - this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED; - }, - _onReset: function() { - this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; this.reset(); }, @@ -430,11 +418,6 @@ const AuthPrompt = new Lang.Class({ }, reset: function() { - if (this.verificationStatus == AuthPromptStatus.VERIFYING) - this._userVerifier.cancel(); - - this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; - this._queryingService = null; this.clear(); this._message.opacity = 0; @@ -473,7 +456,6 @@ const AuthPrompt = new Lang.Class({ this.updateSensitivity(false); this._userVerifier.begin(userName); - this.verificationStatus = AuthPromptStatus.VERIFYING; }, finish: function(onComplete) { diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js index 0dd400a8a..84a38a6b1 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -499,7 +499,7 @@ const LoginDialog = new Lang.Class({ if (disableUserList != this._disableUserList) { this._disableUserList = disableUserList; - if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) + if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.NOT_VERIFYING) this._authPrompt.reset(); } }, @@ -509,7 +509,7 @@ const LoginDialog = new Lang.Class({ // Hide the cancel button if the user list is disabled and we're asking for // a username - if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING && this._disableUserList) + if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.NOT_VERIFYING && this._disableUserList) cancelVisible = false; else cancelVisible = true; @@ -574,8 +574,8 @@ const LoginDialog = new Lang.Class({ }, _shouldShowSessionMenuButton: function() { - if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING && - this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED) + if (this._authPrompt.verificationStatus != GdmUtil.VerificationStatus.VERIFYING && + this._authPrompt.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_FAILED) return false; if (this._user && this._user.is_loaded && this._user.is_logged_in()) diff --git a/js/gdm/util.js b/js/gdm/util.js index 9e2e069ea..c0f4703c2 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -119,6 +119,13 @@ function cloneAndFadeOutActor(actor) { return hold; } +const VerificationStatus = { + NOT_VERIFYING: 0, + VERIFYING: 1, + VERIFICATION_FAILED: 2, + VERIFICATION_SUCCEEDED: 3 +}; + const ShellUserVerifier = new Lang.Class({ Name: 'ShellUserVerifier', @@ -161,12 +168,15 @@ const ShellUserVerifier = new Lang.Class({ _reset: function() { // Clear previous attempts to authenticate + this.verificationStatus = VerificationStatus.NOT_VERIFYING; this._failCounter = 0; this._updateDefaultService(); this.emit('reset'); }, begin: function(userName) { + this.verificationStatus = VerificationStatus.VERIFYING; + this._cancellable = new Gio.Cancellable(); this._userName = userName; this.reauthenticating = false; @@ -479,7 +489,7 @@ const ShellUserVerifier = new Lang.Class({ }, _onVerificationComplete: function() { - this.emit('verification-complete'); + this.verificationStatus = VerificationStatus.VERIFICATION_SUCCEEDED; }, _retry: function() { @@ -496,6 +506,7 @@ const ShellUserVerifier = new Lang.Class({ let canRetry = retry && this._userName && this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY); + this.verificationStatus = VerificationStatus.VERIFICATION_FAILED; this.emit('verification-failed'); this._doAfterPendingMessages(Lang.bind(this, function() {