2013-07-23 20:37:42 -04:00
|
|
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
2019-07-16 05:24:13 -04:00
|
|
|
/* exported AuthPrompt */
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2021-04-13 10:59:49 -04:00
|
|
|
const { Clutter, GLib, GObject, Pango, Shell, St } = imports.gi;
|
2013-07-23 20:37:42 -04:00
|
|
|
|
|
|
|
const Animation = imports.ui.animation;
|
2013-07-22 11:07:35 -04:00
|
|
|
const Batch = imports.gdm.batch;
|
|
|
|
const GdmUtil = imports.gdm.util;
|
2020-08-17 17:41:04 -04:00
|
|
|
const OVirt = imports.gdm.oVirt;
|
2020-09-21 10:11:41 -04:00
|
|
|
const Vmware = imports.gdm.vmware;
|
2013-07-22 11:07:35 -04:00
|
|
|
const Params = imports.misc.params;
|
2013-07-23 20:37:42 -04:00
|
|
|
const ShellEntry = imports.ui.shellEntry;
|
|
|
|
const UserWidget = imports.ui.userWidget;
|
2020-08-17 17:41:04 -04:00
|
|
|
const Util = imports.misc.util;
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-07-18 13:47:27 -04:00
|
|
|
var DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
|
2019-08-01 19:13:10 -04:00
|
|
|
var DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1000;
|
|
|
|
var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 300;
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2019-08-01 19:13:10 -04:00
|
|
|
var MESSAGE_FADE_OUT_ANIMATION_TIME = 500;
|
2013-07-24 10:53:48 -04:00
|
|
|
|
2017-07-18 13:47:27 -04:00
|
|
|
var AuthPromptMode = {
|
2013-07-22 11:07:35 -04:00
|
|
|
UNLOCK_ONLY: 0,
|
2019-08-20 17:43:54 -04:00
|
|
|
UNLOCK_OR_LOG_IN: 1,
|
2013-07-22 11:07:35 -04:00
|
|
|
};
|
|
|
|
|
2017-07-18 13:47:27 -04:00
|
|
|
var AuthPromptStatus = {
|
2013-07-28 16:24:31 -04:00
|
|
|
NOT_VERIFYING: 0,
|
|
|
|
VERIFYING: 1,
|
|
|
|
VERIFICATION_FAILED: 2,
|
2019-08-20 17:43:54 -04:00
|
|
|
VERIFICATION_SUCCEEDED: 3,
|
2021-01-29 22:18:32 -05:00
|
|
|
VERIFICATION_CANCELLED: 4,
|
2021-02-01 07:10:45 -05:00
|
|
|
VERIFICATION_IN_PROGRESS: 5,
|
2013-07-28 16:24:31 -04:00
|
|
|
};
|
|
|
|
|
2017-07-18 13:47:27 -04:00
|
|
|
var BeginRequestType = {
|
2013-07-28 17:49:50 -04:00
|
|
|
PROVIDE_USERNAME: 0,
|
2019-08-20 17:43:54 -04:00
|
|
|
DONT_PROVIDE_USERNAME: 1,
|
2021-02-01 07:10:45 -05:00
|
|
|
REUSE_USERNAME: 2,
|
2013-07-28 17:49:50 -04:00
|
|
|
};
|
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
var AuthPrompt = GObject.registerClass({
|
|
|
|
Signals: {
|
|
|
|
'cancelled': {},
|
|
|
|
'failed': {},
|
|
|
|
'next': {},
|
|
|
|
'prompted': {},
|
|
|
|
'reset': { param_types: [GObject.TYPE_UINT] },
|
2019-08-20 17:43:54 -04:00
|
|
|
},
|
2019-07-16 05:24:13 -04:00
|
|
|
}, class AuthPrompt extends St.BoxLayout {
|
|
|
|
_init(gdmClient, mode) {
|
|
|
|
super._init({
|
|
|
|
style_class: 'login-dialog-prompt-layout',
|
2019-08-20 17:43:54 -04:00
|
|
|
vertical: true,
|
2020-01-14 09:53:36 -05:00
|
|
|
x_expand: true,
|
|
|
|
x_align: Clutter.ActorAlign.CENTER,
|
2019-07-16 05:24:13 -04:00
|
|
|
});
|
|
|
|
|
2013-07-28 16:24:31 -04:00
|
|
|
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
2013-07-22 11:07:35 -04:00
|
|
|
|
|
|
|
this._gdmClient = gdmClient;
|
|
|
|
this._mode = mode;
|
2020-02-20 09:57:36 -05:00
|
|
|
this._defaultButtonWellActor = null;
|
2021-02-01 07:10:45 -05:00
|
|
|
this._cancelledRetries = 0;
|
2013-07-22 11:07:35 -04:00
|
|
|
|
|
|
|
let reauthenticationOnly;
|
|
|
|
if (this._mode == AuthPromptMode.UNLOCK_ONLY)
|
|
|
|
reauthenticationOnly = true;
|
|
|
|
else if (this._mode == AuthPromptMode.UNLOCK_OR_LOG_IN)
|
|
|
|
reauthenticationOnly = false;
|
|
|
|
|
2019-08-19 15:06:04 -04:00
|
|
|
this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly });
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2017-12-01 19:27:35 -05:00
|
|
|
this._userVerifier.connect('ask-question', this._onAskQuestion.bind(this));
|
|
|
|
this._userVerifier.connect('show-message', this._onShowMessage.bind(this));
|
|
|
|
this._userVerifier.connect('verification-failed', this._onVerificationFailed.bind(this));
|
|
|
|
this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
|
|
|
|
this._userVerifier.connect('reset', this._onReset.bind(this));
|
|
|
|
this._userVerifier.connect('smartcard-status-changed', this._onSmartcardStatusChanged.bind(this));
|
2020-01-03 11:31:15 -05:00
|
|
|
this._userVerifier.connect('credential-manager-authenticated', this._onCredentialManagerAuthenticated.bind(this));
|
2013-06-27 08:54:19 -04:00
|
|
|
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
this.connect('destroy', this._onDestroy.bind(this));
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2019-10-21 14:44:00 -04:00
|
|
|
this._userWell = new St.Bin({
|
|
|
|
x_expand: true,
|
|
|
|
y_expand: true,
|
|
|
|
});
|
|
|
|
this.add_child(this._userWell);
|
2019-12-12 04:32:53 -05:00
|
|
|
|
2020-02-18 16:23:26 -05:00
|
|
|
this._hasCancelButton = this._mode === AuthPromptMode.UNLOCK_OR_LOG_IN;
|
2020-02-14 11:14:55 -05:00
|
|
|
|
2020-01-14 14:02:24 -05:00
|
|
|
this._initEntryRow();
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2020-02-14 15:10:04 -05:00
|
|
|
let capsLockPlaceholder = new St.Label();
|
|
|
|
this.add_child(capsLockPlaceholder);
|
|
|
|
|
2020-02-05 13:26:44 -05:00
|
|
|
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning({
|
|
|
|
x_expand: true,
|
|
|
|
x_align: Clutter.ActorAlign.CENTER,
|
|
|
|
});
|
2019-12-17 15:03:45 -05:00
|
|
|
this.add_child(this._capsLockWarningLabel);
|
|
|
|
|
2020-02-14 15:10:04 -05:00
|
|
|
this._capsLockWarningLabel.bind_property('visible',
|
|
|
|
capsLockPlaceholder, 'visible',
|
|
|
|
GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN);
|
|
|
|
|
2019-10-21 14:44:00 -04:00
|
|
|
this._message = new St.Label({
|
|
|
|
opacity: 0,
|
|
|
|
styleClass: 'login-dialog-message',
|
|
|
|
y_expand: true,
|
2020-02-05 13:26:44 -05:00
|
|
|
x_expand: true,
|
2019-10-21 14:44:00 -04:00
|
|
|
y_align: Clutter.ActorAlign.START,
|
2020-02-05 13:26:44 -05:00
|
|
|
x_align: Clutter.ActorAlign.CENTER,
|
2019-10-21 14:44:00 -04:00
|
|
|
});
|
2013-07-28 12:40:55 -04:00
|
|
|
this._message.clutter_text.line_wrap = true;
|
2016-10-13 00:29:21 -04:00
|
|
|
this._message.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
2019-10-21 14:44:00 -04:00
|
|
|
this.add_child(this._message);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onDestroy() {
|
2014-10-09 14:10:12 -04:00
|
|
|
this._userVerifier.destroy();
|
2013-07-29 13:24:36 -04:00
|
|
|
this._userVerifier = null;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2019-09-10 01:42:48 -04:00
|
|
|
vfunc_key_press_event(keyPressEvent) {
|
|
|
|
if (keyPressEvent.keyval == Clutter.KEY_Escape)
|
|
|
|
this.cancel();
|
2020-03-26 18:40:38 -04:00
|
|
|
return super.vfunc_key_press_event(keyPressEvent);
|
2019-09-10 01:42:48 -04:00
|
|
|
}
|
|
|
|
|
2020-01-14 14:02:24 -05:00
|
|
|
_initEntryRow() {
|
|
|
|
this._mainBox = new St.BoxLayout({
|
|
|
|
style_class: 'login-dialog-button-box',
|
|
|
|
vertical: false,
|
|
|
|
});
|
|
|
|
this.add_child(this._mainBox);
|
|
|
|
|
2019-10-21 14:44:00 -04:00
|
|
|
this.cancelButton = new St.Button({
|
2020-01-14 10:15:48 -05:00
|
|
|
style_class: 'modal-dialog-button button cancel-button',
|
2020-02-19 12:06:38 -05:00
|
|
|
accessible_name: _('Cancel'),
|
2019-10-21 14:44:00 -04:00
|
|
|
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
2020-02-14 11:14:55 -05:00
|
|
|
reactive: this._hasCancelButton,
|
2020-02-19 11:32:22 -05:00
|
|
|
can_focus: this._hasCancelButton,
|
2019-10-17 17:27:27 -04:00
|
|
|
x_align: Clutter.ActorAlign.START,
|
2020-01-14 14:02:24 -05:00
|
|
|
y_align: Clutter.ActorAlign.CENTER,
|
2020-01-14 10:15:48 -05:00
|
|
|
child: new St.Icon({ icon_name: 'go-previous-symbolic' }),
|
2019-10-21 14:44:00 -04:00
|
|
|
});
|
2020-02-14 11:14:55 -05:00
|
|
|
if (this._hasCancelButton)
|
|
|
|
this.cancelButton.connect('clicked', () => this.cancel());
|
|
|
|
else
|
|
|
|
this.cancelButton.opacity = 0;
|
2020-01-14 14:02:24 -05:00
|
|
|
this._mainBox.add_child(this.cancelButton);
|
|
|
|
|
|
|
|
let entryParams = {
|
|
|
|
style_class: 'login-dialog-prompt-entry',
|
|
|
|
can_focus: true,
|
|
|
|
x_expand: true,
|
|
|
|
};
|
2019-10-21 14:44:00 -04:00
|
|
|
|
2020-01-14 14:02:24 -05:00
|
|
|
this._entry = null;
|
|
|
|
|
|
|
|
this._textEntry = new St.Entry(entryParams);
|
|
|
|
ShellEntry.addContextMenu(this._textEntry, { actionMode: Shell.ActionMode.NONE });
|
|
|
|
|
|
|
|
this._passwordEntry = new St.PasswordEntry(entryParams);
|
|
|
|
ShellEntry.addContextMenu(this._passwordEntry, { actionMode: Shell.ActionMode.NONE });
|
|
|
|
|
|
|
|
this._entry = this._passwordEntry;
|
|
|
|
this._mainBox.add_child(this._entry);
|
|
|
|
this._entry.grab_key_focus();
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2021-04-13 10:59:49 -04:00
|
|
|
this._timedLoginIndicator = new St.Bin({
|
|
|
|
style_class: 'login-dialog-timed-login-indicator',
|
|
|
|
scale_x: 0,
|
|
|
|
});
|
|
|
|
|
|
|
|
this.add_child(this._timedLoginIndicator);
|
|
|
|
|
2020-02-06 15:27:20 -05:00
|
|
|
[this._textEntry, this._passwordEntry].forEach(entry => {
|
|
|
|
entry.clutter_text.connect('text-changed', () => {
|
|
|
|
if (!this._userVerifier.hasPendingMessages)
|
|
|
|
this._fadeOutMessage();
|
|
|
|
});
|
|
|
|
|
|
|
|
entry.clutter_text.connect('activate', () => {
|
2020-02-11 08:33:02 -05:00
|
|
|
let shouldSpin = entry === this._passwordEntry;
|
2020-02-06 15:27:20 -05:00
|
|
|
if (entry.reactive)
|
2020-02-11 08:33:02 -05:00
|
|
|
this._activateNext(shouldSpin);
|
2020-02-06 15:27:20 -05:00
|
|
|
});
|
2017-10-30 20:38:18 -04:00
|
|
|
});
|
2020-01-14 14:02:24 -05:00
|
|
|
|
|
|
|
this._defaultButtonWell = new St.Widget({
|
|
|
|
layout_manager: new Clutter.BinLayout(),
|
|
|
|
x_align: Clutter.ActorAlign.END,
|
|
|
|
y_align: Clutter.ActorAlign.CENTER,
|
|
|
|
});
|
2020-02-06 15:51:18 -05:00
|
|
|
this._defaultButtonWell.add_constraint(new Clutter.BindConstraint({
|
|
|
|
source: this.cancelButton,
|
2020-04-13 12:55:34 -04:00
|
|
|
coordinate: Clutter.BindCoordinate.WIDTH,
|
2020-02-06 15:51:18 -05:00
|
|
|
}));
|
2020-01-14 14:02:24 -05:00
|
|
|
this._mainBox.add_child(this._defaultButtonWell);
|
|
|
|
|
|
|
|
this._spinner = new Animation.Spinner(DEFAULT_BUTTON_WELL_ICON_SIZE);
|
|
|
|
this._defaultButtonWell.add_child(this._spinner);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2021-04-13 10:59:49 -04:00
|
|
|
showTimedLoginIndicator(time) {
|
|
|
|
let hold = new Batch.Hold();
|
|
|
|
|
|
|
|
this.hideTimedLoginIndicator();
|
|
|
|
|
|
|
|
const startTime = GLib.get_monotonic_time();
|
|
|
|
|
|
|
|
this._timedLoginTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 33,
|
|
|
|
() => {
|
|
|
|
const currentTime = GLib.get_monotonic_time();
|
|
|
|
const elapsedTime = (currentTime - startTime) / GLib.USEC_PER_SEC;
|
|
|
|
this._timedLoginIndicator.scale_x = elapsedTime / time;
|
|
|
|
if (elapsedTime >= time) {
|
|
|
|
this._timedLoginTimeoutId = 0;
|
|
|
|
hold.release();
|
|
|
|
return GLib.SOURCE_REMOVE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return GLib.SOURCE_CONTINUE;
|
|
|
|
});
|
|
|
|
|
|
|
|
GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId');
|
|
|
|
|
|
|
|
return hold;
|
|
|
|
}
|
|
|
|
|
|
|
|
hideTimedLoginIndicator() {
|
|
|
|
if (this._timedLoginTimeoutId) {
|
|
|
|
GLib.source_remove(this._timedLoginTimeoutId);
|
|
|
|
this._timedLoginTimeoutId = 0;
|
|
|
|
}
|
|
|
|
this._timedLoginIndicator.scale_x = 0.;
|
|
|
|
}
|
|
|
|
|
2020-02-11 08:33:02 -05:00
|
|
|
_activateNext(shouldSpin) {
|
2021-02-01 07:10:45 -05:00
|
|
|
this.verificationStatus = AuthPromptStatus.VERIFICATION_IN_PROGRESS;
|
2020-02-11 08:27:36 -05:00
|
|
|
this.updateSensitivity(false);
|
2020-02-11 08:33:02 -05:00
|
|
|
|
|
|
|
if (shouldSpin)
|
|
|
|
this.startSpinning();
|
|
|
|
|
2020-02-11 08:27:36 -05:00
|
|
|
if (this._queryingService)
|
|
|
|
this._userVerifier.answerQuery(this._queryingService, this._entry.text);
|
|
|
|
else
|
|
|
|
this._preemptiveAnswer = this._entry.text;
|
|
|
|
|
|
|
|
this.emit('next');
|
|
|
|
}
|
|
|
|
|
2019-12-12 04:32:53 -05:00
|
|
|
_updateEntry(secret) {
|
2020-02-06 15:20:48 -05:00
|
|
|
if (secret && this._entry !== this._passwordEntry) {
|
2020-01-14 14:02:24 -05:00
|
|
|
this._mainBox.replace_child(this._entry, this._passwordEntry);
|
2019-12-12 04:32:53 -05:00
|
|
|
this._entry = this._passwordEntry;
|
2020-02-06 15:20:48 -05:00
|
|
|
} else if (!secret && this._entry !== this._textEntry) {
|
2020-01-14 14:02:24 -05:00
|
|
|
this._mainBox.replace_child(this._entry, this._textEntry);
|
2019-12-12 04:32:53 -05:00
|
|
|
this._entry = this._textEntry;
|
|
|
|
}
|
2020-02-14 14:50:59 -05:00
|
|
|
this._capsLockWarningLabel.visible = secret;
|
2019-12-12 04:32:53 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
_onAskQuestion(verifier, serviceName, question, secret) {
|
2013-07-22 11:07:35 -04:00
|
|
|
if (this._queryingService)
|
|
|
|
this.clear();
|
|
|
|
|
|
|
|
this._queryingService = serviceName;
|
2015-04-07 15:53:42 -04:00
|
|
|
if (this._preemptiveAnswer) {
|
|
|
|
this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer);
|
|
|
|
this._preemptiveAnswer = null;
|
|
|
|
return;
|
|
|
|
}
|
2019-12-12 04:32:53 -05:00
|
|
|
|
|
|
|
this._updateEntry(secret);
|
2020-02-14 16:14:25 -05:00
|
|
|
|
|
|
|
// Hack: The question string comes directly from PAM, if it's "Password:"
|
|
|
|
// we replace it with our own to allow localization, if it's something
|
|
|
|
// else we remove the last colon and any trailing or leading spaces.
|
|
|
|
if (question === 'Password:' || question === 'Password: ')
|
|
|
|
this.setQuestion(_('Password'));
|
|
|
|
else
|
|
|
|
this.setQuestion(question.replace(/: *$/, '').trim());
|
2013-07-22 11:07:35 -04:00
|
|
|
|
|
|
|
this.updateSensitivity(true);
|
|
|
|
this.emit('prompted');
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2020-01-03 11:31:15 -05:00
|
|
|
_onCredentialManagerAuthenticated() {
|
2013-10-10 04:21:47 -04:00
|
|
|
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
|
|
|
this.reset();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-10-10 04:21:47 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onSmartcardStatusChanged() {
|
2013-06-27 08:54:19 -04:00
|
|
|
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
|
|
|
|
|
|
|
// Most of the time we want to reset if the user inserts or removes
|
|
|
|
// a smartcard. Smartcard insertion "preempts" what the user was
|
|
|
|
// doing, and smartcard removal aborts the preemption.
|
|
|
|
// The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying
|
|
|
|
// with a smartcard
|
|
|
|
// 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.smartcardDetected)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
|
|
|
this.reset();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-06-27 08:54:19 -04:00
|
|
|
|
2021-02-01 13:36:49 -05:00
|
|
|
_onShowMessage(_userVerifier, serviceName, message, type) {
|
|
|
|
this.setMessage(serviceName, message, type);
|
2013-07-29 14:37:10 -04:00
|
|
|
this.emit('prompted');
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2021-02-01 13:36:49 -05:00
|
|
|
_onVerificationFailed(userVerifier, serviceName, canRetry) {
|
2021-02-01 13:39:03 -05:00
|
|
|
const wasQueryingService = this._queryingService === serviceName;
|
2013-09-18 14:23:53 -04:00
|
|
|
this._queryingService = null;
|
2013-07-22 11:07:35 -04:00
|
|
|
this.clear();
|
|
|
|
|
2018-05-28 20:00:04 -04:00
|
|
|
this.updateSensitivity(canRetry);
|
2013-07-22 11:07:35 -04:00
|
|
|
this.setActorInDefaultButtonWell(null);
|
2013-07-28 16:24:31 -04:00
|
|
|
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
|
2019-10-15 15:34:35 -04:00
|
|
|
|
2021-02-01 13:39:03 -05:00
|
|
|
if (wasQueryingService)
|
|
|
|
Util.wiggle(this._entry);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onVerificationComplete() {
|
2015-08-31 15:21:15 -04:00
|
|
|
this.setActorInDefaultButtonWell(null);
|
2013-07-28 16:24:31 -04:00
|
|
|
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
|
2017-06-29 19:16:11 -04:00
|
|
|
this.cancelButton.reactive = false;
|
2020-02-19 11:32:22 -05:00
|
|
|
this.cancelButton.can_focus = false;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onReset() {
|
2013-11-25 22:30:53 -05:00
|
|
|
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
|
|
|
this.reset();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
setActorInDefaultButtonWell(actor, animate) {
|
2013-07-23 20:37:42 -04:00
|
|
|
if (!this._defaultButtonWellActor &&
|
|
|
|
!actor)
|
|
|
|
return;
|
|
|
|
|
|
|
|
let oldActor = this._defaultButtonWellActor;
|
|
|
|
|
|
|
|
if (oldActor)
|
2018-07-20 15:46:19 -04:00
|
|
|
oldActor.remove_all_transitions();
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2015-08-21 09:09:39 -04:00
|
|
|
let wasSpinner;
|
2019-07-16 05:24:13 -04:00
|
|
|
if (oldActor == this._spinner)
|
2015-08-21 09:09:39 -04:00
|
|
|
wasSpinner = true;
|
|
|
|
else
|
|
|
|
wasSpinner = false;
|
|
|
|
|
2013-07-23 20:37:42 -04:00
|
|
|
let isSpinner;
|
2019-07-16 05:24:13 -04:00
|
|
|
if (actor == this._spinner)
|
2013-07-23 20:37:42 -04:00
|
|
|
isSpinner = true;
|
|
|
|
else
|
|
|
|
isSpinner = false;
|
|
|
|
|
|
|
|
if (this._defaultButtonWellActor != actor && oldActor) {
|
|
|
|
if (!animate) {
|
|
|
|
oldActor.opacity = 0;
|
2015-08-21 09:09:39 -04:00
|
|
|
|
|
|
|
if (wasSpinner) {
|
|
|
|
if (this._spinner)
|
|
|
|
this._spinner.stop();
|
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
} else {
|
2018-07-20 15:46:19 -04:00
|
|
|
oldActor.ease({
|
|
|
|
opacity: 0,
|
|
|
|
duration: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
|
|
|
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
|
|
|
mode: Clutter.AnimationMode.LINEAR,
|
|
|
|
onComplete: () => {
|
|
|
|
if (wasSpinner) {
|
|
|
|
if (this._spinner)
|
|
|
|
this._spinner.stop();
|
|
|
|
}
|
2019-08-20 17:43:54 -04:00
|
|
|
},
|
2018-07-20 15:46:19 -04:00
|
|
|
});
|
2013-07-23 20:37:42 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (actor) {
|
|
|
|
if (isSpinner)
|
|
|
|
this._spinner.play();
|
|
|
|
|
2019-08-19 20:51:42 -04:00
|
|
|
if (!animate) {
|
2013-07-23 20:37:42 -04:00
|
|
|
actor.opacity = 255;
|
2019-08-19 20:51:42 -04:00
|
|
|
} else {
|
2018-07-20 15:46:19 -04:00
|
|
|
actor.ease({
|
|
|
|
opacity: 255,
|
|
|
|
duration: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
|
|
|
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
2019-08-20 17:43:54 -04:00
|
|
|
mode: Clutter.AnimationMode.LINEAR,
|
2018-07-20 15:46:19 -04:00
|
|
|
});
|
2019-08-19 20:51:42 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
this._defaultButtonWellActor = actor;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
startSpinning() {
|
2019-07-16 05:24:13 -04:00
|
|
|
this.setActorInDefaultButtonWell(this._spinner, true);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
stopSpinning() {
|
2013-07-23 20:37:42 -04:00
|
|
|
this.setActorInDefaultButtonWell(null, false);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
clear() {
|
2013-07-23 20:37:42 -04:00
|
|
|
this._entry.text = '';
|
|
|
|
this.stopSpinning();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
setQuestion(question) {
|
2020-02-06 14:57:53 -05:00
|
|
|
this._entry.hint_text = question;
|
2013-07-23 20:37:42 -04:00
|
|
|
|
|
|
|
this._entry.show();
|
|
|
|
this._entry.grab_key_focus();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
getAnswer() {
|
2013-08-02 14:10:16 -04:00
|
|
|
let text;
|
|
|
|
|
|
|
|
if (this._preemptiveAnswer) {
|
|
|
|
text = this._preemptiveAnswer;
|
|
|
|
this._preemptiveAnswer = null;
|
|
|
|
} else {
|
|
|
|
text = this._entry.get_text();
|
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
|
|
|
return text;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_fadeOutMessage() {
|
2013-07-24 10:53:48 -04:00
|
|
|
if (this._message.opacity == 0)
|
|
|
|
return;
|
2018-07-20 15:46:19 -04:00
|
|
|
this._message.remove_all_transitions();
|
|
|
|
this._message.ease({
|
|
|
|
opacity: 0,
|
|
|
|
duration: MESSAGE_FADE_OUT_ANIMATION_TIME,
|
2019-08-20 17:43:54 -04:00
|
|
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
2018-07-20 15:46:19 -04:00
|
|
|
});
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-24 10:53:48 -04:00
|
|
|
|
2021-02-01 13:36:49 -05:00
|
|
|
setMessage(serviceName, message, type) {
|
2013-08-27 10:17:26 -04:00
|
|
|
if (type == GdmUtil.MessageType.ERROR)
|
|
|
|
this._message.add_style_class_name('login-dialog-message-warning');
|
|
|
|
else
|
|
|
|
this._message.remove_style_class_name('login-dialog-message-warning');
|
2013-08-19 12:00:33 -04:00
|
|
|
|
2013-08-27 10:17:26 -04:00
|
|
|
if (type == GdmUtil.MessageType.HINT)
|
|
|
|
this._message.add_style_class_name('login-dialog-message-hint');
|
|
|
|
else
|
|
|
|
this._message.remove_style_class_name('login-dialog-message-hint');
|
2013-08-19 12:00:33 -04:00
|
|
|
|
2013-07-23 20:37:42 -04:00
|
|
|
if (message) {
|
2018-07-20 15:46:19 -04:00
|
|
|
this._message.remove_all_transitions();
|
2013-07-23 20:37:42 -04:00
|
|
|
this._message.text = message;
|
|
|
|
this._message.opacity = 255;
|
|
|
|
} else {
|
|
|
|
this._message.opacity = 0;
|
|
|
|
}
|
2021-02-01 13:44:00 -05:00
|
|
|
|
|
|
|
if (type === GdmUtil.MessageType.ERROR &&
|
2021-02-08 13:34:09 -05:00
|
|
|
this._userVerifier.serviceIsFingerprint(serviceName)) {
|
|
|
|
// TODO: Use Await for wiggle to be over before unfreezing the user verifier queue
|
|
|
|
const wiggleParameters = {
|
|
|
|
duration: 65,
|
|
|
|
wiggleCount: 3,
|
|
|
|
};
|
|
|
|
this._userVerifier.increaseCurrentMessageTimeout(
|
|
|
|
wiggleParameters.duration * (wiggleParameters.wiggleCount + 2));
|
|
|
|
Util.wiggle(this._message, wiggleParameters);
|
|
|
|
}
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
updateSensitivity(sensitive) {
|
2020-04-22 11:27:54 -04:00
|
|
|
if (this._entry.reactive === sensitive)
|
|
|
|
return;
|
|
|
|
|
2013-07-23 20:37:42 -04:00
|
|
|
this._entry.reactive = sensitive;
|
2020-04-22 11:27:54 -04:00
|
|
|
|
2021-02-01 06:52:01 -05:00
|
|
|
if (sensitive) {
|
2020-04-22 11:27:54 -04:00
|
|
|
this._entry.grab_key_focus();
|
2021-02-01 06:52:01 -05:00
|
|
|
} else {
|
|
|
|
this.grab_key_focus();
|
|
|
|
|
|
|
|
if (this._entry === this._passwordEntry)
|
|
|
|
this._entry.password_visible = false;
|
|
|
|
}
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
vfunc_hide() {
|
2013-07-23 20:37:42 -04:00
|
|
|
this.setActorInDefaultButtonWell(null, true);
|
2019-07-16 05:24:13 -04:00
|
|
|
super.vfunc_hide();
|
2013-08-19 12:00:33 -04:00
|
|
|
this._message.opacity = 0;
|
2013-07-23 20:37:42 -04:00
|
|
|
|
|
|
|
this.setUser(null);
|
|
|
|
|
|
|
|
this.updateSensitivity(true);
|
|
|
|
this._entry.set_text('');
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
setUser(user) {
|
2014-10-09 12:05:11 -04:00
|
|
|
let oldChild = this._userWell.get_child();
|
|
|
|
if (oldChild)
|
|
|
|
oldChild.destroy();
|
|
|
|
|
2020-01-17 01:47:34 -05:00
|
|
|
let userWidget = new UserWidget.UserWidget(user, Clutter.Orientation.VERTICAL);
|
|
|
|
this._userWell.set_child(userWidget);
|
2020-02-06 15:30:36 -05:00
|
|
|
|
|
|
|
if (!user)
|
|
|
|
this._updateEntry(false);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
reset() {
|
2013-07-29 08:46:37 -04:00
|
|
|
let oldStatus = this.verificationStatus;
|
2013-07-28 16:24:31 -04:00
|
|
|
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
2020-02-14 11:14:55 -05:00
|
|
|
this.cancelButton.reactive = this._hasCancelButton;
|
2020-02-19 11:32:22 -05:00
|
|
|
this.cancelButton.can_focus = this._hasCancelButton;
|
2018-05-28 19:51:00 -04:00
|
|
|
this._preemptiveAnswer = null;
|
2013-07-29 08:46:37 -04:00
|
|
|
|
2015-07-15 15:52:29 -04:00
|
|
|
if (this._userVerifier)
|
2013-07-29 08:46:37 -04:00
|
|
|
this._userVerifier.cancel();
|
|
|
|
|
2013-07-22 11:07:35 -04:00
|
|
|
this._queryingService = null;
|
|
|
|
this.clear();
|
2013-07-23 20:37:42 -04:00
|
|
|
this._message.opacity = 0;
|
|
|
|
this.setUser(null);
|
2020-02-13 16:05:38 -05:00
|
|
|
this._updateEntry(true);
|
2013-07-23 20:37:42 -04:00
|
|
|
this.stopSpinning();
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2013-07-28 16:06:04 -04:00
|
|
|
if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED)
|
|
|
|
this.emit('failed');
|
2021-01-29 22:18:32 -05:00
|
|
|
else if (oldStatus === AuthPromptStatus.VERIFICATION_CANCELLED)
|
|
|
|
this.emit('cancelled');
|
2013-07-28 16:06:04 -04:00
|
|
|
|
2013-06-27 08:54:19 -04:00
|
|
|
let beginRequestType;
|
|
|
|
|
|
|
|
if (this._mode == AuthPromptMode.UNLOCK_ONLY) {
|
|
|
|
// The user is constant at the unlock screen, so it will immediately
|
|
|
|
// respond to the request with the username
|
2021-01-29 22:18:32 -05:00
|
|
|
if (oldStatus === AuthPromptStatus.VERIFICATION_CANCELLED)
|
|
|
|
return;
|
2013-06-27 08:54:19 -04:00
|
|
|
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
|
2020-08-17 17:41:04 -04:00
|
|
|
} else if (this._userVerifier.serviceIsForeground(OVirt.SERVICE_NAME) ||
|
2020-09-21 10:11:41 -04:00
|
|
|
this._userVerifier.serviceIsForeground(Vmware.SERVICE_NAME) ||
|
2014-03-13 13:43:36 -04:00
|
|
|
this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME)) {
|
2013-06-27 08:54:19 -04:00
|
|
|
// We don't need to know the username if the user preempted the login screen
|
2013-10-10 04:21:47 -04:00
|
|
|
// with a smartcard or with preauthenticated oVirt credentials
|
2013-06-27 08:54:19 -04:00
|
|
|
beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME;
|
2021-02-01 07:10:45 -05:00
|
|
|
} else if (oldStatus === AuthPromptStatus.VERIFICATION_IN_PROGRESS) {
|
|
|
|
// We're going back to retry with current user
|
|
|
|
beginRequestType = BeginRequestType.REUSE_USERNAME;
|
2013-06-27 08:54:19 -04:00
|
|
|
} else {
|
|
|
|
// In all other cases, we should get the username up front.
|
|
|
|
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.emit('reset', beginRequestType);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-23 20:37:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
addCharacter(unichar) {
|
2013-07-23 20:37:42 -04:00
|
|
|
if (!this._entry.visible)
|
|
|
|
return;
|
|
|
|
|
|
|
|
this._entry.grab_key_focus();
|
|
|
|
this._entry.clutter_text.insert_unichar(unichar);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
begin(params) {
|
2013-07-22 11:07:35 -04:00
|
|
|
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);
|
2013-07-28 16:24:31 -04:00
|
|
|
this.verificationStatus = AuthPromptStatus.VERIFYING;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
finish(onComplete) {
|
2013-07-22 11:07:35 -04:00
|
|
|
if (!this._userVerifier.hasPendingMessages) {
|
2015-08-03 14:07:17 -04:00
|
|
|
this._userVerifier.clear();
|
2013-07-22 11:07:35 -04:00
|
|
|
onComplete();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-10-30 20:38:18 -04:00
|
|
|
let signalId = this._userVerifier.connect('no-more-messages', () => {
|
|
|
|
this._userVerifier.disconnect(signalId);
|
|
|
|
this._userVerifier.clear();
|
|
|
|
onComplete();
|
|
|
|
});
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-07-22 11:07:35 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
cancel() {
|
2019-08-19 20:51:42 -04:00
|
|
|
if (this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
2014-10-05 16:27:00 -04:00
|
|
|
return;
|
2019-08-19 20:51:42 -04:00
|
|
|
|
2021-02-01 07:10:45 -05:00
|
|
|
if (this.verificationStatus === AuthPromptStatus.VERIFICATION_IN_PROGRESS) {
|
|
|
|
this._cancelledRetries++;
|
|
|
|
if (this._cancelledRetries > this._userVerifier.allowedFailures)
|
|
|
|
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
|
|
|
|
} else {
|
|
|
|
this.verificationStatus = AuthPromptStatus.VERIFICATION_CANCELLED;
|
|
|
|
}
|
|
|
|
|
2013-07-22 11:07:35 -04:00
|
|
|
this.reset();
|
2013-07-23 20:37:42 -04:00
|
|
|
}
|
2019-07-16 05:24:13 -04:00
|
|
|
});
|