xyb3rt / physlock

Lightweight linux console locking tool
GNU General Public License v2.0
303 stars 36 forks source link

Password input problem when resuming from suspend/hibernate #97

Open tstsrt opened 4 years ago

tstsrt commented 4 years ago

After resuming from suspend/hibernate, the first authentication attempt fails unless backspace is pressed atleast once. Later attempts work normally. This is because stdin isn't flushed before the password is read, and systemd automatically uses /dev/null as stdin, which puts an EOF in the password field. A workaround is to set StandardInput=tty in the service file. I'm using the following systemd unit to start physlock before suspend. OS is Arch, physlock version is physlock 13, and systemd version is 245.5-2-arch.

[Unit]
Description=Lock the session before suspending
Before=sleep.target

[Service]
User=%I
Type=forking
StandardInput=tty
TTYPath=/dev/tty7
ExecStart=/usr/bin/physlock -d

[Install]
WantedBy=sleep.target
Noahmatada commented 4 years ago

Any ideas on how this might be solved without systemd, like when launching physlock manually, then closing laptop lid?

tstsrt commented 4 years ago

The bug seems to happen only if both a) the password prompt is running, and b) the system resumes from suspend/hibernate. One possible fix is to have two separate modes of operation - one to lock and another to unlock an already running physlock instance. This way, we can lock the system before suspend and then prompt only after resuming. I'm not sure how difficult this would be to implement, though.

Noahmatada commented 4 years ago

Couldn't it just be made to ignore the EOF character?

tstsrt commented 4 years ago

I believe that would involve either changing the upstream misc_conv function (the password prompt) or writing a custom PAM conversation function that ignores EOF.