tChange player.Fetch() to retrieve user info from token or name - scoreboard - Interactive scoreboard for CTF-like games
 (HTM) git clone git://git.z3bra.org/scoreboard.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 999af0860e61802b8d01a8087ad0f52aba0384ac
 (DIR) parent 3733b227f90b501b4f2817d9d0d4de8402fcf446
 (HTM) Author: Willy Goiffon <contact@z3bra.org>
       Date:   Wed,  2 Oct 2024 23:21:53 +0200
       
       Change player.Fetch() to retrieve user info from token or name
       
       Diffstat:
         M player.go                           |      36 ++++++++++---------------------
         M ui.go                               |       6 +++---
       
       2 files changed, 14 insertions(+), 28 deletions(-)
       ---
 (DIR) diff --git a/player.go b/player.go
       t@@ -65,12 +65,12 @@ func mktoken(key []byte, salt string) (string, string, error) {
                return token32, hash32, nil
        }
        
       -func hashtoken(token string) (string, error) {
       +func hashtoken(token string) (string, string, error) {
                var err error
        
                blob, err := base32.StdEncoding.DecodeString(token)
                if err != nil {
       -                return "", err
       +                return "", "", err
                }
        
                key := blob[:12]
       t@@ -80,11 +80,11 @@ func hashtoken(token string) (string, error) {
        
                dk, err := scrypt.Key(key, []byte(salt), 1<<15, 8, 1, 32)
                if err != nil {
       -                return "", err
       +                return "", "", err
                }
                hash := base32.StdEncoding.EncodeToString(dk)
        
       -        return hash, nil
       +        return name, hash, nil
        }
        
        /* Register a user in the database */
       t@@ -109,10 +109,15 @@ func (p *Player) Register() error {
        
        func (p *Player) Fetch() error {
                var err error
       +        var hash string
       +
       +        if (p.token != "") {
       +                p.name, hash, err = hashtoken(p.token)
       +        }
        
                /* Fill player struct with basic info */
       -        query := `SELECT rowid,ts FROM user WHERE name = ?;`
       -        row := p.db.QueryRow(query, p.name)
       +        query := `SELECT rowid,ts FROM user WHERE hash = ? OR name = ?;`
       +        row := p.db.QueryRow(query, hash, p.name)
                row.Scan(&p.id, &p.ts)
        
                /* Calculate score based on submitted flags */
       t@@ -234,22 +239,3 @@ func (p *Player) Submit(flag Flag) error {
                return nil
        }
        
       -/* Retrieve username from given token */
       -func (p *Player) FromToken(token string) error {
       -        var err error
       -        hash, err := hashtoken(token)
       -        if err != nil {
       -                return err
       -        }
       -
       -        query := `SELECT name,ts FROM user WHERE hash = ?`
       -
       -        row := p.db.QueryRow(query, hash)
       -        err = row.Scan(&p.name, &p.ts)
       -        if err == sql.ErrNoRows {
       -                return errors.New("Unknown token")
       -        }
       -        p.Fetch()
       -
       -        return nil
       -}
 (DIR) diff --git a/ui.go b/ui.go
       t@@ -251,14 +251,14 @@ func (a *Application) Token(callback func()) tview.Primitive {
                                        a.Popup("ERROR", "Invalid token format")
                                        return
                                }
       -                        err := a.player.FromToken(token)
       +                        a.player.token = token
       +
       +                        err := a.player.Fetch()
                                if err != nil {
                                        a.Fatal(err)
                                        return
                                }
        
       -                        a.player.Fetch()
       -                        a.player.token = token;
                                a.pages.RemovePage("token");
                                a.frame.Clear()
                                a.frame.AddText(fmt.Sprintf("🔑%s", a.player.token), false, tview.AlignCenter, 0)