diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js index d2c9a165949a1b09df67754b5476c61692f5e2d8..dce4f441fa65903489c2339f9b1a88a460540280 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -281,10 +281,11 @@ var AuthPrompt = GObject.registerClass({ _onVerificationFailed(userVerifier, serviceName, canRetry) { const wasQueryingService = this._queryingService === serviceName; this._queryingService = null; - this.clear(); + + if (wasQueryingService) + this.clear(); this.updateSensitivity(canRetry); - this.setActorInDefaultButtonWell(null); this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; if (wasQueryingService) diff --git a/js/gdm/credentialManager.js b/js/gdm/credentialManager.js index 5c4bc7e62a35fdc5b89e2b03149b7c8da314068c..21fb76471ee4a29b899f79a6339fd77d6bf8ed80 100644 --- a/js/gdm/credentialManager.js +++ b/js/gdm/credentialManager.js @@ -1,5 +1,8 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported CredentialManager */ +/* exported CredentialManager, DBusCredentialManager */ + +const { Gio } = imports.gi; +const Signals = imports.signals; var CredentialManager = class CredentialManager { constructor(service) { @@ -8,6 +11,10 @@ var CredentialManager = class CredentialManager { this._authenticatedSignalId = null; } + destroy() { + this.disconnectAll(); + } + get token() { return this._token; } @@ -22,3 +29,31 @@ var CredentialManager = class CredentialManager { return this._service; } }; +Signals.addSignalMethods(CredentialManager.prototype); + + +var DBusCredentialManager = class extends CredentialManager { + constructor(service, dbusName, dbusIface, dbusPath) { + super(service); + + this._subscriptionId = Gio.DBus.system.signal_subscribe(dbusName, + dbusIface, 'UserAuthenticated', dbusPath, null, + Gio.DBusSignalFlags.NONE, (_c, _sender, _path, _iface, _signal, params) => { + const [token] = params.deep_unpack(); + this._onUserAuthenticated(token); + }); + } + + _onUserAuthenticated(token) { + this.token = token; + } + + destroy() { + if (this._subscriptionId) { + Gio.DBus.system.signal_unsubscribe(this._subscriptionId); + delete this._subscriptionId; + } + + super.destroy(); + } +}; diff --git a/js/gdm/oVirt.js b/js/gdm/oVirt.js index 94a22b8237f5761b6d9dd15e62143a9a6c66c0ac..e36e318a342088814ac46abc26d66f8fb78771d9 100644 --- a/js/gdm/oVirt.js +++ b/js/gdm/oVirt.js @@ -1,51 +1,15 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported getOVirtCredentialsManager */ +/* exported CredentialsManager */ -const Gio = imports.gi.Gio; -const Signals = imports.signals; const Credential = imports.gdm.credentialManager; var SERVICE_NAME = 'gdm-ovirtcred'; -const OVirtCredentialsIface = ` - - - - - - -`; +const credentialsIface = 'org.ovirt.vdsm.Credentials'; +const credentialsPath = '/org/ovirt/vdsm/Credentials'; -const OVirtCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(OVirtCredentialsIface); - -let _oVirtCredentialsManager = null; - -function OVirtCredentials() { - var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system, - g_interface_name: OVirtCredentialsInfo.name, - g_interface_info: OVirtCredentialsInfo, - g_name: 'org.ovirt.vdsm.Credentials', - g_object_path: '/org/ovirt/vdsm/Credentials', - g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES }); - self.init(null); - return self; -} - -var OVirtCredentialsManager = class OVirtCredentialsManager extends Credential.CredentialManager { +var CredentialsManager = class extends Credential.DBusCredentialManager { constructor() { - super(SERVICE_NAME); - this._credentials = new OVirtCredentials(); - this._credentials.connectSignal('UserAuthenticated', - (proxy, sender, [token]) => { - this.token = token; - }); + super(SERVICE_NAME, credentialsIface, credentialsIface, credentialsPath); } }; -Signals.addSignalMethods(OVirtCredentialsManager.prototype); - -function getOVirtCredentialsManager() { - if (!_oVirtCredentialsManager) - _oVirtCredentialsManager = new OVirtCredentialsManager(); - - return _oVirtCredentialsManager; -} diff --git a/js/gdm/util.js b/js/gdm/util.js index 1ee84acde287a233b098dbd01f8f34ac076a3507..bdbb3cd9e4836fddb59b78625dafe882ef3d4998 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -178,20 +178,17 @@ var ShellUserVerifier = class { this._failCounter = 0; this._unavailableServices = new Set(); - this._credentialManagers = {}; - this._credentialManagers[OVirt.SERVICE_NAME] = OVirt.getOVirtCredentialsManager(); - this._credentialManagers[Vmware.SERVICE_NAME] = Vmware.getVmwareCredentialsManager(); - - for (let service in this._credentialManagers) { - if (this._credentialManagers[service].token) { - this._onCredentialManagerAuthenticated(this._credentialManagers[service], - this._credentialManagers[service].token); - } + this._credentialManagers = new Map(); + this._credentialManagers.set(OVirt.SERVICE_NAME, new OVirt.CredentialsManager()); + this._credentialManagers.set(Vmware.SERVICE_NAME, new Vmware.CredentialsManager()); - this._credentialManagers[service]._authenticatedSignalId = - this._credentialManagers[service].connect('user-authenticated', - this._onCredentialManagerAuthenticated.bind(this)); - } + this._credentialManagers.forEach(service => { + if (service.token) + this._onCredentialManagerAuthenticated(service, service.token); + + service._authenticatedSignalId = service.connect('user-authenticated', + this._onCredentialManagerAuthenticated.bind(this)); + }); } get hasPendingMessages() { @@ -260,11 +257,8 @@ var ShellUserVerifier = class { this._smartcardManager.disconnect(this._smartcardRemovedId); this._smartcardManager = null; - for (let service in this._credentialManagers) { - let credentialManager = this._credentialManagers[service]; - credentialManager.disconnect(credentialManager._authenticatedSignalId); - credentialManager = null; - } + this._credentialManagers.forEach(s => s.destroy()); + this._credentialManagers.clear(); } answerQuery(serviceName, answer) { @@ -644,10 +638,8 @@ var ShellUserVerifier = class { if (!this.serviceIsForeground(serviceName)) return; - let token = null; - if (this._credentialManagers[serviceName]) - token = this._credentialManagers[serviceName].token; + const token = this._credentialManagers.get(serviceName)?.token; if (token) { this.answerQuery(serviceName, token); return; @@ -738,12 +730,11 @@ var ShellUserVerifier = class { // If the login failed with the preauthenticated oVirt credentials // then discard the credentials and revert to default authentication // mechanism. - let foregroundService = Object.keys(this._credentialManagers).find(service => - this.serviceIsForeground(service)); - if (foregroundService) { - this._credentialManagers[foregroundService].token = null; - this._preemptingService = null; + const foregroundService = this.serviceIsForeground(serviceName); + if (foregroundService && this._credentialManagers.has(serviceName)) { + this._credentialManagers.get(serviceName).token = null; this._verificationFailed(serviceName, false); + this._preemptingService = null; return; } @@ -755,7 +746,7 @@ var ShellUserVerifier = class { // if the password service fails, then cancel everything. // But if, e.g., fingerprint fails, still give // password authentication a chance to succeed - if (this.serviceIsForeground(serviceName)) + if (foregroundService) this._failCounter++; this._verificationFailed(serviceName, true); diff --git a/js/gdm/vmware.js b/js/gdm/vmware.js index 20d57e8a28f09534593fddd03b047bde3da3b5a3..dd6fc841a18e6e4b995bc564363ef32eff55ac64 100644 --- a/js/gdm/vmware.js +++ b/js/gdm/vmware.js @@ -1,54 +1,15 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported getVmwareCredentialsManager */ +/* exported CredentialsManager */ -const Gio = imports.gi.Gio; -const Signals = imports.signals; const Credential = imports.gdm.credentialManager; -const dbusPath = '/org/vmware/viewagent/Credentials'; -const dbusInterface = 'org.vmware.viewagent.Credentials'; - var SERVICE_NAME = 'gdm-vmwcred'; -const VmwareCredentialsIface = ' \ - \ - \ - \ - \ - \ -'; - - -const VmwareCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(VmwareCredentialsIface); - -let _vmwareCredentialsManager = null; +const credentialsPath = '/org/vmware/viewagent/Credentials'; +const credentialsIface = 'org.vmware.viewagent.Credentials'; -function VmwareCredentials() { - var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session, - g_interface_name: VmwareCredentialsInfo.name, - g_interface_info: VmwareCredentialsInfo, - g_name: dbusInterface, - g_object_path: dbusPath, - g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES }); - self.init(null); - return self; -} - -var VmwareCredentialsManager = class VmwareCredentialsManager extends Credential.CredentialManager { +var CredentialsManager = class extends Credential.DBusCredentialManager { constructor() { - super(SERVICE_NAME); - this._credentials = new VmwareCredentials(); - this._credentials.connectSignal('UserAuthenticated', - (proxy, sender, [token]) => { - this.token = token; - }); + super(SERVICE_NAME, credentialsIface, credentialsIface, credentialsPath); } }; -Signals.addSignalMethods(VmwareCredentialsManager.prototype); - -function getVmwareCredentialsManager() { - if (!_vmwareCredentialsManager) - _vmwareCredentialsManager = new VmwareCredentialsManager(); - - return _vmwareCredentialsManager; -} diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js index d9b6ff47473174bbd5b14a5e0bf9e137c4d4763d..868734892bd53e42a0ea85fea063e210f97dc006 100644 --- a/js/misc/smartcardManager.js +++ b/js/misc/smartcardManager.js @@ -95,7 +95,7 @@ var SmartcardManager = class { if (this._loginToken == token) this._loginToken = null; - token.disconnectAll(); + token.run_dispose(); } hasInsertedTokens() { diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js index 9a64fc32c3206783da6c4baf4e8843853ca2fda9..58de186d97f88fe87cf8a96bd623d6c6c8d1e187 100644 --- a/js/ui/screenShield.js +++ b/js/ui/screenShield.js @@ -82,19 +82,31 @@ var ScreenShield = class { this._screenSaverDBus = new ShellDBus.ScreenSaverDBus(this); - this._smartcardManager = SmartcardManager.getSmartcardManager(); - this._smartcardManager.connect('smartcard-inserted', - (manager, token) => { - if (this._isLocked && token.UsedToLogin) - this._activateDialog(); - }); - - this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager(); - this._oVirtCredentialsManager.connect('user-authenticated', - () => { - if (this._isLocked) - this._activateDialog(); - }); + this.connect('locked-changed', () => { + const smartcardManager = SmartcardManager.getSmartcardManager(); + if (!this._isLocked) { + this._oVirtCredentialsManager?.destroy(); + delete this._oVirtCredentialsManager; + + smartcardManager.disconnect(this._smartcardInsertedId); + delete this._smartcardInsertedId; + + return; + } + + if (smartcardManager.hasInsertedLoginToken()) + this._activateDialog(); + + this._smartcardInsertedId = smartcardManager.connect('smartcard-inserted', + (manager, token) => { + if (token.UsedToLogin) + this._activateDialog(); + }); + + this._oVirtCredentialsManager = new OVirt.CredentialsManager(); + this._oVirtCredentialsManager.connect('user-authenticated', + () => this._activateDialog()); + }); this._loginManager = LoginManager.getLoginManager(); this._loginManager.connect('prepare-for-sleep',