diff -Nru gnome-shell-46.0/debian/changelog gnome-shell-46.0/debian/changelog --- gnome-shell-46.0/debian/changelog 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/changelog 2024-04-17 05:45:42.000000000 +0000 @@ -1,3 +1,19 @@ +gnome-shell (46.0-0ubuntu5) noble; urgency=medium + + [ Daniel van Vugt ] + * Drop loginDialog-Create-footer-container.patch - it's buggy and still + under active development (LP: #2060893) + + [ Marco Trevisan (Treviño) ] + * debian/patches/ubuntu-authd: Hide the right button if there are no + sessions to choose (LP: #2061153) + * debian/patches/ubuntu-authd: Do not start an unavailable authentication + service (LP: #2060575) + * d/p/ubuntu-authd: Fix selection of multi-factor auth modes (related to + lp:2060546) + + -- Marco Trevisan (Treviño) Wed, 17 Apr 2024 07:45:42 +0200 + gnome-shell (46.0-0ubuntu4) noble; urgency=medium * debian/changelog: Add missing 46.0-0ubuntu3 changelog diff -Nru gnome-shell-46.0/debian/patches/series gnome-shell-46.0/debian/patches/series --- gnome-shell-46.0/debian/patches/series 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/series 2024-04-17 05:45:42.000000000 +0000 @@ -38,7 +38,6 @@ ubuntu-authd/src-Add-function-for-generating-QR-codes.patch ubuntu-authd/gdm-Add-Login-Failed-notification.patch ubuntu-authd/authPrompt-Add-support-for-Web-Login.patch -ubuntu-authd/loginDialog-Create-footer-container.patch ubuntu-authd/authPrompt-Fade-out-cancel-button-after-verification.patch ubuntu-authd/gdm-util-Add-new-background-message-type.patch ubuntu-authd/gdm-util-Catch-errors-on-re-authentication.patch diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/Implement-authd-support-via-the-unified-mechanism.patch gnome-shell-46.0/debian/patches/ubuntu-authd/Implement-authd-support-via-the-unified-mechanism.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/Implement-authd-support-via-the-unified-mechanism.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/Implement-authd-support-via-the-unified-mechanism.patch 2024-04-17 05:45:42.000000000 +0000 @@ -4,25 +4,25 @@ --- js/gdm/authPrompt.js | 41 +- - js/gdm/authd.js | 603 +++++ + js/gdm/authd.js | 607 +++++ js/gdm/authdProtocol.js | 5648 +++++++++++++++++++++++++++++++++++++++++ js/gdm/const.js | 9 + js/gdm/consts.js | 6 - js/gdm/loginDialog.js | 5 +- js/gdm/unifiedMechanism.js | 49 +- - js/gdm/util.js | 196 +- + js/gdm/util.js | 213 +- js/gdm/webLogin.js | 5 + js/js-resources.gresource.xml | 5 +- js/misc/ibusManager.js | 48 +- js/ui/unlockDialog.js | 1 + - 12 files changed, 6519 insertions(+), 97 deletions(-) + 12 files changed, 6540 insertions(+), 97 deletions(-) create mode 100644 js/gdm/authd.js create mode 100644 js/gdm/authdProtocol.js create mode 100644 js/gdm/const.js delete mode 100644 js/gdm/consts.js diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index ccb5a1f..7628834 100644 +index a03103c..5fd317d 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -59,6 +59,12 @@ export const AuthPrompt = GObject.registerClass({ @@ -120,7 +120,7 @@ if (this.verificationStatus !== AuthPromptStatus.VERIFICATION_SUCCEEDED) this.reset(); }); -@@ -796,6 +832,7 @@ export const AuthPrompt = GObject.registerClass({ +@@ -798,6 +834,7 @@ export const AuthPrompt = GObject.registerClass({ this.cancelButton.reactive = this._hasCancelButton; this.cancelButton.can_focus = this._hasCancelButton; this._preemptiveAnswer = null; @@ -130,10 +130,10 @@ this._userVerifier.cancel(); diff --git a/js/gdm/authd.js b/js/gdm/authd.js new file mode 100644 -index 0000000..21d9bee +index 0000000..6c50f9d --- /dev/null +++ b/js/gdm/authd.js -@@ -0,0 +1,603 @@ +@@ -0,0 +1,607 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +import GLib from 'gi://GLib'; @@ -191,8 +191,6 @@ + this._authMechanisms = {}; + this._pendingEvents = []; + this._stage = undefined; -+ -+ console.log('Starting Authd!!!'); + } + + handleProtocolRequest(protocol, version, json) { @@ -209,7 +207,7 @@ + _handleAuthdProtocol(authdData) { + switch (authdData.type) { + case AuthdGdm.DataType.hello: -+ // this._initHandlers(); ++ console.log("Starting authd protocol"); + return new AuthdGdm.Data({ + type: AuthdGdm.DataType.hello, + hello: new AuthdGdm.HelloData({version: 1}), @@ -364,7 +362,6 @@ + } + + _doStageChange(stage) { -+ + this._onStageChanged(stage); + this._requestStageChange(stage); + } @@ -464,11 +461,13 @@ + + case AuthdPam.Stage.brokerSelection: + this._authenticationInProgress = false; ++ this._uiLayout = null; + this._maybeStartBrokerSelection(); + break; + + case AuthdPam.Stage.authModeSelection: + this._authenticationInProgress = false; ++ this._uiLayout = null; + this._maybeStartAuthModeSelection(); + break; + @@ -536,6 +535,7 @@ + + case AuthdGdm.EventType.uiLayoutReceived: + this._uiLayout = event.uiLayoutReceived.uiLayout; ++ this._maybeStartChallenge(); + break; + + case AuthdGdm.EventType.startAuthentication: @@ -582,6 +582,9 @@ + if (this._authenticationInProgress) + return; + ++ if (!this._uiLayout) ++ return; ++ + if (!this._authModes[this._selectedAuthMode]) + return; + @@ -687,8 +690,10 @@ + } + + _handleAuthResponse(response) { -+ if (response.access !== AuthResult.Retry) ++ if (response.access !== AuthResult.Retry) { + this._selectedAuthMode = null; ++ this._uiLayout = null; ++ } + + switch (response.access) { + case AuthResult.Granted: @@ -725,7 +730,6 @@ + + case AuthResult.Next: { + this.emit('clear-message-queue'); -+ this._authenticationStarted = true; + this._authModes = {}; + break; + } @@ -6419,7 +6423,7 @@ -export const SMARTCARD_ROLE_NAME = 'smartcard'; -export const FINGERPRINT_ROLE_NAME = 'fingerprint'; diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index 58888bd..43d20d4 100644 +index ef67811..c1d288d 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -536,6 +536,8 @@ export const LoginDialog = GObject.registerClass({ @@ -6431,7 +6435,7 @@ this._authPrompt.hide(); this.add_child(this._authPrompt); -@@ -1037,6 +1039,7 @@ export const LoginDialog = GObject.registerClass({ +@@ -1022,6 +1024,7 @@ export const LoginDialog = GObject.registerClass({ const activeMechanism = this._loginOptionsButton.getActiveItem(); this._loginOptionsButton.clearItems({serviceName}); @@ -6439,7 +6443,7 @@ if (mechanisms.length === 0) return; -@@ -1117,9 +1120,7 @@ export const LoginDialog = GObject.registerClass({ +@@ -1102,9 +1105,7 @@ export const LoginDialog = GObject.registerClass({ this._user = this._userManager.get_user(answer); this._authPrompt.clear(); this._beginVerification({userName: answer}); @@ -6547,7 +6551,7 @@ if (!mechanisms) return; diff --git a/js/gdm/util.js b/js/gdm/util.js -index 276b283..1ee12b3 100644 +index d197c5c..f8ff01e 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -6,6 +6,7 @@ import Gio from 'gi://Gio'; @@ -6737,17 +6741,49 @@ this.emit('foreground-mechanism-changed'); } -@@ -829,7 +881,8 @@ export class ShellUserVerifier extends Signals.EventEmitter { +@@ -828,8 +880,15 @@ export class ShellUserVerifier extends Signals.EventEmitter { + } } ++ _serviceIsAvailable(serviceName) { ++ return GLib.file_test(`/etc/pam.d/${serviceName}`, GLib.FileTest.EXISTS) || ++ GLib.file_test(`/usr/lib/pam.d/${serviceName}`, GLib.FileTest.EXISTS) ++ } ++ _getDetectedDefaultService() { - if (this._settings.get_boolean(UNIFIED_AUTHENTICATION_KEY)) -+ if (!this._settings.settingsSchema.has_key(UNIFIED_AUTHENTICATION_KEY) || -+ this._settings.get_boolean(UNIFIED_AUTHENTICATION_KEY)) ++ if ((!this._settings.settingsSchema.has_key(UNIFIED_AUTHENTICATION_KEY) || ++ this._settings.get_boolean(UNIFIED_AUTHENTICATION_KEY)) && ++ this._serviceIsAvailable(UNIFIED_AUTH_SERVICE_NAME)) return UNIFIED_AUTH_SERVICE_NAME; const definition = DiscreteServiceMechanismDefinitions.find( -@@ -897,21 +950,25 @@ export class ShellUserVerifier extends Signals.EventEmitter { +@@ -841,6 +900,9 @@ export class ShellUserVerifier extends Signals.EventEmitter { + const oldDefaultService = this._defaultService; + this._defaultService = this._getDetectedDefaultService(); + ++ if (this._unavailableServices.has(this._defaultService)) ++ this._defaultService = null; ++ + if (!this._defaultService) { + log('no authentication service is enabled, using password authentication'); + this._defaultService = PASSWORD_SERVICE_NAME; +@@ -866,6 +928,14 @@ export class ShellUserVerifier extends Signals.EventEmitter { + } + } catch (e) { + this._activeServices.delete(serviceName); ++ if (this.serviceIsForeground(serviceName) && ++ Gio.DBusError.is_remote_error(e) && ++ Gio.DBusError.get_remote_error(e) === 'org.gnome.DisplayManager.SessionWorker.Error.ServiceUnavailable') { ++ this._unavailableServices.add(serviceName); ++ this._updateDefaultService(); ++ this._beginVerification(); ++ return; ++ } + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) + return; + if (!this.serviceIsForeground(serviceName)) { +@@ -897,21 +967,25 @@ export class ShellUserVerifier extends Signals.EventEmitter { _startMechanismFromUnifiedService(mechanism) { const unifiedService = this._unifiedAuthServices.get(mechanism.protocol); @@ -6780,7 +6816,7 @@ } _shouldStartBackgroundService(serviceName) { -@@ -961,6 +1018,8 @@ export class ShellUserVerifier extends Signals.EventEmitter { +@@ -961,6 +1035,8 @@ export class ShellUserVerifier extends Signals.EventEmitter { _beginVerification() { const foregroundService = this._getForegroundService(); @@ -6789,7 +6825,7 @@ this._mechanismsListChangedSignalId = this.connect('mechanisms-list-changed', (_, ...args) => this._onMechanismsListChanged(...args)); -@@ -979,7 +1038,43 @@ export class ShellUserVerifier extends Signals.EventEmitter { +@@ -979,7 +1055,27 @@ export class ShellUserVerifier extends Signals.EventEmitter { this.emit('show-choice-list', serviceName, promptMessage, list.deepUnpack()); } @@ -6815,6 +6851,22 @@ + } + + _startQuestionLogin(serviceName, mechanismId) { + const mechanisms = this._publishedMechanisms.get(serviceName); + + if (!mechanisms) +@@ -989,12 +1085,28 @@ export class ShellUserVerifier extends Signals.EventEmitter { + return; + + const {prompt, role} = mechanisms[mechanismId]; ++ const secret = role !== Const.PLAIN_TEXT_ROLE_NAME; + + this._pendingMechanisms.set(role, mechanismId); +- this.emit('ask-question', serviceName, prompt, true); ++ this.emit('ask-question', serviceName, prompt, secret); + } + +- async _replyWithAuthSelectionResponse(serviceName, role, response) { ++ _startMessageLogin(serviceName, mechanismId) { + const mechanisms = this._publishedMechanisms.get(serviceName); + + if (!mechanisms) @@ -6824,30 +6876,16 @@ + return; + + const {prompt, role} = mechanisms[mechanismId]; -+ const secret = role !== Const.PLAIN_TEXT_ROLE_NAME; + + this._pendingMechanisms.set(role, mechanismId); -+ this.emit('ask-question', serviceName, prompt, secret); ++ this.emit('show-waiting-message', serviceName, prompt); + } + -+ _startMessageLogin(serviceName, mechanismId) { - const mechanisms = this._publishedMechanisms.get(serviceName); - - if (!mechanisms) -@@ -991,10 +1086,10 @@ export class ShellUserVerifier extends Signals.EventEmitter { - const {prompt, role} = mechanisms[mechanismId]; - - this._pendingMechanisms.set(role, mechanismId); -- this.emit('ask-question', serviceName, prompt, true); -+ this.emit('show-waiting-message', serviceName, prompt); - } - -- async _replyWithAuthSelectionResponse(serviceName, role, response) { + _replyWithAuthSelectionResponse(serviceName, role, response) { const mechanism = this._getPendingMechanismForRole(role); if (!mechanism) return; -@@ -1005,21 +1100,25 @@ export class ShellUserVerifier extends Signals.EventEmitter { +@@ -1005,21 +1117,25 @@ export class ShellUserVerifier extends Signals.EventEmitter { if (!authService) throw new Error(`No authentication service for protocol ${mechanism.protocol}`); @@ -6881,7 +6919,7 @@ const {init_prompt: initPrompt, link_prompt: linkPrompt, uri, code, role, timeout} = mechanisms[mechanismId]; -@@ -1059,7 +1158,6 @@ export class ShellUserVerifier extends Signals.EventEmitter { +@@ -1059,7 +1175,6 @@ export class ShellUserVerifier extends Signals.EventEmitter { const mechanism = this._getPendingMechanismForRole(WEB_LOGIN_ROLE_NAME); const authService = this._unifiedAuthServices.get(mechanism?.protocol); @@ -6889,7 +6927,7 @@ if (!authService) return; -@@ -1090,17 +1188,28 @@ export class ShellUserVerifier extends Signals.EventEmitter { +@@ -1090,17 +1205,28 @@ export class ShellUserVerifier extends Signals.EventEmitter { } _onCustomJSONRequest(client, serviceName, protocol, version, json) { @@ -6924,7 +6962,7 @@ } _onInfo(client, serviceName, info) { -@@ -1222,6 +1331,7 @@ export class ShellUserVerifier extends Signals.EventEmitter { +@@ -1222,6 +1348,7 @@ export class ShellUserVerifier extends Signals.EventEmitter { this._activeServices.clear(); this._unavailableServices.clear(); this._activeServices.clear(); diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/authPrompt-Add-support-for-Web-Login.patch gnome-shell-46.0/debian/patches/ubuntu-authd/authPrompt-Add-support-for-Web-Login.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/authPrompt-Add-support-for-Web-Login.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/authPrompt-Add-support-for-Web-Login.patch 2024-04-17 05:45:42.000000000 +0000 @@ -12,11 +12,11 @@ https://gitlab.gnome.org/Teams/Design/os-mockups/-/blob/master/lock-login/web-login.png. --- .../gnome-shell-sass/widgets/_login-lock.scss | 74 +++++- - js/gdm/authPrompt.js | 123 ++++++++++ + js/gdm/authPrompt.js | 125 ++++++++++ js/gdm/util.js | 46 ++++ js/gdm/webLogin.js | 259 +++++++++++++++++++++ js/js-resources.gresource.xml | 1 + - 5 files changed, 502 insertions(+), 1 deletion(-) + 5 files changed, 504 insertions(+), 1 deletion(-) 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 @@ -114,7 +114,7 @@ background-color: transparent; diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 4bd48ea..e40104a 100644 +index 4bd48ea..bb46762 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -18,6 +18,7 @@ import * as MessageTray from '../ui/messageTray.js'; @@ -269,7 +269,7 @@ _onCredentialManagerAuthenticated() { if (this.verificationStatus !== AuthPromptStatus.VERIFICATION_SUCCEEDED) this.reset(); -@@ -505,6 +622,8 @@ export const AuthPrompt = GObject.registerClass({ +@@ -505,12 +622,16 @@ export const AuthPrompt = GObject.registerClass({ this.stopSpinning(); this._authList.clear(); this._authList.hide(); @@ -278,7 +278,15 @@ } setQuestion(question) { -@@ -591,6 +710,9 @@ export const AuthPrompt = GObject.registerClass({ + this._entry.hint_text = question; + + this._authList.hide(); ++ this._closeWebLoginDialog(); ++ + this._entry.show(); + this._entry.grab_key_focus(); + } +@@ -591,6 +712,9 @@ export const AuthPrompt = GObject.registerClass({ } updateSensitivity(sensitive) { @@ -288,7 +296,7 @@ if (this._entry.reactive === sensitive) return; -@@ -722,6 +844,7 @@ export const AuthPrompt = GObject.registerClass({ +@@ -722,6 +846,7 @@ export const AuthPrompt = GObject.registerClass({ hold: null, }); diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/authPrompt-Fade-out-cancel-button-after-verification.patch gnome-shell-46.0/debian/patches/ubuntu-authd/authPrompt-Fade-out-cancel-button-after-verification.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/authPrompt-Fade-out-cancel-button-after-verification.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/authPrompt-Fade-out-cancel-button-after-verification.patch 2024-04-17 05:45:42.000000000 +0000 @@ -13,7 +13,7 @@ 1 file changed, 5 insertions(+) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index e40104a..ccb5a1f 100644 +index bb46762..a03103c 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -537,6 +537,11 @@ export const AuthPrompt = GObject.registerClass({ diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/gdm-Add-support-unified-authentication.patch gnome-shell-46.0/debian/patches/ubuntu-authd/gdm-Add-support-unified-authentication.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/gdm-Add-support-unified-authentication.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/gdm-Add-support-unified-authentication.patch 2024-04-17 05:45:42.000000000 +0000 @@ -19,7 +19,7 @@ 3 files changed, 254 insertions(+), 14 deletions(-) diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index c8f26d8..33bb1ce 100644 +index b81d22d..bfde7af 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -498,7 +498,10 @@ export const LoginDialog = GObject.registerClass({ diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/js-Minify-the-authd-protocol-during-build.patch gnome-shell-46.0/debian/patches/ubuntu-authd/js-Minify-the-authd-protocol-during-build.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/js-Minify-the-authd-protocol-during-build.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/js-Minify-the-authd-protocol-during-build.patch 2024-04-17 05:45:42.000000000 +0000 @@ -11,7 +11,7 @@ create mode 100644 js/gdm/meson.build diff --git a/js/gdm/authd.js b/js/gdm/authd.js -index 21d9bee..4e1b498 100644 +index 6c50f9d..7a60d9c 100644 --- a/js/gdm/authd.js +++ b/js/gdm/authd.js @@ -2,7 +2,7 @@ diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/js-gdm-util-Add-a-gsettings-to-disable-the-authd-in-gdm.patch gnome-shell-46.0/debian/patches/ubuntu-authd/js-gdm-util-Add-a-gsettings-to-disable-the-authd-in-gdm.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/js-gdm-util-Add-a-gsettings-to-disable-the-authd-in-gdm.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/js-gdm-util-Add-a-gsettings-to-disable-the-authd-in-gdm.patch 2024-04-17 05:45:42.000000000 +0000 @@ -4,8 +4,8 @@ --- data/com.ubuntu.login-screen.gschema.xml.in | 10 ++++++++++ - js/gdm/util.js | 10 +++++++++- - 2 files changed, 19 insertions(+), 1 deletion(-) + js/gdm/util.js | 9 +++++++++ + 2 files changed, 19 insertions(+) diff --git a/data/com.ubuntu.login-screen.gschema.xml.in b/data/com.ubuntu.login-screen.gschema.xml.in index ee8b3a2..136d67a 100644 @@ -28,7 +28,7 @@ diff --git a/js/gdm/util.js b/js/gdm/util.js -index 1ee12b3..e9f82a8 100644 +index f8ff01e..ee456cf 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -49,6 +49,9 @@ export const BANNER_MESSAGE_KEY = 'banner-message-enable'; @@ -50,16 +50,12 @@ this._updateEnabledServices(); this._updateDefaultService(); -@@ -881,10 +886,13 @@ export class ShellUserVerifier extends Signals.EventEmitter { - } - - _getDetectedDefaultService() { -- if (!this._settings.settingsSchema.has_key(UNIFIED_AUTHENTICATION_KEY) || -+ if (this._settings.settingsSchema.has_key(UNIFIED_AUTHENTICATION_KEY) && - this._settings.get_boolean(UNIFIED_AUTHENTICATION_KEY)) +@@ -891,6 +896,10 @@ export class ShellUserVerifier extends Signals.EventEmitter { + this._serviceIsAvailable(UNIFIED_AUTH_SERVICE_NAME)) return UNIFIED_AUTH_SERVICE_NAME; -+ if (this._ubuntuSettings.get_boolean(UBUNTU_AUTHD_AUTHENTICATION_KEY)) ++ if (this._ubuntuSettings.get_boolean(UBUNTU_AUTHD_AUTHENTICATION_KEY) && ++ this._serviceIsAvailable(UNIFIED_AUTH_SERVICE_NAME)) + return UNIFIED_AUTH_SERVICE_NAME; + const definition = DiscreteServiceMechanismDefinitions.find( diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Add-Login-Options-button.patch gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Add-Login-Options-button.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Add-Login-Options-button.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Add-Login-Options-button.patch 2024-04-17 05:45:42.000000000 +0000 @@ -80,7 +80,7 @@ let {beginRequestType, queryingService} = Params.parse(params, { beginRequestType: null, diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index 25a00f0..c8f26d8 100644 +index a0d025a..b81d22d 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -532,6 +532,7 @@ export const LoginDialog = GObject.registerClass({ diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Create-footer-container.patch gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Create-footer-container.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Create-footer-container.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Create-footer-container.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,160 +0,0 @@ -From: Ray Strode -Date: Wed, 7 Feb 2024 16:09:42 -0500 -Subject: loginDialog: Create footer container - -Right now the logo is placed in the bottom of the screen, but -in the future we'll want other things there as well. - -To make that possible, this commit adds a footer container. ---- - js/gdm/loginDialog.js | 68 +++++++++++++++++++++++++++++++++++++++++---------- - 1 file changed, 55 insertions(+), 13 deletions(-) - -diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index 33bb1ce..e25b6a9 100644 ---- a/js/gdm/loginDialog.js -+++ b/js/gdm/loginDialog.js -@@ -586,6 +586,13 @@ export const LoginDialog = GObject.registerClass({ - this._createLoginOptionsButton(); - this._createSessionMenuButton(); - -+ this._footerBin = new St.Widget({ -+ style_class: 'login-dialog-footer-bin', -+ x_align: Clutter.ActorAlign.CENTER, -+ y_align: Clutter.ActorAlign.END, -+ }); -+ this.add_child(this._footerBin); -+ - this._logoBin = new St.Widget({ - style_class: 'login-dialog-logo-bin', - x_align: Clutter.ActorAlign.CENTER, -@@ -594,9 +601,17 @@ export const LoginDialog = GObject.registerClass({ - this._logoBin.connect('resource-scale-changed', () => { - this._updateLogoTexture(this._textureCache, this._logoFile); - }); -- this.add_child(this._logoBin); -+ this._footerBin.add_child(this._logoBin); - this._updateLogo(); - -+ this._backgroundServicesMessageBin = new St.Widget({ -+ style_class: 'login-dialog-background-services-messages-bin', -+ x_align: Clutter.ActorAlign.CENTER, -+ y_align: Clutter.ActorAlign.END, -+ }); -+ this._backgroundServicesMessageBin.hide(); -+ this._footerBin.add_child(this._backgroundServicesMessageBin); -+ - this._userList.connect('activate', (userList, item) => { - this._onUserListActivated(item); - }); -@@ -676,10 +691,10 @@ export const LoginDialog = GObject.registerClass({ - return actorBox; - } - -- _getLogoBinAllocation(dialogBox) { -+ _getFooterBinAllocation(dialogBox) { - let actorBox = new Clutter.ActorBox(); - -- let [, , natWidth, natHeight] = this._logoBin.get_preferred_size(); -+ let [, , natWidth, natHeight] = this._footerBin.get_preferred_size(); - let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2; - - actorBox.x1 = Math.floor(centerX - natWidth / 2); -@@ -756,11 +771,11 @@ export const LoginDialog = GObject.registerClass({ - userSelectionHeight = userSelectionAllocation.y2 - userSelectionAllocation.y1; - } - -- let logoAllocation = null; -- let logoHeight = 0; -- if (this._logoBin.visible) { -- logoAllocation = this._getLogoBinAllocation(dialogBox); -- logoHeight = logoAllocation.y2 - logoAllocation.y1; -+ let footerAllocation = null; -+ let footerHeight = 0; -+ if (this._footerBin.visible) { -+ footerAllocation = this._getFooterBinAllocation(dialogBox); -+ footerHeight = footerAllocation.y2 - footerAllocation.y1; - } - - let menuButtonBoxAllocation = null; -@@ -816,10 +831,10 @@ export const LoginDialog = GObject.registerClass({ - bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth); - - // figure out how tall it would like to be and try to accommodate -- // but don't let it get too close to the logo -+ // but don't let it get too close to the footer - let [, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth); - -- let maxWideHeight = dialogHeight - 3 * logoHeight; -+ let maxWideHeight = dialogHeight - 3 * footerHeight; - wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight); - bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2); - bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight; -@@ -843,7 +858,7 @@ export const LoginDialog = GObject.registerClass({ - } - } else if (userSelectionAllocation) { - // Grow the user list to fill the space -- let leftOverYSpace = dialogHeight - userSelectionHeight - logoHeight; -+ let leftOverYSpace = dialogHeight - userSelectionHeight - footerHeight; - - if (leftOverYSpace > 0) { - let topExpansion = Math.floor(leftOverYSpace / 2); -@@ -864,8 +879,8 @@ export const LoginDialog = GObject.registerClass({ - if (userSelectionAllocation) - this._userSelectionBox.allocate(userSelectionAllocation); - -- if (logoAllocation) -- this._logoBin.allocate(logoAllocation); -+ if (footerAllocation) -+ this._footerBin.allocate(footerAllocation); - - if (menuButtonBoxAllocation) - this._menuButtonBox.allocate(menuButtonBoxAllocation); -@@ -1391,6 +1406,29 @@ export const LoginDialog = GObject.registerClass({ - }); - } - -+ _fadeOutLogo() { -+ if (!this._logoBin.visible) -+ return; -+ -+ this._logoBin.ease({ -+ opacity: 0, -+ duration: _FADE_ANIMATION_TIME, -+ mode: Clutter.AnimationMode.EASE_OUT_QUAD, -+ onComplete: () => { -+ this._logoBin.hide(); -+ }, -+ }); -+ } -+ -+ _fadeInLogo() { -+ this._logoBin.show(); -+ this._logoBin.ease({ -+ opacity: 255, -+ duration: _FADE_ANIMATION_TIME, -+ mode: Clutter.AnimationMode.EASE_OUT_QUAD, -+ }); -+ } -+ - _beginVerification(params) { - params = Params.parse(params, { - userName: null, -@@ -1400,6 +1438,8 @@ export const LoginDialog = GObject.registerClass({ - this._authPrompt.begin(params); - - this._loginOptionsButton.updateSensitivity(true); -+ this._fadeOutLogo(); -+ this._backgroundServicesMessageBin.show(); - } - - _setUserListExpanded(expanded) { -@@ -1433,6 +1473,8 @@ export const LoginDialog = GObject.registerClass({ - this._sessionMenuButton.updateSensitivity(false); - this._setUserListExpanded(true); - this._notListedButton.show(); -+ this._backgroundServicesMessageBin.hide(); -+ this._fadeInLogo(); - this._userList.grab_key_focus(); - } - diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Port-sessions-menu-over-to-AuthMenuButton.patch gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Port-sessions-menu-over-to-AuthMenuButton.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Port-sessions-menu-over-to-AuthMenuButton.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/loginDialog-Port-sessions-menu-over-to-AuthMenuButton.patch 2024-04-17 05:45:42.000000000 +0000 @@ -64,7 +64,7 @@ margin: 3em 0; } diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index 5e8121f..25a00f0 100644 +index 5e8121f..a0d025a 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -28,9 +28,9 @@ import Pango from 'gi://Pango'; @@ -118,17 +118,17 @@ + let ids = Gdm.get_session_ids(); + ids.sort(); + -+ if (ids.length <= 1) { -+ this._button.hide(); -+ return; -+ } -+ + for (const id of ids) { + let [sessionName, sessionDescription_] = Gdm.get_session_name_and_description(id); + + this._sessionMenuButton.addItem({name: sessionName, id}); + } + ++ if (ids.length <= 1) { ++ this._sessionMenuButton.hide(); ++ return; ++ } ++ + this._sessionMenuButton.connect('active-item-changed', () => { + const session = this._sessionMenuButton.getActiveItem(); + diff -Nru gnome-shell-46.0/debian/patches/ubuntu-authd/start-abstracting-the-unified-mechanism-handler.patch gnome-shell-46.0/debian/patches/ubuntu-authd/start-abstracting-the-unified-mechanism-handler.patch --- gnome-shell-46.0/debian/patches/ubuntu-authd/start-abstracting-the-unified-mechanism-handler.patch 2024-04-08 00:31:14.000000000 +0000 +++ gnome-shell-46.0/debian/patches/ubuntu-authd/start-abstracting-the-unified-mechanism-handler.patch 2024-04-17 05:45:42.000000000 +0000 @@ -27,10 +27,10 @@ +export const SMARTCARD_ROLE_NAME = 'smartcard'; +export const FINGERPRINT_ROLE_NAME = 'fingerprint'; diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index e25b6a9..58888bd 100644 +index bfde7af..ef67811 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js -@@ -1044,11 +1044,11 @@ export const LoginDialog = GObject.registerClass({ +@@ -1029,11 +1029,11 @@ export const LoginDialog = GObject.registerClass({ mechanisms.sort((a, b) => a.name.localeCompare(b.name)); @@ -180,7 +180,7 @@ + } +} diff --git a/js/gdm/util.js b/js/gdm/util.js -index 59af2d6..276b283 100644 +index 59af2d6..d197c5c 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -13,6 +13,8 @@ import * as Main from '../ui/main.js'; @@ -291,7 +291,7 @@ + continue; + + const protocol = unifiedService.protocolName; -+ const selectable = mechanisms[id].selectable; ++ const selectable = mechanisms[id].selectable ?? true; + mechanisms[id].protocol = protocol; + mechanismsList.push({id, name, role, serviceName, protocol, selectable}); + }