diff --git a/go.mod b/go.mod index f7af208..0024a3a 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,8 @@ module github.com/RudideC/wyst-package-manager go 1.22.0 + +require ( + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // direct +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..eb6a443 --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= diff --git a/src/actions.go b/src/actions.go index c30dbfc..37f593d 100644 --- a/src/actions.go +++ b/src/actions.go @@ -30,10 +30,17 @@ func parsePackageArg(arg string) (string, string) { func createPackage(packageName string) { var psw string + var pswV string var repo string var version string fmt.Printf("Enter the password for %s: ", packageName) - fmt.Scanln(&psw) + ReadPassword(&psw) + fmt.Printf("Verify the password for %s: ", packageName) + ReadPassword(&pswV) + if psw != pswV { + fmt.Printf("Passwords do not match\n") + return + } fmt.Printf("Enter the repo for %s: ", packageName) fmt.Scanln(&repo) fmt.Printf("Enter the latest version for %s: ", packageName) @@ -56,7 +63,7 @@ func editPackage(packageName string) { var newPackageName string = packageName fmt.Printf("Enter the password for %s: ", packageName) - fmt.Scanln(&psw) + ReadPassword(&psw) newPsw = psw for true { @@ -77,7 +84,7 @@ func editPackage(packageName string) { fmt.Scanln(&newPackageName) case "2": fmt.Printf("Enter the new password for %s: ", packageName) - fmt.Scanln(&newPsw) + ReadPassword(&newPsw) case "3": fmt.Printf("Enter the repo for %s: ", packageName) fmt.Scanln(&repo) @@ -106,7 +113,7 @@ func editPackage(packageName string) { func deletePackage(packageName string) { fmt.Printf("Enter the password for %s: ", packageName) var psw string - fmt.Scanln(&psw) + ReadPassword(&psw) jsonBody := []byte(fmt.Sprintf(`{"name": "%s", "psw": "%v"}`, packageName, psw)) sendRequest(http.MethodDelete, URL, jsonBody) } diff --git a/src/progressbar.go b/src/interface.go similarity index 57% rename from src/progressbar.go rename to src/interface.go index f8416fd..d9c24cc 100644 --- a/src/progressbar.go +++ b/src/interface.go @@ -2,7 +2,10 @@ package main import ( "fmt" + "os" "strings" + + "golang.org/x/term" ) type ProgressBar struct { @@ -38,3 +41,34 @@ func (prb ProgressBar) clean() { fmt.Printf("\r" + strings.Repeat(" ", prb.last_suffix+prb.length+2) + "\r") } } + +func ReadPassword(buff *string) error { + safeChar := "*" + oldState, err := term.MakeRaw(int(os.Stdin.Fd())) + if err != nil { + return err + } + defer term.Restore(int(os.Stdin.Fd()), oldState) + for true { + b := make([]byte, 1) + _, err = os.Stdin.Read(b) + if err != nil { + return err + } + chr := string(b[0]) + if chr == "\r" || chr == "\n" { + return nil + } else if chr == "\b" || b[0] == 127 { + fmt.Print("\033[1D \033[1D") + tmp := string(*buff) + *buff = tmp[:len(tmp)-1] + } + if safeChar == "off" { + fmt.Print(chr) + } else { + fmt.Print(safeChar) + } + *buff += chr + } + return nil +}