diff --git a/0001-Support-for-web-login-and-unified-auth-mechanism.patch b/0001-Support-for-web-login-and-unified-auth-mechanism.patch index cf6af2e..a0eeac9 100644 --- a/0001-Support-for-web-login-and-unified-auth-mechanism.patch +++ b/0001-Support-for-web-login-and-unified-auth-mechanism.patch @@ -1,7 +1,7 @@ -From bd65f20755963dbf291ef94f585474604ab6c285 Mon Sep 17 00:00:00 2001 +From ad29c73ff970f406db43391f38f27a34aecfd6c9 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Thu, 2 Oct 2025 10:59:57 +0200 -Subject: [PATCH 01/29] style: Add common login dialog button styles to avoid +Subject: [PATCH 01/30] style: Add common login dialog button styles to avoid duplication This will be used in next commits, when new login buttons are added. @@ -80,13 +80,13 @@ index b661e93c8d..6cca1e28e9 100644 padding: $base_padding * 1.5; -- -2.51.1 +2.51.0 -From 92cfcabba70abdccf4cf5ce90e4c80d900994841 Mon Sep 17 00:00:00 2001 +From 1e02163f891483fc24536c490f3fc5f1a85b3a37 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Sun, 24 Nov 2024 12:53:50 -0500 -Subject: [PATCH 02/29] unlockDialog: Add some small fixes +Subject: [PATCH 02/30] unlockDialog: Add some small fixes 1. Vertically center dialog if clock is active, otherwise reduce vertical margins with a fixed top. @@ -155,13 +155,13 @@ index 63ba591eec..03d91b6114 100644 } -- -2.51.1 +2.51.0 -From ad29cbd94aab54a03268d1483c4227dfffbdab15 Mon Sep 17 00:00:00 2001 +From 8669977768cdf0fe03a62d7fb48370a86c053db3 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 9 Feb 2024 09:02:25 -0500 -Subject: [PATCH 03/29] authPrompt: Fade out input buttons/entry after +Subject: [PATCH 03/30] authPrompt: Fade out input buttons/entry after verification It's nice to just see the user image and post login messages @@ -274,13 +274,46 @@ index 26966b633d..886e432063 100644 this._sessionMenuButton.setActiveSession(sessionId); } -- -2.51.1 +2.51.0 -From 96f9ce3bd82b6cf32af399df5ecf6fa08c228f00 Mon Sep 17 00:00:00 2001 +From 50c44700221fc8c50ca9a9580f6d3cd95fba5dd0 Mon Sep 17 00:00:00 2001 +From: Joan Torres Lopez +Date: Wed, 21 Jan 2026 14:23:34 +0100 +Subject: [PATCH 04/30] authPrompt: Don't reset preemptiveAnswer when + VERIFICATION_IN_PROGRESS + +PreemptiveAnswer wasn't being used in the case where verification is in +progress and the smartcard is inserted, triggering a reset. + +This change ensures a preemptive answer will be used once smartcard +service asks for the PIN. +--- + js/gdm/authPrompt.js | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js +index cdacd32172..5878c57620 100644 +--- a/js/gdm/authPrompt.js ++++ b/js/gdm/authPrompt.js +@@ -688,7 +688,8 @@ export const AuthPrompt = GObject.registerClass({ + this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; + this.cancelButton.reactive = this._hasCancelButton; + this.cancelButton.can_focus = this._hasCancelButton; +- this._preemptiveAnswer = null; ++ if (oldStatus !== AuthPromptStatus.VERIFICATION_IN_PROGRESS) ++ this._preemptiveAnswer = null; + + if (this._preemptiveAnswerWatchId) + this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId); +-- +2.51.0 + + +From bbdc3c3e707cfbfe0762a747daf68b77f0c43b38 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Sun, 24 Nov 2024 16:29:43 -0500 -Subject: [PATCH 04/29] authPrompt: Add some changes to the elements in +Subject: [PATCH 05/30] authPrompt: Add some changes to the elements in _mainBox * Update the prompt entry style to be a bit bigger and more rounded. @@ -298,6 +331,9 @@ Subject: [PATCH 04/29] authPrompt: Add some changes to the elements in Use _fadeInElement (this sets sensitivity to true). Now by default it's not visible. Don't clear it on verificationFailed to keep it visible, it'll be cleared later on reset. + Since it is hidden by default, we must explicitly make it visible when + showing a message if no other widgets are visible. This allows for + a preemptive answer. * Fix animation when updating next button or spinning. Now _deafaultButtonWell can have either _nextButton or _spinner, @@ -312,8 +348,8 @@ Subject: [PATCH 04/29] authPrompt: Add some changes to the elements in --- .../gnome-shell-sass/widgets/_entries.scss | 2 +- .../gnome-shell-sass/widgets/_login-lock.scss | 24 ++- - js/gdm/authPrompt.js | 174 ++++++++++-------- - 3 files changed, 118 insertions(+), 82 deletions(-) + js/gdm/authPrompt.js | 182 ++++++++++-------- + 3 files changed, 126 insertions(+), 82 deletions(-) diff --git a/data/theme/gnome-shell-sass/widgets/_entries.scss b/data/theme/gnome-shell-sass/widgets/_entries.scss index 41e10f7663..5a45e86d6d 100644 @@ -382,7 +418,7 @@ index 6cca1e28e9..93dbe617b7 100644 .conflicting-session-dialog-content { diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index cdacd32172..afb9e6b1c9 100644 +index 5878c57620..7faec91bdc 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -2,6 +2,7 @@ import Clutter from 'gi://Clutter'; @@ -552,7 +588,21 @@ index cdacd32172..afb9e6b1c9 100644 this.emit('prompted'); } -@@ -415,23 +443,21 @@ export const AuthPrompt = GObject.registerClass({ +@@ -409,29 +437,35 @@ export const AuthPrompt = GObject.registerClass({ + } + + this.setMessage(message, type, wiggleParameters); ++ ++ // If we're showing a message and no auth widget is currently visible, ++ // show the entry area to allow getting a preemptive answer ++ if (message && ++ !this._entryArea.visible && ++ !this._authList.visible) ++ this._fadeInElement(this._entryArea); ++ + this.emit('prompted'); + } + _onVerificationFailed(userVerifier, serviceName, canRetry) { const wasQueryingService = this._queryingService === serviceName; @@ -580,7 +630,7 @@ index cdacd32172..afb9e6b1c9 100644 this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED; this._mainBox.reactive = false; -@@ -451,79 +477,68 @@ export const AuthPrompt = GObject.registerClass({ +@@ -451,79 +485,68 @@ export const AuthPrompt = GObject.registerClass({ } setActorInDefaultButtonWell(actor, animate) { @@ -697,7 +747,7 @@ index cdacd32172..afb9e6b1c9 100644 this._entry.text = ''; this._inactiveEntry.text = ''; this.stopSpinning(); -@@ -544,8 +559,8 @@ export const AuthPrompt = GObject.registerClass({ +@@ -544,8 +567,8 @@ export const AuthPrompt = GObject.registerClass({ this._entry.hint_text = question; this._authList.hide(); @@ -708,7 +758,7 @@ index cdacd32172..afb9e6b1c9 100644 } _fadeInElement(element) { -@@ -570,7 +585,7 @@ export const AuthPrompt = GObject.registerClass({ +@@ -570,7 +593,7 @@ export const AuthPrompt = GObject.registerClass({ this._authList.addItem(key, text); } @@ -717,7 +767,7 @@ index cdacd32172..afb9e6b1c9 100644 if (this._message.text === '') this._message.hide(); this._fadeInElement(this._authList); -@@ -635,6 +650,9 @@ export const AuthPrompt = GObject.registerClass({ +@@ -635,6 +658,9 @@ export const AuthPrompt = GObject.registerClass({ if (authWidget.reactive === sensitive) return; @@ -727,7 +777,7 @@ index cdacd32172..afb9e6b1c9 100644 authWidget.reactive = sensitive; if (sensitive) { -@@ -648,7 +666,7 @@ export const AuthPrompt = GObject.registerClass({ +@@ -648,7 +674,7 @@ export const AuthPrompt = GObject.registerClass({ } vfunc_hide() { @@ -737,13 +787,13 @@ index cdacd32172..afb9e6b1c9 100644 this._message.opacity = 0; -- -2.51.1 +2.51.0 -From 757543ed694b88d37fe64b57298d70da48e6d6a2 Mon Sep 17 00:00:00 2001 +From a70c8fae77f0b41359c0962aeb5c31bf6011ddf5 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 6 Feb 2024 13:06:32 -0500 -Subject: [PATCH 05/29] authPrompt: Parameterize reset function +Subject: [PATCH 06/30] authPrompt: Parameterize reset function In the future, userVerifier will request a partial reset where some state is carried over or explicitly specified. @@ -755,10 +805,10 @@ reusing entry text to be specified at reset time. 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index afb9e6b1c9..39392465ff 100644 +index 7faec91bdc..292621bde3 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js -@@ -471,9 +471,11 @@ export const AuthPrompt = GObject.registerClass({ +@@ -479,9 +479,11 @@ export const AuthPrompt = GObject.registerClass({ this.emit('verification-complete'); } @@ -773,7 +823,7 @@ index afb9e6b1c9..39392465ff 100644 } setActorInDefaultButtonWell(actor, animate) { -@@ -701,13 +703,22 @@ export const AuthPrompt = GObject.registerClass({ +@@ -709,14 +711,23 @@ export const AuthPrompt = GObject.registerClass({ this.updateSensitivity(false); } @@ -790,7 +840,8 @@ index afb9e6b1c9..39392465ff 100644 this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; this.cancelButton.reactive = this._hasCancelButton; this.cancelButton.can_focus = this._hasCancelButton; - this._preemptiveAnswer = null; + if (oldStatus !== AuthPromptStatus.VERIFICATION_IN_PROGRESS) + this._preemptiveAnswer = null; + const oldEntryText = this._textEntry.text; + const oldPasswordText = this._passwordEntry.text; @@ -798,7 +849,7 @@ index afb9e6b1c9..39392465ff 100644 if (this._preemptiveAnswerWatchId) this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId); this._preemptiveAnswerWatchId = this._idleMonitor.add_idle_watch(500, -@@ -723,29 +734,35 @@ export const AuthPrompt = GObject.registerClass({ +@@ -732,29 +743,35 @@ export const AuthPrompt = GObject.registerClass({ this._updateEntry(true); this.stopSpinning(); @@ -853,13 +904,119 @@ index afb9e6b1c9..39392465ff 100644 this.emit('reset', beginRequestType); -- -2.51.1 +2.51.0 -From 089304978ce5375dcbc4b1c57970f8b9eec49d4d Mon Sep 17 00:00:00 2001 +From 88fd7f035436f43bbadd1ca65dd64a75179ae719 Mon Sep 17 00:00:00 2001 +From: Joan Torres Lopez +Date: Wed, 21 Jan 2026 14:34:11 +0100 +Subject: [PATCH 07/30] authPrompt: Capture preemptive input before entry is + sensitive + +The previous changes made the entry invisible and insensitive until +askQuestion is called. During the lock screen, when the user starts +typing before the PAM service is ready, keystrokes were being lost. + +Replace addCharacter() with startPreemptiveInput() which buffers +keystrokes and handles Enter key presses while waiting for the entry +to become sensitive. +--- + js/gdm/authPrompt.js | 36 ++++++++++++++++++++++++++++-------- + js/ui/unlockDialog.js | 2 +- + 2 files changed, 29 insertions(+), 9 deletions(-) + +diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js +index 292621bde3..3a82f97d47 100644 +--- a/js/gdm/authPrompt.js ++++ b/js/gdm/authPrompt.js +@@ -152,6 +152,18 @@ export const AuthPrompt = GObject.registerClass({ + this.cancel(); + return Clutter.EVENT_STOP; + } ++ ++ if (this._preemptiveInput && !this._pendingActivate) { ++ const unichar = event.get_key_unicode(); ++ if (event.get_key_symbol() === Clutter.KEY_Return) { ++ this._pendingActivate = true; ++ } else if (GLib.unichar_isgraph(unichar)) { ++ this._entry.clutter_text.insert_text(unichar, ++ this._entry.clutter_text.cursor_position); ++ } ++ return Clutter.EVENT_STOP; ++ } ++ + return Clutter.EVENT_PROPAGATE; + } + +@@ -583,10 +595,20 @@ export const AuthPrompt = GObject.registerClass({ + opacity: 255, + duration: MESSAGE_FADE_OUT_ANIMATION_TIME, + transition: Clutter.AnimationMode.EASE_OUT_QUAD, +- onComplete: () => this.updateSensitivity(true), ++ onComplete: () => { ++ this.updateSensitivity(true); ++ this._endPreemptiveInput(element); ++ }, + }); + } + ++ _endPreemptiveInput(element) { ++ if (element === this._entryArea && this._pendingActivate) ++ this._activateNext(); ++ this._preemptiveInput = false; ++ this._pendingActivate = false; ++ } ++ + setChoiceList(promptMessage, choiceList) { + this._authList.clear(); + this._authList.label.text = promptMessage; +@@ -743,7 +765,7 @@ export const AuthPrompt = GObject.registerClass({ + this._updateEntry(true); + this.stopSpinning(); + +- if (reuseEntryText) { ++ if (reuseEntryText || this._preemptiveInput) { + this._textEntry.text = oldEntryText; + this._passwordEntry.text = oldPasswordText; + } +@@ -777,12 +799,10 @@ export const AuthPrompt = GObject.registerClass({ + this.emit('reset', beginRequestType); + } + +- addCharacter(unichar) { +- if (!this._entry.visible) +- return; +- +- this._entry.grab_key_focus(); +- this._entry.clutter_text.insert_unichar(unichar); ++ startPreemptiveInput(unichar) { ++ this._preemptiveInput = true; ++ this._entry.clutter_text.insert_text(unichar, this._entry.clutter_text.cursor_position); ++ this.grab_key_focus(); + } + + begin(params) { +diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js +index 03d91b6114..a8bdb93b8c 100644 +--- a/js/ui/unlockDialog.js ++++ b/js/ui/unlockDialog.js +@@ -685,7 +685,7 @@ export const UnlockDialog = GObject.registerClass({ + this._showPrompt(); + + if (GLib.unichar_isgraph(unichar)) +- this._authPrompt.addCharacter(unichar); ++ this._authPrompt.startPreemptiveInput(unichar); + + return Clutter.EVENT_PROPAGATE; + } +-- +2.51.0 + + +From b3017fc5d41f1c3fc3b3f0e744acb83e7017e7c9 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Thu, 11 Sep 2025 19:12:05 +0200 -Subject: [PATCH 06/29] authPrompt: On verificationFailed ensure input +Subject: [PATCH 08/30] authPrompt: On verificationFailed ensure input sensitivity is disabled There's a time window between the verification failing and a new @@ -873,10 +1030,10 @@ verification process, reenabling sensitivity. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 39392465ff..561b8d1fa6 100644 +index 3a82f97d47..1cddbd3f5e 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js -@@ -446,7 +446,7 @@ export const AuthPrompt = GObject.registerClass({ +@@ -466,7 +466,7 @@ export const AuthPrompt = GObject.registerClass({ if (wasQueryingService) this._queryingService = null; @@ -886,13 +1043,13 @@ index 39392465ff..561b8d1fa6 100644 if (!canRetry) -- -2.51.1 +2.51.0 -From 7680a243f0ed2695970a61ed32c23ce98ac448b9 Mon Sep 17 00:00:00 2001 +From cb492e57c4361d5c3de4c3b2e14db65d61603b64 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Tue, 30 Sep 2025 17:43:22 +0200 -Subject: [PATCH 07/29] authPrompt: Update authList style +Subject: [PATCH 09/30] authPrompt: Update authList style Make the buttons a bit bigger and more rounded. @@ -1234,10 +1391,10 @@ index 6575ca4c01..1bb635cb87 100644 this._items.clear(); } diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 561b8d1fa6..f344b9f7e8 100644 +index 1cddbd3f5e..5e18d8c751 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js -@@ -200,13 +200,30 @@ export const AuthPrompt = GObject.registerClass({ +@@ -212,13 +212,30 @@ export const AuthPrompt = GObject.registerClass({ duration: MESSAGE_FADE_OUT_ANIMATION_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => { @@ -1269,7 +1426,7 @@ index 561b8d1fa6..f344b9f7e8 100644 this._entryArea = new St.Widget({ style_class: 'login-dialog-prompt-entry-area', -@@ -544,6 +561,7 @@ export const AuthPrompt = GObject.registerClass({ +@@ -564,6 +581,7 @@ export const AuthPrompt = GObject.registerClass({ this._entry.text = ''; this._inactiveEntry.text = ''; this.stopSpinning(); @@ -1277,7 +1434,7 @@ index 561b8d1fa6..f344b9f7e8 100644 this._authList.clear(); this._authList.hide(); -@@ -581,10 +599,10 @@ export const AuthPrompt = GObject.registerClass({ +@@ -611,10 +629,10 @@ export const AuthPrompt = GObject.registerClass({ setChoiceList(promptMessage, choiceList) { this._authList.clear(); @@ -1322,13 +1479,13 @@ index ee0829c96e..8be425615d 100644 js/gdm/loginDialog.js js/gdm/util.js -- -2.51.1 +2.51.0 -From ab9b9cf90f5025a5c0976e4735942f2d3cc2a5e0 Mon Sep 17 00:00:00 2001 +From 5443b2061ab6493fdab6e4b2bb3389c2e5cf7a2d Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Wed, 8 Oct 2025 18:48:07 +0200 -Subject: [PATCH 08/29] authPrompt: Let back button go back to step 1 instead +Subject: [PATCH 10/30] authPrompt: Let back button go back to step 1 instead of full reset There can be some auth methods that would require multiple steps. In the @@ -1342,7 +1499,7 @@ Show backButton in unlockDialog for these cases. 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index f344b9f7e8..462a1d19e7 100644 +index 5e18d8c751..3027adca6d 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -70,6 +70,7 @@ export const AuthPrompt = GObject.registerClass({ @@ -1362,7 +1519,7 @@ index f344b9f7e8..462a1d19e7 100644 this._initInputRow(); let capsLockPlaceholder = new St.Label(); -@@ -168,8 +167,8 @@ export const AuthPrompt = GObject.registerClass({ +@@ -180,8 +179,8 @@ export const AuthPrompt = GObject.registerClass({ style_class: 'login-dialog-button cancel-button', accessible_name: _('Cancel'), button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, @@ -1373,7 +1530,7 @@ index f344b9f7e8..462a1d19e7 100644 x_expand: true, x_align: Clutter.ActorAlign.START, y_align: Clutter.ActorAlign.CENTER, -@@ -181,10 +180,8 @@ export const AuthPrompt = GObject.registerClass({ +@@ -193,10 +192,8 @@ export const AuthPrompt = GObject.registerClass({ pivot_point: new Graphene.Point({x: 1, y: 0}), })); @@ -1386,7 +1543,7 @@ index f344b9f7e8..462a1d19e7 100644 this._mainBox.add_child(this.cancelButton); this._authList = new AuthList.AuthList(); -@@ -295,6 +292,16 @@ export const AuthPrompt = GObject.registerClass({ +@@ -307,6 +304,16 @@ export const AuthPrompt = GObject.registerClass({ this.setActorInDefaultButtonWell(this._nextButton); } @@ -1403,7 +1560,7 @@ index f344b9f7e8..462a1d19e7 100644 showTimedLoginIndicator(time) { let hold = new Batch.Hold(); -@@ -381,6 +388,9 @@ export const AuthPrompt = GObject.registerClass({ +@@ -393,6 +400,9 @@ export const AuthPrompt = GObject.registerClass({ this.clear(); this._queryingService = serviceName; @@ -1413,7 +1570,7 @@ index f344b9f7e8..462a1d19e7 100644 if (this._preemptiveAnswer) { this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer); this._preemptiveAnswer = null; -@@ -405,6 +415,8 @@ export const AuthPrompt = GObject.registerClass({ +@@ -417,6 +427,8 @@ export const AuthPrompt = GObject.registerClass({ this.clear(); this._queryingService = serviceName; @@ -1422,19 +1579,20 @@ index f344b9f7e8..462a1d19e7 100644 if (this._preemptiveAnswer) this._preemptiveAnswer = null; -@@ -730,9 +742,9 @@ export const AuthPrompt = GObject.registerClass({ +@@ -760,10 +772,10 @@ export const AuthPrompt = GObject.registerClass({ const oldStatus = this.verificationStatus; this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; - this.cancelButton.reactive = this._hasCancelButton; - this.cancelButton.can_focus = this._hasCancelButton; - this._preemptiveAnswer = null; + if (oldStatus !== AuthPromptStatus.VERIFICATION_IN_PROGRESS) + this._preemptiveAnswer = null; + this._promptStep = 0; + this._updateCancelButton(); const oldEntryText = this._textEntry.text; const oldPasswordText = this._passwordEntry.text; -@@ -828,6 +840,12 @@ export const AuthPrompt = GObject.registerClass({ +@@ -857,6 +869,12 @@ export const AuthPrompt = GObject.registerClass({ if (this.verificationStatus === AuthPromptStatus.VERIFICATION_SUCCEEDED) return; @@ -1448,13 +1606,13 @@ index f344b9f7e8..462a1d19e7 100644 this._cancelledRetries++; if (this._cancelledRetries > this._userVerifier.allowedFailures) -- -2.51.1 +2.51.0 -From 69eecd2b4ecb30170eb4a93ca59a16a0c0c3582b Mon Sep 17 00:00:00 2001 +From 587d4f56cde0fb8fb4ee6282323385d1dbde1bbf Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Mon, 20 Oct 2025 17:24:40 +0200 -Subject: [PATCH 09/29] loginDialog: Vertically align promptAuth with fixed top +Subject: [PATCH 11/30] loginDialog: Vertically align promptAuth with fixed top --- js/gdm/loginDialog.js | 21 ++++++++++++++++++++- @@ -1500,45 +1658,13 @@ index 886e432063..103bdfd83b 100644 } -- -2.51.1 +2.51.0 -From ec0cfa9647795677d1ee2b594190e09465d3cd8d Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Tue, 14 Jan 2025 08:17:48 -0500 -Subject: [PATCH 10/29] loginDialog: When updating disable user list ask for - username - -Right now if the disable-user-list key is changed we do -a reset that asks for a username via PAM instead of via -gnome-shell. This is different than Not Listed? behavior -and can get in the way off smartcard handling, so change -it to explicitly ask for the username up front. ---- - js/gdm/loginDialog.js | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index 103bdfd83b..bb65f047a5 100644 ---- a/js/gdm/loginDialog.js -+++ b/js/gdm/loginDialog.js -@@ -937,7 +937,7 @@ export const LoginDialog = GObject.registerClass({ - this._disableUserList = disableUserList; - - if (this._authPrompt.verificationStatus === AuthPrompt.AuthPromptStatus.NOT_VERIFYING) -- this._authPrompt.reset(); -+ this._authPrompt.reset({beginRequestType: AuthPrompt.BeginRequestType.PROVIDE_USERNAME}); - - if (this._disableUserList && this._timedLoginUserListHold) - this._timedLoginUserListHold.release(); --- -2.51.1 - - -From fc795152f20f28aafde110761234167385ecd20c Mon Sep 17 00:00:00 2001 +From f033d96f18d630af58e847b9b446ef72c6832b4a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 12 Nov 2024 14:26:30 -0500 -Subject: [PATCH 11/29] data: Add fingerprint and vcard icons +Subject: [PATCH 12/30] data: Add fingerprint and vcard icons Fingerprint icon will be used to inform when it's being run un the background. @@ -1623,13 +1749,13 @@ index 0000000000..1694f23645 + + -- -2.51.1 +2.51.0 -From 05bae54ec750e5f460ee5f0fb7cf95e6bc4037d0 Mon Sep 17 00:00:00 2001 +From 73239a973f591106ecc616827e160f36b74ce221 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Mon, 18 Aug 2025 12:30:50 +0200 -Subject: [PATCH 12/29] gdm: Extract authentication service and role constants +Subject: [PATCH 13/30] gdm: Extract authentication service and role constants to const.js Create a dedicated const.js module to centralize GDM authentication-related @@ -1648,7 +1774,7 @@ constants. create mode 100644 js/gdm/const.js diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 462a1d19e7..2a66947493 100644 +index 3027adca6d..4804d6af8e 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -10,6 +10,7 @@ import St from 'gi://St'; @@ -1659,7 +1785,7 @@ index 462a1d19e7..2a66947493 100644 import * as GdmUtil from './util.js'; import * as Params from '../misc/params.js'; import * as ShellEntry from '../ui/shellEntry.js'; -@@ -441,7 +442,7 @@ export const AuthPrompt = GObject.registerClass({ +@@ -453,7 +454,7 @@ export const AuthPrompt = GObject.registerClass({ // with a smartcard // 2) Don't reset if we've already succeeded at verification and // the user is getting logged in. @@ -1852,13 +1978,13 @@ index e5e6167f15..ee6b77d322 100644 gdm/loginDialog.js gdm/oVirt.js -- -2.51.1 +2.51.0 -From f23fd9d9cea2972eac107263cf3b9fdc9c5f52fd Mon Sep 17 00:00:00 2001 +From e45452807bcc688520627a358b764c9d7d089cf4 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 6 Feb 2024 11:04:20 -0500 -Subject: [PATCH 13/29] gdm: Add new AuthMenuButton control +Subject: [PATCH 14/30] gdm: Add new AuthMenuButton control The latest login screen designs show a new "Login Options" menu in the corner for session selection and login methods. @@ -2551,13 +2677,13 @@ index 0426ce5452..b719b1bc0c 100644 if (this.isOpen) return; -- -2.51.1 +2.51.0 -From 26a5a5ae6130d6a3711a15c36b02b6273c1505bc Mon Sep 17 00:00:00 2001 +From bdd51d00dbc012b596d1910ffecd153ba3eb8fb4 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 6 Feb 2024 11:11:32 -0500 -Subject: [PATCH 14/29] loginDialog: Port sessions menu over to AuthMenuButton +Subject: [PATCH 15/30] loginDialog: Port sessions menu over to AuthMenuButton Now that AuthMenuButton exists, we should use it. @@ -2581,7 +2707,7 @@ index 4b4f1a5d4e..58c2ed495c 100644 @extend .icon-button; @extend %system_button; diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index bb65f047a5..507107614c 100644 +index 103bdfd83b..f9c5602e70 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -27,9 +27,9 @@ import Pango from 'gi://Pango'; @@ -2835,13 +2961,13 @@ index bb65f047a5..507107614c 100644 this._notListedButton.show(); this._userList.grab_key_focus(); -- -2.51.1 +2.51.0 -From 028ce476031b926c0884eb75ec91540b8e868eec Mon Sep 17 00:00:00 2001 +From ec49238b27648005d9c0a192acb41da47264b494 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 6 Feb 2024 13:40:26 -0500 -Subject: [PATCH 15/29] loginDialog: Add login options menu to AuthMenuButton +Subject: [PATCH 16/30] loginDialog: Add login options menu to AuthMenuButton MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -2868,7 +2994,7 @@ Co-authored-by: Marco Trevisan (Treviño) 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 2a66947493..bae0f008f7 100644 +index 4804d6af8e..90eef29313 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -51,6 +51,7 @@ export const AuthPrompt = GObject.registerClass({ @@ -2887,8 +3013,8 @@ index 2a66947493..bae0f008f7 100644 this._userVerifier.connect('verification-failed', this._onVerificationFailed.bind(this)); this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this)); this._userVerifier.connect('reset', this._onReset.bind(this)); -@@ -734,6 +736,17 @@ export const AuthPrompt = GObject.registerClass({ - this.updateSensitivity(false); +@@ -751,6 +753,17 @@ export const AuthPrompt = GObject.registerClass({ + this._updateEntry(false); } + selectMechanism(mechanism) { @@ -2902,11 +3028,11 @@ index 2a66947493..bae0f008f7 100644 + return true; + } + - reset(params) { - let {beginRequestType, reuseEntryText, softReset} = Params.parse(params, { - beginRequestType: null, + _onUserStoppedTypePreemptiveAnswer() { + if (!this._preemptiveAnswerWatchId || + this._preemptiveAnswer || diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index 507107614c..f578f6c88a 100644 +index f9c5602e70..b8cab9c3e3 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -47,6 +47,7 @@ const _FADE_ANIMATION_TIME = 250; @@ -3006,13 +3132,13 @@ index 507107614c..f578f6c88a 100644 this._authMenuButton.setActiveItem({ sectionName: _SESSION_TYPE_SECTION_NAME, -- -2.51.1 +2.51.0 -From f7a8e6c80d8d0239ca718d62ad2406771496e028 Mon Sep 17 00:00:00 2001 +From 4519eba61a47554de60ad4bd06c5c7733e283597 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 6 Feb 2024 13:41:39 -0500 -Subject: [PATCH 16/29] unlockDialog: Add _authMenuButton and +Subject: [PATCH 17/30] unlockDialog: Add _authMenuButton and _authIndicatorButton _authMenuButton is used to select an available auth mechanism from the @@ -3030,7 +3156,7 @@ prompt visible. 1 file changed, 140 insertions(+), 17 deletions(-) diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js -index 03d91b6114..0a8c208d7d 100644 +index a8bdb93b8c..372baee262 100644 --- a/js/ui/unlockDialog.js +++ b/js/ui/unlockDialog.js @@ -15,11 +15,16 @@ import * as Main from './main.js'; @@ -3298,13 +3424,13 @@ index 03d91b6114..0a8c208d7d 100644 cancel() { -- -2.51.1 +2.51.0 -From b8b8b2a8baffc39e6d8a1e7887cae6995e5ce8f6 Mon Sep 17 00:00:00 2001 +From 028069486a9bb053e7fd4c37f4d2ad2e34e60825 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 3 Dec 2024 07:39:32 -0500 -Subject: [PATCH 17/29] unlockDialog: Update hint text based on mockup +Subject: [PATCH 18/30] unlockDialog: Update hint text based on mockup This considers future mechanisms which might be the default ones, i.e. smartcard and passkey. And have special hint texts. @@ -3313,7 +3439,7 @@ smartcard and passkey. And have special hint texts. 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js -index 0a8c208d7d..92a9f8fbbe 100644 +index 372baee262..5deb435daa 100644 --- a/js/ui/unlockDialog.js +++ b/js/ui/unlockDialog.js @@ -421,9 +421,17 @@ class UnlockDialogClock extends St.BoxLayout { @@ -3338,13 +3464,13 @@ index 0a8c208d7d..92a9f8fbbe 100644 _onDestroy() { -- -2.51.1 +2.51.0 -From d20606a97cf0dc4df07274e930651ae9dcf6991a Mon Sep 17 00:00:00 2001 +From 93db7daf7f86b4e5bf4448d019b9a5863dfa080e Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Tue, 14 Oct 2025 19:19:15 +0200 -Subject: [PATCH 18/29] gdm/util: Increase time of messages based on new +Subject: [PATCH 19/30] gdm/util: Increase time of messages based on new environment variable called 'GDM_MESSAGE_TIME_MULTIPLIER'. This is can used for testing @@ -3370,13 +3496,13 @@ index 3ad0116686..20dcd4c49a 100644 finishMessageQueue() { -- -2.51.1 +2.51.0 -From db68ffad42a67c693c31f6731f5aa5a9eaa63558 Mon Sep 17 00:00:00 2001 +From 87c3debe06256886273e1fd2217d5a10198b38d0 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Mon, 15 Sep 2025 17:13:17 +0200 -Subject: [PATCH 19/29] gdm/util: Allow null _hold and don't recreate dummy +Subject: [PATCH 20/30] gdm/util: Allow null _hold and don't recreate dummy holds _hold property is used to inform the caller of begin method (authPrompt) @@ -3395,10 +3521,10 @@ but for now, just accept getting null and dont create dummy ones. 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index bae0f008f7..4211a486cc 100644 +index 90eef29313..5341f2b980 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js -@@ -828,11 +828,7 @@ export const AuthPrompt = GObject.registerClass({ +@@ -857,11 +857,7 @@ export const AuthPrompt = GObject.registerClass({ this.updateSensitivity(false); @@ -3487,13 +3613,13 @@ index 20dcd4c49a..b797d1d321 100644 this._startService(serviceName); } -- -2.51.1 +2.51.0 -From 22f9296a614bfd26790a774ab25ed4c7bf13779f Mon Sep 17 00:00:00 2001 +From df3dae82666e74076700534d08d413192e2c2986 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Wed, 20 Aug 2025 10:54:33 +0200 -Subject: [PATCH 20/29] gdm/util: Add fingerprintManager +Subject: [PATCH 21/30] gdm/util: Add fingerprintManager Move fingerprint bits to new fingerprintManager class. @@ -3903,13 +4029,13 @@ index 0000000000..60b5163b48 + } +} -- -2.51.1 +2.51.0 -From a291c648f4ff6d0e30770f497ac519a45e82c5fd Mon Sep 17 00:00:00 2001 +From b661016c26d77d03e3f74e1476410d0fd13b4034 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Tue, 23 Sep 2025 16:45:59 +0200 -Subject: [PATCH 21/29] gdm/misc: Add passkeyManager +Subject: [PATCH 22/30] gdm/misc: Add passkeyManager This utility will be used in the next commits, when passkey authentication is implemented, to detect when a passkey has been inserted or removed. @@ -4014,13 +4140,13 @@ index 0000000000..66e17e3f3c + } +} -- -2.51.1 +2.51.0 -From 568c91e4cb55750ca38790d53b82d86eb9bc1773 Mon Sep 17 00:00:00 2001 +From 17480706b5dccde4c438939960167b1a9296b04b Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Mon, 18 Aug 2025 12:08:21 +0200 -Subject: [PATCH 22/29] gdm: Add AuthServices +Subject: [PATCH 23/30] gdm: Add AuthServices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -4090,7 +4216,7 @@ Based on the previous work done by: create mode 100644 js/gdm/authServicesLegacy.js diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 4211a486cc..91702c9b76 100644 +index 5341f2b980..57b0ed3aeb 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -10,7 +10,6 @@ import St from 'gi://St'; @@ -4111,7 +4237,7 @@ index 4211a486cc..91702c9b76 100644 this.connect('destroy', this._onDestroy.bind(this)); -@@ -429,31 +425,6 @@ export const AuthPrompt = GObject.registerClass({ +@@ -441,31 +437,6 @@ export const AuthPrompt = GObject.registerClass({ this.emit('prompted'); } @@ -4143,7 +4269,7 @@ index 4211a486cc..91702c9b76 100644 _onShowMessage(_userVerifier, serviceName, message, type) { let wiggleParameters = {duration: 0}; -@@ -744,6 +715,13 @@ export const AuthPrompt = GObject.registerClass({ +@@ -761,6 +732,13 @@ export const AuthPrompt = GObject.registerClass({ if (invalidStatus.includes(this.verificationStatus)) return false; @@ -4157,7 +4283,7 @@ index 4211a486cc..91702c9b76 100644 return true; } -@@ -768,8 +746,10 @@ export const AuthPrompt = GObject.registerClass({ +@@ -799,8 +777,10 @@ export const AuthPrompt = GObject.registerClass({ this._preemptiveAnswerWatchId = this._idleMonitor.add_idle_watch(500, this._onUserStoppedTypePreemptiveAnswer.bind(this)); @@ -5891,13 +6017,13 @@ index 8be425615d..782fed0d11 100644 js/gdm/util.js js/misc/breakManager.js -- -2.51.1 +2.51.0 -From e611f7d6ac07c91707d34301ccd21b68a52e908a Mon Sep 17 00:00:00 2001 +From a1b03e73f5e8ee27237b929570046161d8140eea Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Tue, 6 Feb 2024 14:09:34 -0500 -Subject: [PATCH 23/29] gdm: Add authServicesSwitchable +Subject: [PATCH 24/30] gdm: Add authServicesSwitchable This new authService child is used by SSSD to control multiple authentication mechanisms from a single PAM conversation using 'gdm-switchable-auth' @@ -6109,7 +6235,7 @@ index 0000000000..4913cb2f41 + } +}); diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index f578f6c88a..df4c6ea0d0 100644 +index b8cab9c3e3..1e601b6c15 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -451,7 +451,10 @@ export const LoginDialog = GObject.registerClass({ @@ -6280,7 +6406,7 @@ index e7020fe013..ca4856e565 100644 gdm/const.js gdm/credentialManager.js diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js -index 92a9f8fbbe..f1f5f84af2 100644 +index 5deb435daa..90130269a9 100644 --- a/js/ui/unlockDialog.js +++ b/js/ui/unlockDialog.js @@ -568,6 +568,7 @@ export const UnlockDialog = GObject.registerClass({ @@ -6304,13 +6430,13 @@ index 782fed0d11..6c4ed8012e 100644 js/gdm/util.js js/misc/breakManager.js -- -2.51.1 +2.51.0 -From 5d0300a3eca7876d30e9eb56244cc4ce3f6f05d5 Mon Sep 17 00:00:00 2001 +From 16d03415a584aba741ce28696a52e46d98f59e1e Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Wed, 12 Nov 2025 17:25:33 +0100 -Subject: [PATCH 24/29] authServicesSwitchable: Allow resetting expired +Subject: [PATCH 25/30] authServicesSwitchable: Allow resetting expired password JSON protocol can't inform when a password is expired, so it's needed to @@ -6387,13 +6513,13 @@ index 4913cb2f41..48a0be4433 100644 if (serviceName !== this._selectedMechanism?.serviceName) return; -- -2.51.1 +2.51.0 -From 0867f2249add126605bbe37127d1c83c820bf7c0 Mon Sep 17 00:00:00 2001 +From 24c428a9d667b7592fe13d43708f9d77f2a8cfd1 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Thu, 21 Aug 2025 22:25:02 +0200 -Subject: [PATCH 25/29] gdm: Allow starting authServicesLegacy as fallback +Subject: [PATCH 26/30] gdm: Allow starting authServicesLegacy as fallback There can be cases where authServicesSwitchable doesn't support some authentication methods. @@ -6681,13 +6807,13 @@ index d94f4de897..b088ef20ce 100644 try { await this._handlePendingMessages(); -- -2.51.1 +2.51.0 -From d3467ed0fec0c3350cf3050510fd8d2adeb34e12 Mon Sep 17 00:00:00 2001 +From bab609836db76021de1e9c75aa8435c2ae379c6f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 6 Feb 2024 14:18:24 -0500 -Subject: [PATCH 26/29] gdm: Add support for Web Login in +Subject: [PATCH 27/30] gdm: Add support for Web Login in authServicesSwitchable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -6704,7 +6830,7 @@ Use the bindings of the new GnomeQR library to generate the QR code. Co-authored-by: Marco Trevisan (Treviño) --- .../gnome-shell-sass/widgets/_login-lock.scss | 100 ++++ - js/gdm/authPrompt.js | 102 +++- + js/gdm/authPrompt.js | 106 ++++- js/gdm/authServices.js | 6 + js/gdm/authServicesSwitchable.js | 82 ++++ js/gdm/const.js | 1 + @@ -6716,7 +6842,7 @@ Co-authored-by: Marco Trevisan (Treviño) js/ui/unlockDialog.js | 3 +- js/ui/userWidget.js | 8 + po/POTFILES.in | 1 + - 13 files changed, 739 insertions(+), 11 deletions(-) + 13 files changed, 742 insertions(+), 12 deletions(-) create mode 100644 js/gdm/webLogin.js diff --git a/data/theme/gnome-shell-sass/widgets/_login-lock.scss b/data/theme/gnome-shell-sass/widgets/_login-lock.scss @@ -6844,7 +6970,7 @@ index 58c2ed495c..c591edd940 100644 + } +} diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 91702c9b76..d26314e016 100644 +index 57b0ed3aeb..3f4878915d 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -14,6 +14,7 @@ import * as GdmUtil from './util.js'; @@ -6863,7 +6989,7 @@ index 91702c9b76..d26314e016 100644 this._userVerifier.connect('verification-failed', this._onVerificationFailed.bind(this)); this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this)); this._userVerifier.connect('reset', this._onReset.bind(this)); -@@ -289,6 +291,28 @@ export const AuthPrompt = GObject.registerClass({ +@@ -301,6 +303,28 @@ export const AuthPrompt = GObject.registerClass({ this._defaultButtonWell.add_child(this._spinner); this.setActorInDefaultButtonWell(this._nextButton); @@ -6892,7 +7018,7 @@ index 91702c9b76..d26314e016 100644 } _updateCancelButton() { -@@ -425,6 +449,51 @@ export const AuthPrompt = GObject.registerClass({ +@@ -437,6 +461,51 @@ export const AuthPrompt = GObject.registerClass({ this.emit('prompted'); } @@ -6944,7 +7070,18 @@ index 91702c9b76..d26314e016 100644 _onShowMessage(_userVerifier, serviceName, message, type) { let wiggleParameters = {duration: 0}; -@@ -463,12 +532,14 @@ export const AuthPrompt = GObject.registerClass({ +@@ -457,7 +526,9 @@ export const AuthPrompt = GObject.registerClass({ + // show the entry area to allow getting a preemptive answer + if (message && + !this._entryArea.visible && +- !this._authList.visible) ++ !this._authList.visible && ++ !this._webLoginIntro.visible && ++ !this._webLoginDialog.visible) + this._fadeInElement(this._entryArea); + + this.emit('prompted'); +@@ -483,12 +554,14 @@ export const AuthPrompt = GObject.registerClass({ this.stopSpinning(true); this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED; @@ -6965,7 +7102,7 @@ index 91702c9b76..d26314e016 100644 }); this.emit('verification-complete'); -@@ -540,6 +611,9 @@ export const AuthPrompt = GObject.registerClass({ +@@ -560,6 +633,9 @@ export const AuthPrompt = GObject.registerClass({ stopSpinning(animate) { this.emit('loading', false); this.setActorInDefaultButtonWell(this._nextButton, animate); @@ -6975,7 +7112,7 @@ index 91702c9b76..d26314e016 100644 } clear() { -@@ -550,10 +624,14 @@ export const AuthPrompt = GObject.registerClass({ +@@ -570,10 +646,14 @@ export const AuthPrompt = GObject.registerClass({ this._authListTitle.child.text = ''; this._authList.clear(); this._authList.hide(); @@ -6993,7 +7130,7 @@ index 91702c9b76..d26314e016 100644 } setQuestion(question) { -@@ -565,6 +643,8 @@ export const AuthPrompt = GObject.registerClass({ +@@ -585,6 +665,8 @@ export const AuthPrompt = GObject.registerClass({ this._entry.hint_text = question; this._authList.hide(); @@ -7002,7 +7139,7 @@ index 91702c9b76..d26314e016 100644 this._fadeInElement(this._entryArea); } -@@ -650,6 +730,10 @@ export const AuthPrompt = GObject.registerClass({ +@@ -680,6 +762,10 @@ export const AuthPrompt = GObject.registerClass({ if (this._authList.visible) authWidget = this._authList; @@ -7184,7 +7321,7 @@ index 2f37446c8a..e8ca48625a 100644 export const PASSWORD_SERVICE_NAME = 'gdm-password'; export const SMARTCARD_SERVICE_NAME = 'gdm-smartcard'; diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index df4c6ea0d0..02c1d1fb38 100644 +index 1e601b6c15..927ed32d65 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -742,7 +742,10 @@ export const LoginDialog = GObject.registerClass({ @@ -7702,7 +7839,7 @@ index c3c51aa2de..fbb83d1164 100644 import 'gi://Graphene?version=1.0'; import 'gi://GUdev?version=1.0'; diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js -index f1f5f84af2..428104e67b 100644 +index 90130269a9..0bf375ad18 100644 --- a/js/ui/unlockDialog.js +++ b/js/ui/unlockDialog.js @@ -492,7 +492,8 @@ class UnlockDialogLayout extends Clutter.LayoutManager { @@ -7745,13 +7882,13 @@ index 6c4ed8012e..12001308f3 100644 js/misc/brightnessManager.js js/misc/systemActions.js -- -2.51.1 +2.51.0 -From 00968e0004247e44f4bccf1ac0b0fb3a1929fcfb Mon Sep 17 00:00:00 2001 +From fa64ce0ce62b0e977301e07eee8277d417f47cd9 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Tue, 14 Jan 2025 07:31:59 -0500 -Subject: [PATCH 27/29] gdm: Add support for Smartcard in +Subject: [PATCH 28/30] gdm: Add support for Smartcard in authServicesSwitchable This allows selecting smartcard as a login method. @@ -7764,9 +7901,13 @@ smartcard mechanism for every user. When a smartcard is inserted, authServicesSwitchable will be restarted to check if a cert is available for the current user. This won't change the authentication state (if it was doing password auth, that won't change). + +To avoid multiple events, SmartcardManager won't connect to tokens with +'/login_token', those are aliases for already connected tokens. --- js/gdm/authServicesSwitchable.js | 64 ++++++++++++++++++++++++++++++++ - 1 file changed, 64 insertions(+) + js/misc/smartcardManager.js | 6 +++ + 2 files changed, 70 insertions(+) diff --git a/js/gdm/authServicesSwitchable.js b/js/gdm/authServicesSwitchable.js index d13020e642..b99128dc15 100644 @@ -7897,14 +8038,31 @@ index d13020e642..b99128dc15 100644 _startWebLogin() { const { serviceName, +diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js +index 51471e51d4..3eabd2f3be 100644 +--- a/js/misc/smartcardManager.js ++++ b/js/misc/smartcardManager.js +@@ -70,6 +70,12 @@ class SmartcardManager extends Signals.EventEmitter { + } + + _addToken(token) { ++ // This is an alias, mirroring the real token. ++ // Skip it to avoid duplicate events ++ const objectPath = token.get_object_path(); ++ if (objectPath.endsWith('/login_token')) ++ return; ++ + this._updateToken(token); + + token.connectObject('g-properties-changed', (proxy, properties) => { -- -2.51.1 +2.51.0 -From c6ab4497f8b6c2b0fafee864629868ee027af2d7 Mon Sep 17 00:00:00 2001 +From 1be13c51125edb5ede37f0b2b5fd03beca173ce3 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Mon, 15 Sep 2025 16:36:42 +0200 -Subject: [PATCH 28/29] gdm: Add support for Passkey in authServicesSwitchable +Subject: [PATCH 29/30] gdm: Add support for Passkey in authServicesSwitchable This allows selecting passkey authentication mechanism. @@ -8113,7 +8271,7 @@ index 7c54009763..8b999c363f 100644 enabledRoles.push(Const.FINGERPRINT_ROLE_NAME); if (this._settings.get_boolean(WEB_AUTHENTICATION_KEY)) diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js -index 428104e67b..7ba379f7c7 100644 +index 0bf375ad18..e506acfad8 100644 --- a/js/ui/unlockDialog.js +++ b/js/ui/unlockDialog.js @@ -426,6 +426,8 @@ class UnlockDialogClock extends St.BoxLayout { @@ -8126,13 +8284,13 @@ index 428104e67b..7ba379f7c7 100644 text = _('Swipe up'); else -- -2.51.1 +2.51.0 -From 508d07a0ee495a6e31373859cd4a7c2b288f0e7c Mon Sep 17 00:00:00 2001 +From 67db1e0773543b39b6670cbb4759ba2b8f0f0657 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Wed, 24 Dec 2025 11:28:39 +0100 -Subject: [PATCH 29/29] gdm: Add extra fix remove logErrorUnlessCancelled +Subject: [PATCH 30/30] gdm: Add extra fix remove logErrorUnlessCancelled --- js/gdm/authServices.js | 7 ++++--- @@ -8194,5 +8352,5 @@ index 2da29582f3..5a864587dc 100644 } -- -2.51.1 +2.51.0