// tofuproxy -- flexible HTTP/HTTPS proxy, TLS terminator, X.509 TOFU // manager, WARC/geminispace browser // Copyright (C) 2021-2024 Sergey Matveev // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, version 3 of the License. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package tofuproxy import ( "bytes" "errors" "fmt" "os/exec" "strings" "go.cypherpunks.ru/netrc" ttls "go.stargrave.org/tofuproxy/tls" ) func authDialog(host, realm string) (string, string, error) { var b bytes.Buffer userInit, passInit := netrc.Find(host) fmt.Fprintf(&b, ` tk_setPalette grey wm title . "Unauthorized: %s" label .luser -text "User" set userinit "%s" set u [entry .user -textvariable userinit] grid .luser .user label .lpass -text "Password" set passinit "%s" set p [entry .pass -show "*" -textvariable passinit] grid .lpass .pass proc login {} { global u p puts [$u get] puts [$p get] exit } button .login -text "Login" -command login grid .login bind . {switch -exact %%K { q {exit 0} ; # reject once l login }} `, strings.ReplaceAll(realm, "\"", ""), userInit, passInit) cmd := exec.Command(ttls.CmdWish) cmd.Stdin = &b out, err := cmd.Output() if err != nil { return "", "", err } lines := strings.Split(string(out), "\n") if len(lines) < 2 { return "", "", errors.New("invalid output from authorization form") } return lines[0], lines[1], nil }