diff options
author | Antoni Sawicki <tenox@google.com> | 2022-03-27 00:52:48 -0700 |
---|---|---|
committer | Antoni Sawicki <tenox@google.com> | 2022-03-27 00:52:48 -0700 |
commit | 863acca5f55141b898821428008867d8ccf92e88 (patch) | |
tree | 3e02997a82f7c743b47c40b0b0054c3006bea75a | |
parent | 2b0e63044b9f27ee5fa779aac7ef389d26785d02 (diff) | |
download | wfm-863acca5f55141b898821428008867d8ccf92e88.tar.gz |
add user add
-rw-r--r-- | users.go | 63 |
1 files changed, 54 insertions, 9 deletions
@@ -1,19 +1,24 @@ package main import ( + "crypto/sha256" + "encoding/base64" "encoding/json" "flag" "fmt" "io/ioutil" "log" + "math/rand" ) +type userDB struct { + User, Salt, Hash string + RW bool +} + var ( // you can also hardcode users here instead of loading password file - users = []struct { - User, Salt, Hash string - RW bool - }{} + users = []userDB{} ) func loadUsers() { @@ -28,17 +33,57 @@ func loadUsers() { log.Printf("Loaded %q (%d users)", *passwdDb, len(users)) } +func manageUsers() { + switch flag.Arg(1) { + case "list": + listUsers() + case "add": + addUser(flag.Arg(2), flag.Arg(3)) + default: + fmt.Println("usage: user <list|add|delete|passwd|rw|ro> [username] [rw|ro]") + } +} + func listUsers() { for _, u := range users { fmt.Printf("User: %q, RW: %v\n", u.User, u.RW) } } -func manageUsers() { - switch flag.Arg(1) { - case "list": - listUsers() +func addUser(usr, rw string) { + if usr == "" || rw == "" { + log.Fatal("user add requires username and ro/rw\n") + } + var bRW bool + switch rw { + case "ro": + bRW = false + case "rw": + bRW = true default: - fmt.Println("usage: user <list|add|delete|passwd|rw|ro> [username]") + log.Fatal("Access must be 'ro' or 'rw' only.") } + + fmt.Print("Password: ") + var pwd string + fmt.Scanln(&pwd) + salt := rndStr(8) + hash := fmt.Sprintf("%x", sha256.Sum256([]byte(salt+pwd))) + fmt.Printf("New Usr=%q Salt=%q Pwd=%q Hash=%q Rw=%v\n", usr, salt, pwd, hash, bRW) + users = append(users, userDB{User: usr, Salt: salt, Hash: hash, RW: bRW}) + fmt.Printf("users=%#v\n", users) + u, err := json.Marshal(users) + if err != nil { + log.Fatal(err) + } + err = ioutil.WriteFile(*passwdDb, u, 600) + if err != nil { + log.Fatal(err) + } +} + +func rndStr(len int) string { + b := make([]byte, len) + rand.Read(b) + return base64.StdEncoding.EncodeToString(b)[:len] } |