1#!/bin/sh 2# Tcl ignores the next line -*- tcl -*- \ 3exec wish "$0" -- "$@" 4 5# This is a trivial implementation of an SSH_ASKPASS handler. 6# Git-gui uses this script if none are already configured. 7 8package require Tk 9 10set answer {} 11set yesno 0 12set rc 255 13 14if {$argc < 1} { 15 set prompt "Enter your OpenSSH passphrase:" 16} else { 17 set prompt [join $argv " "] 18 if {[regexp -nocase {\(yes\/no\)\?\s*$} $prompt]} { 19 set yesno 1 20 } 21} 22 23message .m -text $prompt -justify center -aspect 4000 24pack .m -side top -fill x -padx 20 -pady 20 -expand 1 25 26entry .e -textvariable answer -width 50 27pack .e -side top -fill x -padx 10 -pady 10 28 29proc on_show_input_changed {args} { 30 global show_input 31 if {$show_input} { 32 .e configure -show "" 33 } else { 34 .e configure -show "*" 35 } 36} 37trace add variable show_input write "on_show_input_changed" 38 39set show_input 0 40 41if {!$yesno} { 42 checkbutton .cb_show -text "Show input" -variable show_input 43 pack .cb_show -side top -anchor nw 44} 45 46frame .b 47button .b.ok -text OK -command finish 48button .b.cancel -text Cancel -command cancel 49 50pack .b.ok -side left -expand 1 51pack .b.cancel -side right -expand 1 52pack .b -side bottom -fill x -padx 10 -pady 10 53 54bind . <Visibility> {focus -force .e} 55bind . <Key-Return> [list .b.ok invoke] 56bind . <Key-Escape> [list .b.cancel invoke] 57bind . <Destroy> {set rc $rc} 58 59proc cancel {} { 60 set ::rc 255 61} 62 63proc finish {} { 64 if {$::yesno} { 65 if {$::answer ne "yes" && $::answer ne "no"} { 66 tk_messageBox -icon error -title "Error" -type ok \ 67 -message "Only 'yes' or 'no' input allowed." 68 return 69 } 70 } 71 72 # On Windows, force the encoding to UTF-8: it is what `git.exe` expects 73 if {$::tcl_platform(platform) eq {windows}} { 74 set ::answer [encoding convertto utf-8 $::answer] 75 } 76 77 puts $::answer 78 set ::rc 0 79} 80 81wm title . "OpenSSH" 82tk::PlaceWindow . 83vwait rc 84exit $rc 85