diff --git a/gin-cpularp.go b/gin-cpularp.go index 06ac4bc..c96287c 100644 --- a/gin-cpularp.go +++ b/gin-cpularp.go @@ -114,6 +114,17 @@ func loginRedirect(context *gin.Context) { context.Redirect(302, oauthConfig.AuthCodeURL(context.GetString("state"))) } +func logoutRedirect(context *gin.Context) { + oauthTokenJSON, err := context.Cookie("discord-oauthtoken") + if err == nil { + dbcommands.LogoutDatabaseUser(db, oauthTokenJSON) + context.SetCookie("discord-oauthtoken", "", -1, "", config.API.Domain, false, true) + } else { + log.Println(err) + } + context.Redirect(http.StatusTemporaryRedirect, "/") +} + func authCallback(context *gin.Context) { oauthState := randomstring.CookieFriendlyString(32) context.Set("state", oauthState) @@ -127,6 +138,8 @@ func authCallback(context *gin.Context) { } oauthTokenJSON, _ := json.Marshal(oauthToken) context.SetCookie("discord-oauthtoken", string(oauthTokenJSON), 0, "", config.API.Domain, false, false) + user := getDiscordUser(context, oauthToken) + createOrUpdateUser(context, oauthToken, user) context.Redirect(http.StatusTemporaryRedirect, "/dashboard") } @@ -155,8 +168,7 @@ func getDiscordUser(context *gin.Context, oauthToken *oauth2.Token) discordUser return user } -func createOrUpdateUser(context *gin.Context, oauthToken *oauth2.Token) { - user := getDiscordUser(context, oauthToken) +func createOrUpdateUser(context *gin.Context, oauthToken *oauth2.Token, user discordUser) { oauthTokenJSON, err := json.Marshal(oauthToken) if err != nil { log.Println(err) @@ -168,16 +180,18 @@ func createOrUpdateUser(context *gin.Context, oauthToken *oauth2.Token) { Avatar: user.Avatar, AvatarDecoration: user.Avatar_Decoration_Data.Asset, LoginToken: string(oauthTokenJSON), + LoggedIn: true, } if dbcommands.DatabaseUserExists(db, user.Id) { dbOAuthToken := dbcommands.GetDatabaseUserToken(db, user.Id) if dbOAuthToken == "" { + context.SetCookie("discord-oauthtoken", string(oauthTokenJSON), 0, "", config.API.Domain, false, false) + err := dbcommands.UpdateDatabaseUser(db, dbUser) + if err != nil { + log.Println(err) + } + } else { context.SetCookie("discord-oauthtoken", dbOAuthToken, 0, "", config.API.Domain, false, false) - dbUser.LoginToken = dbOAuthToken - } - err := dbcommands.UpdateDatabaseUser(db, dbUser) - if err != nil { - log.Println(err) } } else { err := dbcommands.CreateDatabaseUser(db, dbUser) @@ -194,9 +208,12 @@ func dashboardDisplay(context *gin.Context) { err := json.Unmarshal([]byte(oauthTokenJSON), &oauthToken) if err == nil { if oauthToken.Valid() { - createOrUpdateUser(context, oauthToken) user := getDiscordUser(context, oauthToken) - context.HTML(http.StatusOK, "dashboard.html", user) + if dbcommands.DatabaseUserLoggedIn(db, user.Id) { + context.HTML(http.StatusOK, "dashboard.html", user) + } else { + context.Redirect(http.StatusTemporaryRedirect, "/logout") + } return } } else { @@ -218,6 +235,7 @@ func main() { app.GET("/", loginDisplay) app.GET("/login", loginRedirect) app.GET("/auth/callback", authCallback) + app.GET("/logout", logoutRedirect) app.GET("/dashboard", dashboardDisplay) app.Run(":31337") } diff --git a/lib/dbcommands/dbcommands.go b/lib/dbcommands/dbcommands.go index 02a591c..cd91e09 100644 --- a/lib/dbcommands/dbcommands.go +++ b/lib/dbcommands/dbcommands.go @@ -16,6 +16,7 @@ type User struct { Avatar string AvatarDecoration string LoginToken string + LoggedIn bool } func InitializeDatabase() *gorm.DB { @@ -47,6 +48,16 @@ func DatabaseUserExists(db *gorm.DB, id string) bool { } } +func DatabaseUserLoggedIn(db *gorm.DB, id string) bool { + var queryUser User + result := db.Where("id = ?", id).Take(&queryUser) + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return false + } else { + return queryUser.LoggedIn + } +} + func UpdateDatabaseUser(db *gorm.DB, user User) error { result := db.Save(&user) if result.Error != nil { @@ -62,3 +73,8 @@ func CreateDatabaseUser(db *gorm.DB, user User) error { } return nil } + +func LogoutDatabaseUser(db *gorm.DB, oauthToken string) { + db.Model(&User{}).Where("login_token = ?", oauthToken).Update("logged_in", false) + db.Model(&User{}).Where("login_token = ?", oauthToken).Update("login_token", "") +} diff --git a/lib/dbcommands/go.mod b/lib/dbcommands/go.mod index b160e89..090359c 100644 --- a/lib/dbcommands/go.mod +++ b/lib/dbcommands/go.mod @@ -6,8 +6,7 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/mattn/go-sqlite3 v1.14.22 // indirect - golang.org/x/oauth2 v0.29.0 // indirect golang.org/x/text v0.14.0 // indirect - gorm.io/driver/sqlite v1.5.7 // indirect - gorm.io/gorm v1.25.12 // indirect + gorm.io/driver/sqlite v1.5.7 // direct + gorm.io/gorm v1.25.12 // direct ) diff --git a/src/templates/dashboard.html b/src/templates/dashboard.html index 7204541..5dc0301 100644 --- a/src/templates/dashboard.html +++ b/src/templates/dashboard.html @@ -16,7 +16,8 @@ class="container max-w-3xl p-4 mx-auto space-y-2 font-mono text-white bg-primary min-w-xs md:space-y-4">