From 9c8b8177ada288265ee3104ce979cd32bc84aef6 Mon Sep 17 00:00:00 2001 From: Hazel Noack Date: Mon, 30 Jun 2025 14:23:13 +0200 Subject: [PATCH] fixed changing of pointers --- internal/game/session.go | 41 +++++++++++++++++---------- internal/rest_handler/create_user.go | 12 ++++++-- internal/rest_handler/guess_letter.go | 23 ++++----------- internal/rest_handler/helper.go | 30 ++++++++++++++++++++ internal/rest_handler/test_auth.go | 33 ++++++--------------- python_frontend/frontend.py | 18 +++++------- 6 files changed, 87 insertions(+), 70 deletions(-) create mode 100644 internal/rest_handler/helper.go diff --git a/internal/game/session.go b/internal/game/session.go index f9a0919..8fdc486 100644 --- a/internal/game/session.go +++ b/internal/game/session.go @@ -27,14 +27,14 @@ type Session struct { CurrentUser *User } -func NewSession(phrase string) Session { +func NewSession(phrase string) *Session { sessionName := petname.Generate(3, "-") p := strings.Split(phrase, "") s := Session{ id: lastSessionId, Name: sessionName, - Users: []User{}, + Users: make([]User, 0), phrase: p, AskedLetters: []string{}, DiscoveredPhrase: make([]string, len(p)), @@ -44,34 +44,44 @@ func NewSession(phrase string) Session { } sessionStorage = append(sessionStorage, s) - nameToSession[sessionName] = &s + nameToSession[sessionName] = &sessionStorage[len(sessionStorage)-1] lastSessionId++ - return s + return &sessionStorage[len(sessionStorage)-1] } -func GetSession(name string) *Session { - return nameToSession[name] +func GetSession(name string) (*Session, error) { + s, ok := nameToSession[name] + if !ok { + return s, errors.New("can't find session " + name) + } + + return s, nil } func (s *Session) AddUser(user User) { s.Users = append(s.Users, user) - if s.CurrentUser == nil { - s.CurrentUser = &s.Users[s.userIndex] - } + // fmt.Printf("#### Adding %v:\t%p\n", s.Users[len(s.Users)-1].Name, &(s.Users[len(s.Users)-1])) + // append changes the pointers to the users because it needs to resize that slice + s.CurrentUser = &(s.Users[s.userIndex]) } -func (s Session) VerifySignature(signature string, message []byte) *User { - for _, u := range s.Users { - sig, _ := base64.StdEncoding.DecodeString(signature) +func (s *Session) VerifySignature(signature string, message []byte) (*User, error) { + sig, err := base64.StdEncoding.DecodeString(signature) + if err != nil { + return nil, err + } - if ed25519.Verify(u.PublicKey, message, sig) { - return &u + for i := range s.Users { + // fmt.Printf("looking %v:\t%p\n", s.Users[i].Name, &(s.Users[i])) + + if ed25519.Verify(s.Users[i].PublicKey, message, sig) { + return &s.Users[i], nil } } - return nil + return nil, errors.New("this user was not fount in the current session") } func (s *Session) GuessLetter(letter string) (*Session, error) { @@ -101,5 +111,6 @@ func (s *Session) GuessLetter(letter string) (*Session, error) { s.userIndex = (s.userIndex + 1) % len(s.Users) s.CurrentUser = &s.Users[s.userIndex] + return s, nil } diff --git a/internal/rest_handler/create_user.go b/internal/rest_handler/create_user.go index 20c0a3f..d24e084 100644 --- a/internal/rest_handler/create_user.go +++ b/internal/rest_handler/create_user.go @@ -9,7 +9,10 @@ import ( ) func CreateUser(c echo.Context) error { - session := game.GetSession(c.Param("session")) + session, err := game.GetSession(c.Param("session")) + if err != nil { + return c.String(http.StatusBadRequest, err.Error()) + } type BodyContent struct { Name string @@ -17,12 +20,15 @@ func CreateUser(c echo.Context) error { } var bodyContent BodyContent - err := c.Bind(&bodyContent) + err = c.Bind(&bodyContent) if err != nil { return c.String(http.StatusBadRequest, err.Error()) } - pub, _ := base64.StdEncoding.DecodeString(bodyContent.PublicKey) + pub, err := base64.StdEncoding.DecodeString(bodyContent.PublicKey) + if err != nil { + return c.String(http.StatusBadRequest, err.Error()) + } user := game.NewUser(bodyContent.Name, pub) session.AddUser(user) diff --git a/internal/rest_handler/guess_letter.go b/internal/rest_handler/guess_letter.go index 76d8887..f509a14 100644 --- a/internal/rest_handler/guess_letter.go +++ b/internal/rest_handler/guess_letter.go @@ -1,40 +1,29 @@ package rest_handler import ( - "bytes" - "fmt" - "io" "net/http" - "gitea.elara.ws/Hazel/hangman/internal/game" "github.com/labstack/echo/v4" ) func GuessLetter(c echo.Context) error { - session := game.GetSession(c.Param("session")) + session, user, err := GetData(c) - sig := c.Request().Header.Get("signature") - body, _ := io.ReadAll(c.Request().Body) - - u := session.VerifySignature(sig, body) - if u == nil { - return c.String(http.StatusBadRequest, "This user was not fount in the current session.") + if err != nil { + return c.String(http.StatusBadRequest, err.Error()) } - if !session.CurrentUser.PublicKey.Equal(u.PublicKey) { - return c.String(http.StatusBadRequest, "It's not the turn of user "+u.Name+". It's the turn of "+session.CurrentUser.Name+".") + if session.CurrentUser != user { + return c.String(http.StatusBadRequest, "It's not the turn of user "+user.Name+". It's the turn of "+session.CurrentUser.Name+".") } - c.Request().Body = io.NopCloser(bytes.NewBuffer(body)) - type BodyContent struct { Guess string } var bodyContent BodyContent - err := c.Bind(&bodyContent) + err = c.Bind(&bodyContent) if err != nil { - fmt.Println(err) return c.String(http.StatusBadRequest, err.Error()) } diff --git a/internal/rest_handler/helper.go b/internal/rest_handler/helper.go new file mode 100644 index 0000000..4142590 --- /dev/null +++ b/internal/rest_handler/helper.go @@ -0,0 +1,30 @@ +package rest_handler + +import ( + "bytes" + "io" + + "gitea.elara.ws/Hazel/hangman/internal/game" + "github.com/labstack/echo/v4" +) + +func GetData(c echo.Context) (*game.Session, *game.User, error) { + session, err := game.GetSession(c.Param("session")) + if err != nil { + return session, nil, err + } + + sig := c.Request().Header.Get("signature") + body, _ := io.ReadAll(c.Request().Body) + + user, err := session.VerifySignature(sig, body) + if err != nil { + return session, user, err + } + + c.Request().Body = io.NopCloser(bytes.NewBuffer(body)) + + // fmt.Printf("user %v:\t%p\n", user.Name, user) + + return session, user, nil +} diff --git a/internal/rest_handler/test_auth.go b/internal/rest_handler/test_auth.go index 6c88fb1..f45aba0 100644 --- a/internal/rest_handler/test_auth.go +++ b/internal/rest_handler/test_auth.go @@ -1,8 +1,6 @@ package rest_handler import ( - "fmt" - "io" "net/http" "gitea.elara.ws/Hazel/hangman/internal/game" @@ -10,30 +8,17 @@ import ( ) func TestAuth(c echo.Context) error { - session := game.GetSession(c.Param("session")) - type TestResults struct { - SignatureValid bool - User *string + Session *game.Session + User *game.User + Error error } - sig := c.Request().Header.Get("signature") - body, _ := io.ReadAll(c.Request().Body) - fmt.Println(sig) + session, user, err := GetData(c) - u := session.VerifySignature(sig, body) - var resp TestResults - if u == nil { - resp = TestResults{ - SignatureValid: false, - User: nil, - } - } else { - resp = TestResults{ - SignatureValid: true, - User: &u.Name, - } - } - - return c.JSON(http.StatusOK, resp) + return c.JSON(http.StatusOK, TestResults{ + Session: session, + User: user, + Error: err, + }) } diff --git a/python_frontend/frontend.py b/python_frontend/frontend.py index 5dc32b5..ec6517e 100644 --- a/python_frontend/frontend.py +++ b/python_frontend/frontend.py @@ -97,16 +97,12 @@ var Words []string = []string{""" if __name__ == "__main__": s = Session() print(s) - a = s.add_user(name="Hazel") - b = s.add_user(name="OtherHazel") + a = s.add_user(name="Hazel_1") + b = s.add_user(name="Hazel_2") + c = s.add_user(name="Hazel_3") - print(b) - b.test_auth() - + a.guess("a") b.guess("e") - a.guess("e") - b.guess("e") - b.guess("a") - a.guess("i") - b.guess("o") - a.guess("u") + c.guess("i") + a.guess("o") + b.guess("u")