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  }