diff --git a/internal/aria2/aria2.go b/internal/aria2/aria2.go index 24299c13..df3f9fc5 100644 --- a/internal/aria2/aria2.go +++ b/internal/aria2/aria2.go @@ -17,6 +17,7 @@ var notify = NewNotify() var client rpc.Client func InitClient(timeout int) (string, error) { + client = nil uri := setting.GetByKey(conf.Aria2Uri) secret := setting.GetByKey(conf.Aria2Secret) return InitAria2Client(uri, secret, timeout) diff --git a/internal/fs/fs.go b/internal/fs/fs.go index 7c63e916..ab0c044e 100644 --- a/internal/fs/fs.go +++ b/internal/fs/fs.go @@ -13,8 +13,8 @@ import ( // So, the purpose of this package is to convert virtual path to actual path // then pass the actual path to the operations package -func List(ctx context.Context, path string) ([]model.Obj, error) { - res, err := list(ctx, path) +func List(ctx context.Context, path string, refresh ...bool) ([]model.Obj, error) { + res, err := list(ctx, path, refresh...) if err != nil { log.Errorf("failed list %s: %+v", path, err) return nil, err diff --git a/internal/fs/list.go b/internal/fs/list.go index 566a6daf..824020d5 100644 --- a/internal/fs/list.go +++ b/internal/fs/list.go @@ -13,7 +13,7 @@ import ( ) // List files -func list(ctx context.Context, path string) ([]model.Obj, error) { +func list(ctx context.Context, path string, refresh ...bool) ([]model.Obj, error) { meta := ctx.Value("meta").(*model.Meta) user := ctx.Value("user").(*model.User) storage, actualPath, err := operations.GetStorageAndActualPath(path) @@ -26,7 +26,7 @@ func list(ctx context.Context, path string) ([]model.Obj, error) { } objs, err := operations.List(ctx, storage, actualPath, model.ListArgs{ ReqPath: path, - }) + }, refresh...) if err != nil { log.Errorf("%+v", err) if len(virtualFiles) != 0 { diff --git a/server/handles/fsread.go b/server/handles/fsread.go index 3f20f426..9f6b4e90 100644 --- a/server/handles/fsread.go +++ b/server/handles/fsread.go @@ -22,6 +22,7 @@ type ListReq struct { common.PageReq Path string `json:"path" form:"path"` Password string `json:"password" form:"password"` + Refresh bool `json:"refresh"` } type DirReq struct { @@ -67,7 +68,11 @@ func FsList(c *gin.Context) { common.ErrorStrResp(c, "password is incorrect", 403) return } - objs, err := fs.List(c, req.Path) + if !user.CanWrite() && !canWrite(meta, req.Path) && req.Refresh { + common.ErrorStrResp(c, "Refresh without permission", 403) + return + } + objs, err := fs.List(c, req.Path, req.Refresh) if err != nil { common.ErrorResp(c, err, 500) return