From 4a6954050e174bf8b851c82bc2476409a4d78eea Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Fri, 24 Sep 2021 14:33:15 +0300 Subject: [PATCH] Passwords listing ability --- doc/passwords.texi | 7 ++++--- main.go | 27 ++++++++++++++++++++++++--- passwd.go | 12 ++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/doc/passwords.texi b/doc/passwords.texi index d3d9ad4..4660c52 100644 --- a/doc/passwords.texi +++ b/doc/passwords.texi @@ -3,11 +3,12 @@ Password authentication is required for packages uploading. Passwords are dynamically changed through the FIFO file. You have to create it and -use in @option{-passwd} option: +use in @option{-passwd} option. Optionally, to list currently present +logins use another FIFO and @option{-passwd-list} option: @example -$ mkfifo passwd -$ gocheese -passwd passwd ... +$ mkfifo passwd passwd-list +$ gocheese -passwd passwd -passwd-list passwd-list ... @end example Then you must feed it newline-separated records in following format: diff --git a/main.go b/main.go index 12a325a..46be525 100644 --- a/main.go +++ b/main.go @@ -105,8 +105,9 @@ var ( pypiURL = flag.String("pypi", "https://pypi.org/simple/", "Upstream (PyPI) URL") pypiCertHash = flag.String("pypi-cert-hash", "", "Authenticate upstream by its X.509 certificate's SPKI SHA256 hash") - passwdPath = flag.String("passwd", "", "Path to FIFO for upload authentication") - passwdCheck = flag.Bool("passwd-check", false, "Run password checker") + passwdPath = flag.String("passwd", "", "Path to FIFO for upload authentication") + passwdListPath = flag.String("passwd-list", "", "Path to FIFO for login listing") + passwdCheck = flag.Bool("passwd-check", false, "Run password checker") logTimestamped = flag.Bool("log-timestamped", false, "Prepend timestmap to log messages") fsck = flag.Bool("fsck", false, "Check integrity of all packages (errors are in stderr)") @@ -306,7 +307,11 @@ func main() { if *passwdPath != "" { go func() { for { - fd, err := os.OpenFile(*passwdPath, os.O_RDONLY, os.FileMode(0666)) + fd, err := os.OpenFile( + *passwdPath, + os.O_RDONLY, + os.FileMode(0666), + ) if err != nil { log.Fatalln(err) } @@ -315,6 +320,22 @@ func main() { } }() } + if *passwdListPath != "" { + go func() { + for { + fd, err := os.OpenFile( + *passwdListPath, + os.O_WRONLY|os.O_APPEND, + os.FileMode(0666), + ) + if err != nil { + log.Fatalln(err) + } + passwdLister(fd) + fd.Close() + } + }() + } if (*tlsCert != "" && *tlsKey == "") || (*tlsCert == "" && *tlsKey != "") { log.Fatalln("Both -tls-cert and -tls-key are required") diff --git a/passwd.go b/passwd.go index 1a32f70..a93fbc9 100644 --- a/passwd.go +++ b/passwd.go @@ -91,3 +91,15 @@ func passwdReader(fd *os.File) bool { } return isGood } + +func passwdLister(fd *os.File) { + PasswordsM.RLock() + logins := make([]string, 0, len(Passwords)) + for login := range Passwords { + logins = append(logins, login) + } + PasswordsM.RUnlock() + for _, login := range logins { + fd.WriteString(login + "\n") + } +} -- 2.44.0