Skip to content

logind: always check for inhibitor locks#30307

Merged
keszybz merged 2 commits intosystemd:mainfrom
bluca:enforce_inhibitors
Jul 26, 2024
Merged

logind: always check for inhibitor locks#30307
keszybz merged 2 commits intosystemd:mainfrom
bluca:enforce_inhibitors

Conversation

@bluca
Copy link
Copy Markdown
Member

@bluca bluca commented Dec 3, 2023

Currently inhibitors are bypassed unless an explicit request is made to
check for them, or even in that case when the requestor is root or the
same uid as the holder of the lock.

But in many cases this makes it impractical to rely on inhibitor locks.
For example, in Debian there are several convoluted and archaic
workarounds that divert systemctl/reboot to some hacky custom scripts
to try and enforce blocking accidental reboots, when it's not expected
that the requestor will remember to specify the command line option
to enable checking for active inhibitor locks.

Also in many cases one wants to ensure that locks taken by a user are
respected by actions initiated by that same user.

Change logind so that inhibitors checks are not skipped in these
cases, and systemctl so that locks are checked in order to show a
friendly error message rather than "permission denied".

@github-actions github-actions bot added documentation tests please-review PR is ready for (re-)review by a maintainer labels Dec 3, 2023
@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 3, 2023

An -rc1 tag has been created and a release is being prepared, so please note that PRs introducing new features and APIs will be held back until the new version has been released.

@bluca bluca force-pushed the enforce_inhibitors branch from 77f62eb to bf3beb8 Compare December 3, 2023 15:05
Copy link
Copy Markdown
Member

@YHNdnzj YHNdnzj left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we should restrict rebooting with --force (only once) in this way. PowerOff and similar methods already require CAP_SYS_BOOT to operate, and adding those checks in systemctl doesn't block people from calling the methods directly using busctl. This doesn't seem to introduce security improvements, but merely prohibits privileged users from issuing a method through systemctl, which is confusing.

--force --force is kinda destructive, and I'm not convinced that you should do/recommand that just to bypass inhibitors.

@bluca
Copy link
Copy Markdown
Member Author

bluca commented Dec 3, 2023

I don't think we should restrict rebooting with --force (only once) in this way. PowerOff and similar methods already require CAP_SYS_BOOT to operate, and adding those checks in systemctl doesn't block people from calling the methods directly using busctl. This doesn't seem to introduce security improvements, but merely prohibits privileged users from issuing a method through systemctl, which is confusing.

--force --force is kinda destructive, and I'm not convinced that you should do/recommand that just to bypass inhibitors.

It's not a security feature, as privilege levels are the same. It's for safety: evidently people want to be able to avoid accidentally issueing reboot commands, given the horrendous hacks that are shipped for this purpose, and this is necessary to provide a full alternative to be able to deprecate them. It's intentionally behind a config option disabled by default: if you choose to enable it, then you sign up for this. Otherwise, previous behavior continues to apply unchanged.

I also want to extend this to pid1 dbus methods, but it's a bit more complicated due to the client/server relationship so I'll keep it for later.

@bluca bluca force-pushed the enforce_inhibitors branch from bf3beb8 to d998aab Compare December 3, 2023 15:37
@YHNdnzj
Copy link
Copy Markdown
Member

YHNdnzj commented Dec 3, 2023

It's not a security feature, as privilege levels are the same. It's for safety: evidently people want to be able to avoid accidentally issueing reboot commands, given the horrendous hacks that are shipped for this purpose, and this is necessary to provide a full alternative to be able to deprecate them. It's intentionally behind a config option disabled by default: if you choose to enable it, then you sign up for this. Otherwise, previous behavior continues to apply unchanged.

Yeah, but the main point is that --force --force is now overloaded. It is destructive, as it skips all finalizing steps for shutting down - unmounting file systems, deactivate DM devices and such. But now you document it as if it was a "supported way to ignore prohibitors", which isn't really what's happening.

Maybe, just disallow the use of --force unless --check-inhibitors=no is also specified? The combination is more intuitive to users and has better semantic.

@bluca bluca force-pushed the enforce_inhibitors branch from d998aab to 467a3ce Compare December 3, 2023 16:00
@bluca
Copy link
Copy Markdown
Member Author

