[gnome-shell] authPrompt: move unlock and login user verifier code here
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] authPrompt: move unlock and login user verifier code here
- Date: Wed, 24 Jul 2013 10:01:29 +0000 (UTC)
commit 7e7295f259febf34c89659a9bcb05f9924fa1976
Author: Ray Strode <rstrode redhat com>
Date: Mon Jul 22 11:07:35 2013 -0400
authPrompt: move unlock and login user verifier code here
There's quite a bit of duplicated code between the login dialog
and the unlock dialog dealing with the various signals from the
ShellUserVerifier.
This commit moves that duplicated code into the AuthPrompt.
https://bugzilla.gnome.org/show_bug.cgi?id=704707
js/gdm/authPrompt.js | 152 +++++++++++++++++++++++++++++++++++++-
js/gdm/loginDialog.js | 198 ++++++++++++-------------------------------------
js/ui/unlockDialog.js | 121 ++----------------------------
3 files changed, 206 insertions(+), 265 deletions(-)
---
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
index 12acf44..3aa3ebf 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -6,6 +6,9 @@ const Signals = imports.signals;
const St = imports.gi.St;
const Animation = imports.ui.animation;
+const Batch = imports.gdm.batch;
+const GdmUtil = imports.gdm.util;
+const Params = imports.misc.params;
const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener;
const UserWidget = imports.ui.userWidget;
@@ -14,16 +17,53 @@ const DEFAULT_BUTTON_WELL_ICON_SIZE = 24;
const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
const DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
+const AuthPromptMode = {
+ UNLOCK_ONLY: 0,
+ UNLOCK_OR_LOG_IN: 1
+};
+
const AuthPrompt = new Lang.Class({
Name: 'AuthPrompt',
- _init: function() {
+ _init: function(gdmClient, mode) {
+ this.verifyingUser = false;
+
+ this._gdmClient = gdmClient;
+ this._mode = mode;
+
+ let reauthenticationOnly;
+ if (this._mode == AuthPromptMode.UNLOCK_ONLY)
+ reauthenticationOnly = true;
+ else if (this._mode == AuthPromptMode.UNLOCK_OR_LOG_IN)
+ reauthenticationOnly = false;
+
+ this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly:
reauthenticationOnly });
+
+ 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('show-login-hint', Lang.bind(this, this._onShowLoginHint));
+ this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._onHideLoginHint));
+
+ this.connect('next', Lang.bind(this, function() {
+ this.updateSensitivity(false);
+ this.startSpinning();
+ if (this._queryingService) {
+ this._userVerifier.answerQuery(this._queryingService, this._entry.text);
+ } else {
+ this._preemptiveAnswer = this._entry.text;
+ }
+ }));
+
this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
vertical: true });
+ this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this.actor.connect('key-press-event',
Lang.bind(this, function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Escape) {
- this.emit('cancel');
+ this.cancel();
}
}));
@@ -78,6 +118,10 @@ const AuthPrompt = new Lang.Class({
this._defaultButtonWell.add_child(this._spinner.actor);
},
+ _onDestroy: function() {
+ this._userVerifier.clear();
+ },
+
_initButtons: function() {
this.cancelButton = new St.Button({ style_class: 'modal-dialog-button',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
@@ -86,7 +130,7 @@ const AuthPrompt = new Lang.Class({
label: _("Cancel") });
this.cancelButton.connect('clicked',
Lang.bind(this, function() {
- this.emit('cancel');
+ this.cancel();
}));
this._buttonBox.add(this.cancelButton,
{ expand: false,
@@ -129,6 +173,67 @@ const AuthPrompt = new Lang.Class({
}));
},
+ _onAskQuestion: function(verifier, serviceName, question, passwordChar) {
+ if (this._preemptiveAnswer) {
+ this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer);
+ this._preemptiveAnswer = null;
+ return;
+ }
+
+ if (this._queryingService)
+ this.clear();
+
+ this._queryingService = serviceName;
+ this.setPasswordChar(passwordChar);
+ this.setQuestion(question);
+
+ if (this.verifyingUser)
+ this.cancelButton.show();
+ else
+ this.cancelButton.hide();
+
+ if (passwordChar) {
+ if (this._mode == AuthPromptMode.UNLOCK_ONLY)
+ this.nextButton.label = _("Unlock");
+ else if (this._mode == AuthPromptMode.UNLOCK_OR_LOG_IN)
+ this.nextButton.label = C_("button", "Sign In");
+ } else {
+ this.nextButton.label = _("Next");
+ }
+
+ this.updateSensitivity(true);
+ this.emit('prompted');
+ },
+
+ _onShowMessage: function(userVerifier, message, styleClass) {
+ this.setMessage(message, styleClass);
+ },
+
+ _onVerificationFailed: function() {
+ this.clear();
+
+ this.updateSensitivity(true);
+ this.setActorInDefaultButtonWell(null);
+ this.userVerified = false;
+ },
+
+ _onVerificationComplete: function() {
+ this.userVerified = true;
+ },
+
+ _onReset: function() {
+ if (!this.userVerified)
+ this.reset();
+ },
+
+ _onShowLoginHint: function(verifier, message) {
+ this.setHint(message);
+ },
+
+ _onHideLoginHint: function() {
+ this.setHint(null);
+ },
+
addActorToDefaultButtonWell: function(actor) {
this._defaultButtonWell.add_child(actor);
@@ -278,9 +383,16 @@ const AuthPrompt = new Lang.Class({
},
reset: function() {
+ this.verifyingUser = false;
+ this.userVerified = false;
+ this._queryingService = null;
+ this.clear();
this._message.opacity = 0;
this.setUser(null);
this.stopSpinning();
+ this.setHint(null);
+
+ this.emit('reset');
},
addCharacter: function(unichar) {
@@ -289,6 +401,40 @@ const AuthPrompt = new Lang.Class({
this._entry.grab_key_focus();
this._entry.clutter_text.insert_unichar(unichar);
+ },
+
+ begin: function(params) {
+ params = Params.parse(params, { userName: null,
+ hold: null });
+
+ this.updateSensitivity(false);
+
+ let hold = params.hold;
+ if (!hold)
+ hold = new Batch.Hold();
+
+ this._userVerifier.begin(params.userName, hold);
+ this.verifyingUser = true;
+ },
+
+ finish: function(onComplete) {
+ if (!this._userVerifier.hasPendingMessages) {
+ onComplete();
+ return;
+ }
+
+ let signalId = this._userVerifier.connect('no-more-messages',
+ Lang.bind(this, function() {
+ this._userVerifier.disconnect(signalId);
+ onComplete();
+ }));
+ },
+
+ cancel: function() {
+ if (this.verifyingUser)
+ this._userVerifier.cancel();
+
+ this.reset();
}
});
Signals.addSignalMethods(AuthPrompt.prototype);
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index 6346065..46478aa 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -401,10 +401,10 @@ const LoginDialog = new Lang.Class({
parentActor.add_child(this.actor);
this._userManager = AccountsService.UserManager.get_default()
- this._greeterClient = new Gdm.Client();
+ let gdmClient = new Gdm.Client();
if (GLib.getenv('GDM_GREETER_TEST') != '1') {
- this._greeter = this._greeterClient.get_greeter_sync(null);
+ this._greeter = gdmClient.get_greeter_sync(null);
this._greeter.connect('default-session-name-changed',
Lang.bind(this, this._onDefaultSessionChanged));
@@ -415,15 +415,6 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, this._onTimedLoginRequested));
}
- this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient);
- this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion));
- this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage));
- this._userVerifier.connect('verification-failed', Lang.bind(this, this._verificationFailed));
- this._userVerifier.connect('reset', Lang.bind(this, this._reset));
- this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
- this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
- this._verifyingUser = false;
-
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
@@ -458,12 +449,10 @@ const LoginDialog = new Lang.Class({
x_fill: true,
y_fill: true });
- this._authPrompt = new AuthPrompt.AuthPrompt();
+ this._authPrompt = new AuthPrompt.AuthPrompt(gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_OR_LOGIN);
+ this._authPrompt.connect('prompted', Lang.bind(this, this._onPrompted));
+ this._authPrompt.connect('reset', Lang.bind(this, this._reset));
this._authPrompt.hide();
- this._authPrompt.connect('cancel',
- Lang.bind(this, function() {
- this.cancel();
- }));
this._authPrompt.actor.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
align_axis:
Clutter.AlignAxis.BOTH,
@@ -540,7 +529,7 @@ const LoginDialog = new Lang.Class({
if (disableUserList != this._disableUserList) {
this._disableUserList = disableUserList;
- if (!this._verifyingUser)
+ if (!this._authPrompt.verifyingUser)
this._reset();
}
},
@@ -575,14 +564,24 @@ const LoginDialog = new Lang.Class({
this._updateLogoTexture(this._textureCache, this._logoFileUri);
},
+ _onPrompted: function() {
+ this._sessionMenuButton.updateSensitivity(true);
+
+ if (this._shouldShowSessionMenuButton())
+ this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor);
+
+ this._authPrompt.cancelButton.show();
+
+ this._showPrompt();
+ },
+
_reset: function() {
- this._userVerifier.clear();
+ if (this._authPrompt.verifyingUser)
+ return;
- this._updateSensitivity(true);
- this._authPrompt.reset();
+ this._sessionMenuButton.updateSensitivity(true);
this._user = null;
- this._verifyingUser = false;
if (this._disableUserList)
this._hideUserListAndLogIn();
@@ -590,38 +589,12 @@ const LoginDialog = new Lang.Class({
this._showUserList();
},
- _verificationFailed: function() {
- this._authPrompt.clear();
-
- this._updateSensitivity(true);
- this._authPrompt.setActorInDefaultButtonWell(null);
- },
-
_onDefaultSessionChanged: function(client, sessionId) {
this._sessionMenuButton.setActiveSession(sessionId);
},
- _showMessage: function(userVerifier, message, styleClass) {
- this._authPrompt.setMessage(message, styleClass);
- },
-
- _showLoginHint: function(verifier, message) {
- this._authPrompt.setHint(message);
- },
-
- _hideLoginHint: function() {
- this._authPrompt.setHint(null);
- },
-
- cancel: function() {
- if (this._verifyingUser)
- this._userVerifier.cancel();
- else
- this._reset();
- },
-
_shouldShowSessionMenuButton: function() {
- if (this._verifyingUser)
+ if (this._authPrompt.verifyingUser)
return true;
if (!this._user)
@@ -633,75 +606,15 @@ const LoginDialog = new Lang.Class({
return true;
},
- _showPrompt: function(forSecret) {
+ _showPrompt: function() {
+ if (this._authPrompt.actor.visible)
+ return;
this._authPrompt.actor.opacity = 0;
this._authPrompt.actor.show();
Tweener.addTween(this._authPrompt.actor,
{ opacity: 255,
time: _FADE_ANIMATION_TIME,
transition: 'easeOutQuad' });
-
- let hold = new Batch.Hold();
- let tasks = [function() {
- this._preparePrompt(forSecret, hold);
- },
-
- hold];
-
- let batch = new Batch.ConcurrentBatch(this, tasks);
-
- return batch.run();
- },
-
- _preparePrompt: function(forSecret, hold) {
- if (!this._disableUserList || this._verifyingUser) {
- this._authPrompt.cancelButton.show();
- } else {
- this._authPrompt.cancelButton.hide();
- }
-
- if (forSecret) {
- this._authPrompt.nextButton.label = C_("button", "Sign In");
- } else {
- this._authPrompt.nextButton.label = _("Next");
- }
-
- let signalId = this._authPrompt.connect('next', Lang.bind(this, function() {
- this._authPrompt.disconnect(signalId);
- hold.release();
- }));
- },
-
- _updateSensitivity: function(sensitive) {
- this._sessionMenuButton.updateSensitivity(sensitive);
- this._authPrompt.updateSensitivity(sensitive);
- },
-
- _askQuestion: function(verifier, serviceName, question, passwordChar) {
- this._authPrompt.setPasswordChar(passwordChar);
- this._authPrompt.setQuestion(question);
-
- this._updateSensitivity(true);
-
- if (this._shouldShowSessionMenuButton())
- this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor);
- else
- this._authPrompt.setActorInDefaultButtonWell(null);
-
- let tasks = [function() {
- return this._showPrompt(!!passwordChar);
- },
-
- function() {
- let text = this._authPrompt.getAnswer();
-
- this._updateSensitivity(false);
- this._authPrompt.startSpinning();
- this._userVerifier.answerQuery(serviceName, text);
- }];
-
- let batch = new Batch.ConsecutiveBatch(this, tasks);
- return batch.run();
},
_showRealmLoginHint: function(realmManager, hint) {
@@ -714,7 +627,7 @@ const LoginDialog = new Lang.Class({
// Translators: this message is shown below the username entry field
// to clue the user in on how to login to the local network realm
- this._showLoginHint(null, _("(e.g., user or %s)").format(hint));
+ this._authPrompt.setHint(_("(e.g., user or %s)").format(hint));
},
_askForUsernameAndLogIn: function() {
@@ -722,25 +635,24 @@ const LoginDialog = new Lang.Class({
this._authPrompt.setQuestion(_("Username: "));
let realmManager = new Realmd.Manager();
- let signalId = realmManager.connect('login-format-changed',
- Lang.bind(this, this._showRealmLoginHint));
+ let realmSignalId = realmManager.connect('login-format-changed',
+ Lang.bind(this, this._showRealmLoginHint));
this._showRealmLoginHint(realmManager.loginFormat);
- let tasks = [this._showPrompt,
-
- function() {
- let userName = this._authPrompt.getAnswer();
- this._authPrompt._entry.reactive = false;
- return this._beginVerificationForUser(userName);
- },
-
- function() {
- realmManager.disconnect(signalId)
- realmManager.release();
- }];
+ let nextSignalId = this._authPrompt.connect('next',
+ Lang.bind(this, function() {
+ this._authPrompt.disconnect(nextSignalId);
+ this._authPrompt.updateSensitivity(false);
+ let answer = this._authPrompt.getAnswer();
+ this._authPrompt.clear();
+ this._authPrompt.startSpinning();
+ this._authPrompt.begin({ userName: answer });
- let batch = new Batch.ConsecutiveBatch(this, tasks);
- return batch.run();
+ realmManager.disconnect(realmSignalId)
+ realmManager.release();
+ }));
+ this._authPrompt.cancelButton.hide();
+ this._showPrompt();
},
_startSession: function(serviceName) {
@@ -767,15 +679,9 @@ const LoginDialog = new Lang.Class({
},
_onSessionOpened: function(client, serviceName) {
- if (!this._userVerifier.hasPendingMessages) {
+ this._authPrompt.finish(Lang.bind(this, function() {
this._startSession(serviceName);
- } else {
- let signalId = this._userVerifier.connect('no-more-messages',
- Lang.bind(this, function() {
- this._userVerifier.disconnect(signalId);
- this._startSession(serviceName);
- }));
- }
+ }));
},
_waitForItemForUser: function(userName) {
@@ -922,23 +828,15 @@ const LoginDialog = new Lang.Class({
this._userList.actor.grab_key_focus();
},
- _beginVerificationForUser: function(userName) {
- let hold = new Batch.Hold();
-
- this._userVerifier.begin(userName, hold);
- this._verifyingUser = true;
- return hold;
- },
-
_beginVerificationForItem: function(item) {
this._authPrompt.setUser(item.user);
- let tasks = [function() {
- let userName = item.user.get_user_name();
- return this._beginVerificationForUser(userName);
- }];
- let batch = new Batch.ConsecutiveBatch(this, tasks);
- return batch.run();
+ let userName = item.user.get_user_name();
+ let hold = new Batch.Hold();
+
+ this._authPrompt.begin({ userName: userName,
+ hold: hold });
+ return hold;
},
_onUserListActivated: function(activatedItem) {
diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
index 86ac19f..1fc55eb 100644
--- a/js/ui/unlockDialog.js
+++ b/js/ui/unlockDialog.js
@@ -42,33 +42,17 @@ const UnlockDialog = new Lang.Class({
this._userName = GLib.get_user_name();
this._user = this._userManager.get_user(this._userName);
- this._firstQuestion = true;
-
- this._greeterClient = new Gdm.Client();
- this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient, { reauthenticationOnly: true
});
- this._userVerified = false;
-
- this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion));
- this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage));
- this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete));
- this._userVerifier.connect('verification-failed', Lang.bind(this, this._onVerificationFailed));
- this._userVerifier.connect('reset', Lang.bind(this, this._onReset));
-
- this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
- this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
-
this._promptBox = new St.BoxLayout({ vertical: true });
this.actor.add_child(this._promptBox);
this._promptBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
align_axis: Clutter.AlignAxis.BOTH,
factor: 0.5 }));
- this._authPrompt = new AuthPrompt.AuthPrompt();
+ this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(),
AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
+ this._authPrompt.connect('reset', Lang.bind(this, this._onReset));
this._authPrompt.setUser(this._user);
this._authPrompt.setPasswordChar('\u25cf');
this._authPrompt.nextButton.label = _("Unlock");
- this._authPrompt.connect('cancel', Lang.bind(this, this._escape));
- this._authPrompt.connect('next', Lang.bind(this, this._doUnlock));
this._promptBox.add_child(this._authPrompt.actor);
@@ -90,11 +74,9 @@ const UnlockDialog = new Lang.Class({
this._otherUserButton = null;
}
+ this._authPrompt.begin({ userName: this._userName });
this._updateSensitivity(true);
- let batch = new Batch.Hold();
- this._userVerifier.begin(this._userName, batch);
-
Main.ctrlAltTabManager.addGroup(this.actor, _("Unlock Window"), 'dialog-password-symbolic');
this._idleMonitor = new GnomeDesktop.IdleMonitor();
@@ -110,88 +92,13 @@ const UnlockDialog = new Lang.Class({
}
},
- _showMessage: function(userVerifier, message, styleClass) {
- this._authPrompt.setMessage(message, styleClass);
- },
-
- _onAskQuestion: function(verifier, serviceName, question, passwordChar) {
- if (this._firstQuestion && this._firstQuestionAnswer) {
- this._userVerifier.answerQuery(serviceName, this._firstQuestionAnswer);
- this._firstQuestionAnswer = null;
- this._firstQuestion = false;
- return;
- }
-
- if (!this._firstQuestion)
- this._promptEntry.text = '';
- else
- this._firstQuestion = false;
-
- this._authPrompt.setPasswordChar(passwordChar);
- this._authPrompt.setQuestion(question);
-
- this._currentQuery = serviceName;
-
- this._updateSensitivity(true);
- this._authPrompt.stopSpinning();
- },
-
- _showLoginHint: function(verifier, message) {
- this._authPrompt.setHint(message);
- },
-
- _hideLoginHint: function() {
- this._authPrompt.setHint(null);
- },
-
- _doUnlock: function() {
- if (this._firstQuestion) {
- // we haven't received a query yet, so stash the answer
- // and make ourself non-reactive
- // the actual reply to GDM will be sent as soon as asked
- this._firstQuestionAnswer = this._promptEntry.text;
- this._updateSensitivity(false);
- this._authPrompt.startSpinning();
- return;
- }
-
- if (!this._currentQuery)
- return;
-
- let query = this._currentQuery;
- this._currentQuery = null;
-
- this._updateSensitivity(false);
- this._authPrompt.startSpinning();
-
- this._userVerifier.answerQuery(query, this._authPrompt.getAnswer());
- },
-
- _onVerificationComplete: function() {
- this._userVerified = true;
- },
-
_onReset: function() {
- if (!this._userVerified) {
- this._userVerifier.clear();
- this.emit('failed');
- }
- },
-
- _onVerificationFailed: function() {
- this._currentQuery = null;
- this._firstQuestion = true;
- this._userVerified = false;
-
- this._authPrompt.clear();
-
- this._updateSensitivity(false);
- this._authPrompt.stopSpinning();
+ this.emit('failed');
},
_escape: function() {
if (this.allowCancel) {
- this._userVerifier.cancel();
+ this._authPrompt.cancel();
this.emit('failed');
}
},
@@ -199,12 +106,11 @@ const UnlockDialog = new Lang.Class({
_otherUserClicked: function(button, event) {
Gdm.goto_login_session_sync(null);
- this._userVerifier.cancel();
- this.emit('failed');
+ this._authPrompt.cancel();
},
destroy: function() {
- this._userVerifier.clear();
+ this.popModal();
this.actor.destroy();
if (this._idleWatchId) {
@@ -214,7 +120,7 @@ const UnlockDialog = new Lang.Class({
},
cancel: function() {
- this._userVerifier.cancel(null);
+ this._authPrompt.cancel();
this.destroy();
},
@@ -224,16 +130,7 @@ const UnlockDialog = new Lang.Class({
},
finish: function(onComplete) {
- if (!this._userVerifier.hasPendingMessages) {
- onComplete();
- return;
- }
-
- let signalId = this._userVerifier.connect('no-more-messages',
- Lang.bind(this, function() {
- this._userVerifier.disconnect(signalId);
- onComplete();
- }));
+ this._authPrompt.finish(onComplete);
},
open: function(timestamp) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]