diff --git a/internal/api/routes/auth.go b/internal/api/routes/auth.go index 3679710..38a85b2 100644 --- a/internal/api/routes/auth.go +++ b/internal/api/routes/auth.go @@ -5,7 +5,7 @@ import ( "time" "github.com/gin-gonic/gin" - "stereo.cat/backend/internal/auth" + "stereo.cat/backend/internal/auth/token" "stereo.cat/backend/internal/types" ) @@ -25,7 +25,7 @@ func RegisterAuthRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { panic(err) } - jwt, err := auth.GenerateJWT(cfg.JWTSecret, user, uint64(time.Now().Add(time.Second*time.Duration(t.ExpiresIn)).Unix())) + jwt, err := token.GenerateJWT(cfg.JWTSecret, user, uint64(time.Now().Add(time.Second*time.Duration(t.ExpiresIn)).Unix())) if err != nil { panic(err) @@ -47,7 +47,7 @@ func RegisterAuthRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { c.Redirect(http.StatusTemporaryRedirect, cfg.FrontendUri+"?jwt_set=true") }) - api.GET("/auth/me", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { + api.GET("/auth/me", token.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { claims, _ := c.Get("claims") c.JSON(http.StatusOK, claims) }) diff --git a/internal/api/routes/files.go b/internal/api/routes/files.go index 8accd1b..5c046ed 100644 --- a/internal/api/routes/files.go +++ b/internal/api/routes/files.go @@ -12,6 +12,7 @@ import ( "github.com/h2non/filetype" "github.com/minio/minio-go/v7" "stereo.cat/backend/internal/auth" + "stereo.cat/backend/internal/auth/token" "stereo.cat/backend/internal/types" ) @@ -20,7 +21,7 @@ func intoReader(buf []byte) io.Reader { } func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { - api.POST("/upload", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { + api.POST("/upload", token.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { claims := c.MustGet("claims").(jwt.MapClaims) user := claims["user"].(auth.User) @@ -88,7 +89,7 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { c.JSON(200, gin.H{"message": "file uploaded successfully", "id": fileMeta.ID.String()}) }) - api.DELETE("/:id", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { + api.DELETE("/:id", token.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { claims := c.MustGet("claims").(jwt.MapClaims) user := claims["user"].(auth.User) @@ -100,15 +101,10 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { var file *types.File - cfg.Database.First(&file, fileID) + err = cfg.Database.First(&file, fileID).Error - if file == nil { - err := cfg.Database.Delete(&file).Error - if err != nil { - types.ErrorDatabase.Throw(c, err) - return - } - types.ErrorFileNotFound.Throw(c, nil) + if err != nil { + types.ErrorFileNotFound.Throw(c, err) return } @@ -162,7 +158,7 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { c.DataFromReader(200, file.Size, file.Mime, object, nil) }) - api.GET("/list", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { + api.GET("/list", token.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { claims := c.MustGet("claims").(jwt.MapClaims) user := claims["user"].(auth.User) diff --git a/internal/auth/jwt.go b/internal/auth/token/jwt.go similarity index 75% rename from internal/auth/jwt.go rename to internal/auth/token/jwt.go index 7f21182..e98e376 100644 --- a/internal/auth/jwt.go +++ b/internal/auth/token/jwt.go @@ -1,17 +1,18 @@ -package auth +package token import ( "encoding/json" "fmt" - "net/http" "strings" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" + "stereo.cat/backend/internal/auth" + "stereo.cat/backend/internal/types" ) -func GenerateJWT(key string, user User, expiryTimestamp uint64) (string, error) { - claims := Claims{ +func GenerateJWT(key string, user auth.User, expiryTimestamp uint64) (string, error) { + claims := auth.Claims{ User: user, Exp: expiryTimestamp, } @@ -20,10 +21,6 @@ func GenerateJWT(key string, user User, expiryTimestamp uint64) (string, error) return token.SignedString([]byte(key)) } -func invalidAuth(c *gin.Context) { - c.String(http.StatusUnauthorized, "Unauthorized.") - c.Abort() -} func JwtMiddleware(secret string) gin.HandlerFunc { return func(c *gin.Context) { @@ -33,7 +30,7 @@ func JwtMiddleware(secret string) gin.HandlerFunc { jwtSplit := strings.Split(c.GetHeader("Authorization"), " ") if len(jwtSplit) < 2 || jwtSplit[0] != "Bearer" { - invalidAuth(c) + types.ErrorUnauthorized.Throw(c, nil) return } @@ -42,21 +39,21 @@ func JwtMiddleware(secret string) gin.HandlerFunc { claims, err := ValidateJWT(jwt, secret) if err != nil { - invalidAuth(c) + types.ErrorUnauthorized.Throw(c, err) return } if userClaims, ok := claims["user"].(map[string]interface{}); ok { userJSON, err := json.Marshal(userClaims) // Convert map to JSON if err != nil { - invalidAuth(c) + types.ErrorUnauthorized.Throw(c, err) return } - var user User + var user auth.User err = json.Unmarshal(userJSON, &user) if err != nil { - invalidAuth(c) + types.ErrorUserNotFound.Throw(c, err) return } diff --git a/internal/types/errors.go b/internal/types/errors.go index 3ed414e..5dd84e3 100644 --- a/internal/types/errors.go +++ b/internal/types/errors.go @@ -64,3 +64,8 @@ var ErrorS3 = StereoError{ Code: 7, StatusCode: 500, } + +var ErrorUserNotFound = StereoError{ + Code: 8, + StatusCode: 404, +}