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',