mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-10-31 08:39:10 +08:00 
			
		
		
		
	 79b8784934
			
		
	
	79b8784934
	
	
	
		
			
			* Code: compatible with semantic import versioning * Tools & Docs: compatible with semantic import versioning * Clean go.mod & go.sum
		
			
				
	
	
		
			134 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package middleware
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 
 | |
| 	model "github.com/cloudreve/Cloudreve/v3/models"
 | |
| 	"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
 | |
| 	"github.com/cloudreve/Cloudreve/v3/pkg/util"
 | |
| 	"github.com/gin-gonic/gin"
 | |
| )
 | |
| 
 | |
| // ShareOwner 检查当前登录用户是否为分享所有者
 | |
| func ShareOwner() gin.HandlerFunc {
 | |
| 	return func(c *gin.Context) {
 | |
| 		var user *model.User
 | |
| 		if userCtx, ok := c.Get("user"); ok {
 | |
| 			user = userCtx.(*model.User)
 | |
| 		} else {
 | |
| 			c.JSON(200, serializer.Err(serializer.CodeCheckLogin, "请先登录", nil))
 | |
| 			c.Abort()
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		if share, ok := c.Get("share"); ok {
 | |
| 			if share.(*model.Share).Creator().ID != user.ID {
 | |
| 				c.JSON(200, serializer.Err(serializer.CodeNotFound, "分享不存在", nil))
 | |
| 				c.Abort()
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		c.Next()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // ShareAvailable 检查分享是否可用
 | |
| func ShareAvailable() gin.HandlerFunc {
 | |
| 	return func(c *gin.Context) {
 | |
| 		var user *model.User
 | |
| 		if userCtx, ok := c.Get("user"); ok {
 | |
| 			user = userCtx.(*model.User)
 | |
| 		} else {
 | |
| 			user = model.NewAnonymousUser()
 | |
| 		}
 | |
| 
 | |
| 		share := model.GetShareByHashID(c.Param("id"))
 | |
| 
 | |
| 		if share == nil || !share.IsAvailable() {
 | |
| 			c.JSON(200, serializer.Err(serializer.CodeNotFound, "分享不存在或已失效", nil))
 | |
| 			c.Abort()
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		c.Set("user", user)
 | |
| 		c.Set("share", share)
 | |
| 		c.Next()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // ShareCanPreview 检查分享是否可被预览
 | |
| func ShareCanPreview() gin.HandlerFunc {
 | |
| 	return func(c *gin.Context) {
 | |
| 		if share, ok := c.Get("share"); ok {
 | |
| 			if share.(*model.Share).PreviewEnabled {
 | |
| 				c.Next()
 | |
| 				return
 | |
| 			}
 | |
| 			c.JSON(200, serializer.Err(serializer.CodeNoPermissionErr, "此分享无法预览",
 | |
| 				nil))
 | |
| 			c.Abort()
 | |
| 			return
 | |
| 		}
 | |
| 		c.Abort()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // CheckShareUnlocked 检查分享是否已解锁
 | |
| func CheckShareUnlocked() gin.HandlerFunc {
 | |
| 	return func(c *gin.Context) {
 | |
| 		if shareCtx, ok := c.Get("share"); ok {
 | |
| 			share := shareCtx.(*model.Share)
 | |
| 			// 分享是否已解锁
 | |
| 			if share.Password != "" {
 | |
| 				sessionKey := fmt.Sprintf("share_unlock_%d", share.ID)
 | |
| 				unlocked := util.GetSession(c, sessionKey) != nil
 | |
| 				if !unlocked {
 | |
| 					c.JSON(200, serializer.Err(serializer.CodeNoPermissionErr,
 | |
| 						"无权访问此分享", nil))
 | |
| 					c.Abort()
 | |
| 					return
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			c.Next()
 | |
| 			return
 | |
| 		}
 | |
| 		c.Abort()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // BeforeShareDownload 分享被下载前的检查
 | |
| func BeforeShareDownload() gin.HandlerFunc {
 | |
| 	return func(c *gin.Context) {
 | |
| 		if shareCtx, ok := c.Get("share"); ok {
 | |
| 			if userCtx, ok := c.Get("user"); ok {
 | |
| 				share := shareCtx.(*model.Share)
 | |
| 				user := userCtx.(*model.User)
 | |
| 
 | |
| 				// 检查用户是否可以下载此分享的文件
 | |
| 				err := share.CanBeDownloadBy(user)
 | |
| 				if err != nil {
 | |
| 					c.JSON(200, serializer.Err(serializer.CodeNoPermissionErr, err.Error(),
 | |
| 						nil))
 | |
| 					c.Abort()
 | |
| 					return
 | |
| 				}
 | |
| 
 | |
| 				// 对积分、下载次数进行更新
 | |
| 				err = share.DownloadBy(user, c)
 | |
| 				if err != nil {
 | |
| 					c.JSON(200, serializer.Err(serializer.CodeNoPermissionErr, err.Error(),
 | |
| 						nil))
 | |
| 					c.Abort()
 | |
| 					return
 | |
| 				}
 | |
| 
 | |
| 				c.Next()
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 		c.Abort()
 | |
| 	}
 | |
| }
 |