[gnome-shell] gdm: port from libgdmgreeter to libgdm
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] gdm: port from libgdmgreeter to libgdm
- Date: Tue, 17 Jul 2012 15:39:36 +0000 (UTC)
commit e06ecb8f0c948aa7043d1703702fbe8fa66835ec
Author: Ray Strode <rstrode redhat com>
Date: Sun May 20 01:19:25 2012 +0200
gdm: port from libgdmgreeter to libgdm
When GDM was moved over to GDBus it dropped the libgdmgreeter
library and introduced a new libgdm library with a somewhat
different API.
The main differences in the API are:
1) open_connection is now implicit and automatic
2) conversations don't need to be started explicitly, they're
started just-in-time when verification is requested
3) The functions are split up between the client, and new
helper objects that correspond to the dbus interfaces
they were generated from (one for user verification,
one for greeter specific operations, and a couple more
that aren't used by gnome-shell).
4) libgdm supports reauthenticating in an already running
session, so user switching should now affect the users
session more like screen unlocking does.
This commit moves the shell over to the new library.
Based on work by Giovanni Campagna <gcampagna src gnome org>
https://bugzilla.gnome.org/show_bug.cgi?id=676401
js/gdm/loginDialog.js | 183 +++++++++++++++++++++++++++++++++++--------------
js/ui/userMenu.js | 6 +-
2 files changed, 134 insertions(+), 55 deletions(-)
---
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index 6ea4151..53005b7 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -30,7 +30,7 @@ const Pango = imports.gi.Pango;
const Signals = imports.signals;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
-const GdmGreeter = imports.gi.GdmGreeter;
+const Gdm = imports.gi.Gdm;
const Batch = imports.gdm.batch;
const Fprint = imports.gdm.fingerprint;
@@ -703,7 +703,7 @@ const SessionList = new Lang.Class({
this._activeSessionId = null;
this._items = {};
- let ids = GdmGreeter.get_session_ids();
+ let ids = Gdm.get_session_ids();
ids.sort();
if (ids.length <= 1) {
@@ -715,7 +715,7 @@ const SessionList = new Lang.Class({
}
for (let i = 0; i < ids.length; i++) {
- let [sessionName, sessionDescription] = GdmGreeter.get_session_name_and_description(ids[i]);
+ let [sessionName, sessionDescription] = Gdm.get_session_name_and_description(ids[i]);
let item = new SessionListItem(ids[i], sessionName);
this._itemList.add_actor(item.actor,
@@ -749,37 +749,22 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, this._onOpened));
this._userManager = AccountsService.UserManager.get_default()
- this._greeterClient = new GdmGreeter.Client();
-
- this._greeterClient.open_connection();
-
- this._greeterClient.call_start_conversation(_PASSWORD_SERVICE_NAME);
-
- this._greeterClient.connect('reset',
- Lang.bind(this, this._onReset));
- this._greeterClient.connect('default-session-changed',
- Lang.bind(this, this._onDefaultSessionChanged));
- this._greeterClient.connect('info',
- Lang.bind(this, this._onInfo));
- this._greeterClient.connect('problem',
- Lang.bind(this, this._onProblem));
- this._greeterClient.connect('info-query',
- Lang.bind(this, this._onInfoQuery));
- this._greeterClient.connect('secret-info-query',
- Lang.bind(this, this._onSecretInfoQuery));
- this._greeterClient.connect('session-opened',
- Lang.bind(this, this._onSessionOpened));
- this._greeterClient.connect('timed-login-requested',
- Lang.bind(this, this._onTimedLoginRequested));
- this._greeterClient.connect('authentication-failed',
- Lang.bind(this, this._onAuthenticationFailed));
- this._greeterClient.connect('conversation-stopped',
- Lang.bind(this, this._onConversationStopped));
+ this._greeterClient = new Gdm.Client();
+
+ this._greeter = this._greeterClient.get_greeter_sync(null);
+
+ this._greeter.connect('default-session-name-changed',
+ Lang.bind(this, this._onDefaultSessionChanged));
+
+ this._greeter.connect('session-opened',
+ Lang.bind(this, this._onSessionOpened));
+ this._greeter.connect('timed-login-requested',
+ Lang.bind(this, this._onTimedLoginRequested));
this._settings = new Gio.Settings({ schema: _LOGIN_SCREEN_SCHEMA });
this._fprintManager = new Fprint.FprintManager();
- this._startFingerprintConversationIfNeeded();
+ this._checkForFingerprintReader();
this._settings.connect('changed::' + _LOGO_KEY,
Lang.bind(this, this._updateLogo));
this._settings.connect('changed::' + _BANNER_MESSAGE_KEY,
@@ -850,7 +835,7 @@ const LoginDialog = new Lang.Class({
this._sessionList = new SessionList();
this._sessionList.connect('session-activated',
Lang.bind(this, function(list, sessionId) {
- this._greeterClient.call_select_session (sessionId);
+ this._greeter.call_select_session_sync (sessionId, null);
}));
this._promptBox.add(this._sessionList.actor,
@@ -898,7 +883,7 @@ const LoginDialog = new Lang.Class({
},
- _startFingerprintConversationIfNeeded: function() {
+ _checkForFingerprintReader: function() {
this._haveFingerprintReader = false;
if (!this._settings.get_boolean(_FINGERPRINT_AUTHENTICATION_KEY))
@@ -908,9 +893,6 @@ const LoginDialog = new Lang.Class({
function(device, error) {
if (!error && device)
this._haveFingerprintReader = true;
-
- if (this._haveFingerprintReader)
- this._greeterClient.call_start_conversation(_FINGERPRINT_SERVICE_NAME);
}));
},
@@ -941,8 +923,9 @@ const LoginDialog = new Lang.Class({
},
_onReset: function(client, serviceName) {
- this._greeterClient.call_start_conversation(_PASSWORD_SERVICE_NAME);
- this._startFingerprintConversationIfNeeded();
+ this._userVerifier = null;
+
+ this._checkForFingerprintReader();
let tasks = [this._hidePrompt,
@@ -1000,7 +983,7 @@ const LoginDialog = new Lang.Class({
},
_onCancel: function(client) {
- this._greeterClient.call_cancel();
+ this._userVerifier.call_cancel_sync(null);
},
_fadeInPrompt: function() {
@@ -1107,7 +1090,7 @@ const LoginDialog = new Lang.Class({
let _text = this._promptEntry.get_text();
this._promptEntry.reactive = false;
this._promptEntry.add_style_pseudo_class('insensitive');
- this._greeterClient.call_answer_query(serviceName, _text);
+ this._userVerifier.call_answer_query_sync(serviceName, _text, null);
}];
let batch = new Batch.ConsecutiveBatch(this, tasks);
@@ -1134,7 +1117,7 @@ const LoginDialog = new Lang.Class({
},
_onSessionOpened: function(client, serviceName) {
- this._greeterClient.call_start_session_when_ready(serviceName, true);
+ this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
},
_waitForItemForUser: function(userName) {
@@ -1216,7 +1199,7 @@ const LoginDialog = new Lang.Class({
function() {
this._timedLoginBatch = null;
- this._greeterClient.call_begin_auto_login(userName);
+ this._greeter.call_begin_auto_login_sync(userName, null);
}];
this._timedLoginBatch = new Batch.ConsecutiveBatch(this, tasks);
@@ -1259,16 +1242,12 @@ const LoginDialog = new Lang.Class({
}));
},
- _onAuthenticationFailed: function(client) {
- this._greeterClient.call_cancel();
- },
-
_onConversationStopped: function(client, serviceName) {
// if the password service fails, then cancel everything.
// But if, e.g., fingerprint fails, still give
// password authentication a chance to succeed
if (serviceName == _PASSWORD_SERVICE_NAME) {
- this._greeterClient.call_cancel();
+ this._userVerifier.call_cancel_sync(null);
} else if (serviceName == _FINGERPRINT_SERVICE_NAME) {
_fadeOutActor(this._promptFingerprintMessage);
}
@@ -1292,7 +1271,16 @@ const LoginDialog = new Lang.Class({
this._fadeOutLogo]),
function() {
- this._greeterClient.call_begin_verification(_PASSWORD_SERVICE_NAME);
+ let hold = new Batch.Hold();
+
+ this._userVerifier.call_begin_verification(_PASSWORD_SERVICE_NAME,
+ null,
+ Lang.bind(this, function (userVerifier, result) {
+ this._userVerifier.call_begin_verification_finish (result);
+ hold.release();
+ }));
+
+ return hold;
}];
let batch = new Batch.ConsecutiveBatch(this, tasks);
@@ -1331,7 +1319,101 @@ const LoginDialog = new Lang.Class({
return _fadeOutActor(this._notListedButton);
},
+ _getUserVerifier: function(userName) {
+ let hold = new Batch.Hold();
+
+ this._userVerifier = null;
+
+ // If possible, reauthenticate an already running session,
+ // so any session specific credentials get updated appropriately
+ this._greeterClient.open_reauthentication_channel(userName,
+ null,
+ Lang.bind(this, function(client, result) {
+ try {
+ this._userVerifier = this._greeterClient.open_reauthentication_channel_finish(result);
+ hold.release();
+ } catch (e) {
+ // If there's no session running, or it otherwise fails, then fall back
+ // to performing verification from this login session
+ this._greeterClient.get_user_verifier(null,
+ Lang.bind(this, function(client, result) {
+ this._userVerifier = this._greeterClient.get_user_verifier_finish(result);
+ hold.release();
+ }));
+ }
+ }));
+
+ hold.connect('release', Lang.bind(this, function() {
+ if (this._userVerifier) {
+ let ids = [];
+ let id;
+
+ id = this._userVerifier.connect('info',
+ Lang.bind(this, this._onInfo));
+ ids.push(id);
+ id = this._userVerifier.connect('problem',
+ Lang.bind(this, this._onProblem));
+ ids.push(id);
+ id = this._userVerifier.connect('info-query',
+ Lang.bind(this, this._onInfoQuery));
+ ids.push(id);
+ id = this._userVerifier.connect('secret-info-query',
+ Lang.bind(this, this._onSecretInfoQuery));
+ ids.push(id);
+ id = this._userVerifier.connect('conversation-stopped',
+ Lang.bind(this, this._onConversationStopped));
+ ids.push(id);
+ id = this._userVerifier.connect('reset',
+ Lang.bind(this, function() {
+ for (let i = 0; i < ids.length; i++)
+ this._userVerifier.disconnect(ids[i]);
+
+ this._onReset();
+ }));
+ ids.push(id);
+ }
+ }));
+
+ return hold;
+ },
+
+ _beginVerificationForUser: function(userName) {
+ let tasks = [function() {
+ let hold = new Batch.Hold();
+ this._userVerifier.call_begin_verification_for_user (_PASSWORD_SERVICE_NAME,
+ userName, null,
+ Lang.bind(this, function(userVerifier, result) {
+ this._userVerifier.call_begin_verification_for_user_finish (result);
+ hold.release();
+ }));
+ return hold;
+ },
+
+ function() {
+ let hold = new Batch.Hold();
+ if (this._haveFingerprintReader) {
+ this._userVerifier.call_begin_verification_for_user (_FINGERPRINT_SERVICE_NAME,
+ userName, null,
+ Lang.bind(this, function(userVerifier, result) {
+ this._userVerifier.call_begin_verification_for_user_finish (result);
+ hold.release();
+ }));
+ } else {
+ hold.release();
+ }
+
+ return hold;
+ }];
+
+ let batch = new Batch.ConsecutiveBatch(this, [this._getUserVerifier(userName),
+ new Batch.ConcurrentBatch(this, tasks)]);
+
+ return batch.run();
+ },
+
_onUserListActivated: function(activatedItem) {
+ let userName;
+
let tasks = [function() {
this._userList.actor.reactive = false;
return this._userList.pinInPlace();
@@ -1358,12 +1440,9 @@ const LoginDialog = new Lang.Class({
},
function() {
- let userName = activatedItem.user.get_user_name();
- this._greeterClient.call_begin_verification_for_user(_PASSWORD_SERVICE_NAME,
- userName);
+ userName = activatedItem.user.get_user_name();
- if (this._haveFingerprintReader)
- this._greeterClient.call_begin_verification_for_user(_FINGERPRINT_SERVICE_NAME, userName);
+ return this._beginVerificationForUser(userName);
}];
this._user = activatedItem.user;
diff --git a/js/ui/userMenu.js b/js/ui/userMenu.js
index f535923..16395d2 100644
--- a/js/ui/userMenu.js
+++ b/js/ui/userMenu.js
@@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const AccountsService = imports.gi.AccountsService;
-const GdmGreeter = imports.gi.GdmGreeter;
+const Gdm = imports.gi.Gdm;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
@@ -562,7 +562,7 @@ const UserMenuButton = new Lang.Class({
_updateSwitchUser: function() {
let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY);
let multiUser = this._userManager.can_switch() && this._userManager.has_multiple_users;
- let multiSession = GdmGreeter.get_session_ids().length > 1;
+ let multiSession = Gdm.get_session_ids().length > 1;
this._loginScreenItem.label.set_text(multiUser ? _("Switch User")
: _("Switch Session"));
@@ -572,7 +572,7 @@ const UserMenuButton = new Lang.Class({
_updateLogout: function() {
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
let multiUser = this._userManager.has_multiple_users;
- let multiSession = GdmGreeter.get_session_ids().length > 1;
+ let multiSession = Gdm.get_session_ids().length > 1;
this._logoutItem.actor.visible = allowLogout && (multiUser || multiSession);
},
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]