fixed changing of pointers

This commit is contained in:
Hazel Noack 2025-06-30 14:23:13 +02:00
parent 1e0a4c6317
commit 9c8b8177ad
6 changed files with 87 additions and 70 deletions

View File

@ -27,14 +27,14 @@ type Session struct {
CurrentUser *User CurrentUser *User
} }
func NewSession(phrase string) Session { func NewSession(phrase string) *Session {
sessionName := petname.Generate(3, "-") sessionName := petname.Generate(3, "-")
p := strings.Split(phrase, "") p := strings.Split(phrase, "")
s := Session{ s := Session{
id: lastSessionId, id: lastSessionId,
Name: sessionName, Name: sessionName,
Users: []User{}, Users: make([]User, 0),
phrase: p, phrase: p,
AskedLetters: []string{}, AskedLetters: []string{},
DiscoveredPhrase: make([]string, len(p)), DiscoveredPhrase: make([]string, len(p)),
@ -44,34 +44,44 @@ func NewSession(phrase string) Session {
} }
sessionStorage = append(sessionStorage, s) sessionStorage = append(sessionStorage, s)
nameToSession[sessionName] = &s nameToSession[sessionName] = &sessionStorage[len(sessionStorage)-1]
lastSessionId++ lastSessionId++
return s return &sessionStorage[len(sessionStorage)-1]
} }
func GetSession(name string) *Session { func GetSession(name string) (*Session, error) {
return nameToSession[name] s, ok := nameToSession[name]
if !ok {
return s, errors.New("can't find session " + name)
}
return s, nil
} }
func (s *Session) AddUser(user User) { func (s *Session) AddUser(user User) {
s.Users = append(s.Users, user) s.Users = append(s.Users, user)
if s.CurrentUser == nil { // fmt.Printf("#### Adding %v:\t%p\n", s.Users[len(s.Users)-1].Name, &(s.Users[len(s.Users)-1]))
s.CurrentUser = &s.Users[s.userIndex] // 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 { func (s *Session) VerifySignature(signature string, message []byte) (*User, error) {
for _, u := range s.Users { sig, err := base64.StdEncoding.DecodeString(signature)
sig, _ := base64.StdEncoding.DecodeString(signature) if err != nil {
return nil, err
}
if ed25519.Verify(u.PublicKey, message, sig) { for i := range s.Users {
return &u // 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) { 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.userIndex = (s.userIndex + 1) % len(s.Users)
s.CurrentUser = &s.Users[s.userIndex] s.CurrentUser = &s.Users[s.userIndex]
return s, nil return s, nil
} }

View File

@ -9,7 +9,10 @@ import (
) )
func CreateUser(c echo.Context) error { 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 { type BodyContent struct {
Name string Name string
@ -17,12 +20,15 @@ func CreateUser(c echo.Context) error {
} }
var bodyContent BodyContent var bodyContent BodyContent
err := c.Bind(&bodyContent) err = c.Bind(&bodyContent)
if err != nil { if err != nil {
return c.String(http.StatusBadRequest, err.Error()) 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) user := game.NewUser(bodyContent.Name, pub)
session.AddUser(user) session.AddUser(user)

View File

@ -1,40 +1,29 @@
package rest_handler package rest_handler
import ( import (
"bytes"
"fmt"
"io"
"net/http" "net/http"
"gitea.elara.ws/Hazel/hangman/internal/game"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
) )
func GuessLetter(c echo.Context) error { func GuessLetter(c echo.Context) error {
session := game.GetSession(c.Param("session")) session, user, err := GetData(c)
sig := c.Request().Header.Get("signature") if err != nil {
body, _ := io.ReadAll(c.Request().Body) return c.String(http.StatusBadRequest, err.Error())
u := session.VerifySignature(sig, body)
if u == nil {
return c.String(http.StatusBadRequest, "This user was not fount in the current session.")
} }
if !session.CurrentUser.PublicKey.Equal(u.PublicKey) { if session.CurrentUser != user {
return c.String(http.StatusBadRequest, "It's not the turn of user "+u.Name+". It's the turn of "+session.CurrentUser.Name+".") 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 { type BodyContent struct {
Guess string Guess string
} }
var bodyContent BodyContent var bodyContent BodyContent
err := c.Bind(&bodyContent) err = c.Bind(&bodyContent)
if err != nil { if err != nil {
fmt.Println(err)
return c.String(http.StatusBadRequest, err.Error()) return c.String(http.StatusBadRequest, err.Error())
} }

View File

@ -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
}

View File

@ -1,8 +1,6 @@
package rest_handler package rest_handler
import ( import (
"fmt"
"io"
"net/http" "net/http"
"gitea.elara.ws/Hazel/hangman/internal/game" "gitea.elara.ws/Hazel/hangman/internal/game"
@ -10,30 +8,17 @@ import (
) )
func TestAuth(c echo.Context) error { func TestAuth(c echo.Context) error {
session := game.GetSession(c.Param("session"))
type TestResults struct { type TestResults struct {
SignatureValid bool Session *game.Session
User *string User *game.User
Error error
} }
sig := c.Request().Header.Get("signature") session, user, err := GetData(c)
body, _ := io.ReadAll(c.Request().Body)
fmt.Println(sig)
u := session.VerifySignature(sig, body) return c.JSON(http.StatusOK, TestResults{
var resp TestResults Session: session,
if u == nil { User: user,
resp = TestResults{ Error: err,
SignatureValid: false, })
User: nil,
}
} else {
resp = TestResults{
SignatureValid: true,
User: &u.Name,
}
}
return c.JSON(http.StatusOK, resp)
} }

View File

@ -97,16 +97,12 @@ var Words []string = []string{"""
if __name__ == "__main__": if __name__ == "__main__":
s = Session() s = Session()
print(s) print(s)
a = s.add_user(name="Hazel") a = s.add_user(name="Hazel_1")
b = s.add_user(name="OtherHazel") 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") b.guess("e")
a.guess("e") c.guess("i")
b.guess("e") a.guess("o")
b.guess("a") b.guess("u")
a.guess("i")
b.guess("o")
a.guess("u")