fixed changing of pointers
This commit is contained in:
parent
1e0a4c6317
commit
9c8b8177ad
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
30
internal/rest_handler/helper.go
Normal file
30
internal/rest_handler/helper.go
Normal 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
|
||||||
|
}
|
@ -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)
|
|
||||||
}
|
}
|
||||||
|
@ -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")
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user