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
This commit is contained in:
parent
d30cb2d4d9
commit
7e7295f259
@ -6,6 +6,9 @@ const Signals = imports.signals;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
const Animation = imports.ui.animation;
|
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 ShellEntry = imports.ui.shellEntry;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const UserWidget = imports.ui.userWidget;
|
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_DELAY = 1.0;
|
||||||
const DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
const DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
||||||
|
|
||||||
|
const AuthPromptMode = {
|
||||||
|
UNLOCK_ONLY: 0,
|
||||||
|
UNLOCK_OR_LOG_IN: 1
|
||||||
|
};
|
||||||
|
|
||||||
const AuthPrompt = new Lang.Class({
|
const AuthPrompt = new Lang.Class({
|
||||||
Name: 'AuthPrompt',
|
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',
|
this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
|
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||||
this.actor.connect('key-press-event',
|
this.actor.connect('key-press-event',
|
||||||
Lang.bind(this, function(actor, event) {
|
Lang.bind(this, function(actor, event) {
|
||||||
if (event.get_key_symbol() == Clutter.KEY_Escape) {
|
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);
|
this._defaultButtonWell.add_child(this._spinner.actor);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onDestroy: function() {
|
||||||
|
this._userVerifier.clear();
|
||||||
|
},
|
||||||
|
|
||||||
_initButtons: function() {
|
_initButtons: function() {
|
||||||
this.cancelButton = new St.Button({ style_class: 'modal-dialog-button',
|
this.cancelButton = new St.Button({ style_class: 'modal-dialog-button',
|
||||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||||
@ -86,7 +130,7 @@ const AuthPrompt = new Lang.Class({
|
|||||||
label: _("Cancel") });
|
label: _("Cancel") });
|
||||||
this.cancelButton.connect('clicked',
|
this.cancelButton.connect('clicked',
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this.emit('cancel');
|
this.cancel();
|
||||||
}));
|
}));
|
||||||
this._buttonBox.add(this.cancelButton,
|
this._buttonBox.add(this.cancelButton,
|
||||||
{ expand: false,
|
{ 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) {
|
addActorToDefaultButtonWell: function(actor) {
|
||||||
this._defaultButtonWell.add_child(actor);
|
this._defaultButtonWell.add_child(actor);
|
||||||
|
|
||||||
@ -278,9 +383,16 @@ const AuthPrompt = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
reset: function() {
|
reset: function() {
|
||||||
|
this.verifyingUser = false;
|
||||||
|
this.userVerified = false;
|
||||||
|
this._queryingService = null;
|
||||||
|
this.clear();
|
||||||
this._message.opacity = 0;
|
this._message.opacity = 0;
|
||||||
this.setUser(null);
|
this.setUser(null);
|
||||||
this.stopSpinning();
|
this.stopSpinning();
|
||||||
|
this.setHint(null);
|
||||||
|
|
||||||
|
this.emit('reset');
|
||||||
},
|
},
|
||||||
|
|
||||||
addCharacter: function(unichar) {
|
addCharacter: function(unichar) {
|
||||||
@ -289,6 +401,40 @@ const AuthPrompt = new Lang.Class({
|
|||||||
|
|
||||||
this._entry.grab_key_focus();
|
this._entry.grab_key_focus();
|
||||||
this._entry.clutter_text.insert_unichar(unichar);
|
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);
|
Signals.addSignalMethods(AuthPrompt.prototype);
|
||||||
|
@ -401,10 +401,10 @@ const LoginDialog = new Lang.Class({
|
|||||||
parentActor.add_child(this.actor);
|
parentActor.add_child(this.actor);
|
||||||
|
|
||||||
this._userManager = AccountsService.UserManager.get_default()
|
this._userManager = AccountsService.UserManager.get_default()
|
||||||
this._greeterClient = new Gdm.Client();
|
let gdmClient = new Gdm.Client();
|
||||||
|
|
||||||
if (GLib.getenv('GDM_GREETER_TEST') != '1') {
|
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',
|
this._greeter.connect('default-session-name-changed',
|
||||||
Lang.bind(this, this._onDefaultSessionChanged));
|
Lang.bind(this, this._onDefaultSessionChanged));
|
||||||
@ -415,15 +415,6 @@ const LoginDialog = new Lang.Class({
|
|||||||
Lang.bind(this, this._onTimedLoginRequested));
|
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 = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||||
|
|
||||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
|
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
|
||||||
@ -458,12 +449,10 @@ const LoginDialog = new Lang.Class({
|
|||||||
x_fill: true,
|
x_fill: true,
|
||||||
y_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.hide();
|
||||||
this._authPrompt.connect('cancel',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this.cancel();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._authPrompt.actor.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
this._authPrompt.actor.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
||||||
align_axis: Clutter.AlignAxis.BOTH,
|
align_axis: Clutter.AlignAxis.BOTH,
|
||||||
@ -540,7 +529,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
if (disableUserList != this._disableUserList) {
|
if (disableUserList != this._disableUserList) {
|
||||||
this._disableUserList = disableUserList;
|
this._disableUserList = disableUserList;
|
||||||
|
|
||||||
if (!this._verifyingUser)
|
if (!this._authPrompt.verifyingUser)
|
||||||
this._reset();
|
this._reset();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -575,14 +564,24 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._updateLogoTexture(this._textureCache, this._logoFileUri);
|
this._updateLogoTexture(this._textureCache, this._logoFileUri);
|
||||||
},
|
},
|
||||||
|
|
||||||
_reset: function() {
|
_onPrompted: function() {
|
||||||
this._userVerifier.clear();
|
this._sessionMenuButton.updateSensitivity(true);
|
||||||
|
|
||||||
this._updateSensitivity(true);
|
if (this._shouldShowSessionMenuButton())
|
||||||
this._authPrompt.reset();
|
this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor);
|
||||||
|
|
||||||
|
this._authPrompt.cancelButton.show();
|
||||||
|
|
||||||
|
this._showPrompt();
|
||||||
|
},
|
||||||
|
|
||||||
|
_reset: function() {
|
||||||
|
if (this._authPrompt.verifyingUser)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._sessionMenuButton.updateSensitivity(true);
|
||||||
|
|
||||||
this._user = null;
|
this._user = null;
|
||||||
this._verifyingUser = false;
|
|
||||||
|
|
||||||
if (this._disableUserList)
|
if (this._disableUserList)
|
||||||
this._hideUserListAndLogIn();
|
this._hideUserListAndLogIn();
|
||||||
@ -590,38 +589,12 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._showUserList();
|
this._showUserList();
|
||||||
},
|
},
|
||||||
|
|
||||||
_verificationFailed: function() {
|
|
||||||
this._authPrompt.clear();
|
|
||||||
|
|
||||||
this._updateSensitivity(true);
|
|
||||||
this._authPrompt.setActorInDefaultButtonWell(null);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDefaultSessionChanged: function(client, sessionId) {
|
_onDefaultSessionChanged: function(client, sessionId) {
|
||||||
this._sessionMenuButton.setActiveSession(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() {
|
_shouldShowSessionMenuButton: function() {
|
||||||
if (this._verifyingUser)
|
if (this._authPrompt.verifyingUser)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!this._user)
|
if (!this._user)
|
||||||
@ -633,75 +606,15 @@ const LoginDialog = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
_showPrompt: function(forSecret) {
|
_showPrompt: function() {
|
||||||
|
if (this._authPrompt.actor.visible)
|
||||||
|
return;
|
||||||
this._authPrompt.actor.opacity = 0;
|
this._authPrompt.actor.opacity = 0;
|
||||||
this._authPrompt.actor.show();
|
this._authPrompt.actor.show();
|
||||||
Tweener.addTween(this._authPrompt.actor,
|
Tweener.addTween(this._authPrompt.actor,
|
||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
time: _FADE_ANIMATION_TIME,
|
time: _FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad' });
|
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) {
|
_showRealmLoginHint: function(realmManager, hint) {
|
||||||
@ -714,7 +627,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
|
|
||||||
// Translators: this message is shown below the username entry field
|
// Translators: this message is shown below the username entry field
|
||||||
// to clue the user in on how to login to the local network realm
|
// 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() {
|
_askForUsernameAndLogIn: function() {
|
||||||
@ -722,25 +635,24 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._authPrompt.setQuestion(_("Username: "));
|
this._authPrompt.setQuestion(_("Username: "));
|
||||||
|
|
||||||
let realmManager = new Realmd.Manager();
|
let realmManager = new Realmd.Manager();
|
||||||
let signalId = realmManager.connect('login-format-changed',
|
let realmSignalId = realmManager.connect('login-format-changed',
|
||||||
Lang.bind(this, this._showRealmLoginHint));
|
Lang.bind(this, this._showRealmLoginHint));
|
||||||
this._showRealmLoginHint(realmManager.loginFormat);
|
this._showRealmLoginHint(realmManager.loginFormat);
|
||||||
|
|
||||||
let tasks = [this._showPrompt,
|
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 });
|
||||||
|
|
||||||
function() {
|
realmManager.disconnect(realmSignalId)
|
||||||
let userName = this._authPrompt.getAnswer();
|
realmManager.release();
|
||||||
this._authPrompt._entry.reactive = false;
|
}));
|
||||||
return this._beginVerificationForUser(userName);
|
this._authPrompt.cancelButton.hide();
|
||||||
},
|
this._showPrompt();
|
||||||
|
|
||||||
function() {
|
|
||||||
realmManager.disconnect(signalId)
|
|
||||||
realmManager.release();
|
|
||||||
}];
|
|
||||||
|
|
||||||
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
|
||||||
return batch.run();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_startSession: function(serviceName) {
|
_startSession: function(serviceName) {
|
||||||
@ -767,15 +679,9 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onSessionOpened: function(client, serviceName) {
|
_onSessionOpened: function(client, serviceName) {
|
||||||
if (!this._userVerifier.hasPendingMessages) {
|
this._authPrompt.finish(Lang.bind(this, function() {
|
||||||
this._startSession(serviceName);
|
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) {
|
_waitForItemForUser: function(userName) {
|
||||||
@ -922,23 +828,15 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._userList.actor.grab_key_focus();
|
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) {
|
_beginVerificationForItem: function(item) {
|
||||||
this._authPrompt.setUser(item.user);
|
this._authPrompt.setUser(item.user);
|
||||||
|
|
||||||
let tasks = [function() {
|
let userName = item.user.get_user_name();
|
||||||
let userName = item.user.get_user_name();
|
let hold = new Batch.Hold();
|
||||||
return this._beginVerificationForUser(userName);
|
|
||||||
}];
|
this._authPrompt.begin({ userName: userName,
|
||||||
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
hold: hold });
|
||||||
return batch.run();
|
return hold;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onUserListActivated: function(activatedItem) {
|
_onUserListActivated: function(activatedItem) {
|
||||||
|
@ -42,33 +42,17 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._userName = GLib.get_user_name();
|
this._userName = GLib.get_user_name();
|
||||||
this._user = this._userManager.get_user(this._userName);
|
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._promptBox = new St.BoxLayout({ vertical: true });
|
||||||
this.actor.add_child(this._promptBox);
|
this.actor.add_child(this._promptBox);
|
||||||
this._promptBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
this._promptBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
||||||
align_axis: Clutter.AlignAxis.BOTH,
|
align_axis: Clutter.AlignAxis.BOTH,
|
||||||
factor: 0.5 }));
|
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.setUser(this._user);
|
||||||
this._authPrompt.setPasswordChar('\u25cf');
|
this._authPrompt.setPasswordChar('\u25cf');
|
||||||
this._authPrompt.nextButton.label = _("Unlock");
|
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);
|
this._promptBox.add_child(this._authPrompt.actor);
|
||||||
|
|
||||||
@ -90,11 +74,9 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._otherUserButton = null;
|
this._otherUserButton = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._authPrompt.begin({ userName: this._userName });
|
||||||
this._updateSensitivity(true);
|
this._updateSensitivity(true);
|
||||||
|
|
||||||
let batch = new Batch.Hold();
|
|
||||||
this._userVerifier.begin(this._userName, batch);
|
|
||||||
|
|
||||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Unlock Window"), 'dialog-password-symbolic');
|
Main.ctrlAltTabManager.addGroup(this.actor, _("Unlock Window"), 'dialog-password-symbolic');
|
||||||
|
|
||||||
this._idleMonitor = new GnomeDesktop.IdleMonitor();
|
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() {
|
_onReset: function() {
|
||||||
if (!this._userVerified) {
|
this.emit('failed');
|
||||||
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();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_escape: function() {
|
_escape: function() {
|
||||||
if (this.allowCancel) {
|
if (this.allowCancel) {
|
||||||
this._userVerifier.cancel();
|
this._authPrompt.cancel();
|
||||||
this.emit('failed');
|
this.emit('failed');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -199,12 +106,11 @@ const UnlockDialog = new Lang.Class({
|
|||||||
_otherUserClicked: function(button, event) {
|
_otherUserClicked: function(button, event) {
|
||||||
Gdm.goto_login_session_sync(null);
|
Gdm.goto_login_session_sync(null);
|
||||||
|
|
||||||
this._userVerifier.cancel();
|
this._authPrompt.cancel();
|
||||||
this.emit('failed');
|
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
this._userVerifier.clear();
|
this.popModal();
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
|
|
||||||
if (this._idleWatchId) {
|
if (this._idleWatchId) {
|
||||||
@ -214,7 +120,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
cancel: function() {
|
cancel: function() {
|
||||||
this._userVerifier.cancel(null);
|
this._authPrompt.cancel();
|
||||||
|
|
||||||
this.destroy();
|
this.destroy();
|
||||||
},
|
},
|
||||||
@ -224,16 +130,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
finish: function(onComplete) {
|
finish: function(onComplete) {
|
||||||
if (!this._userVerifier.hasPendingMessages) {
|
this._authPrompt.finish(onComplete);
|
||||||
onComplete();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let signalId = this._userVerifier.connect('no-more-messages',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._userVerifier.disconnect(signalId);
|
|
||||||
onComplete();
|
|
||||||
}));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
open: function(timestamp) {
|
open: function(timestamp) {
|
||||||
|
Loading…
Reference in New Issue
Block a user