| package middlewares |
|
|
| import ( |
| "strings" |
|
|
| "github.com/alist-org/alist/v3/internal/conf" |
| "github.com/alist-org/alist/v3/internal/setting" |
|
|
| "github.com/alist-org/alist/v3/internal/errs" |
| "github.com/alist-org/alist/v3/internal/model" |
| "github.com/alist-org/alist/v3/internal/op" |
| "github.com/alist-org/alist/v3/internal/sign" |
| "github.com/alist-org/alist/v3/pkg/utils" |
| "github.com/alist-org/alist/v3/server/common" |
| "github.com/gin-gonic/gin" |
| "github.com/pkg/errors" |
| ) |
|
|
| func Down(c *gin.Context) { |
| rawPath := parsePath(c.Param("path")) |
| c.Set("path", rawPath) |
| meta, err := op.GetNearestMeta(rawPath) |
| if err != nil { |
| if !errors.Is(errors.Cause(err), errs.MetaNotFound) { |
| common.ErrorResp(c, err, 500, true) |
| return |
| } |
| } |
| c.Set("meta", meta) |
| |
| if needSign(meta, rawPath) { |
| s := c.Query("sign") |
| err = sign.Verify(rawPath, strings.TrimSuffix(s, "/")) |
| if err != nil { |
| common.ErrorResp(c, err, 401) |
| c.Abort() |
| return |
| } |
| } |
| c.Next() |
| } |
|
|
| |
| |
| func parsePath(path string) string { |
| return utils.FixAndCleanPath(path) |
| } |
|
|
| func needSign(meta *model.Meta, path string) bool { |
| if setting.GetBool(conf.SignAll) { |
| return true |
| } |
| if common.IsStorageSignEnabled(path) { |
| return true |
| } |
| if meta == nil || meta.Password == "" { |
| return false |
| } |
| if !meta.PSub && path != meta.Path { |
| return false |
| } |
| return true |
| } |
|
|