From af5aff32514d7236d3261670a5ed0c087ee3abdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 4 Dec 2020 20:40:13 +0100 Subject: [PATCH] dbusServices/screensaver: Split out public ScreenSaver service Commit 799bbdb50 split out the public Fdo notification service, so that any app with permission to talk to org.freedesktop.Notifications will in fact be limited to that service. To a somewhat lesser extent this applies to the org.gnome.ScreenSaver service as well, which some applications still use instead of the Inhibit portal. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3452 Part-of: --- js/dbusServices/meson.build | 1 + .../org.gnome.ScreenSaver.src.gresource.xml | 11 +++ js/dbusServices/screensaver/main.js | 11 +++ .../screensaver/screenSaverService.js | 68 +++++++++++++++++++ js/ui/shellDBus.js | 3 +- 5 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 js/dbusServices/org.gnome.ScreenSaver.src.gresource.xml create mode 100644 js/dbusServices/screensaver/main.js create mode 100644 js/dbusServices/screensaver/screenSaverService.js diff --git a/js/dbusServices/meson.build b/js/dbusServices/meson.build index 2f047bb52..68e8bd12d 100644 --- a/js/dbusServices/meson.build +++ b/js/dbusServices/meson.build @@ -6,6 +6,7 @@ launcherconf.set('libdir', libdir) dbus_services = { 'org.gnome.Shell.Extensions': 'extensions', 'org.gnome.Shell.Notifications': 'notifications', + 'org.gnome.ScreenSaver': 'screensaver', } if enable_recorder diff --git a/js/dbusServices/org.gnome.ScreenSaver.src.gresource.xml b/js/dbusServices/org.gnome.ScreenSaver.src.gresource.xml new file mode 100644 index 000000000..834167b95 --- /dev/null +++ b/js/dbusServices/org.gnome.ScreenSaver.src.gresource.xml @@ -0,0 +1,11 @@ + + + + main.js + screenSaverService.js + dbusService.js + + misc/config.js + misc/fileUtils.js + + diff --git a/js/dbusServices/screensaver/main.js b/js/dbusServices/screensaver/main.js new file mode 100644 index 000000000..2a08d1403 --- /dev/null +++ b/js/dbusServices/screensaver/main.js @@ -0,0 +1,11 @@ +/* exported main */ + +const { DBusService } = imports.dbusService; +const { ScreenSaverService } = imports.screenSaverService; + +function main() { + const service = new DBusService( + 'org.gnome.ScreenSaver', + new ScreenSaverService()); + service.run(); +} diff --git a/js/dbusServices/screensaver/screenSaverService.js b/js/dbusServices/screensaver/screenSaverService.js new file mode 100644 index 000000000..571e64e50 --- /dev/null +++ b/js/dbusServices/screensaver/screenSaverService.js @@ -0,0 +1,68 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- +/* exported ScreenSaverService */ + +const { Gio, GLib } = imports.gi; + +const { loadInterfaceXML } = imports.misc.fileUtils; +const { ServiceImplementation } = imports.dbusService; + +const ScreenSaverIface = loadInterfaceXML('org.gnome.ScreenSaver'); +const ScreenSaverProxy = Gio.DBusProxy.makeProxyWrapper(ScreenSaverIface); + +var ScreenSaverService = class extends ServiceImplementation { + constructor() { + super(ScreenSaverIface, '/org/gnome/ScreenSaver'); + + this._proxy = new ScreenSaverProxy(Gio.DBus.session, + 'org.gnome.Shell.ScreenShield', + '/org/gnome/ScreenSaver', + (proxy, error) => { + if (error) + log(error.message); + }); + + this._proxy.connectSignal('ActiveChanged', + (proxy, sender, params) => { + this._dbusImpl.emit_signal('ActiveChanged', + new GLib.Variant('(b)', params)); + }); + this._proxy.connectSignal('WakeUpScreen', + () => this._dbusImpl.emit_signal('WakeUpScreen', null)); + } + + LockAsync(params, invocation) { + this._proxy.LockRemote(...params, (res, error) => { + if (this._handleError(invocation, error)) + return; + + invocation.return_value(null); + }); + } + + GetActiveAsync(params, invocation) { + this._proxy.GetActiveRemote(...params, (res, error) => { + if (this._handleError(invocation, error)) + return; + + invocation.return_value(new GLib.Variant('(b)', res)); + }); + } + + SetActiveAsync(params, invocation) { + this._proxy.SetActiveRemote(...params, (res, error) => { + if (this._handleError(invocation, error)) + return; + + invocation.return_value(null); + }); + } + + GetActiveTimeAsync(params, invocation) { + this._proxy.GetActiveTimeRemote(...params, (res, error) => { + if (this._handleError(invocation, error)) + return; + + invocation.return_value(new GLib.Variant('(u)', res)); + }); + } +}; diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js index f7b542b29..181bd1631 100644 --- a/js/ui/shellDBus.js +++ b/js/ui/shellDBus.js @@ -367,7 +367,8 @@ var ScreenSaverDBus = class { this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver'); - Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null); + Gio.DBus.session.own_name('org.gnome.Shell.ScreenShield', + Gio.BusNameOwnerFlags.NONE, null, null); } LockAsync(parameters, invocation) {