bluca commented Dec 3, 2023

It's not a security feature, as privilege levels are the same. It's for safety: evidently people want to be able to avoid accidentally issueing reboot commands, given the horrendous hacks that are shipped for this purpose, and this is necessary to provide a full alternative to be able to deprecate them. It's intentionally behind a config option disabled by default: if you choose to enable it, then you sign up for this. Otherwise, previous behavior continues to apply unchanged.

Yeah, but the main point is that --force --force is now overloaded. It is destructive, as it skips all finalizing steps for shutting down - unmounting file systems, deactivate DM devices and such. But now you document it as if it was a "supported way to ignore prohibitors", which isn't really what's happening.

Maybe, just disallow the use of --force unless --check-inhibitors=no is also specified? The combination is more intuitive to users and has better semantic.

It's a pre-existing option, and as such we shouldn't hide it - it's there, so it should be documented. I've reworded to list several other safer options first, and to make clear that it's a last resort and will likely cause data loss when used.

@bluca bluca force-pushed the enforce_inhibitors branch 2 times, most recently from f80ed4b to b70a6fa Compare December 3, 2023 16:06
@bluca
Copy link
Copy Markdown
Member Author

bluca commented Dec 3, 2023

@mrc0mmand looks new, but I don't think it's related?

16:25:21 [   12.318403] testsuite-06.sh[703]: + sestatus
16:25:21 [   12.322542] testsuite-06.sh[704]: SELinux status:                 enabled
16:25:21 [   12.322542] testsuite-06.sh[704]: SELinuxfs mount:                /sys/fs/selinux
16:25:21 [   12.322542] testsuite-06.sh[704]: SELinux root directory:         /etc/selinux
16:25:21 [   12.322542] testsuite-06.sh[704]: Loaded policy name:             refpolicy-arch
16:25:21 [   12.322542] testsuite-06.sh[704]: Current mode:                   permissive
16:25:21 [   12.322542] testsuite-06.sh[704]: Mode from config file:          permissive
16:25:21 [   12.322542] testsuite-06.sh[704]: Policy MLS status:              disabled
16:25:21 [   12.322542] testsuite-06.sh[704]: Policy deny_unknown status:     denied
16:25:21 [   12.322542] testsuite-06.sh[704]: Memory protection checking:     actual (secure)
16:25:21 [   12.322542] testsuite-06.sh[704]: Max kernel policy version:      33
16:25:21 [   12.323483] testsuite-06.sh[705]: ++ getenforce
16:25:21 [   12.326822] testsuite-06.sh[703]: + [[ Permissive == \P\e\r\m\i\s\s\i\v\e ]]
16:25:21 [   12.327374] testsuite-06.sh[707]: ++ ps -h -o label 1
16:25:21 [   12.347798] testsuite-06.sh[703]: + PID1_CONTEXT=system_u:system_r:kernel_t
16:25:21 [   12.347798] testsuite-06.sh[703]: + [[ system_u:system_r:kernel_t =~ ^system_u:system_r:init_t(:s0)?$ ]]

@mrc0mmand
Copy link
Copy Markdown
Member

@mrc0mmand looks new, but I don't think it's related?

16:25:21 [   12.318403] testsuite-06.sh[703]: + sestatus
16:25:21 [   12.322542] testsuite-06.sh[704]: SELinux status:                 enabled
16:25:21 [   12.322542] testsuite-06.sh[704]: SELinuxfs mount:                /sys/fs/selinux
16:25:21 [   12.322542] testsuite-06.sh[704]: SELinux root directory:         /etc/selinux
16:25:21 [   12.322542] testsuite-06.sh[704]: Loaded policy name:             refpolicy-arch
16:25:21 [   12.322542] testsuite-06.sh[704]: Current mode:                   permissive
16:25:21 [   12.322542] testsuite-06.sh[704]: Mode from config file:          permissive
16:25:21 [   12.322542] testsuite-06.sh[704]: Policy MLS status:              disabled
16:25:21 [   12.322542] testsuite-06.sh[704]: Policy deny_unknown status:     denied
16:25:21 [   12.322542] testsuite-06.sh[704]: Memory protection checking:     actual (secure)
16:25:21 [   12.322542] testsuite-06.sh[704]: Max kernel policy version:      33
16:25:21 [   12.323483] testsuite-06.sh[705]: ++ getenforce
16:25:21 [   12.326822] testsuite-06.sh[703]: + [[ Permissive == \P\e\r\m\i\s\s\i\v\e ]]
16:25:21 [   12.327374] testsuite-06.sh[707]: ++ ps -h -o label 1
16:25:21 [   12.347798] testsuite-06.sh[703]: + PID1_CONTEXT=system_u:system_r:kernel_t
16:25:21 [   12.347798] testsuite-06.sh[703]: + [[ system_u:system_r:kernel_t =~ ^system_u:system_r:init_t(:s0)?$ ]]

