authPrompt: add support for auth without username

This commit introduces a new BeginRequestType enum which gets
passed to the 'reset' signal to specify whether
a username should be provided to the begin() method and changes
the loginDialog to comply.

Currently, the signal only ever gets emitted with

AuthPrompt.BeginRequestType.PROVIDE_USERNAME

but that will change in the future when providing smartcard
support.

https://bugzilla.gnome.org/show_bug.cgi?id=683437
This commit is contained in:
Ray Strode 2013-07-28 17:49:50 -04:00
parent 1104a385fa
commit 93f072d1fc
3 changed files with 43 additions and 10 deletions

View File

@ -31,6 +31,11 @@ const AuthPromptStatus = {
VERIFICATION_SUCCEEDED: 3 VERIFICATION_SUCCEEDED: 3
}; };
const BeginRequestType = {
PROVIDE_USERNAME: 0,
DONT_PROVIDE_USERNAME: 1
};
const AuthPrompt = new Lang.Class({ const AuthPrompt = new Lang.Class({
Name: 'AuthPrompt', Name: 'AuthPrompt',
@ -431,7 +436,7 @@ const AuthPrompt = new Lang.Class({
if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED) if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED)
this.emit('failed'); this.emit('failed');
this.emit('reset'); this.emit('reset', BeginRequestType.PROVIDE_USERNAME);
}, },
addCharacter: function(unichar) { addCharacter: function(unichar) {

View File

@ -475,7 +475,12 @@ const LoginDialog = new Lang.Class({
x_align: St.Align.START, x_align: St.Align.START,
x_fill: true }); x_fill: true });
this._notListedButton.connect('clicked', Lang.bind(this, this._hideUserListAndLogIn)); this._notListedButton.connect('clicked',
Lang.bind(this, function() {
this._authPrompt.cancelButton.show();
this._hideUserListAndLogIn();
}));
this._notListedButton.hide(); this._notListedButton.hide();
this._userSelectionBox.add(this._notListedButton, this._userSelectionBox.add(this._notListedButton,
@ -585,15 +590,17 @@ const LoginDialog = new Lang.Class({
this._showPrompt(); this._showPrompt();
}, },
_onReset: function() { _onReset: function(authPrompt, beginRequest) {
this._sessionMenuButton.updateSensitivity(true); this._sessionMenuButton.updateSensitivity(true);
this._user = null; this._user = null;
if (this._disableUserList) if (this._disableUserList) {
this._authPrompt.cancelButton.hide();
this._hideUserListAndLogIn(); this._hideUserListAndLogIn();
else } else {
this._showUserList(); this._showUserList();
}
}, },
_onDefaultSessionChanged: function(client, sessionId) { _onDefaultSessionChanged: function(client, sessionId) {
@ -634,7 +641,7 @@ const LoginDialog = new Lang.Class({
this._authPrompt.setHint(_("(e.g., user or %s)").format(hint)); this._authPrompt.setHint(_("(e.g., user or %s)").format(hint));
}, },
_askForUsernameAndLogIn: function() { _askForUsernameAndBeginVerification: function() {
this._authPrompt.setPasswordChar(''); this._authPrompt.setPasswordChar('');
this._authPrompt.setQuestion(_("Username: ")); this._authPrompt.setQuestion(_("Username: "));
@ -818,11 +825,20 @@ const LoginDialog = new Lang.Class({
this._userSelectionBox.visible = expanded; this._userSelectionBox.visible = expanded;
}, },
_hideUserListAndLogIn: function() { _hideUserList: function() {
this._setUserListExpanded(false); this._setUserListExpanded(false);
if (this._userSelectionBox.visible) if (this._userSelectionBox.visible)
GdmUtil.cloneAndFadeOutActor(this._userSelectionBox); GdmUtil.cloneAndFadeOutActor(this._userSelectionBox);
this._askForUsernameAndLogIn(); },
_hideUserListAskForUsernameAndBeginVerification: function() {
this._hideUserList();
this._askForUsernameAndBeginVerification();
},
_hideUserListAndBeginVerification: function() {
this._hideUserList();
this._authPrompt.begin();
}, },
_showUserList: function() { _showUserList: function() {

View File

@ -51,7 +51,7 @@ const UnlockDialog = new Lang.Class({
this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY); this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
this._authPrompt.connect('failed', Lang.bind(this, this._fail)); this._authPrompt.connect('failed', Lang.bind(this, this._fail));
this._authPrompt.connect('cancelled', Lang.bind(this, this._fail)); this._authPrompt.connect('cancelled', Lang.bind(this, this._fail));
this._authPrompt.setUser(this._user); this._authPrompt.connect('reset', Lang.bind(this, this._onReset));
this._authPrompt.setPasswordChar('\u25cf'); this._authPrompt.setPasswordChar('\u25cf');
this._authPrompt.nextButton.label = _("Unlock"); this._authPrompt.nextButton.label = _("Unlock");
@ -75,7 +75,7 @@ const UnlockDialog = new Lang.Class({
this._otherUserButton = null; this._otherUserButton = null;
} }
this._authPrompt.begin({ userName: this._userName }); this._authPrompt.reset();
this._updateSensitivity(true); this._updateSensitivity(true);
Main.ctrlAltTabManager.addGroup(this.actor, _("Unlock Window"), 'dialog-password-symbolic'); Main.ctrlAltTabManager.addGroup(this.actor, _("Unlock Window"), 'dialog-password-symbolic');
@ -97,6 +97,18 @@ const UnlockDialog = new Lang.Class({
this.emit('failed'); this.emit('failed');
}, },
_onReset: function(authPrompt, beginRequest) {
let userName;
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
this._authPrompt.setUser(this._user);
userName = this._userName;
} else {
userName = null;
}
this._authPrompt.begin({ userName: userName });
},
_escape: function() { _escape: function() {
if (this.allowCancel) if (this.allowCancel)
this._authPrompt.cancel(); this._authPrompt.cancel();