git-gui: Add a simple implementation of SSH_ASKPASS.
OpenSSH allows specifying an external program to use for direct user interaction. While most Linux systems already have such programs, some environments, for instance, msysgit, lack it. This patch adds a simple fallback Tcl implementation of the tool. In msysgit it is also necessary to set a fake value of the DISPLAY variable, because otherwise ssh won't even try to use SSH_ASKPASS handlers. Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> Acked-by: Johannes Sixt <johannes.sixt@telecom.at> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
98a6846bb8
commit
8c76212529
2
Makefile
2
Makefile
@ -285,6 +285,7 @@ all:: $(GITGUI_MAIN) lib/tclIndex $(ALL_MSGFILES)
|
|||||||
install: all
|
install: all
|
||||||
$(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1)
|
$(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1)
|
||||||
$(QUIET)$(INSTALL_X0)git-gui $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
$(QUIET)$(INSTALL_X0)git-gui $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
||||||
|
$(QUIET)$(INSTALL_X0)git-gui--askpass $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
||||||
$(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(INSTALL_L0)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L1)'$(DESTDIR_SQ)$(gitexecdir_SQ)/git-gui' $(INSTALL_L2)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L3) &&) true
|
$(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(INSTALL_L0)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L1)'$(DESTDIR_SQ)$(gitexecdir_SQ)/git-gui' $(INSTALL_L2)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L3) &&) true
|
||||||
ifdef GITGUI_WINDOWS_WRAPPER
|
ifdef GITGUI_WINDOWS_WRAPPER
|
||||||
$(QUIET)$(INSTALL_R0)git-gui.tcl $(INSTALL_R1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
$(QUIET)$(INSTALL_R0)git-gui.tcl $(INSTALL_R1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
||||||
@ -302,6 +303,7 @@ endif
|
|||||||
uninstall:
|
uninstall:
|
||||||
$(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
$(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
|
||||||
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui $(REMOVE_F1)
|
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui $(REMOVE_F1)
|
||||||
|
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui--askpass $(REMOVE_F1)
|
||||||
$(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/$p $(REMOVE_F1) &&) true
|
$(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/$p $(REMOVE_F1) &&) true
|
||||||
ifdef GITGUI_WINDOWS_WRAPPER
|
ifdef GITGUI_WINDOWS_WRAPPER
|
||||||
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui.tcl $(REMOVE_F1)
|
$(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui.tcl $(REMOVE_F1)
|
||||||
|
59
git-gui--askpass
Executable file
59
git-gui--askpass
Executable file
@ -0,0 +1,59 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Tcl ignores the next line -*- tcl -*- \
|
||||||
|
exec wish "$0" -- "$@"
|
||||||
|
|
||||||
|
# This is a trivial implementation of an SSH_ASKPASS handler.
|
||||||
|
# Git-gui uses this script if none are already configured.
|
||||||
|
|
||||||
|
set answer {}
|
||||||
|
set yesno 0
|
||||||
|
set rc 255
|
||||||
|
|
||||||
|
if {$argc < 1} {
|
||||||
|
set prompt "Enter your OpenSSH passphrase:"
|
||||||
|
} else {
|
||||||
|
set prompt [join $argv " "]
|
||||||
|
if {[regexp -nocase {\(yes\/no\)\?\s*$} $prompt]} {
|
||||||
|
set yesno 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
|
||||||
|
|
||||||
|
if {!$yesno} {
|
||||||
|
.e configure -show "*"
|
||||||
|
}
|
||||||
|
|
||||||
|
frame .b
|
||||||
|
button .b.ok -text OK -command finish
|
||||||
|
button .b.cancel -text Cancel -command {destroy .}
|
||||||
|
|
||||||
|
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> finish
|
||||||
|
bind . <Key-Escape> {destroy .}
|
||||||
|
bind . <Destroy> {exit $rc}
|
||||||
|
|
||||||
|
proc finish {} {
|
||||||
|
if {$::yesno} {
|
||||||
|
if {$::answer ne "yes" && $::answer ne "no"} {
|
||||||
|
tk_messageBox -icon error -title "Error" -type ok \
|
||||||
|
-message "Only 'yes' or 'no' input allowed."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
set ::rc 0
|
||||||
|
puts $::answer
|
||||||
|
destroy .
|
||||||
|
}
|
||||||
|
|
||||||
|
wm title . "OpenSSH"
|
||||||
|
tk::PlaceWindow .
|
12
git-gui.sh
12
git-gui.sh
@ -592,6 +592,11 @@ bind . <Visibility> {
|
|||||||
if {[is_Windows]} {
|
if {[is_Windows]} {
|
||||||
wm iconbitmap . -default $oguilib/git-gui.ico
|
wm iconbitmap . -default $oguilib/git-gui.ico
|
||||||
set ::tk::AlwaysShowSelection 1
|
set ::tk::AlwaysShowSelection 1
|
||||||
|
|
||||||
|
# Spoof an X11 display for SSH
|
||||||
|
if {![info exists env(DISPLAY)]} {
|
||||||
|
set env(DISPLAY) :9999
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
@ -1070,6 +1075,13 @@ set nullid2 "0000000000000000000000000000000000000001"
|
|||||||
|
|
||||||
set have_tk85 [expr {[package vcompare $tk_version "8.5"] >= 0}]
|
set have_tk85 [expr {[package vcompare $tk_version "8.5"] >= 0}]
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Suggest our implementation of askpass, if none is set
|
||||||
|
if {![info exists env(SSH_ASKPASS)]} {
|
||||||
|
set env(SSH_ASKPASS) [gitexec git-gui--askpass]
|
||||||
|
}
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
##
|
##
|
||||||
## task management
|
## task management
|
||||||
|
Loading…
Reference in New Issue
Block a user