That's ... concerning. Lemme restart the job.

@mrc0mmand
Copy link
Copy Markdown
Member

Ah, it failed to reboot the machine after relabeling:

[   12.140953] H sh[344]: Cleaning up labels on /tmp
[   12.211032] H sh[338]: + rm /.autorelabel
[   12.213740] H sh[338]: + systemctl --force reboot
[   12.220337] H systemctl[338]: Failed to connect to bus: No such file or directory
[   12.223067] H systemd[1]: Received SIGCHLD from PID 338 (systemctl).
[   12.223143] H systemd[1]: Child 338 (systemctl) died (code=exited, status=1/FAILURE)
[   12.223223] H systemd[1]: autorelabel.service: Child 338 belongs to autorelabel.service.
[   12.223265] H systemd[1]: autorelabel.service: Main process exited, code=exited, status=1/FAILURE
[   12.223332] H systemd[1]: autorelabel.service: Failed with result 'exit-code'.
[   12.223425] H systemd[1]: autorelabel.service: Service will not restart (restart setting)
[   12.223470] H systemd[1]: autorelabel.service: Changed start -> failed
[   12.223627] H systemd[1]: autorelabel.service: Job 173 autorelabel.service/start finished, result=failed
[   12.223680] H systemd[1]: Failed to start autorelabel.service.
[   12.231459] H systemd[1]: autorelabel.service: Unit entered failed state.

Could that be related to the change?

@bluca
Copy link
Copy Markdown
Member Author

bluca commented Dec 3, 2023

Yes, that could, let me check

@bluca bluca force-pushed the enforce_inhibitors branch from b70a6fa to bc32682 Compare December 3, 2023 18:50
@poettering
Copy link
Copy Markdown
Member

hmpf, I really don't like this approach. I hate config options which totally redefine what things mean. In particular as some distris will just set this and others won't and then noone knows what an inhibitor actzally means. I also think it's a really bad idea to allow unpriv users to just block reboots done by root. That's totally not acceptable.

This discussion has been going on for a while, and I know I changed my mind in some parts on this a couple of times, but maybe a solution like this might work:

  1. define a flag you can set when registering an inhibitor, maybe called "mandatory" or so. If set the inhibitor cannot be skipped easily
  2. allow the client to explicitly turn this flag on, or explicitly turn it off
  3. if neither explicitly turned on, nor explicitly turned off, then set it automatically to on for privileged clients (i.e. uid_is_system() being true), and to off for all other users
  4. if the flag is turned on for inhibitors of unpriv clients, then require polkit auth, since registering an inhibitor like this would stop root to shut down cleanly, and we cannot allow that just willy-nilly.
  5. Add a new RebootWithFlags() flags to override even this flag.

@bluca
Copy link
Copy Markdown
Member Author

bluca commented Dec 4, 2023

hmpf, I really don't like this approach. I hate config options which totally redefine what things mean. In particular as some distris will just set this and others won't and then noone knows what an inhibitor actzally means.

It doesn't really redefine it, it makes it stricter, to cover some extra corner cases. The protocol, meaning, tooling, etc are the same. We got tons of options that make existing things stricter on demand. No distro would set this by default as it would break a tons of things, and it wouldn't make sense anyway. This is a config option for machine owners and admins, not a build option for distro builders.

I also think it's a really bad idea to allow unpriv users to just block reboots done by root. That's totally not acceptable.

Unpriv users are not allowed to block, only to delay. That is already the case today. The only difference here is that root decides that it wants to impose additional restrictions on itself by itself. It can also be backed out at any time as documented - it is not a security feature.

