diff --git a/README.md b/README.md index 3b29e8e1..16f87d16 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ - Onedrive/世纪互联 - 天翼云盘 - GoogleDrive +- 123pan - ... ### 如何使用 diff --git a/bootstrap/setting.go b/bootstrap/setting.go index 567b0e21..c0bd2b15 100644 --- a/bootstrap/setting.go +++ b/bootstrap/setting.go @@ -57,7 +57,7 @@ func InitSettings() { }, { Key: "text types", - Value: "txt,htm,html,xml,java,properties,sql,js,md,json,conf,ini,vue,php,py,bat,gitignore,yml,go,sh,c,cpp,h,hpp", + Value: "txt,htm,html,xml,java,properties,sql,js,md,json,conf,ini,vue,php,py,bat,gitignore,yml,go,sh,c,cpp,h,hpp,tsx", Type: "string", Description: "text type extensions", }, @@ -98,35 +98,48 @@ func InitSettings() { Key: "autoplay video", Value: "false", Type: "bool", + Group: model.PUBLIC, }, { Key: "autoplay audio", Value: "false", Type: "bool", + Group: model.PUBLIC, }, { Key: "check parent folder", Value: "false", Type: "bool", Description: "check parent folder password", + Group: model.PRIVATE, }, { Key: "customize style", Value: "", Type: "text", Description: "customize style, don't need add ", + Group: model.PRIVATE, }, { Key: "customize script", Value: "", Type: "text", Description: "customize script, don't need add ", + Group: model.PRIVATE, }, { Key: "animation", Value: "true", Type: "bool", Description: "when there are a lot of files, the animation will freeze when opening", + Group: model.PUBLIC, + }, + { + Key: "check down link", + Value: "false", + Type: "bool", + Description: "check down link password, your link will be 'https://alist.com/d/filename?pw=xxx'", + Group: model.PUBLIC, }, } for _, v := range settings { @@ -139,4 +152,4 @@ func InitSettings() { } } model.LoadSettings() -} \ No newline at end of file +} diff --git a/conf/var.go b/conf/var.go index f141cf57..f672d8a0 100644 --- a/conf/var.go +++ b/conf/var.go @@ -44,4 +44,5 @@ var ( //CustomizeStyle string //CustomizeScript string //Favicon string + CheckDown bool ) diff --git a/model/setting.go b/model/setting.go index 96c95e13..b42132ae 100644 --- a/model/setting.go +++ b/model/setting.go @@ -61,6 +61,10 @@ func LoadSettings() { if err == nil { conf.CheckParent = checkParent.Value == "true" } + checkDown,err := GetSettingByKey("check down link") + if err == nil { + conf.CheckDown = checkDown.Value == "true" + } favicon, err := GetSettingByKey("favicon") if err == nil { //conf.Favicon = favicon.Value diff --git a/server/check.go b/server/check.go index d2551d30..234be581 100644 --- a/server/check.go +++ b/server/check.go @@ -2,9 +2,11 @@ package server import ( "fmt" + "github.com/Xhofe/alist/conf" "github.com/Xhofe/alist/model" "github.com/Xhofe/alist/utils" "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" "gorm.io/gorm" "path/filepath" ) @@ -53,3 +55,26 @@ func CheckParent(path string, password string) bool { return CheckParent(filepath.Dir(path), password) } } + +func CheckDownLink(path string, passwordMd5 string) bool { + if !conf.CheckDown { + return true + } + meta, err := model.GetMetaByPath(path) + log.Debugf("check down path: %s", path) + if err == nil { + log.Debugf("check down link: %s,%s", meta.Password, passwordMd5) + if meta.Password != "" && utils.Get16MD5Encode(meta.Password) != passwordMd5 { + return false + } + return true + } else { + if !conf.CheckParent { + return true + } + if path == "/" { + return true + } + return CheckDownLink(filepath.Dir(path), passwordMd5) + } +} diff --git a/server/down.go b/server/down.go index 3b6d028b..5269b63b 100644 --- a/server/down.go +++ b/server/down.go @@ -21,6 +21,11 @@ func Down(c *gin.Context) { } rawPath = utils.ParsePath(rawPath) log.Debugf("down: %s", rawPath) + pw := c.Query("pw") + if !CheckDownLink(filepath.Dir(rawPath), pw) { + ErrorResp(c, fmt.Errorf("wrong password"), 401) + return + } account, path, driver, err := ParsePath(rawPath) if err != nil { ErrorResp(c, err, 500) @@ -52,6 +57,11 @@ func Proxy(c *gin.Context) { } rawPath = utils.ParsePath(rawPath) log.Debugf("proxy: %s", rawPath) + pw := c.Query("pw") + if !CheckDownLink(filepath.Dir(rawPath), pw) { + ErrorResp(c, fmt.Errorf("wrong password"), 401) + return + } account, path, driver, err := ParsePath(rawPath) if err != nil { ErrorResp(c, err, 500) @@ -74,7 +84,7 @@ func Proxy(c *gin.Context) { Text(c, link) return } - driver.Proxy(c,account) + driver.Proxy(c, account) r := c.Request w := c.Writer target, err := url.Parse(link)