town/cmd/registeruser/main.go

76 lines
1.4 KiB
Go

package main
import (
"database/sql"
"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 *sql.DB, 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 userData.Insert(tdb)
}
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
}
func main() {
tdb, err := towndb.ConnectDB()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
userData, err := parseInput(os.Stdin)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(2)
}
if err = _main(tdb, userData); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(3)
}
}