mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-10-31 00:27:31 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			200 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package setting
 | |
| 
 | |
| import (
 | |
| 	"github.com/cloudreve/Cloudreve/v4/application/constants"
 | |
| 	"github.com/cloudreve/Cloudreve/v4/application/dependency"
 | |
| 	"github.com/cloudreve/Cloudreve/v4/ent"
 | |
| 	"github.com/cloudreve/Cloudreve/v4/inventory"
 | |
| 	"github.com/cloudreve/Cloudreve/v4/inventory/types"
 | |
| 	"github.com/cloudreve/Cloudreve/v4/pkg/boolset"
 | |
| 	"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
 | |
| 	"github.com/cloudreve/Cloudreve/v4/pkg/hashid"
 | |
| 	"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
 | |
| 	"github.com/cloudreve/Cloudreve/v4/pkg/util"
 | |
| 	"github.com/gin-gonic/gin"
 | |
| )
 | |
| 
 | |
| // WebDAVAccountService WebDAV 账号管理服务
 | |
| type WebDAVAccountService struct {
 | |
| 	ID uint `uri:"id" binding:"required,min=1"`
 | |
| }
 | |
| 
 | |
| // WebDAVAccountCreateService WebDAV 账号创建服务
 | |
| type WebDAVAccountCreateService struct {
 | |
| 	Path string `json:"path" binding:"required,min=1,max=65535"`
 | |
| 	Name string `json:"name" binding:"required,min=1,max=255"`
 | |
| }
 | |
| 
 | |
| // WebDAVAccountUpdateReadonlyService WebDAV 修改只读性服务
 | |
| type WebDAVAccountUpdateReadonlyService struct {
 | |
| 	ID       uint `json:"id" binding:"required,min=1"`
 | |
| 	Readonly bool `json:"readonly"`
 | |
| }
 | |
| 
 | |
| // WebDAVMountCreateService WebDAV 挂载创建服务
 | |
| type WebDAVMountCreateService struct {
 | |
| 	Path   string `json:"path" binding:"required,min=1,max=65535"`
 | |
| 	Policy string `json:"policy" binding:"required,min=1"`
 | |
| }
 | |
| 
 | |
| //// Unmount 取消目录挂载
 | |
| //func (service *WebDAVListService) Unmount(c *gin.Context, user *model.User) serializer.Response {
 | |
| //	folderID, _ := c.Get("object_id")
 | |
| //	folder, err := model.GetFoldersByIDs([]uint{folderID.(uint)}, user.ID)
 | |
| //	if err != nil || len(folder) == 0 {
 | |
| //		return serializer.ErrDeprecated(serializer.CodeParentNotExist, "", err)
 | |
| //	}
 | |
| //
 | |
| //	if err := folder[0].Mount(0); err != nil {
 | |
| //		return serializer.DBErrDeprecated("Failed to update folder record", err)
 | |
| //	}
 | |
| //
 | |
| //	return serializer.Response{}
 | |
| //}
 | |
| 
 | |
| type (
 | |
| 	ListDavAccountsService struct {
 | |
| 		PageSize      int    `form:"page_size" binding:"required,min=10,max=100"`
 | |
| 		NextPageToken string `form:"next_page_token"`
 | |
| 	}
 | |
| 	ListDavAccountParamCtx struct{}
 | |
| )
 | |
| 
 | |
| // Accounts 列出WebDAV账号
 | |
