[gnome-shell/gnome-3-8] polkitAgent: Allow retrying mistyped passwords



commit 17aa8e0488d83feb9ad34f345fc7b848bb2b4aa5
Author: Stef Walter <stefw gnome org>
Date:   Wed Apr 17 11:05:36 2013 +0200

    polkitAgent: Allow retrying mistyped passwords
    
    Don't hide the polkit agent window when someone mistypes their password.
    Allow them to try again. The user can cancel at any point.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=684431

 js/ui/components/polkitAgent.js |   62 ++++++++++++++------------------------
 1 files changed, 23 insertions(+), 39 deletions(-)
---
diff --git a/js/ui/components/polkitAgent.js b/js/ui/components/polkitAgent.js
index 15307f3..20e8b2a 100644
--- a/js/ui/components/polkitAgent.js
+++ b/js/ui/components/polkitAgent.js
@@ -31,7 +31,6 @@ const AuthenticationDialog = new Lang.Class({
         this.message = message;
         this.userNames = userNames;
         this._wasDismissed = false;
-        this._completed = false;
 
         let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
                                                 vertical: false });
@@ -177,16 +176,16 @@ const AuthenticationDialog = new Lang.Class({
 
         this._identityToAuth = Polkit.UnixUser.new_for_name(userName);
         this._cookie = cookie;
+    },
 
+    performAuthentication: function() {
+        this.destroySession();
         this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
                                                   cookie: this._cookie });
         this._session.connect('completed', Lang.bind(this, this._onSessionCompleted));
         this._session.connect('request', Lang.bind(this, this._onSessionRequest));
         this._session.connect('show-error', Lang.bind(this, this._onSessionShowError));
         this._session.connect('show-info', Lang.bind(this, this._onSessionShowInfo));
-    },
-
-    startAuthentication: function() {
         this._session.initiate();
     },
 
@@ -208,14 +207,14 @@ const AuthenticationDialog = new Lang.Class({
             log('polkitAuthenticationAgent: Failed to show modal dialog.' +
                 ' Dismissing authentication request for action-id ' + this.actionId +
                 ' cookie ' + this._cookie);
-            this._emitDone(false, true);
+            this._emitDone(true);
         }
     },
 
-    _emitDone: function(keepVisible, dismissed) {
+    _emitDone: function(dismissed) {
         if (!this._doneEmitted) {
             this._doneEmitted = true;
-            this.emit('done', keepVisible, dismissed);
+            this.emit('done', dismissed);
         }
     },
 
@@ -244,12 +243,16 @@ const AuthenticationDialog = new Lang.Class({
     },
 
     _onSessionCompleted: function(session, gainedAuthorization) {
-        if (this._completed)
+        if (this._completed || this._doneEmitted)
             return;
 
         this._completed = true;
 
-        if (!gainedAuthorization) {
+        /* Yay, all done */
+        if (gainedAuthorization) {
+            this._emitDone(false);
+
+        } else {
             /* Unless we are showing an existing error message from the PAM
              * module (the PAM module could be reporting the authentication
              * error providing authentication-method specific information),
@@ -265,8 +268,10 @@ const AuthenticationDialog = new Lang.Class({
                 this._infoMessageLabel.hide();
                 this._nullMessageLabel.hide();
             }
+
+            /* Try and authenticate again */
+            this.performAuthentication();
         }
-        this._emitDone(!gainedAuthorization, false);
     },
 
     _onSessionRequest: function(session, request, echo_on) {
@@ -310,6 +315,7 @@ const AuthenticationDialog = new Lang.Class({
         if (this._session) {
             if (!this._completed)
                 this._session.cancel();
+            this._completed = false;
             this._session = null;
         }
     },
@@ -324,7 +330,7 @@ const AuthenticationDialog = new Lang.Class({
     cancel: function() {
         this._wasDismissed = true;
         this.close(global.get_current_time());
-        this._emitDone(false, true);
+        this._emitDone(true);
     },
 });
 Signals.addSignalMethods(AuthenticationDialog.prototype);
@@ -334,7 +340,6 @@ const AuthenticationAgent = new Lang.Class({
 
     _init: function() {
         this._currentDialog = null;
-        this._isCompleting = false;
         this._handle = null;
         this._native = new Shell.PolkitAuthenticationAgent();
         this._native.connect('initiate', Lang.bind(this, this._onInitiate));
@@ -371,45 +376,24 @@ const AuthenticationAgent = new Lang.Class({
         // discussion.
 
         this._currentDialog.connect('done', Lang.bind(this, this._onDialogDone));
-        this._currentDialog.startAuthentication();
+        this._currentDialog.performAuthentication();
     },
 
     _onCancel: function(nativeAgent) {
-        this._completeRequest(false, false);
+        this._completeRequest(false);
     },
 
-    _onDialogDone: function(dialog, keepVisible, dismissed) {
-        this._completeRequest(keepVisible, dismissed);
+    _onDialogDone: function(dialog, dismissed) {
+        this._completeRequest(dismissed);
     },
 
-    _reallyCompleteRequest: function(dismissed) {
+    _completeRequest: function(dismissed) {
         this._currentDialog.close();
         this._currentDialog.destroySession();
         this._currentDialog = null;
-        this._isCompleting = false;
 
-        this._native.complete(dismissed)
+        this._native.complete(dismissed);
     },
-
-    _completeRequest: function(keepVisible, wasDismissed) {
-        if (this._isCompleting)
-            return;
-
-        this._isCompleting = true;
-
-        if (keepVisible) {
-            // Give the user 2 seconds to read 'Authentication Failure' before
-            // dismissing the dialog
-            Mainloop.timeout_add(2000,
-                                 Lang.bind(this,
-                                           function() {
-                                               this._reallyCompleteRequest(wasDismissed);
-                                               return false;
-                                           }));
-        } else {
-            this._reallyCompleteRequest(wasDismissed);
-        }
-    }
 });
 
 const Component = AuthenticationAgent;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]