loginDialog: Reconsider user for user list when user changes
Generally a user-changed operation will be uninteresting, but if the user is currently in the user list and the account changes to locked, we want to remove it from the list, or if the user is not in the list and the account changed to unlocked, we want to add it to the list. This fixes the case where a new user account created in gnome-control-center does not appear in the user list. The password mode is set in the new account immediately after it is created, but the operations are not atomic, so the login dialog considers the new user account when it is still locked and rejects it from being displayed, then immediately afterwards the account is unlocked. This commit causes the login dialog to show the account when this occurs. The containsUser() check here is not strictly necessary, but reduces spurious calls to addUser() and removeUser(), since there's no easy way to check if the locked status of the account has changed (as it's much easier to connect to one signal on the UserManager than to notify::locked on each User object). https://bugzilla.gnome.org/show_bug.cgi?id=758568
This commit is contained in:
parent
491e511a96
commit
3001f3376c
@ -212,6 +212,10 @@ const UserList = new Lang.Class({
|
||||
return item;
|
||||
},
|
||||
|
||||
containsUser: function(user) {
|
||||
return this._items[user.get_user_name()] != null;
|
||||
},
|
||||
|
||||
addUser: function(user) {
|
||||
if (!user.is_loaded)
|
||||
return;
|
||||
@ -1126,6 +1130,10 @@ const LoginDialog = new Lang.Class({
|
||||
this._userManager.disconnect(this._userRemovedId);
|
||||
this._userRemovedId = 0;
|
||||
}
|
||||
if (this._userChangedId) {
|
||||
this._userManager.disconnect(this._userChangedId);
|
||||
this._userChangedId = 0;
|
||||
}
|
||||
this._textureCache.disconnect(this._updateLogoTextureId);
|
||||
Main.layoutManager.disconnect(this._startupCompleteId);
|
||||
if (this._settings) {
|
||||
@ -1172,6 +1180,14 @@ const LoginDialog = new Lang.Class({
|
||||
this._userList.removeUser(user);
|
||||
}));
|
||||
|
||||
this._userChangedId = this._userManager.connect('user-changed',
|
||||
Lang.bind(this, function(userManager, user) {
|
||||
if (this._userList.containsUser(user) && user.locked)
|
||||
this._userList.removeUser(user);
|
||||
else if (!this._userList.containsUser(user) && !user.locked)
|
||||
this._userList.addUser(user);
|
||||
}));
|
||||
|
||||
return GLib.SOURCE_REMOVE;
|
||||
},
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user