Compare commits

...

2 Commits

Author SHA1 Message Date
Joaquim Rocha
9915bad039 polkitAgent: Do not set initial focus in the password entry
The password entry can be hidden if the user has no password set, but
setting the initial focus to it will result in the entry responding to
the "activate" and signals.
Besides, with the logic that the dialog follows, setting the initial
focus in the entry is redundant, because the focus is also set in the
entry upon showing it.
2018-02-14 17:29:40 +01:00
Joaquim Rocha
903036e244 polkitAgent: Use dialog as confirmation when the user has no password
When a user has no password and a polkit authentication is started,
instead of blindly initiating the admin session, the regular
"Authentication Requested" dialog is shown (but without the password
entry). This means that the user's admin session is only effectively
started after the user chooses to proceed with the authentication which
provides an extra confirmation step that can be vital for critical
tasks.

Ideally we should use a different wording than "authentication" when the
user has no password set, and use "confirmation" instead. However polkit
already sends the requests with such messages (e.g. "Authentication is
required to configure software repositories"), and it's important to
show those to the user, so this patch keeps the regular wording.
2018-02-14 17:29:33 +01:00

View File

@ -27,6 +27,11 @@ var WORK_SPINNER_ICON_SIZE = 16;
var WORK_SPINNER_ANIMATION_DELAY = 1.0;
var WORK_SPINNER_ANIMATION_TIME = 0.3;
const DialogMode = {
AUTH: 0,
CONFIRM: 1
};
var AuthenticationDialog = new Lang.Class({
Name: 'AuthenticationDialog',
Extends: ModalDialog.ModalDialog,
@ -59,10 +64,6 @@ var AuthenticationDialog = new Lang.Class({
this._user = AccountsService.UserManager.get_default().get_user(userName);
let userRealName = this._user.get_real_name()
this._userLoadedId = this._user.connect('notify::is_loaded',
Lang.bind(this, this._onUserChanged));
this._userChangedId = this._user.connect('changed',
Lang.bind(this, this._onUserChanged));
// Special case 'root'
let userIsRoot = false;
@ -98,10 +99,14 @@ var AuthenticationDialog = new Lang.Class({
y_align: St.Align.MIDDLE });
}
this._onUserChanged();
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
content.messageBox.add(this._passwordBox);
// onUserChanged needs to be called after we have the _passwordBox set
this._user.connect('notify::is_loaded', Lang.bind(this, this._onUserChanged));
this._user.connect('changed', Lang.bind(this, this._onUserChanged));
this._onUserChanged();
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label' }));
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
@ -118,7 +123,6 @@ var AuthenticationDialog = new Lang.Class({
this._passwordBox.add(this._workSpinner.actor);
this.setInitialKeyFocus(this._passwordEntry);
this._passwordBox.hide();
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
@ -182,7 +186,7 @@ var AuthenticationDialog = new Lang.Class({
}
},
performAuthentication: function() {
_initiateSession: function() {
this.destroySession();
this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
cookie: this._cookie });
@ -193,6 +197,12 @@ var AuthenticationDialog = new Lang.Class({
this._session.initiate();
},
performAuthentication: function() {
if (this._mode == DialogMode.AUTH)
this._initiateSession();
this._ensureOpen();
},
_ensureOpen: function() {
// NOTE: ModalDialog.open() is safe to call if the dialog is
// already open - it just returns true without side-effects
@ -243,7 +253,10 @@ var AuthenticationDialog = new Lang.Class({
},
_onAuthenticateButtonPressed: function() {
this._onEntryActivate();
if (this._mode == DialogMode.CONFIRM)
this._initiateSession();
else
this._onEntryActivate();
},
_onSessionCompleted: function(session, gainedAuthorization) {
@ -329,6 +342,13 @@ var AuthenticationDialog = new Lang.Class({
this._userAvatar.update();
this._userAvatar.actor.show();
}
if (this._user.get_password_mode() == AccountsService.UserPasswordMode.NONE) {
this._mode = DialogMode.CONFIRM;
this._passwordBox.hide();
} else {
this._mode = DialogMode.AUTH;
}
},
cancel: function() {