diff --git a/drivers/base/driver.go b/drivers/base/driver.go index eb1d8609..ddaf41f4 100644 --- a/drivers/base/driver.go +++ b/drivers/base/driver.go @@ -61,12 +61,19 @@ func GetDrivers() map[string][]Item { res[k] = v.Items() } else { res[k] = append([]Item{ + //{ + // Name: "allow_proxy", + // Label: "allow_proxy", + // Type: TypeBool, + // Required: true, + // Description: "allow proxy", + //}, { Name: "proxy", Label: "proxy", Type: TypeBool, Required: true, - Description: "allow proxy", + Description: "web proxy", }, { Name: "webdav_proxy", @@ -77,6 +84,13 @@ 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", + }) } return res } diff --git a/model/account.go b/model/account.go index 56ca5846..afdd881f 100644 --- a/model/account.go +++ b/model/account.go @@ -7,22 +7,21 @@ import ( ) type Account struct { - ID uint `json:"id" gorm:"primaryKey"` - Name string `json:"name" gorm:"unique" binding:"required"` - Index int `json:"index"` - Type string `json:"type"` + ID uint `json:"id" gorm:"primaryKey"` // 唯一ID + Name string `json:"name" gorm:"unique" binding:"required"` // 唯一名称 + Index int `json:"index"` // 序号 用于排序 + Type string `json:"type"` // 类型,即driver Username string `json:"username"` Password string `json:"password"` RefreshToken string `json:"refresh_token"` AccessToken string `json:"access_token"` RootFolder string `json:"root_folder"` - Status string `json:"status"` + Status string `json:"status"` // 状态 CronId int DriveId string Limit int `json:"limit"` OrderBy string `json:"order_by"` OrderDirection string `json:"order_direction"` - Proxy bool `json:"proxy"` UpdatedAt *time.Time `json:"updated_at"` Search bool `json:"search"` ClientId string `json:"client_id"` @@ -33,8 +32,9 @@ type Account struct { SiteId string `json:"site_id"` OnedriveType string `json:"onedrive_type"` WebdavProxy bool `json:"webdav_proxy"` - AllowProxy bool `json:"allow_proxy"` - ProxyUrl string `json:"proxy_url"` + Proxy bool `json:"proxy"` // 是否中转 + //AllowProxy bool `json:"allow_proxy"` // 是否允许中转下载 + ProxyUrl string `json:"proxy_url"` // 用于中转下载服务的URL } var accountsMap = map[string]Account{} diff --git a/server/controllers/down.go b/server/controllers/down.go index 67622846..82ba968d 100644 --- a/server/controllers/down.go +++ b/server/controllers/down.go @@ -47,22 +47,29 @@ func Proxy(c *gin.Context) { common.ErrorResp(c, err, 500) return } + // 只有三种情况允许中转: + // 1. 账号开启中转 + // 2. driver只能中转 + // 3. 是文本类型文件 + 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 + } + // 中转时有中转机器使用中转机器 if account.ProxyUrl != "" { name := utils.Base(rawPath) link := fmt.Sprintf("%s%s?sign=%s", account.ProxyUrl, rawPath, utils.SignWithToken(name, conf.Token)) c.Redirect(302, link) return } - if !account.Proxy && utils.GetFileType(filepath.Ext(rawPath)) != conf.TEXT { - common.ErrorResp(c, fmt.Errorf("[%s] not allowed proxy", account.Name), 403) - return - } link, err := driver.Link(path, account) if err != nil { common.ErrorResp(c, err, 500) return } + // 本机文件直接返回文件 if account.Type == "Native" { + // 对于名称为index.html的文件需要特殊处理 if utils.Base(rawPath) == "index.html" { file, err := os.Open(link) if err != nil { diff --git a/server/controllers/path.go b/server/controllers/path.go index 8438b3cb..6585e4cc 100644 --- a/server/controllers/path.go +++ b/server/controllers/path.go @@ -2,6 +2,7 @@ package controllers import ( "fmt" + "github.com/Xhofe/alist/conf" "github.com/Xhofe/alist/model" "github.com/Xhofe/alist/server/common" "github.com/Xhofe/alist/utils" @@ -37,8 +38,13 @@ func Path(c *gin.Context) { return } if file != nil { - if driver.Config().OnlyProxy { - file.Url = fmt.Sprintf("//%s/d%s", c.Request.Host, req.Path) + // 对于中转文件或只能中转,将链接修改为中转链接 + 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)) + }else { + file.Url = fmt.Sprintf("//%s/d%s", c.Request.Host, req.Path) + } } c.JSON(200, common.Resp{ Code: 200,