X-Git-Url: http://www.git.stargrave.org/?p=tofuproxy.git;a=blobdiff_plain;f=httpauth.go;h=92eff6e699dc81fa0261438a804ab713525d8499;hp=5e97636cd6c3a88cab878bbc744756c754778e92;hb=HEAD;hpb=1b3ef99af2896156902264aaccced15426874484 diff --git a/httpauth.go b/httpauth.go index 5e97636..8e32452 100644 --- a/httpauth.go +++ b/httpauth.go @@ -1,19 +1,18 @@ -/* -tofuproxy -- HTTP proxy with TLS certificates management -Copyright (C) 2021 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 . -*/ +// 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 @@ -21,47 +20,18 @@ import ( "bytes" "errors" "fmt" - "io/ioutil" - "log" - "os" "os/exec" - "path/filepath" "strings" -) -func findInNetrc(host string) (string, string) { - netrcPath, ok := os.LookupEnv("NETRC") - if !ok { - netrcPath = filepath.Join(os.Getenv("HOME"), ".netrc") - } - data, err := ioutil.ReadFile(netrcPath) - if err != nil { - if os.IsNotExist(err) { - return "", "" - } - log.Fatalln(err) - } - var login string - var password string - for _, line := range strings.Split(string(data), "\n") { - if i := strings.Index(line, "#"); i >= 0 { - line = line[:i] - } - f := strings.Fields(line) - if len(f) >= 6 && - f[0] == "machine" && f[1] == host && - f[2] == "login" && f[4] == "password" { - login, password = f[3], f[5] - break - } - } - return login, password -} + "go.cypherpunks.ru/netrc" + ttls "go.stargrave.org/tofuproxy/tls" +) func authDialog(host, realm string) (string, string, error) { var b bytes.Buffer - userInit, passInit := findInNetrc(host) - b.WriteString(fmt.Sprintf(` + userInit, passInit := netrc.Find(host) + fmt.Fprintf(&b, ` +tk_setPalette grey wm title . "Unauthorized: %s" label .luser -text "User" @@ -74,17 +44,22 @@ set passinit "%s" set p [entry .pass -show "*" -textvariable passinit] grid .lpass .pass -proc submit {} { +proc login {} { global u p puts [$u get] puts [$p get] exit } -button .submit -text "Submit" -command submit -grid .submit -`, realm, userInit, passInit)) - cmd := exec.Command(CmdWish) +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 {