| func (service *ListDavAccountsService) List(c *gin.Context) (*ListDavAccountResponse, error) {
 | |
| 	dep := dependency.FromContext(c)
 | |
| 	user := inventory.UserFromContext(c)
 | |
| 	hasher := dep.HashIDEncoder()
 | |
| 	davAccountClient := dep.DavAccountClient()
 | |
| 
 | |
| 	args := &inventory.ListDavAccountArgs{
 | |
| 		UserID: user.ID,
 | |
| 		PaginationArgs: &inventory.PaginationArgs{
 | |
| 			UseCursorPagination: true,
 | |
| 			PageSize:            service.PageSize,
 | |
| 			PageToken:           service.NextPageToken,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	res, err := davAccountClient.List(c, args)
 | |
| 	if err != nil {
 | |
| 		return nil, serializer.NewError(serializer.CodeDBError, "Failed to list dav accounts", err)
 | |
| 	}
 | |
| 
 | |
| 	return BuildListDavAccountResponse(res, hasher), nil
 | |
| }
 | |
| 
 | |
| type (
 | |
| 	CreateDavAccountService struct {
 | |
| 		Uri      string `json:"uri" binding:"required"`
 | |
| 		Name     string `json:"name" binding:"required,min=1,max=255"`
 | |
| 		Readonly bool   `json:"readonly"`
 | |
| 		Proxy    bool   `json:"proxy"`
 | |
| 	}
 | |
| 	CreateDavAccountParamCtx struct{}
 | |
| )
 | |
| 
 | |
| // Create 创建WebDAV账号
 | |
| func (service *CreateDavAccountService) Create(c *gin.Context) (*DavAccount, error) {
 | |
| 	dep := dependency.FromContext(c)
 | |
| 	user := inventory.UserFromContext(c)
 | |
| 
 | |
| 	bs, err := service.validateAndGetBs(user)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	davAccountClient := dep.DavAccountClient()
 | |
| 	account, err := davAccountClient.Create(c, &inventory.CreateDavAccountParams{
 | |
| 		UserID:   user.ID,
 | |
| 		Name:     service.Name,
 | |
| 		URI:      service.Uri,
 | |
| 		Password: util.RandString(32, util.RandomLowerCases),
 | |
| 		Options:  bs,
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		return nil, serializer.NewError(serializer.CodeDBError, "Failed to create dav account", err)
 | |
| 	}
 | |
| 
 | |
| 	accountRes := BuildDavAccount(account, dep.HashIDEncoder())
 | |
| 	return &accountRes, nil
 | |
| }
 | |
| 
 | |
| // Update updates an existing account
 | |
| func (service *CreateDavAccountService) Update(c *gin.Context) (*DavAccount, error) {
 | |
| 	dep := dependency.FromContext(c)
 | |
| 	user := inventory.UserFromContext(c)
 | |
| 	accountId := hashid.FromContext(c)
 | |
| 
 | |
| 	// Find existing account
 | |
| 	davAccountClient := dep.DavAccountClient()
 | |
| 	account, err := davAccountClient.GetByIDAndUserID(c, accountId, user.ID)
 | |
| 	if err != nil {
 | |
| 		return nil, serializer.NewError(serializer.CodeNotFound, "Account not exist", err)
 | |
| 	}
 | |
| 
 | |
| 	bs, err := service.validateAndGetBs(user)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	// Update account
 | |
| 	account, err = davAccountClient.Update(c, accountId, &inventory.CreateDavAccountParams{
 | |
| 		Name:    service.Name,
 | |
| 		URI:     service.Uri,
 | |
| 		Options: bs,
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		return nil, serializer.NewError(serializer.CodeDBError, "Failed to update dav account", err)
 | |
| 	}
 | |
| 
 | |
| 	accountRes := BuildDavAccount(account, dep.HashIDEncoder())
 | |
| 	return &accountRes, nil
 | |
| }
 | |
| 
 | |
| func (service *CreateDavAccountService) validateAndGetBs(user *ent.User) (*boolset.BooleanSet, error) {
 | |
| 	if !user.Edges.Group.Permissions.Enabled(int(types.GroupPermissionWebDAV)) {
 | |
| 		return nil, serializer.NewError(serializer.CodeGroupNotAllowed, "WebDAV is not enabled for this user group", nil)
 | |
| 	}
 | |
| 
 | |
| 	uri, err := fs.NewUriFromString(service.Uri)
 | |
| 	if err != nil {
 | |
| 		return nil, serializer.NewError(serializer.CodeParamErr, "Invalid URI", err)
 | |
| 	}
 | |
| 
 | |
| 	// Only "my" and "share" fs is allowed in WebDAV
 | |
| 	if uriFs := uri.FileSystem(); uri.SearchParameters() != nil ||
 | |
| 		(uriFs != constants.FileSystemMy && uriFs != constants.FileSystemShare) {
 | |
| 		return nil, serializer.NewError(serializer.CodeParamErr, "Invalid URI", nil)
 | |
| 	}
 | |
| 
 | |
| 	bs := boolset.BooleanSet{}
 | |
| 	if service.Readonly {
 | |
| 		boolset.Set(types.DavAccountReadOnly, true, &bs)
 | |
| 	}
 | |
| 
 | |
| 	if service.Proxy && user.Edges.Group.Permissions.Enabled(int(types.GroupPermissionWebDAVProxy)) {
 | |
| 		boolset.Set(types.DavAccountProxy, true, &bs)
 | |
| 	}
 | |
| 	return &bs, nil
 | |
| }
 | |
| 
 | |
| func DeleteDavAccount(c *gin.Context) error {
 | |
| 	dep := dependency.FromContext(c)
 | |
| 	user := inventory.UserFromContext(c)
 | |
| 	accountId := hashid.FromContext(c)
 | |
| 
 | |
| 	// Find existing account
 | |
| 	davAccountClient := dep.DavAccountClient()
 | |
| 	_, err := davAccountClient.GetByIDAndUserID(c, accountId, user.ID)
 | |
| 	if err != nil {
 | |
| 		return serializer.NewError(serializer.CodeNotFound, "Account not exist", err)
 | |
| 	}
 | |
| 
 | |
| 	if err := davAccountClient.Delete(c, accountId); err != nil {
 | |
| 		return serializer.NewError(serializer.CodeDBError, "Failed to delete dav account", err)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | 
