registration and logging in bootleg but functionining

trunk
vilmibm 2022-07-15 23:54:18 -07:00
parent 1259354a3c
commit 66471f74d2
3 changed files with 77 additions and 31 deletions

View File

@ -131,7 +131,7 @@ func _main() error {
mainPage := tview.NewList(). mainPage := tview.NewList().
AddItem("jack in", "connect using an existing account", '1', func() { AddItem("jack in", "connect using an existing account", '1', func() {
pages.SwitchToPage("game") pages.SwitchToPage("login")
}). }).
AddItem("rez a toon", "create a new account", '2', func() { AddItem("rez a toon", "create a new account", '2', func() {
pages.SwitchToPage("register") pages.SwitchToPage("register")
@ -143,30 +143,61 @@ func _main() error {
pages.AddPage("main", mainPage, true, false) pages.AddPage("main", mainPage, true, false)
unfi := tview.NewInputField().SetLabel("account name") lunfi := tview.NewInputField().SetLabel("account name")
pwfi := tview.NewInputField().SetLabel("password").SetMaskCharacter('~') lpwfi := tview.NewInputField().SetLabel("password").SetMaskCharacter('~')
registerPage := tview.NewForm().AddFormItem(unfi).AddFormItem(pwfi). loginPage := tview.NewForm().AddFormItem(lunfi).AddFormItem(lpwfi).
SetCancelFunc(func() { SetCancelFunc(func() {
pages.SwitchToPage("main") pages.SwitchToPage("main")
}) })
submitFunc := func() { loginSubmitFn := func() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel() defer cancel()
si, err := cs.Client.Register(ctx, &proto.AuthInfo{ si, err := cs.Client.Login(ctx, &proto.AuthInfo{
Username: unfi.GetText(), Username: lunfi.GetText(),
Password: pwfi.GetText(), Password: lpwfi.GetText(),
}) })
if err != nil { if err != nil {
panic(err.Error()) panic(err.Error())
} }
fmt.Printf("DBG %#v\n", si) cs.SessionInfo = si
fmt.Printf("DBG %#v\n", err)
pages.SwitchToPage("game")
} }
registerPage.AddButton("gimme that shit", submitFunc) loginPage.AddButton("gimme that shit", loginSubmitFn)
loginPage.AddButton("nah get outta here", func() {
pages.SwitchToPage("main")
})
pages.AddPage("login", loginPage, true, false)
runfi := tview.NewInputField().SetLabel("account name")
rpwfi := tview.NewInputField().SetLabel("password").SetMaskCharacter('~')
registerPage := tview.NewForm().AddFormItem(runfi).AddFormItem(rpwfi).
SetCancelFunc(func() {
pages.SwitchToPage("main")
})
registerSubmitFn := func() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
si, err := cs.Client.Register(ctx, &proto.AuthInfo{
Username: runfi.GetText(),
Password: rpwfi.GetText(),
})
if err != nil {
panic(err.Error())
}
cs.SessionInfo = si
pages.SwitchToPage("game")
}
registerPage.AddButton("gimme that shit", registerSubmitFn)
registerPage.AddButton("nah get outta here", func() { registerPage.AddButton("nah get outta here", func() {
pages.SwitchToPage("main") pages.SwitchToPage("main")
}) })

View File

@ -84,13 +84,14 @@ func (s *gameWorldServer) Messages(si *proto.SessionInfo, stream proto.GameWorld
} }
func (s *gameWorldServer) Register(ctx context.Context, auth *proto.AuthInfo) (si *proto.SessionInfo, err error) { func (s *gameWorldServer) Register(ctx context.Context, auth *proto.AuthInfo) (si *proto.SessionInfo, err error) {
err = db.CreateAccount(auth.Username, auth.Password) var a *db.Account
a, err = db.CreateAccount(auth.Username, auth.Password)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var sessionID string var sessionID string
sessionID, err = db.StartSession(auth.Username) sessionID, err = db.StartSession(*a)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -101,15 +102,17 @@ func (s *gameWorldServer) Register(ctx context.Context, auth *proto.AuthInfo) (s
} }
func (s *gameWorldServer) Login(ctx context.Context, auth *proto.AuthInfo) (si *proto.SessionInfo, err error) { func (s *gameWorldServer) Login(ctx context.Context, auth *proto.AuthInfo) (si *proto.SessionInfo, err error) {
err = db.ValidateCredentials(auth.Username, auth.Password) fmt.Printf("DBG %#v\n", "HI")
var a *db.Account
a, err = db.ValidateCredentials(auth.Username, auth.Password)
if err != nil { if err != nil {
return return
} }
var sessionID string var sessionID string
sessionID, err = db.StartSession(auth.Username) sessionID, err = db.StartSession(*a)
if err != nil { if err != nil {
return nil, err return
} }
si = &proto.SessionInfo{SessionID: sessionID} si = &proto.SessionInfo{SessionID: sessionID}

View File

@ -26,37 +26,49 @@ func connect() (*pgxpool.Pool, error) {
return conn, nil return conn, nil
} }
func CreateAccount(name, password string) error { func CreateAccount(name, password string) (*Account, error) {
conn, err := connect() conn, err := connect()
if err != nil { if err != nil {
return err return nil, err
} }
_, err = conn.Exec(context.Background(), "INSERT INTO accounts VALUES ( ?, ? )", name, password) _, err = conn.Exec(context.Background(),
"INSERT INTO accounts (name, pwhash) VALUES ( $1, $2 )", name, password)
if err != nil {
return nil, err
}
row := conn.QueryRow(context.Background(), "SELECT id,name,pwhash FROM accounts WHERE name = $1")
a := &Account{}
err = row.Scan(&a.ID, &a.Name, &a.Pwhash)
if err != nil {
return nil, err
}
// TODO handle and cleanup unqiue violations // TODO handle and cleanup unqiue violations
return err return a, err
} }
func ValidateCredentials(name, password string) error { func ValidateCredentials(name, password string) (*Account, error) {
a, err := GetAccount(name) a, err := GetAccount(name)
if err != nil { if err != nil {
return err return nil, err
} }
// TODO hashing lol // TODO hashing lol
if a.Password != password { if a.Pwhash != password {
return errors.New("invalid credentials") return nil, errors.New("invalid credentials")
} }
return nil return a, nil
} }
type Account struct { type Account struct {
Name string ID int
Password string Name string
Pwhash string
} }
func GetAccount(name string) (*Account, error) { func GetAccount(name string) (*Account, error) {
@ -65,11 +77,11 @@ func GetAccount(name string) (*Account, error) {
return nil, err return nil, err
} }
row := conn.QueryRow(context.Background(), "SELECT name,password FROM accounts WHERE name = ?", name) row := conn.QueryRow(context.Background(), "SELECT id, name, pwhash FROM accounts WHERE name = $1", name)
a := &Account{} a := &Account{}
err = row.Scan(&a.Name, &a.Password) err = row.Scan(&a.ID, &a.Name, &a.Pwhash)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -77,7 +89,7 @@ func GetAccount(name string) (*Account, error) {
return a, nil return a, nil
} }
func StartSession(name string) (sessionID string, err error) { func StartSession(a Account) (sessionID string, err error) {
var conn *pgxpool.Pool var conn *pgxpool.Pool
conn, err = connect() conn, err = connect()
if err != nil { if err != nil {
@ -86,7 +98,7 @@ func StartSession(name string) (sessionID string, err error) {
sessionID = uuid.New().String() sessionID = uuid.New().String()
_, err = conn.Exec(context.Background(), "INSERT INTO sessions VALUES ( ?, ? )", name, sessionID) _, err = conn.Exec(context.Background(), "INSERT INTO sessions (session_id, account) VALUES ( $1, $2 )", sessionID, a.ID)
return return
} }