From 291b4f917ba2892b93ad46a2648b23a8106f09cb Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 13 Oct 2021 15:46:51 -0400 Subject: [PATCH] Ensure extensions are reenabled after unlock Resolves: #2013801 --- gnome-shell.spec | 6 +- login-screen-extensions.patch | 200 ++++++++++++++++++++++++++++++++-- 2 files changed, 194 insertions(+), 12 deletions(-) diff --git a/gnome-shell.spec b/gnome-shell.spec index e579043..be98b6b 100644 --- a/gnome-shell.spec +++ b/gnome-shell.spec @@ -2,7 +2,7 @@ Name: gnome-shell Version: 40.4 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Window management and application launching for GNOME License: GPLv2+ @@ -252,6 +252,10 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.de %{_mandir}/man1/gnome-shell.1* %changelog +* Wed Oct 13 2021 Ray Strode - 40.4-4 +- Ensure extensions are reenabled after unlock + Resolves: #2013801 + * Mon Sep 27 2021 Ray Strode - 40.4-3 - Allow extensions at the login screen Related: #2006985 diff --git a/login-screen-extensions.patch b/login-screen-extensions.patch index 5c42b45..d108b73 100644 --- a/login-screen-extensions.patch +++ b/login-screen-extensions.patch @@ -1,7 +1,184 @@ -From 335b88a5508ae97c8da491e33fb07e823f405844 Mon Sep 17 00:00:00 2001 +From e7fe96d918ef75f59448664d7583eb51735be64d Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 10 Aug 2021 13:25:57 -0400 +Subject: [PATCH 1/3] extensionSystem: Get rid of _enabled boolean optimization + +At the moment a session mode either allows extensions or it doesn't. +If it allows extensions, then the entire available list of +configured extensions get enabled as soon as the session mode is +entered. + +Since enabling or disabling extensions is an all or nothing situation, +the code tracks whether extensions are already enabled when entering +the session mode, and if so, avoids iterating through the extension list +needlessly. It does this using a boolean named _enabled. + +In the future, the extensions themselves will be given some say on +whether or not they should be enabled in a given session mode. This +means, the configured extension list may contain extensions that +shouldn't be enabled for a given session mode, and the _enabled boolean +will no longer be appropriated. + +This commit drops the _enabled boolean optimization. +--- + js/ui/extensionSystem.js | 10 ---------- + 1 file changed, 10 deletions(-) + +diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js +index 6b624fca0..9a8f1c9a2 100644 +--- a/js/ui/extensionSystem.js ++++ b/js/ui/extensionSystem.js +@@ -1,56 +1,55 @@ + // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + /* exported init connect disconnect */ + + const { GLib, Gio, GObject, Shell, St } = imports.gi; + const ByteArray = imports.byteArray; + const Signals = imports.signals; + + const ExtensionDownloader = imports.ui.extensionDownloader; + const ExtensionUtils = imports.misc.extensionUtils; + const FileUtils = imports.misc.fileUtils; + const Main = imports.ui.main; + const MessageTray = imports.ui.messageTray; + + const { ExtensionState, ExtensionType } = ExtensionUtils; + + const ENABLED_EXTENSIONS_KEY = 'enabled-extensions'; + const DISABLED_EXTENSIONS_KEY = 'disabled-extensions'; + const DISABLE_USER_EXTENSIONS_KEY = 'disable-user-extensions'; + const EXTENSION_DISABLE_VERSION_CHECK_KEY = 'disable-extension-version-validation'; + + const UPDATE_CHECK_TIMEOUT = 24 * 60 * 60; // 1 day in seconds + + var ExtensionManager = class { + constructor() { + this._initialized = false; +- this._enabled = false; + this._updateNotified = false; + + this._extensions = new Map(); + this._unloadedExtensions = new Map(); + this._enabledExtensions = []; + this._extensionOrder = []; + + Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); + } + + init() { + // The following file should exist for a period of time when extensions + // are enabled after start. If it exists, then the systemd unit will + // disable extensions should gnome-shell crash. + // Should the file already exist from a previous login, then this is OK. + let disableFilename = GLib.build_filenamev([GLib.get_user_runtime_dir(), 'gnome-shell-disable-extensions']); + let disableFile = Gio.File.new_for_path(disableFilename); + try { + disableFile.create(Gio.FileCreateFlags.REPLACE_DESTINATION, null); + } catch (e) { + log('Failed to create file %s: %s'.format(disableFilename, e.message)); + } + + GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 60, () => { + disableFile.delete(null); + return GLib.SOURCE_REMOVE; + }); + + this._installExtensionUpdates(); + this._sessionUpdated(); +@@ -563,85 +562,76 @@ var ExtensionManager = class { + + this._enabledExtensions = this._getEnabledExtensions(); + + let perUserDir = Gio.File.new_for_path(global.userdatadir); + FileUtils.collectFromDatadirs('extensions', true, (dir, info) => { + let fileType = info.get_file_type(); + if (fileType != Gio.FileType.DIRECTORY) + return; + let uuid = info.get_name(); + let existing = this.lookup(uuid); + if (existing) { + log('Extension %s already installed in %s. %s will not be loaded'.format(uuid, existing.path, dir.get_path())); + return; + } + + let extension; + let type = dir.has_prefix(perUserDir) + ? ExtensionType.PER_USER + : ExtensionType.SYSTEM; + try { + extension = this.createExtensionObject(uuid, dir, type); + } catch (e) { + logError(e, 'Could not load extension %s'.format(uuid)); + return; + } + this.loadExtension(extension); + }); + } + + _enableAllExtensions() { +- if (this._enabled) +- return; +- + if (!this._initialized) { + this._loadExtensions(); + this._initialized = true; + } else { + this._enabledExtensions.forEach(uuid => { + this._callExtensionEnable(uuid); + }); + } +- this._enabled = true; + } + + _disableAllExtensions() { +- if (!this._enabled) +- return; +- + if (this._initialized) { + this._extensionOrder.slice().reverse().forEach(uuid => { + this._callExtensionDisable(uuid); + }); + } +- +- this._enabled = false; + } + + _sessionUpdated() { + // For now sessionMode.allowExtensions controls extensions from both the + // 'enabled-extensions' preference and the sessionMode.enabledExtensions + // property; it might make sense to make enabledExtensions independent + // from allowExtensions in the future + if (Main.sessionMode.allowExtensions) { + // Take care of added or removed sessionMode extensions + this._onEnabledExtensionsChanged(); + this._enableAllExtensions(); + } else { + this._disableAllExtensions(); + } + } + }; + Signals.addSignalMethods(ExtensionManager.prototype); + + const ExtensionUpdateSource = GObject.registerClass( + class ExtensionUpdateSource extends MessageTray.Source { + _init() { + let appSys = Shell.AppSystem.get_default(); + this._app = appSys.lookup_app('org.gnome.Extensions.desktop'); + + super._init(this._app.get_name()); + } + + getIcon() { + return this._app.app_info.get_icon(); + } +-- +2.31.1 + + +From c96d908167b8bb088454e0e839d1c2d6e3638676 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Sat, 28 Aug 2021 13:54:39 -0400 -Subject: [PATCH 1/2] extensionSystem: Allow extensions to run on the login +Subject: [PATCH 2/3] extensionSystem: Allow extensions to run on the login screen At the moment it's not realy possible to extend the login screen to do @@ -33,10 +210,10 @@ session. 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js -index 6b624fca0..278d31f08 100644 +index 9a8f1c9a2..bbf322ee7 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js -@@ -48,120 +48,142 @@ var ExtensionManager = class { +@@ -47,120 +47,142 @@ var ExtensionManager = class { } GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 60, () => { @@ -180,7 +357,7 @@ index 6b624fca0..278d31f08 100644 try { extension.stateObj.enable(); -@@ -289,60 +311,61 @@ var ExtensionManager = class { +@@ -288,60 +310,61 @@ var ExtensionManager = class { } catch (e) { throw new Error('Failed to load metadata.json: %s'.format(e.toString())); } @@ -242,7 +419,7 @@ index 6b624fca0..278d31f08 100644 if (enabled) { if (!this._callExtensionInit(extension.uuid)) return; -@@ -373,61 +396,61 @@ var ExtensionManager = class { +@@ -372,61 +395,61 @@ var ExtensionManager = class { // If we did install an importer, it is now cached and it's // impossible to load a different version if (type === ExtensionType.PER_USER && extension.imports) @@ -305,7 +482,7 @@ index 6b624fca0..278d31f08 100644 } catch (e) { this.logExtensionError(uuid, e); return false; -@@ -462,67 +485,69 @@ var ExtensionManager = class { +@@ -461,67 +484,69 @@ var ExtensionManager = class { : ENABLED_EXTENSIONS_KEY; extension.canChange = @@ -378,12 +555,13 @@ index 6b624fca0..278d31f08 100644 _installExtensionUpdates() { if (!this.updatesSupported) -- -2.32.0 +2.31.1 -From 8153a4fd6c0526946afaf531a6e6f14e2da1ef1b Mon Sep 17 00:00:00 2001 + +From 407c537a5cd14c9e9494d954f27eacfa1589aed5 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 10 Aug 2021 15:31:00 -0400 -Subject: [PATCH 2/2] sessionMode: Allow extensions at the login and unlock +Subject: [PATCH 3/3] sessionMode: Allow extensions at the login and unlock screens Now extensions can specify which session modes they work in, @@ -480,5 +658,5 @@ index 4d4fb2444..0534fd1d4 100644 'keyring', 'autorunManager', 'automountManager'] : ['polkitAgent', 'telepathyClient', -- -2.32.0 +2.31.1