aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoni Sawicki <tenox@google.com>2022-03-27 00:52:48 -0700
committerAntoni Sawicki <tenox@google.com>2022-03-27 00:52:48 -0700
commit863acca5f55141b898821428008867d8ccf92e88 (patch)
tree3e02997a82f7c743b47c40b0b0054c3006bea75a
parent2b0e63044b9f27ee5fa779aac7ef389d26785d02 (diff)
downloadwfm-863acca5f55141b898821428008867d8ccf92e88.tar.gz
add user add
-rw-r--r--users.go63
1 files changed, 54 insertions, 9 deletions
diff --git a/users.go b/users.go
index 37814b4..7f6978d 100644
--- a/users.go
+++ b/users.go
@@ -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]
}