diff --git a/drivers/base/driver.go b/drivers/base/driver.go index cd4270aa..e4e6f059 100644 --- a/drivers/base/driver.go +++ b/drivers/base/driver.go @@ -84,13 +84,18 @@ func GetDrivers() map[string][]Item { }, }, v.Items()...) } - res[k] = append(res[k], Item{ - Name: "proxy_url", - Label: "proxy_url", - Type: TypeString, - Required: false, - Description: "proxy url", - }) + res[k] = append([]Item{ + { + Name: "down_proxy_url", + Label: "down_proxy_url", + Type: TypeString, + }, + { + Name: "api_proxy_url", + Label: "api_proxy_url", + Type: TypeString, + }, + }, res[k]...) } return res } diff --git a/drivers/pikpak/pikpak.go b/drivers/pikpak/pikpak.go index abe86b2d..b020b662 100644 --- a/drivers/pikpak/pikpak.go +++ b/drivers/pikpak/pikpak.go @@ -2,6 +2,7 @@ package pikpak import ( "errors" + "fmt" "github.com/Xhofe/alist/conf" "github.com/Xhofe/alist/drivers/base" "github.com/Xhofe/alist/model" @@ -20,6 +21,10 @@ type RespErr struct { } func (driver PikPak) Login(account *model.Account) error { + url := "https://user.mypikpak.com/v1/auth/signin" + if account.APIProxyUrl != "" { + url = fmt.Sprintf("%s/%s", account.APIProxyUrl, url) + } var e RespErr res, err := base.RestyClient.R().SetError(&e).SetBody(base.Json{ "captcha_token": "", @@ -27,11 +32,12 @@ func (driver PikPak) Login(account *model.Account) error { "client_secret": "dbw2OtmVEeuUvIptb1Coyg", "username": account.Username, "password": account.Password, - }).Post("https://user.mypikpak.com/v1/auth/signin") + }).Post(url) if err != nil { account.Status = err.Error() return err } + log.Debug(res.String()) if e.ErrorCode != 0 { account.Status = e.Error return errors.New(e.Error) @@ -44,13 +50,17 @@ func (driver PikPak) Login(account *model.Account) error { } func (driver PikPak) RefreshToken(account *model.Account) error { + url := "https://user.mypikpak.com/v1/auth/token" + if account.APIProxyUrl != "" { + url = fmt.Sprintf("%s/%s", account.APIProxyUrl, url) + } var e RespErr res, err := base.RestyClient.R().SetError(&e).SetBody(base.Json{ "client_id": "YNxT9w7GMdWvEOKa", "client_secret": "dbw2OtmVEeuUvIptb1Coyg", "grant_type": "refresh_token", "refresh_token": account.RefreshToken, - }).Post("https://user.mypikpak.com/v1/auth/token") + }).Post(url) if err != nil { account.Status = err.Error() return err @@ -69,6 +79,9 @@ func (driver PikPak) RefreshToken(account *model.Account) error { } func (driver PikPak) Request(url string, method int, query map[string]string, data *base.Json, resp interface{}, account *model.Account) ([]byte, error) { + if account.APIProxyUrl != "" { + url = fmt.Sprintf("%s/%s", account.APIProxyUrl, url) + } req := base.RestyClient.R() req.SetHeader("Authorization", "Bearer "+account.AccessToken) if query != nil { @@ -97,6 +110,7 @@ func (driver PikPak) Request(url string, method int, query map[string]string, da if err != nil { return nil, err } + log.Debug(res.String()) if e.ErrorCode != 0 { if e.ErrorCode == 16 { // login / refresh token diff --git a/model/account.go b/model/account.go index 96e7cabc..f4df5bb2 100644 --- a/model/account.go +++ b/model/account.go @@ -31,10 +31,11 @@ type Account struct { SiteUrl string `json:"site_url"` SiteId string `json:"site_id"` InternalType string `json:"internal_type"` - WebdavProxy bool `json:"webdav_proxy"` - Proxy bool `json:"proxy"` // 是否中转 + WebdavProxy bool `json:"webdav_proxy"` // 开启之后只会webdav走中转 + Proxy bool `json:"proxy"` // 是否中转,开启之后web和webdav都会走中转 //AllowProxy bool `json:"allow_proxy"` // 是否允许中转下载 - ProxyUrl string `json:"proxy_url"` // 用于中转下载服务的URL + DownProxyUrl string `json:"down_proxy_url"` // 用于中转下载服务的URL 两处 1. path请求中返回的链接 2. down下载时进行302 + APIProxyUrl string `json:"api_proxy_url"` // 用于中转api的地址 } var accountsMap = map[string]Account{} diff --git a/server/controllers/down.go b/server/controllers/down.go index d13d1b2f..ad4df0f5 100644 --- a/server/controllers/down.go +++ b/server/controllers/down.go @@ -48,18 +48,26 @@ func Proxy(c *gin.Context) { common.ErrorResp(c, err, 500) return } - // 只有三种情况允许中转: + // 只有以下几种情况允许中转: // 1. 账号开启中转 // 2. driver只能中转 // 3. 是文本类型文件 + // 4. 开启webdav中转(需要验证sign) if !account.Proxy && !driver.Config().OnlyProxy && utils.GetFileType(filepath.Ext(rawPath)) != conf.TEXT { - common.ErrorResp(c, fmt.Errorf("[%s] not allowed proxy", account.Name), 403) - return + // 只开启了webdav中转,验证sign + ok := false + if account.WebdavProxy { + _, ok = c.Get("sign") + } + if !ok { + common.ErrorResp(c, fmt.Errorf("[%s] not allowed proxy", account.Name), 403) + return + } } // 中转时有中转机器使用中转机器,若携带标志位则表明不能再走中转机器了 - if account.ProxyUrl != "" && c.Param("d") != "1" { + if account.DownProxyUrl != "" && c.Param("d") != "1" { name := utils.Base(rawPath) - link := fmt.Sprintf("%s%s?sign=%s", account.ProxyUrl, rawPath, utils.SignWithToken(name, conf.Token)) + link := fmt.Sprintf("%s%s?sign=%s", account.DownProxyUrl, rawPath, utils.SignWithToken(name, conf.Token)) c.Redirect(302, link) return } diff --git a/server/controllers/path.go b/server/controllers/path.go index 0dbfec49..a7434c49 100644 --- a/server/controllers/path.go +++ b/server/controllers/path.go @@ -41,8 +41,8 @@ func Path(c *gin.Context) { if file != nil { // 对于中转文件或只能中转,将链接修改为中转链接 if driver.Config().OnlyProxy || account.Proxy { - if account.ProxyUrl != "" { - file.Url = fmt.Sprintf("%s%s?sign=%s", account.ProxyUrl, req.Path, utils.SignWithToken(file.Name, conf.Token)) + if account.DownProxyUrl != "" { + file.Url = fmt.Sprintf("%s%s?sign=%s", account.DownProxyUrl, req.Path, utils.SignWithToken(file.Name, conf.Token)) } else { file.Url = fmt.Sprintf("//%s/d%s", c.Request.Host, req.Path) } diff --git a/server/middlewares/down.go b/server/middlewares/down.go index e6856549..a8409441 100644 --- a/server/middlewares/down.go +++ b/server/middlewares/down.go @@ -14,6 +14,7 @@ func DownCheck(c *gin.Context) { rawPath = utils.ParsePath(rawPath) name := utils.Base(rawPath) if sign == utils.SignWithToken(name, conf.Token) { + c.Set("sign", true) c.Next() return } @@ -24,4 +25,4 @@ func DownCheck(c *gin.Context) { return } c.Next() -} \ No newline at end of file +}