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) // verify sign 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() } // TODO: implement // path maybe contains # ? etc. 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 }