2 Commits

Author SHA1 Message Date
Adrian Zürcher
9a0019f3ad fix user defined exiration 2025-11-07 15:12:51 +01:00
Adrian Zürcher
0506ed6491 add new user defined user exiration 2025-11-07 13:51:58 +01:00
2 changed files with 58 additions and 10 deletions

View File

@@ -60,12 +60,24 @@ func (aH *AccessHandler) Login(c *gin.Context) {
return
}
if len(dbRecord) == 0 {
aH.logger.Error("Login", "no user "+user.Name+" found")
c.JSON(http.StatusUnauthorized, models.NewJsonMessageResponse("invalid credentials"))
return
}
if len(dbRecord) > 1 {
aH.logger.Error("Login", "more than one record found")
c.JSON(http.StatusInternalServerError, models.NewJsonMessageResponse("internal error"))
return
}
if !dbRecord[0].ExpirationIsValid() {
aH.logger.Error("Login", fmt.Sprintf("user %s is expired", user.Name))
c.JSON(http.StatusUnauthorized, models.NewJsonMessageResponse("user "+user.Name+" is expired"))
return
}
// Check password
if !utils.CheckPassword(user.Password, dbRecord[0].Password) {
aH.logger.Error("Login", "invalid password")
@@ -89,6 +101,7 @@ func (aH *AccessHandler) Login(c *gin.Context) {
"role": user.Role,
"type": "access",
"exp": accessTokenExp.Unix(),
"userExpiration": user.Expiration,
})
// Create refresh token
@@ -98,6 +111,7 @@ func (aH *AccessHandler) Login(c *gin.Context) {
"role": user.Role,
"type": "refresh",
"exp": refreshTokenExp.Unix(),
"userExpiration": user.GetExpiration(),
})
// Sign tokens
@@ -175,6 +189,13 @@ func (aH *AccessHandler) Refresh(c *gin.Context) {
id := int(claims["id"].(float64))
role := claims["role"].(string)
if !expirationDateValid(claims["userExpiration"].(string)) {
aH.Logout(c)
aH.logger.Error("Refresh", fmt.Sprintf("user %s is expired", username))
c.JSON(http.StatusUnauthorized, models.NewJsonMessageResponse("user "+username+" is expired"))
return
}
// Create new access token
aH.logger.Debug("Refresh", "create new access token")
accessExp := time.Now().Add(ACCESS_TOKEN_TIME)
@@ -240,3 +261,16 @@ func (aH *AccessHandler) Logout(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "logged out"})
}
func expirationDateValid(expiration string) bool {
if expiration == "" {
return true // No expiration = always valid
}
t, err := time.Parse(time.RFC3339, expiration)
if err != nil {
return false // Invalid date format
}
return time.Now().Before(t)
}

View File

@@ -15,3 +15,17 @@ type User struct {
func (u *User) IsValid() bool {
return u.Name != ""
}
func (u *User) ExpirationIsValid() bool {
if u.Expiration == nil {
return true
}
return time.Now().Before(*u.Expiration)
}
func (u *User) GetExpiration() string {
if u.Expiration == nil {
return ""
}
return u.Expiration.Format(time.RFC3339)
}