[pkg-gnupg-maint] Bug#927105: Bug#927105: pinentry-gnome3: No proper curses fallback.
Zephaniah E. Loss-Cutler-Hull
zephaniah at gmail.com
Wed Apr 17 05:50:47 BST 2019
Control: tags 927105 - moreinfo
Hi Daniel,
On 4/15/19 9:17 PM, Daniel Kahn Gillmor wrote:
> On Sun 2019-04-14 23:25:14 -0700, Zephaniah E. Loss-Cutler-Hull wrote:
>
>> Looking at the code, it sure looks like it tries to handle this, by
>> checking to see if there is a DBUS_SESSION_BUS_ADDRESS (which there is,
>> inherited from the gpg-agent), if a gcr system prompt is available, and
>> trying to see if the screen is locked, however in my testing none of
>> these actually seem to work to detect that, indeed, the screen is locked
>> and the user isn't at the desktop any more.
>>
>> To me the obvious solution is to also check and see if there is a
>> display set, using the same logic as pinentry-gtk-2, I have some fear
>> that this will break a pure wayland environment (one with no xwayland
>> involved), however I don't actually have one of those handy to test
>> with. If someone with a wayland environment could test this that would
>> be appreciated.
>
> As far as i'm aware, the current state is a deliberate choice by
> upstream (and it's also one that i think is the right answer) -- GNOME3
> is not X11-only, and pinentry-gnome3 doesn't bother communicating with
> the X11 session via $DISPLAY at all. As you point out, your proposed
> patch seems likely to fail in environments like Wayland.
I need to try and find the time to spin up a Wayland native VM and do
some testing to see if DISPLAY is getting set in all reasonable cases.
I say reasonable because no X11 programs could be run in that
environment, and that doesn't seem like a horribly likely configuration.
>
> If you don't want to talk to a GNOME3 session, you can change your
> pinentry explicitly to be something other than pinentry-gnome3 :)
But that's _way_ uglier! :)
>
> That said, are you certain that GNOME desktop is is locked when you
> conduct your test? What screenlocking mechanism are you using? If the
> screen is *unlocked* then i think there's a decent argument for wanting
> the prompt to happen on the screen anyway. But if the screen is locked,
> and it can fall back to curses maybe i can agree with you that it
> should?
So for the sake of immediate convenience, I'm doing some of the testing
while I write this email on a Ubuntu 18.04 box, but the behaviour
appears to be the same.
System was locked with the lock screen hot key, password is required to
unlock, and monitors were powered down by the system. So definitely locked.
ssh to the system, attempt to use 'pass' to access a password fails with:
gpg: decryption failed: No secret key
More interestingly calling pinentry-gnome3 directly fails with an
'Operation Cancelled' error:
(Doing this without the echo so there is a real TTY doesn't have any
impact on the results.)
~$ echo 'GETPIN' | pinentry-gnome3
OK Pleased to meet you
ERR 83886179 Operation cancelled <Pinentry>
Doing the same thing on an unlocked desktop brings up the pin prompt,
and returns the results:
~$ echo GETPIN | pinentry-gnome3
OK Pleased to meet you
D 1234
OK
Now, with all of that said...
>
> If you have any patch that you want to propose that falls back to curses
> if both:
>
> * gcr fails because the screen is locked, and
> * a tty is available
>
> Then i would be happy to help you convince upstream (e.g. via
> https://dev.gnupg.org/) that this should be adopted. I've suggested
> this approach before in #842015, but i haven't had the time (or the
> experience with using dbus to monitor a GNOME session lock, e.g. [0]) to
> implement it myself.
>
> There may also be a race condition here -- between testing for the
> screen lock and using gcr, or vice versa. Perhaps gcr itself is what
> needs to be able to fail cleanly (thereby triggering the fallback) if
> the screen is locked? that seems less likely to have a race. I'm open
> to different implementation ideas, anyway, but testing for $DISPLAY
> seems like the wrong choice.
(This may be a little disjointed, I'm writing as I debug.)
I think that there is a bug in how it is detecting the screen lock,
because pe_gnome_screen_locked has a comment that the check it is doing
is intended to be equivalent of:
dbus-send --print-reply=literal --session --dest=org.gnome.ScreenSaver
/org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActive
Except that this command when run from the command line is correctly
detecting that the screen is locked.
Which means that either pe_gnome_screen_locked isn't working correctly,
or it somehow isn't getting called.
So, a few minutes of debugging later, in looks like
g_dbus_connection_call_sync is returning NULL, instead of a correct value.
Which, as long as there is no error, fails silently. But there is an
error, a timeout. Timeouts are explicitly getting ignored, but why is
there a timeout?
So, referencing:
https://developer.gnome.org/gio//2.50/GDBusConnection.html#g-dbus-connection-call-sync
The third to the last argument is timeout_msec:
the timeout in milliseconds, -1 to use the default timeout or G_MAXINT
for no timeout
Except that the code is passing in a 0, not -1, not some other value,
and not G_MAXINT. Which appears to be causing an immediate timeout, and
so the 'is the screen locked' check simply fails, every single time.
Which means that the correct fix is to simply change the timeout from 0
to something sane.
Do you see any reason why accepting the default timeout with -1 wouldn't
be the correct thing to do here?
A tested patch is attached.
Now, I'm still not entirely convinced on the logic that a remote session
should trigger a desktop PIN entry, but that seems more like an upstream
design question of intent instead of something to try and fix in Debian.
I'm happy to try and do some work to implement a check that works on
Wayland as well if upstream has any interest in it, but first we would
need to confirm the intent.
Regards,
Zephaniah E. Loss-Cutler-Hull.
>
> --dkg
>
> [0] https://elementaryos.stackexchange.com/questions/14083/dbus-signal-for-session-lock-unlock
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: gnome3_dbus_timeout.patch
Type: text/x-patch
Size: 1493 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-gnupg-maint/attachments/20190416/c9ad667b/attachment.bin>
More information about the pkg-gnupg-maint
mailing list