Bug#1068044: openssh-client: graphical prompting does not work on wayland systems without xwayland

Daniel Kahn Gillmor <[email protected]>
Newsgroups gmane.linux.debian.devel.ssh
Message-ID <875xx4r4ml.fsf__44689.2262598098$1711755757$gmane$org@fifthhorseman.net>
Package: openssh-client
Version: 1:9.7p1-2+b1
Severity: normal
Tags: patch
Forwarded: https://github.com/openssh/openssh-portable/pull/479
X-Debbugs-Cc: Daniel Kahn Gillmor <[email protected]>

When using a wayland graphical environment without xwayland, at least
two different parts of OpenSSH decline to prompt the user graphically,
even if ssh-askpass-gnome is installed.  (and ssh-askpass-gnome works
cleanly on wayland without xwayland).

The two places that i've noticed that don't prompt are:

- when a key has been added to ssh-agent with `-c` the confirmation
  prompt for use doesn't show.

- when a multiplexed ssh session with `ControlMaster=ask` or
  `ControlMaster=autoask` is configured and another ssh session wants to
  connect over it.


In both locations, ssh-askpass isn't used because the environment
variable DISPLAY isn't set.  I would guess that early adopters of
wayland who have declined to run XWayland have all just shrugged and
worked around this by manually setting SSH_ASKPASS_REQUIRE=force, or to
spuriously setting DISPLAY or something like that as a workaround.

But the tools should really be friendlier to this environment.

I think the attached patch, which i've also offered upstream, should
enable this use case.

       --dkg


-- System Information:
Debian Release: trixie/sid
  APT prefers testing-debug
  APT policy: (500, 'testing-debug'), (500, 'testing'), (500, 'stable'), (500, 'oldstable'), (200, 'unstable-debug'), (200, 'unstable'), (1, 'experimental-debug'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 6.6.15-amd64 (SMP w/4 CPU threads; PREEMPT)
Kernel taint flags: TAINT_FIRMWARE_WORKAROUND
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages openssh-client depends on:
ii  adduser           3.137
ii  libc6             2.37-15
ii  libedit2          3.1-20230828-1
ii  libfido2-1        1.14.0-1
ii  libgssapi-krb5-2  1.20.1-5+b1
ii  libselinux1       3.5-2
ii  libssl3t64        3.1.5-1.1
ii  passwd            1:4.13+dfsg1-4
ii  zlib1g            1:1.3.dfsg-3+b1

Versions of packages openssh-client recommends:
ii  xauth  1:1.1.2-1

Versions of packages openssh-client suggests:
pn  keychain                         <none>
pn  libpam-ssh                       <none>
ii  monkeysphere                     0.44-1
ii  ssh-askpass-gnome [ssh-askpass]  1:9.6p1-4

-- no debconf information
0001-Allow-ssh-askpass-on-Wayland-by-checking-for-WAYLAND.patch (text/x-diff, 1.6 KB)
From bb3412c842c8c3dc98c1e0643905229ed3fa7a6c Mon Sep 17 00:00:00 2001
From: Daniel Kahn Gillmor <[email protected]>
Date: Thu, 28 Mar 2024 16:22:41 -0400
Subject: [PATCH] Allow ssh-askpass on Wayland by checking for $WAYLAND_DISPLAY

Currently, no part of ssh (including the agent!) will even consider
running ssh-askpass unless $DISPLAY is set.  But some systems run a
graphical environment (e.g. Wayland) where some versions of
ssh-askpass (e.g. ssh-askpass-gnome) will still work just fine.

So expand this baseline check to to permit invoking ssh-askpass if the
sentinel wayland environment variable is present as well.
---
 readpass.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/readpass.c b/readpass.c
index b52f3d6b1..5e5cad29c 100644
--- a/readpass.c
+++ b/readpass.c
@@ -127,8 +127,9 @@ read_passphrase(const char *prompt, int flags)
 	const char *askpass_hint = NULL;
 	const char *s;
 
-	if ((s = getenv("DISPLAY")) != NULL)
-		allow_askpass = *s != '\0';
+	if ((((s = getenv("DISPLAY")) != NULL) && (*s != '\0')) ||
+            (((s = getenv("WAYLAND_DISPLAY")) != NULL) && (*s != '\0')))
+		allow_askpass = 1;
 	if ((s = getenv(SSH_ASKPASS_REQUIRE_ENV)) != NULL) {
 		if (strcasecmp(s, "force") == 0) {
 			use_askpass = 1;
@@ -262,6 +263,7 @@ notify_start(int force_askpass, const char *fmt, ...)
 		goto out;
 	}
 	if (getenv("DISPLAY") == NULL &&
+            getenv("WAYLAND_DISPLAY") == NULL &&
 	    ((s = getenv(SSH_ASKPASS_REQUIRE_ENV)) == NULL ||
 	    strcmp(s, "force") != 0)) {
 		debug3_f("cannot notify: no display");
-- 
2.43.0
signature.asc (application/pgp-signature, 324 B)
-----BEGIN PGP SIGNATURE-----

wr0EARYKAG8FgmYHUNIJEHctFh41zUuBRxQAAAAAAB4AIHNhbHRAbm90YXRpb25z
LnNlcXVvaWEtcGdwLm9yZxOV1uH0VFbHnp0JIj1A5QGzlxp4+vgO//L5XH9UGRP2
FiEEdLwExD2GCEvoZywGdy0WHjXNS4EAAK3GAP9FjhhbPhB9TYJ+GbH9wnYjwZDf
rCq6B/oZ3Dog3eg+gwEAhHtxO2Ym1ZCNwql3lVi2dQiG310+C1DcTn5k72ocowU=
=ci5g
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.