Hello community, here is the log from the commit of package brightnessctl for openSUSE:Factory checked in at 2020-01-31 23:58:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/brightnessctl (Old) and /work/SRC/openSUSE:Factory/.brightnessctl.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "brightnessctl" Fri Jan 31 23:58:05 2020 rev:3 rq:769065 version:0.4 Changes: -------- --- /work/SRC/openSUSE:Factory/brightnessctl/brightnessctl.changes 2019-05-22 12:20:07.840846161 +0200 +++ /work/SRC/openSUSE:Factory/.brightnessctl.new.26092/brightnessctl.changes 2020-01-31 23:59:14.091712048 +0100 @@ -1,0 +2,15 @@ +Thu Jan 30 08:52:07 UTC 2020 - Dan Čermák <dcermak@suse.com> + +- Add support for using logind mode for recent distributions + cherry pick patches from upstream: + * 0001-Fixed-inconsistency-in-README-thanks-AJGQ.patch + * 0002-Support-the-new-SetBrightness-logind-API.patch + * 0003-Make-the-use-of-SetBrightness-dynamic.patch + * 0004-Use-non-suid-permissions-when-logind-is-used.patch + +------------------------------------------------------------------- +Thu Oct 17 14:57:05 UTC 2019 - Richard Brown <rbrown@suse.com> + +- Remove obsolete Groups tag (fate#326485) + +------------------------------------------------------------------- New: ---- 0001-Fixed-inconsistency-in-README-thanks-AJGQ.patch 0002-Support-the-new-SetBrightness-logind-API.patch 0003-Make-the-use-of-SetBrightness-dynamic.patch 0004-Use-non-suid-permissions-when-logind-is-used.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ brightnessctl.spec ++++++ --- /var/tmp/diff_new_pack.7GUUbV/_old 2020-01-31 23:59:15.331712690 +0100 +++ /var/tmp/diff_new_pack.7GUUbV/_new 2020-01-31 23:59:15.335712692 +0100 @@ -1,7 +1,7 @@ # # spec file for package brightnessctl # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # Copyright (c) 2019 R Tyler Croy <rtyler@brokenco.de> # Copyright (c) 2016 Fabio Alessandro Locati <fale@fedoraproject.org> # @@ -18,37 +18,69 @@ # +# use systemd-logind instead of udev for systemd >= 243 +%if 0%{?sle_version} >= 150200 || 0%{?suse_version} > 1500 +%global use_logind 1 +%else +%global use_logind 0 +%endif Name: brightnessctl Version: 0.4 Release: 0 Summary: Tool to read and control device brightness License: MIT -Group: System/Management URL: https://github.com/Hummer12007/%{name} -Source: https://github.com/Hummer12007/brightnessctl/archive/%{version}.tar.gz +Source: %{URL}/archive/%{version}.tar.gz +# required to resolve cherry pick conflicts +# https://github.com/Hummer12007/brightnessctl/commit/aa6a71cd8206992a64269239... +Patch0: 0001-Fixed-inconsistency-in-README-thanks-AJGQ.patch +# https://github.com/Hummer12007/brightnessctl/pull/33 +Patch1: 0002-Support-the-new-SetBrightness-logind-API.patch +Patch2: 0003-Make-the-use-of-SetBrightness-dynamic.patch +# https://github.com/Hummer12007/brightnessctl/pull/41 +Patch3: 0004-Use-non-suid-permissions-when-logind-is-used.patch BuildRequires: gcc BuildRequires: make +%if %{use_logind} +BuildRequires: pkgconfig(libsystemd) +Requires: systemd >= 243 +%else BuildRequires: systemd-rpm-macros +%endif %description A utility to read and control the display brightness. %prep -%autosetup +%autosetup -N +%if %{use_logind} +%autopatch -p1 +%endif %build -export CFLAGS="%{optflags}" +%if %{use_logind} +export ENABLE_SYSTEMD=1 +%{set_build_flags} +%else export MODE="4755" +export CFLAGS="%{optflags}" +%endif %make_build %install +%if %{use_logind} +%make_install INSTALL_UDEV_RULES=0 ENABLE_SYSTEMD=1 PREFIX=%{_prefix} +%else %make_install UDEVDIR=%{_udevrulesdir} +%endif %files %doc README.md %license LICENSE %{_bindir}/%{name} +%if ! %{use_logind} %{_udevrulesdir}/90-brightnessctl.rules +%endif %{_mandir}/man1/brightnessctl.1%{?ext_man} %changelog ++++++ 0001-Fixed-inconsistency-in-README-thanks-AJGQ.patch ++++++
From 5bee979cd84347369027b45b5df5d917b3231ab6 Mon Sep 17 00:00:00 2001 From: Hummer12007 <hilobakho@gmail.com> Date: Fri, 2 Aug 2019 15:23:38 +0300 Subject: [PATCH 1/4] Fixed inconsistency in README (thanks @AJGQ)
Closes #28 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 92b65b0..0042bb4 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Modifying brightness requires write permissions for device files. `brightnessctl 2) installing `brightnessctl` as a suid binary. -The behavior is controlled by the `INSTALL_UDEV_RULES` flag (setting it to `1` installs the udev rules, `0` is the default value). +The behavior is controlled by the `INSTALL_UDEV_RULES` flag (setting it to `1` installs the udev rules, it is the default value). ## Usage ``` -- 2.25.0 ++++++ 0002-Support-the-new-SetBrightness-logind-API.patch ++++++
From d8dfd8ed49762922e9ff8ebd19b2607fc6cd60aa Mon Sep 17 00:00:00 2001 From: Antoine Damhet <antoine.damhet@lse.epita.fr> Date: Tue, 10 Sep 2019 00:24:05 +0200 Subject: [PATCH 2/4] Support the new `SetBrightness` logind API
This API from `org.freedesktop.login1.Session` allows an unprivileged user with an active session to change its own backlight. Systemd >= v243 is needed. Signed-off-by: Antoine Damhet <antoine.damhet@lse.epita.fr> --- Makefile | 6 ++++++ README.md | 6 +++++- brightnessctl.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index f324efd..22ff475 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,12 @@ INSTALL_UDEV_RULES = 1 INSTALL_UDEV_1 = install_udev_rules UDEVDIR ?= /lib/udev/rules.d +ifdef ENABLE_SYSTEMD + CFLAGS += ${shell pkg-config --cflags libsystemd} + LDLIBS += ${shell pkg-config --libs libsystemd} + CPPFLAGS += -DENABLE_SYSTEMD +endif + MODE_0 = 4711 MODE_1 = 0755 MODE = ${MODE_${INSTALL_UDEV_RULES}} diff --git a/README.md b/README.md index 0042bb4..b57d3df 100644 --- a/README.md +++ b/README.md @@ -17,14 +17,18 @@ One can build and install the program using `make install`. Consult the Makefile ## Permissions -Modifying brightness requires write permissions for device files. `brightnessctl` accomplishes this (without using `sudo`/`su`/etc.) by either of the following means: +Modifying brightness requires write permissions for device files or systemd support. `brightnessctl` accomplishes this (without using `sudo`/`su`/etc.) by either of the following means: 1) installing relevant udev rules to add permissions to backlight class devices for users in `video` and leds for users in `input`. (done by default) 2) installing `brightnessctl` as a suid binary. +3) using the `systemd-logind` API. + The behavior is controlled by the `INSTALL_UDEV_RULES` flag (setting it to `1` installs the udev rules, it is the default value). +The systemd support (since v243) is controlled by the `ENABLE_SYSTEMD` flag (in that case it is recommended to set `INSTALL_UDEV_RULES` to 0). + ## Usage ``` Usage: brightnessctl [options] [operation] [value] diff --git a/brightnessctl.c b/brightnessctl.c index eb3ce3c..3fec6ec 100644 --- a/brightnessctl.c +++ b/brightnessctl.c @@ -14,6 +14,10 @@ #include <string.h> #include <math.h> +#ifdef ENABLE_SYSTEMD +# include <systemd/sd-bus.h> +#endif + static char *path = "/sys/class"; static char *classes[] = { "backlight", "leds", NULL }; @@ -101,7 +105,12 @@ int main(int argc, char **argv) { struct device *devs[255]; struct device *dev; struct utsname name; - char *dev_name, *file_path, *sys_run_dir; + char *dev_name, *sys_run_dir; + +#ifndef ENABLE_SYSTEMD + char *file_path; +#endif + int n, c, phelp = 0; if (uname(&name)) fail("Unable to determine current OS. Exiting!\n"); @@ -194,6 +203,8 @@ int main(int argc, char **argv) { fail("Invalid value given"); if (!(dev = find_device(devs, dev_name))) fail("Device '%s' not found.\n", dev_name); + +#ifndef ENABLE_SYSTEMD if ((p.operation == SET || p.restore) && !p.pretend && geteuid()) { errno = 0; file_path = cat_with('/', path, dev->class, dev->id, "brightness"); @@ -204,6 +215,8 @@ int main(int argc, char **argv) { } free(file_path); } +#endif + if ((sys_run_dir = getenv("XDG_RUNTIME_DIR"))) run_dir = dir_child(sys_run_dir, "brightnessctl"); if (p.save) @@ -325,6 +338,37 @@ apply: d->curr_brightness = new; } +#ifdef ENABLE_SYSTEMD + +bool write_device(struct device *d) { + sd_bus *bus = NULL; + int r = sd_bus_default_system(&bus); + if (r < 0) { + fprintf(stderr, "Can't connect to system bus: %s\n", strerror(-r)); + return false; + } + + r = sd_bus_call_method(bus, + "org.freedesktop.login1", + "/org/freedesktop/login1/session/auto", + "org.freedesktop.login1.Session", + "SetBrightness", + NULL, + NULL, + "ssu", + d->class, + d->id, + d->curr_brightness); + if (r < 0) + fprintf(stderr, "Failed to set brightness: %s\n", strerror(-r)); + + sd_bus_unref(bus); + + return r >= 0; +} + +#else + bool write_device(struct device *d) { FILE *f; char c[16]; @@ -348,6 +392,8 @@ fail: return !errno; } +#endif + bool read_device(struct device *d, char *class, char *id) { DIR *dirp; FILE *f; -- 2.25.0 ++++++ 0003-Make-the-use-of-SetBrightness-dynamic.patch ++++++
From 658d5d058cb03a94269f8eec5b7ac4f1e8c43880 Mon Sep 17 00:00:00 2001 From: Antoine Damhet <antoine.damhet@lse.epita.fr> Date: Tue, 10 Sep 2019 08:52:59 +0200 Subject: [PATCH 3/4] Make the use of `SetBrightness` dynamic
It will only be used if the user do not have the permission to directly write to the backlight device. Signed-off-by: Antoine Damhet <antoine.damhet@lse.epita.fr> --- brightnessctl.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/brightnessctl.c b/brightnessctl.c index 3fec6ec..576e591 100644 --- a/brightnessctl.c +++ b/brightnessctl.c @@ -38,7 +38,7 @@ static char *class_path(char *); static void apply_value(struct device *, struct value *); static int apply_operation(struct device *, enum operation, struct value *); static bool parse_value(struct value *, char *); -static bool write_device(struct device *); +static bool do_write_device(struct device *); static bool read_device(struct device *, char *, char *); static int read_class(struct device **, char *); static int read_devices(struct device **); @@ -50,6 +50,10 @@ static bool restore_device_data(struct device *); static bool ensure_dir(char *); #define ensure_run_dir() ensure_dir(run_dir) +#ifdef ENABLE_SYSTEMD +static bool logind_set_brightness(struct device *); +#endif + struct device { char *class; char *id; @@ -101,16 +105,13 @@ static const struct option options[] = { {NULL,} }; +static bool (*write_device)(struct device *) = do_write_device; + int main(int argc, char **argv) { struct device *devs[255]; struct device *dev; struct utsname name; - char *dev_name, *sys_run_dir; - -#ifndef ENABLE_SYSTEMD - char *file_path; -#endif - + char *dev_name, *file_path, *sys_run_dir; int n, c, phelp = 0; if (uname(&name)) fail("Unable to determine current OS. Exiting!\n"); @@ -203,20 +204,20 @@ int main(int argc, char **argv) { fail("Invalid value given"); if (!(dev = find_device(devs, dev_name))) fail("Device '%s' not found.\n", dev_name); - -#ifndef ENABLE_SYSTEMD if ((p.operation == SET || p.restore) && !p.pretend && geteuid()) { errno = 0; file_path = cat_with('/', path, dev->class, dev->id, "brightness"); if (access(file_path, W_OK)) { +#ifdef ENABLE_SYSTEMD + write_device = logind_set_brightness; +#else perror("Can't modify brightness"); fail("\nYou should run this program with root privileges.\n" "Alternatively, get write permissions for device files.\n"); +#endif } free(file_path); } -#endif - if ((sys_run_dir = getenv("XDG_RUNTIME_DIR"))) run_dir = dir_child(sys_run_dir, "brightnessctl"); if (p.save) @@ -340,7 +341,7 @@ apply: #ifdef ENABLE_SYSTEMD -bool write_device(struct device *d) { +bool logind_set_brightness(struct device *d) { sd_bus *bus = NULL; int r = sd_bus_default_system(&bus); if (r < 0) { @@ -367,9 +368,9 @@ bool write_device(struct device *d) { return r >= 0; } -#else +#endif -bool write_device(struct device *d) { +bool do_write_device(struct device *d) { FILE *f; char c[16]; size_t s = sprintf(c, "%u", d->curr_brightness); @@ -392,8 +393,6 @@ fail: return !errno; } -#endif - bool read_device(struct device *d, char *class, char *id) { DIR *dirp; FILE *f; -- 2.25.0 ++++++ 0004-Use-non-suid-permissions-when-logind-is-used.patch ++++++
From 4e815152fb366972ca24ce17d3d25f337a3b01b9 Mon Sep 17 00:00:00 2001 From: Christian Kellner <christian@kellner.me> Date: Sun, 26 Jan 2020 13:15:40 +0100 Subject: [PATCH 4/4] Use non-suid permissions when logind is used
When systemd-logind and its D-Bus API is used to actual change the brightness of devices the binary does not have to be suid, which is desired for security reasons. --- Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 22ff475..fcd746a 100644 --- a/Makefile +++ b/Makefile @@ -11,16 +11,17 @@ INSTALL_UDEV_RULES = 1 INSTALL_UDEV_1 = install_udev_rules UDEVDIR ?= /lib/udev/rules.d +MODE_0 = 4711 +MODE_1 = 0755 +MODE = ${MODE_${INSTALL_UDEV_RULES}} + ifdef ENABLE_SYSTEMD CFLAGS += ${shell pkg-config --cflags libsystemd} LDLIBS += ${shell pkg-config --libs libsystemd} CPPFLAGS += -DENABLE_SYSTEMD + MODE = 0755 endif -MODE_0 = 4711 -MODE_1 = 0755 -MODE = ${MODE_${INSTALL_UDEV_RULES}} - all: brightnessctl brightnessctl.1 install: all ${INSTALL_UDEV_${INSTALL_UDEV_RULES}} -- 2.25.0