mirror of
https://github.com/AlistGo/alist.git
synced 2025-09-15 12:58:42 +08:00
* Determine whether the URL requires Sign
* Add File and Mem based KV
NOT TESTED: TokenKV Function
* Change Token KV func to common func.
Add File based KV func
* Remove KV, Remove Token
I found that the original Sign function is enough to complete the link signature, and only need to add simple configuration items to meet the requirements.
* Add IsStorageSigned func to judge if Signing is enabled in the storage settings.
It should be working now.
* Add a SIGN button to the management panel.
* Add enable_sign to the basic storage struct.
Can enable sign for every driver now.
Bug: When sign enabled, in download page, Copy link doesn't contain a sign.
(Not done yet)
* Fix a bug from commit 8f6c25f.
Response of fsread function does not contain sign.
* Optimize code and follow advices.
- Add back public/dist/README.md
- Enable sign when DownProxyUrl is enabled
- Merge needSign() to isEncrypt() in fsread.go
* simplify code
---------
Co-authored-by: Andy Hsu <i@nn.ci>
64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
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
|
|
}
|