This discussion has been going on for a while, and I know I changed my mind in some parts on this a couple of times, but maybe a solution like this might work:

  1. define a flag you can set when registering an inhibitor, maybe called "mandatory" or so. If set the inhibitor cannot be skipped easily
  2. allow the client to explicitly turn this flag on, or explicitly turn it off
  3. if neither explicitly turned on, nor explicitly turned off, then set it automatically to on for privileged clients (i.e. uid_is_system() being true), and to off for all other users
  4. if the flag is turned on for inhibitors of unpriv clients, then require polkit auth, since registering an inhibitor like this would stop root to shut down cleanly, and we cannot allow that just willy-nilly.
  5. Add a new RebootWithFlags() flags to override even this flag.

This would require a new API, and all applications to buy into that new API. That doesn't help at all to solve the problem I'm trying to solve: how can a machine owner decide to make things stricter for itself, regardless of what the application wants to do. This is not about applications making things stricter for the machine owner, that is not the problem being solved here.
And it would make things more confusing to me: depending on which application is installed and running, then you get one behaviour or the other imposed on the machine owner.

@poettering
Copy link
Copy Markdown
Member

This would require a new API, and all applications to buy into that new API.

No, it does not. Because I suggested the new flag if not configured specifically defaults to whether the client has privs or not. This would mean that magically all such locks created by priv userspace become truly blocking, but those by unpriv locks are not.

@poettering
Copy link
Copy Markdown
Member

It doesn't really redefine it, it makes it stricter, to cover some extra corner cases. The protocol, meaning, tooling, etc are the same. We got tons of options that make existing things stricter on demand. No distro would set this by default as it would break a tons of things, and it wouldn't make sense anyway. This is a config option for machine owners and admins, not a build option for distro builders.

Didn't you say Debian builds something like this manually? So what is this PR about? I assumed this was something DEbian needs? if not, what is this for?

@bluca
Copy link
Copy Markdown
Member Author

bluca commented Dec 4, 2023

This would require a new API, and all applications to buy into that new API.

No, it does not. Because I suggested the new flag if not configured specifically defaults to whether the client has privs or not. This would mean that magically all such locks created by priv userspace become truly blocking, but those by unpriv locks are not.

That would break backward compatibility

It doesn't really redefine it, it makes it stricter, to cover some extra corner cases. The protocol, meaning, tooling, etc are the same. We got tons of options that make existing things stricter on demand. No distro would set this by default as it would break a tons of things, and it wouldn't make sense anyway. This is a config option for machine owners and admins, not a build option for distro builders.

Didn't you say Debian builds something like this manually? So what is this PR about? I assumed this was something DEbian needs? if not, what is this for?

Yes, for users on Debian to enable if/when they need it, not for the distribution to enable it by default. This is what it replaces: https://sources.debian.org/src/molly-guard/0.8.1/debian/control/

@bluca bluca force-pushed the enforce_inhibitors branch from bc32682 to f4f7841 Compare December 6, 2023 21:33
@poettering
Copy link
Copy Markdown
Member

That would break backward compatibility

So would your change.

Sorry, I am not convinced that inhibitor semantics should be up for configuration of the admin.

I think a more selective change might be OK, as I proposed, but it would have to adjust things for all cases, not dependent on config.

Sorry, but new config options for this are just bad. This makes no sense.

Yes, for users on Debian to enable if/when they need it, not for the distribution to enable it by default. This is what it replaces: https://sources.debian.org/src/molly-guard/0.8.1/debian/control/

I do no see the relationship of that to inhibitors? That tool appears to interactively ask for confirmation, asking for a hostname to be typed in? this is nothing inhibitors could be used for.

@bluca
Copy link
Copy Markdown
Member Author

bluca commented Jul 9, 2024

anyway, I offered you a compromise, i even offered you to change the defaults to match the behaviour you want (even though you initially even wanted to make this a config file option!!!), but you just categorically say no and saying a compromise is not enough. I am stepping out of this discussione then.

Yes I wanted to make it a config option because that is also fixed beforehand - if it is set, you know the behaviour is reliable. Not ideal, but fine as a compromise. A flag from the client side is not the same: when you successfully get a lock, you don't know if later another clients comes in and passes a flag via D-Bus that makes your lock go ignored.

