From 7e3c02e37eabc8681f545df80bf29a2cf61b3be8 Mon Sep 17 00:00:00 2001 From: MaxJa4 <74194322+MaxJa4@users.noreply.github.com> Date: Wed, 17 Jan 2024 12:21:48 +0100 Subject: [PATCH] Add activation-codes and registration. Added tooltips. Added player-score-cache-display in mainpage. --- auth.go | 29 ++++++++++- controllers/player_controller.go | 2 +- main.go | 6 +++ models/code.go | 6 +++ models/setup.go | 17 ++++++- pages.go | 45 +++++++++++++++++ static/index.js | 9 +++- templates/components/bottom_controls.html | 26 +++++++--- templates/components/header.html | 1 + templates/components/home_clan_bar.html | 6 +-- templates/components/home_player_list.html | 14 ++++-- templates/components/opp_clan_bar.html | 6 +-- templates/components/opp_player_list.html | 12 +++-- templates/index.html | 7 +-- templates/login.html | 7 +-- templates/player_list_item.html | 7 ++- templates/register.html | 56 ++++++++++++++++++++++ utils/misc.go | 14 ++++++ 18 files changed, 234 insertions(+), 36 deletions(-) create mode 100644 models/code.go create mode 100644 templates/register.html create mode 100644 utils/misc.go diff --git a/auth.go b/auth.go index bf541b7..f47c93a 100644 --- a/auth.go +++ b/auth.go @@ -2,9 +2,12 @@ package main import ( "InfrantrySkillCalculator/models" + "InfrantrySkillCalculator/utils" + "errors" "fmt" "github.com/gin-gonic/gin" "golang.org/x/crypto/bcrypt" + "gorm.io/gorm" "log" "net/http" ) @@ -25,7 +28,9 @@ func getUserPassword(username string) (string, error) { var user models.User if err := models.DB.Where("username = ?", username).First(&user).Error; err != nil { - log.Fatal(err) + if !errors.Is(err, gorm.ErrRecordNotFound) { + log.Fatal(err) + } return "", err } @@ -58,3 +63,25 @@ func AuthRequired() gin.HandlerFunc { c.Next() } } + +func isValidCode(code string) bool { + var activationCode models.ActivationCode + if err := models.DB.Where("code = ?", code).First(&activationCode).Error; err != nil { + return false + } + + if activationCode.Code == code && !activationCode.Used { + models.DB.Model(&activationCode).Updates(map[string]interface{}{ + "Code": code, + "Used": true, + }) + + newCode := utils.GenerateActivationCode() + newCodeObj := models.ActivationCode{Code: newCode, Used: false} + models.DB.Create(&newCodeObj) + + return true + } + + return false +} diff --git a/controllers/player_controller.go b/controllers/player_controller.go index 8940b1f..74d2ed4 100644 --- a/controllers/player_controller.go +++ b/controllers/player_controller.go @@ -46,7 +46,7 @@ func GetPlayersByClanHTML(c *gin.Context) { var htmlOptions string for _, player := range players { - htmlOptions += fmt.Sprintf(playerItem, player.Name, player.ID, player.ID) + htmlOptions += fmt.Sprintf(playerItem, player.Name, "----", player.ID, player.ID) } c.Header("Content-Type", "text/html") diff --git a/main.go b/main.go index bdb788a..c937752 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,10 @@ func main() { //gin.SetMode(gin.ReleaseMode) // uncomment upon release router := gin.New() + err := router.SetTrustedProxies([]string{"127.0.0.1"}) + if err != nil { + log.Fatal(err) + } router.LoadHTMLGlob("templates/**/*") protected := router.Group("/") protected.Use(AuthRequired()) @@ -38,6 +42,8 @@ func main() { router.GET("/login", loginPage) router.POST("/login", loginPost) router.GET("/logout", logout) + router.GET("/register", registerPage) + router.POST("/register", registerPost) protected.GET("/", mainPage) diff --git a/models/code.go b/models/code.go new file mode 100644 index 0000000..544633b --- /dev/null +++ b/models/code.go @@ -0,0 +1,6 @@ +package models + +type ActivationCode struct { + Code string + Used bool +} diff --git a/models/setup.go b/models/setup.go index 763031a..ec94985 100644 --- a/models/setup.go +++ b/models/setup.go @@ -1,6 +1,7 @@ package models import ( + "InfrantrySkillCalculator/utils" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" @@ -29,7 +30,21 @@ func ConnectDatabase() { log.Fatal(err) } //database.AutoMigrate(&PlayerCache{}) - //database.AutoMigrate(&User{}) + err = database.AutoMigrate(&User{}) + if err != nil { + log.Fatal(err) + } + err = database.AutoMigrate(&ActivationCode{}) + if err != nil { + log.Fatal(err) + } else { + var code ActivationCode + if err := database.First(&code).Error; err != nil { + firstCode := utils.GenerateActivationCode() + database.Create(&ActivationCode{Code: firstCode, Used: false}) + log.Println("Created first activation code: " + firstCode) + } + } //database.AutoMigrate(&Game{}) //database.AutoMigrate(&MetricSettings{}) diff --git a/pages.go b/pages.go index 62181df..ab7b939 100644 --- a/pages.go +++ b/pages.go @@ -94,3 +94,48 @@ func logout(c *gin.Context) { c.Redirect(http.StatusFound, "/login") } + +func registerPage(c *gin.Context) { + session, _ := store.Get(c.Request, LoginSessionName) + + if auth, ok := session.Values["authenticated"].(bool); ok && auth { + c.Redirect(http.StatusFound, "/") + return + } + + tmpl, err := template.ParseFiles([]string{"./templates/register.html", "./templates/components/header.html"}...) + if err != nil { + log.Fatal(err) + } + + err = tmpl.Execute(c.Writer, nil) + if err != nil { + log.Fatal(err) + } +} + +func registerPost(c *gin.Context) { + username := c.PostForm("username") + password := c.PostForm("password") + code := c.PostForm("code") + + if !isValidCode(code) { + c.HTML(http.StatusOK, "login_error.html", gin.H{"message": "Ungültiger Aktivierungscode!"}) + return + } + + user := models.User{Username: username, Password: password, Enabled: true} + models.DB.Create(&user) + + session, _ := store.Get(c.Request, LoginSessionName) + session.Values["authenticated"] = true + session.Values["username"] = username + err := session.Save(c.Request, c.Writer) + if err != nil { + c.JSON(http.StatusInternalServerError, nil) + return + } + + c.Header("HX-Redirect", "/") + c.String(http.StatusOK, "") +} diff --git a/static/index.js b/static/index.js index c697a7b..d394c47 100644 --- a/static/index.js +++ b/static/index.js @@ -1,3 +1,10 @@ +document.addEventListener('DOMContentLoaded', function() { + const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]'); + tooltipTriggerList.forEach((elem) => { + new bootstrap.Tooltip(elem); + }); +}); + function setupClanButtons(dropdownId, delBtnId, editBtnId) { const dropdown = document.getElementById(dropdownId); const deleteButton = document.getElementById(delBtnId); @@ -128,4 +135,4 @@ function deselectAllPlayers(playerListId) { }); checkCounter.innerText = 0; -} \ No newline at end of file +} diff --git a/templates/components/bottom_controls.html b/templates/components/bottom_controls.html index 51b2010..ee286d1 100644 --- a/templates/components/bottom_controls.html +++ b/templates/components/bottom_controls.html @@ -1,14 +1,26 @@ {{ define "bottom_controls" }} -
-
- +
+
+ + + +
-
- +
+
-
- +
+
diff --git a/templates/components/header.html b/templates/components/header.html index 95d120a..2eeff05 100644 --- a/templates/components/header.html +++ b/templates/components/header.html @@ -8,6 +8,7 @@ + {{ end }} \ No newline at end of file diff --git a/templates/components/home_clan_bar.html b/templates/components/home_clan_bar.html index 7324f84..e292f7b 100644 --- a/templates/components/home_clan_bar.html +++ b/templates/components/home_clan_bar.html @@ -11,13 +11,13 @@
diff --git a/templates/components/home_player_list.html b/templates/components/home_player_list.html index 31b063b..c5e5071 100644 --- a/templates/components/home_player_list.html +++ b/templates/components/home_player_list.html @@ -2,21 +2,25 @@
-
+
- - + +


-
+
0
diff --git a/templates/components/opp_clan_bar.html b/templates/components/opp_clan_bar.html index 9bbf378..ae36e4e 100644 --- a/templates/components/opp_clan_bar.html +++ b/templates/components/opp_clan_bar.html @@ -10,13 +10,13 @@
diff --git a/templates/components/opp_player_list.html b/templates/components/opp_player_list.html index 100bbf7..18f1748 100644 --- a/templates/components/opp_player_list.html +++ b/templates/components/opp_player_list.html @@ -8,15 +8,19 @@
- - + +


-
+
0
diff --git a/templates/index.html b/templates/index.html index 564cd1a..9de8694 100644 --- a/templates/index.html +++ b/templates/index.html @@ -8,7 +8,7 @@
-

Heim-Team

+

Heim-Team

{{ template "home_clan_bar" . }} @@ -18,7 +18,7 @@
-

Gegner-Team

+

Gegner-Team

{{ template "opp_clan_bar" . }} @@ -48,11 +48,8 @@ - - diff --git a/templates/login.html b/templates/login.html index 944a87b..2479e58 100644 --- a/templates/login.html +++ b/templates/login.html @@ -7,7 +7,7 @@

Login


-
+
@@ -16,9 +16,10 @@
- + +
-
+
\ No newline at end of file diff --git a/templates/player_list_item.html b/templates/player_list_item.html index 51600db..16899b9 100644 --- a/templates/player_list_item.html +++ b/templates/player_list_item.html @@ -1,8 +1,11 @@
- +
- %s + %s + + %s +