town/cmd/registeruser/main.go

80 lines
1.5 KiB
Go

package main
import (
"encoding/json"
"errors"
"fmt"
"os"
// _ "github.com/mattn/go-sqlite3"
"git.tilde.town/tildetown/town/towndb"
)
// this command adds a new user to /town/var/town.db. it's meant to be invoked
// by the welcome binary upon successfully creating a new user account
func main() {
tdb, err := towndb.ConnectDB()
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1)
}
userData, err := parseInput(os.Stdin)
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(2)
}
if err = validateInput(userData); err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(3)
}
if err = userData.Insert(tdb); err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(4)
}
}
func validateInput(userData towndb.TownUser) error {
if userData.Username == "" {
return errors.New("no username")
}
if len(userData.Emails) == 0 {
return errors.New("no email set")
}
for _, e := range userData.Emails {
if e == "" {
return errors.New("blank email in email list")
}
}
if userData.IsAdmin {
return errors.New("please stop")
}
if userData.State != towndb.StateActive {
return errors.New("bad state")
}
return nil
}
func parseInput(stdin *os.File) (u towndb.TownUser, err error) {
var n int
input := make([]byte, 3000) // arbitrary
if n, err = stdin.Read(input); err != nil {
return
}
if n == 0 {
err = errors.New("nothing passed on input")
return
}
err = json.Unmarshal(input[0:n], &u)
return
}