github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/routers/controllers/webdav.go (about) 1 package controllers 2 3 import ( 4 "context" 5 model "github.com/cloudreve/Cloudreve/v3/models" 6 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem" 7 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem/fsctx" 8 "github.com/cloudreve/Cloudreve/v3/pkg/util" 9 "github.com/cloudreve/Cloudreve/v3/pkg/webdav" 10 "github.com/cloudreve/Cloudreve/v3/service/setting" 11 "github.com/gin-gonic/gin" 12 "net/http" 13 "sync" 14 ) 15 16 var handler *webdav.Handler 17 18 func init() { 19 handler = &webdav.Handler{ 20 Prefix: "/dav", 21 LockSystem: make(map[uint]webdav.LockSystem), 22 Mutex: &sync.Mutex{}, 23 } 24 } 25 26 // ServeWebDAV 处理WebDAV相关请求 27 func ServeWebDAV(c *gin.Context) { 28 fs, err := filesystem.NewFileSystemFromContext(c) 29 if err != nil { 30 util.Log().Warning("Failed to initialize filesystem for WebDAV,%s", err) 31 return 32 } 33 34 if webdavCtx, ok := c.Get("webdav"); ok { 35 application := webdavCtx.(*model.Webdav) 36 37 // 重定根目录 38 if application.Root != "/" { 39 if exist, root := fs.IsPathExist(application.Root); exist { 40 root.Position = "" 41 root.Name = "/" 42 fs.Root = root 43 } 44 } 45 46 // 检查是否只读 47 if application.Readonly { 48 switch c.Request.Method { 49 case "DELETE", "PUT", "MKCOL", "COPY", "MOVE": 50 c.Status(http.StatusForbidden) 51 return 52 } 53 } 54 55 // 更新Context 56 c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), fsctx.WebDAVCtx, application)) 57 } 58 59 handler.ServeHTTP(c.Writer, c.Request, fs) 60 } 61 62 // GetWebDAVAccounts 获取webdav账号列表 63 func GetWebDAVAccounts(c *gin.Context) { 64 var service setting.WebDAVListService 65 if err := c.ShouldBindUri(&service); err == nil { 66 res := service.Accounts(c, CurrentUser(c)) 67 c.JSON(200, res) 68 } else { 69 c.JSON(200, ErrorResponse(err)) 70 } 71 } 72 73 // DeleteWebDAVAccounts 删除WebDAV账户 74 func DeleteWebDAVAccounts(c *gin.Context) { 75 var service setting.WebDAVAccountService 76 if err := c.ShouldBindUri(&service); err == nil { 77 res := service.Delete(c, CurrentUser(c)) 78 c.JSON(200, res) 79 } else { 80 c.JSON(200, ErrorResponse(err)) 81 } 82 } 83 84 // UpdateWebDAVAccounts 更改WebDAV账户只读性和是否使用代理服务 85 func UpdateWebDAVAccounts(c *gin.Context) { 86 var service setting.WebDAVAccountUpdateService 87 if err := c.ShouldBindJSON(&service); err == nil { 88 res := service.Update(c, CurrentUser(c)) 89 c.JSON(200, res) 90 } else { 91 c.JSON(200, ErrorResponse(err)) 92 } 93 } 94 95 // CreateWebDAVAccounts 创建WebDAV账户 96 func CreateWebDAVAccounts(c *gin.Context) { 97 var service setting.WebDAVAccountCreateService 98 if err := c.ShouldBindJSON(&service); err == nil { 99 res := service.Create(c, CurrentUser(c)) 100 c.JSON(200, res) 101 } else { 102 c.JSON(200, ErrorResponse(err)) 103 } 104 }