And adding one more problem of the exact same type of the many problems that already exist is not really a compromise - it does not solve the issue at hand - seriously I do not know how else to explain this: the problem is the huge variability that comes in depending on internal details of whichever client happens to call the inhibited operation. Adding one more dimension to that variability is not a generous compromise, is a step in the wrong direction that makes the existing situation even worse than it is, as now there's one more thing that can go wrong and take your successfully acquired lock away from you, that you have no way whatsoever of knowing in advance. How would that help solve the problem?

@YHNdnzj
Copy link
Copy Markdown
Member

YHNdnzj commented Jul 9, 2024

So my proposal again goes something like this: when taking an inhibitor take one of three flags: STRONG_INHIBITOR, WEAK_INHIBITOR, AUTO_INHIBITOR. The latter would be the default (and be what would be what is done if current clients use the api). In case of auto inhibitor logind would simply ask PK if client can have a strong inhibitor, and if not it would ask for a weak one instead.

Well, this proposal is about making existing users of inhibitors behave consistently/reliably. I.e. if the inhibitor cannot be acquired, the owner/user/taker should get an error, and based on that it could choose whether to carry on without inhibitor (if the job is interruptible) or to bail out if not. IOW, to actually do this right, STRONG_INHIBITOR must be the default choice, i.e. the approach taken by the PR.

If there's need for WEAK_INHIBITOR, maybe it could be added, but AUTO_INHIBITOR is really a terrible concept, and does not fit into the real use-cases.

@bluca
Copy link
Copy Markdown
Member Author

bluca commented Jul 19, 2024

Ok on top of the SD_LOGIND_SKIP_INHIBITORS reboot flag that I already had added, I have now added two new modes 'block-weak' and 'delay-weak' as requested, that make the new lock behave as it does currently

@YHNdnzj
Copy link
Copy Markdown
Member

YHNdnzj commented Jul 19, 2024

Ok on top of the SD_LOGIND_SKIP_INHIBITORS reboot flag that I already had added, I have now added two new modes 'block-weak' and 'delay-weak' as requested, that make the new lock behave as it does currently

Hmm, I don't see the point for delay-weak? delay inhibitors are inherently weak?

BTW, to make things actually reliable, SD_LOGIND_SKIP_INHIBITORS should only try to skip block inhibitors?

@bluca
Copy link
Copy Markdown
Member Author

bluca commented Jul 19, 2024

The request was to be able to skip/ignore everything, so I've implemented it as that. I think there's been enough back and forth, I just want to get this merged

@YHNdnzj
Copy link
Copy Markdown
Member

YHNdnzj commented Jul 19, 2024

The request was to be able to skip/ignore everything, so I've implemented it as that. I think there's been enough back and forth, I just want to get this merged

But this just brings the problem you're trying to resolve back, no? Now the clients that do hold an block inhibitor can still be skipped.

The idea is that the block inhibitors, once acquired, will definitely not be skipped. And whether you can acquire one is authorized through polkit. OTOH, the weak ones can be skipped when a flag is specified and the caller is privileged, and the required privilege is relatively lower. The delay one you can aleays get, but others are always allowed to shortcut things.

@bluca
Copy link
Copy Markdown
Member Author

bluca commented Jul 19, 2024

The request was to be able to skip/ignore everything, so I've implemented it as that. I think there's been enough back and forth, I just want to get this merged

But this just brings the problem you're trying to resolve back, no? Now the clients that do hold an block inhibitor can still be skipped.

The idea is that the block inhibitors, once acquired, will definitely not be skipped. And whether you can acquire one is authorized through polkit. OTOH, the weak ones can be skipped when a flag is specified and the caller is privileged, and the required privilege is relatively lower. The delay one you can aleays get, but others are always allowed to shortcut things.

Yes, I am well aware - but @poettering doesn't want to have it any other way as per last meeting, and is adamant this "weak" version needs to be available too in parallel. I do not like it, but I want to get this merged. At least the default now will be sane and work in all cases as a reasonable person expects. And if one wants to take a lock that doesn't actually lock, the option is there.

