git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] git-gui--askpass implements SSH_ASKPASS_PROMPT
@ 2021-11-14  0:30 Likai Liu
  0 siblings, 0 replies; only message in thread
From: Likai Liu @ 2021-11-14  0:30 UTC (permalink / raw)
  To: git; +Cc: Likai Liu

SSH_ASKPASS_PROMPT is a new behavior introduced in OpenSSH 8.2 for
prompting U2F touch.

  - When unset/empty, this is used to input passphrase as before.
  - When set to "confirm", allows the user to OK or Cancel.
  - When set to "none", only shows a message.

Signed-off-by: Likai Liu <liulk@likai.org>
---
 git-gui/git-gui--askpass | 70 +++++++++++++++++++++++++++++-----------
 1 file changed, 52 insertions(+), 18 deletions(-)

diff --git a/git-gui/git-gui--askpass b/git-gui/git-gui--askpass
index 71a536d232..7d4bda8f31 100755
--- a/git-gui/git-gui--askpass
+++ b/git-gui/git-gui--askpass
@@ -4,6 +4,21 @@ exec wish "$0" -- "$@"
 
 # This is a trivial implementation of an SSH_ASKPASS handler.
 # Git-gui uses this script if none are already configured.
+#
+# When SSH_ASKPASS_PROMPT is unset or empty, we show a message
+# promot, a text input, an option to show the input, and the OK and
+# Cancel buttons.  If the prompt explicitly asks for (yes/no) as the
+# answer, the input will be checked to be either "yes" or "no".
+#
+# When SSH_ASKPASS_PROMPT=confirm, we only show the message and the OK
+# and Cancel buttons without the text input.
+#
+# When SSH_ASKPASS_PROMPT=none, we only show the message.  This is
+# typically to prompt for U2F touch, which cannot be dismissed.  We
+# will get SIGTERM once touched.  The exit status is inconsequential.
+#
+# See: https://www.openssh.com/txt/release-8.2
+# See also: notify_start() and notify_complete() in readpass.c
 
 package require Tk
 
@@ -11,10 +26,22 @@ set answer {}
 set yesno  0
 set rc     255
 
+if {[info exists ::env(SSH_ASKPASS_PROMPT)]} {
+	set mode $::env(SSH_ASKPASS_PROMPT)
+} else {
+	set mode {}
+}
+switch $mode {
+	confirm {}
+	none {}
+	default {set mode {}}
+}
 if {$argc < 1} {
 	set prompt "Enter your OpenSSH passphrase:"
 } else {
 	set prompt [join $argv " "]
+}
+if {$mode eq {}} {
 	if {[regexp -nocase {\(yes\/no\)\?\s*$} $prompt]} {
 		set yesno 1
 	}
@@ -23,9 +50,6 @@ if {$argc < 1} {
 message .m -text $prompt -justify center -aspect 4000
 pack .m -side top -fill x -padx 20 -pady 20 -expand 1
 
-entry .e -textvariable answer -width 50
-pack .e -side top -fill x -padx 10 -pady 10
-
 proc on_show_input_changed {args} {
 	global show_input
 	if {$show_input} {
@@ -34,27 +58,37 @@ proc on_show_input_changed {args} {
 		.e configure -show "*"
 	}
 }
-trace add variable show_input write "on_show_input_changed"
 
-set show_input 0
+if {$mode eq {}} {
+	entry .e -textvariable answer -width 50
+	pack .e -side top -fill x -padx 10 -pady 10
 
-if {!$yesno} {
-	checkbutton .cb_show -text "Show input" -variable show_input
-	pack .cb_show -side top -anchor nw
+	trace add variable show_input write "on_show_input_changed"
+
+	set show_input $yesno
+
+	if {!$yesno} {
+		checkbutton .cb_show -text "Show input" -variable show_input
+		pack .cb_show -side top -anchor nw
+	}
 }
 
-frame .b
-button .b.ok     -text OK     -command finish
-button .b.cancel -text Cancel -command cancel
+if {$mode ne {none}} {
+	frame .b
+	button .b.ok     -text OK     -command finish
+	button .b.cancel -text Cancel -command cancel
 
-pack .b.ok -side left -expand 1
-pack .b.cancel -side right -expand 1
-pack .b -side bottom -fill x -padx 10 -pady 10
+	pack .b.ok -side left -expand 1
+	pack .b.cancel -side right -expand 1
+	pack .b -side bottom -fill x -padx 10 -pady 10
 
-bind . <Visibility> {focus -force .e}
-bind . <Key-Return> [list .b.ok invoke]
-bind . <Key-Escape> [list .b.cancel invoke]
-bind . <Destroy>    {set rc $rc}
+	if {$mode eq {}} {
+		bind . <Visibility> {focus -force .e}
+	}
+	bind . <Key-Return> [list .b.ok invoke]
+	bind . <Key-Escape> [list .b.cancel invoke]
+}
+bind . <Destroy> {set rc $rc}
 
 proc cancel {} {
 	set ::rc 255
-- 
2.30.1 (Apple Git-130)


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2021-11-14  0:30 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-14  0:30 [PATCH] git-gui--askpass implements SSH_ASKPASS_PROMPT Likai Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).