diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js index 1cae3db85..36554e5bc 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -402,6 +402,40 @@ var SessionMenuButton = new Lang.Class({ }); Signals.addSignalMethods(SessionMenuButton.prototype); +var GuestUser = new Lang.Class({ + Name: 'GuestUser', + + _init: function() { + this.is_loaded = true; + this.locked = false; + }, + + connect: function() { + }, + disconnect: function() { + }, + + is_system_account: function() { + return false; + }, + + get_icon_file: function() { + return null; // FIXME: Use an icon for guest? + }, + + get_real_name: function() { + return 'Guest'; // FIXME: Translatable + }, + + get_user_name: function() { + return '*guest'; // FIXME: No a real username... + }, + + is_logged_in: function() { + return false; // FIXME: Can be logged in.. + } +}); + var LoginDialog = new Lang.Class({ Name: 'LoginDialog', @@ -446,6 +480,8 @@ var LoginDialog = new Lang.Class({ x_fill: true, y_fill: true }); + this._guestUser = new GuestUser(); + this._authPrompt = new AuthPrompt.AuthPrompt(this._gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_OR_LOG_IN); this._authPrompt.connect('prompted', Lang.bind(this, this._onPrompted)); this._authPrompt.connect('reset', Lang.bind(this, this._onReset)); @@ -1204,6 +1240,7 @@ var LoginDialog = new Lang.Class({ for (let i = 0; i < users.length; i++) { this._userList.addUser(users[i]); } + this._userList.addUser(this._guestUser); this._updateDisableUserList(); diff --git a/js/gdm/util.js b/js/gdm/util.js index b594da4fd..e144fce75 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -423,7 +423,21 @@ var ShellUserVerifier = new Lang.Class({ _startService: function(serviceName) { this._hold.acquire(); - if (this._userName) { + if (this._userName == "*guest") { + this._userVerifier.call_begin_verification_for_guest(this._cancellable, + Lang.bind(this, function(obj, result) { + try { + obj.call_begin_verification_for_guest_finish(result); + } catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { + return; + } catch(e) { + this._reportInitError('Failed to start verification for guest', e); + return; + } + + this._hold.release(); + })); + } else if (this._userName) { this._userVerifier.call_begin_verification_for_user(serviceName, this._userName, this._cancellable,