@YHNdnzj
Copy link
Copy Markdown
Member

YHNdnzj commented Jul 19, 2024

Yes, I am well aware - but @poettering doesn't want to have it any other way as per last meeting, and is adamant this "weak" version needs to be available too in parallel.

That's not the way I understand @poettering? The weak ones are enough IIUC?

Copy link
Copy Markdown
Member

@keszybz keszybz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM apart from cosmetic stuff.

I tested this in a VM, and it all seems to work as expected, incl. the new weak inhibitors.

@keszybz
Copy link
Copy Markdown
Member

keszybz commented Jul 24, 2024

Yes, I am well aware - but @poettering doesn't want to have it any other way as per last meeting, and is adamant this "weak" version needs to be available too in parallel.

That's not the way I understand @poettering? The weak ones are enough IIUC?

My understanding is the the latest version implements what we agreed on in the meeting. To quote Lennart (from memory, but I think I got the gist correctly): as a user I want to take an inhibitor that blocks other users, but not actions that I initiate myself, nor actions initiated by the system. The weak inhibitors implement exactly that.

@keszybz
Copy link
Copy Markdown
Member

keszybz commented Jul 24, 2024

noble-s390x testbed is busted, not related.

bluca added 2 commits July 25, 2024 12:22
Currently inhibitors are bypassed unless an explicit request is made to
check for them, or even in that case when the requestor is root or the
same uid as the holder of the lock.

But in many cases this makes it impractical to rely on inhibitor locks.
For example, in Debian there are several convoluted and archaic
workarounds that divert systemctl/reboot to some hacky custom scripts
to try and enforce blocking accidental reboots, when it's not expected
that the requestor will remember to specify the command line option
to enable checking for active inhibitor locks.

Also in many cases one wants to ensure that locks taken by a user are
respected by actions initiated by that same user.

Change logind so that inhibitors checks are not skipped in these
cases, and systemctl so that locks are checked in order to show a
friendly error message rather than "permission denied".

Add new block-weak and delay-weak modes that keep the previous
behaviour unchanged.
<literal>shutdown</literal>.</para></listitem>
Note that <literal>delay</literal> is only available for <literal>sleep</literal> and
<literal>shutdown</literal>. In addition, the weak variants will automatically and silently be
bypassed under some circumstances.</para></listitem>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that's awfully vague. please clarify this.

delay inhibitors are already kinda weak: they have a timeout anyway, that's enough. and we always applied them anyway regardless who is asking for a shutdown. Please do not add a weak flavour of delay inhibitors. they make no sense.

This mode is only available for _sleep_ and _shutdown_ locks.

3. _block-weak_ and _delay-weak_ that work as the non-weak counterparts, but that in addition may be ignored
automatically and silently under certain circumstances, unlike the formers which are always respected.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add proper documentation, i.e. which "certain circumstances" those are. we need to tell people which ones to take.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like the conditions are:

Invoker of the command is root (geteuid() == 0), invoker is the same UID as the inhibitor (geteuid() == uid), or invoker is not on a terminal (?!) (!on_tty)

performs a userspace reboot only. <constant>SD_LOGIND_SOFT_REBOOT_IF_NEXTROOT_SET_UP</constant> and
flags. Since systemd version 256 <constant>SD_LOGIND_ROOT_CHECK_INHIBITORS</constant> (0x01) is deprecated,
and active inhibitors are always honoured by default for privileged users too, and a new flag
<constant>SD_LOGIND_SKIP_INHIBITORS</constant> (0x04) can be specified to bypass inhibitors. When
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please be explicit here, that this is limited to privileged clients, and that this bypasses block and block-weak inhibitors (and has no effect on delay inhibitors).

/* We don't check polkit for root here, because you can't be more privileged than root */
if (uid == 0 && (flags & SD_LOGIND_ROOT_CHECK_INHIBITORS))
if (!FLAGS_SET(flags, SD_LOGIND_SKIP_INHIBITORS))
return sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should return a proper dbus error btw, that says BlockedByInhibitor... (yes, pre-existing issue i know, but please fix if you touch this)

@poettering
Copy link
Copy Markdown
Member

sigh. sorry, but this wasn't ready. what was the need to hurry this in? you knew this was a contentious issue...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

6 participants