diff --git a/drivers/quark_uc/driver.go b/drivers/quark_uc/driver.go index 5d658fb8..c9944345 100644 --- a/drivers/quark_uc/driver.go +++ b/drivers/quark_uc/driver.go @@ -39,7 +39,7 @@ func (d *QuarkOrUC) Init(ctx context.Context) error { if err == nil { if d.AdditionVersion != 2 { d.AdditionVersion = 2 - if !d.UseTransCodingAddress && len(d.DownProxyUrl) == 0 { + if !d.UseTransCodingAddress && len(d.DownProxyURL) == 0 { d.WebProxy = true d.WebdavPolicy = "native_proxy" } diff --git a/internal/model/storage.go b/internal/model/storage.go index e3c7e1f9..1f60667e 100644 --- a/internal/model/storage.go +++ b/internal/model/storage.go @@ -31,7 +31,9 @@ type Proxy struct { WebProxy bool `json:"web_proxy"` WebdavPolicy string `json:"webdav_policy"` ProxyRange bool `json:"proxy_range"` - DownProxyUrl string `json:"down_proxy_url"` + DownProxyURL string `json:"down_proxy_url"` + //Disable sign for DownProxyURL + DisableProxySign bool `json:"disable_proxy_sign"` } func (s *Storage) GetStorage() *Storage { @@ -50,10 +52,6 @@ func (p Proxy) Webdav302() bool { return p.WebdavPolicy == "302_redirect" } -func (p Proxy) WebdavProxy() bool { +func (p Proxy) WebdavProxyURL() bool { return p.WebdavPolicy == "use_proxy_url" } - -func (p Proxy) WebdavNative() bool { - return !p.Webdav302() && !p.WebdavProxy() -} diff --git a/internal/op/driver.go b/internal/op/driver.go index d3fca871..f25b3a6b 100644 --- a/internal/op/driver.go +++ b/internal/op/driver.go @@ -117,6 +117,12 @@ func getMainItems(config driver.Config) []driver.Item { Name: "down_proxy_url", Type: conf.TypeText, }) + items = append(items, driver.Item{ + Name: "disable_proxy_sign", + Type: conf.TypeBool, + Default: "false", + Help: "Disable sign for Download proxy URL", + }) if config.LocalSort { items = append(items, []driver.Item{{ Name: "order_by", diff --git a/server/common/proxy.go b/server/common/proxy.go index 0f3cf656..d352582e 100644 --- a/server/common/proxy.go +++ b/server/common/proxy.go @@ -12,6 +12,7 @@ import ( "github.com/OpenListTeam/OpenList/v4/internal/conf" "github.com/OpenListTeam/OpenList/v4/internal/model" "github.com/OpenListTeam/OpenList/v4/internal/net" + "github.com/OpenListTeam/OpenList/v4/internal/sign" "github.com/OpenListTeam/OpenList/v4/internal/stream" "github.com/OpenListTeam/OpenList/v4/pkg/utils" ) @@ -140,3 +141,18 @@ func (ww *WrittenResponseWriter) Write(p []byte) (int, error) { func (ww *WrittenResponseWriter) IsWritten() bool { return ww.written } + +func GenerateDownProxyURL(storage *model.Storage, reqPath string) string { + if storage.DownProxyURL == "" { + return "" + } + query := "" + if !storage.DisableProxySign { + query = "?sign=" + sign.Sign(reqPath) + } + return fmt.Sprintf("%s%s%s", + strings.Split(storage.DownProxyURL, "\n")[0], + utils.EncodePath(reqPath, true), + query, + ) +} diff --git a/server/handles/down.go b/server/handles/down.go index a8b4a7ed..ed473379 100644 --- a/server/handles/down.go +++ b/server/handles/down.go @@ -6,7 +6,6 @@ import ( "fmt" stdpath "path" "strconv" - "strings" "github.com/OpenListTeam/OpenList/v4/internal/conf" "github.com/OpenListTeam/OpenList/v4/internal/driver" @@ -14,7 +13,6 @@ import ( "github.com/OpenListTeam/OpenList/v4/internal/model" "github.com/OpenListTeam/OpenList/v4/internal/net" "github.com/OpenListTeam/OpenList/v4/internal/setting" - "github.com/OpenListTeam/OpenList/v4/internal/sign" "github.com/OpenListTeam/OpenList/v4/pkg/utils" "github.com/OpenListTeam/OpenList/v4/server/common" "github.com/gin-gonic/gin" @@ -58,15 +56,9 @@ func Proxy(c *gin.Context) { return } if canProxy(storage, filename) { - downProxyUrl := storage.GetStorage().DownProxyUrl - if downProxyUrl != "" { - _, ok := c.GetQuery("d") - if !ok { - URL := fmt.Sprintf("%s%s?sign=%s", - strings.Split(downProxyUrl, "\n")[0], - utils.EncodePath(rawPath, true), - sign.Sign(rawPath)) - c.Redirect(302, URL) + if _, ok := c.GetQuery("d"); !ok { + if url := common.GenerateDownProxyURL(storage.GetStorage(), rawPath); url != "" { + c.Redirect(302, url) return } } @@ -172,7 +164,7 @@ func proxy(c *gin.Context, link *model.Link, file model.Obj, proxyRange bool) { // 4. proxy_types // solution: text_file + shouldProxy() func canProxy(storage driver.Driver, filename string) bool { - if storage.Config().MustProxy() || storage.GetStorage().WebProxy || storage.GetStorage().WebdavProxy() { + if storage.Config().MustProxy() || storage.GetStorage().WebProxy || storage.GetStorage().WebdavProxyURL() { return true } if utils.SliceContains(conf.SlicesMap[conf.ProxyTypes], utils.Ext(filename)) { diff --git a/server/handles/fsread.go b/server/handles/fsread.go index 501fbcf4..2cabada5 100644 --- a/server/handles/fsread.go +++ b/server/handles/fsread.go @@ -285,16 +285,12 @@ func FsGet(c *gin.Context) { return } if storage.Config().MustProxy() || storage.GetStorage().WebProxy { - query := "" - if isEncrypt(meta, reqPath) || setting.GetBool(conf.SignAll) { - query = "?sign=" + sign.Sign(reqPath) - } - if storage.GetStorage().DownProxyUrl != "" { - rawURL = fmt.Sprintf("%s%s?sign=%s", - strings.Split(storage.GetStorage().DownProxyUrl, "\n")[0], - utils.EncodePath(reqPath, true), - sign.Sign(reqPath)) - } else { + rawURL = common.GenerateDownProxyURL(storage.GetStorage(), reqPath) + if rawURL == "" { + query := "" + if isEncrypt(meta, reqPath) || setting.GetBool(conf.SignAll) { + query = "?sign=" + sign.Sign(reqPath) + } rawURL = fmt.Sprintf("%s/p%s%s", common.GetApiUrl(c), utils.EncodePath(reqPath, true), diff --git a/server/webdav/webdav.go b/server/webdav/webdav.go index 8f3cec3d..a4fbf205 100644 --- a/server/webdav/webdav.go +++ b/server/webdav/webdav.go @@ -24,7 +24,6 @@ import ( "github.com/OpenListTeam/OpenList/v4/internal/errs" "github.com/OpenListTeam/OpenList/v4/internal/fs" "github.com/OpenListTeam/OpenList/v4/internal/model" - "github.com/OpenListTeam/OpenList/v4/internal/sign" "github.com/OpenListTeam/OpenList/v4/pkg/utils" "github.com/OpenListTeam/OpenList/v4/server/common" ) @@ -238,37 +237,39 @@ func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (sta } // Let ServeContent determine the Content-Type header. storage, _ := fs.GetStorage(reqPath, &fs.GetStoragesArgs{}) - downProxyUrl := storage.GetStorage().DownProxyUrl - if storage.GetStorage().WebdavNative() || (storage.GetStorage().WebdavProxy() && downProxyUrl == "") { - link, _, err := fs.Link(ctx, reqPath, model.LinkArgs{Header: r.Header}) - if err != nil { - return http.StatusInternalServerError, err - } - defer link.Close() - if storage.GetStorage().ProxyRange { - link = common.ProxyRange(ctx, link, fi.GetSize()) - } - err = common.Proxy(w, r, link, fi) - if err != nil { - if statusCode, ok := errors.Unwrap(err).(net.ErrorHttpStatusCode); ok { - return int(statusCode), err - } - return http.StatusInternalServerError, fmt.Errorf("webdav proxy error: %+v", err) - } - } else if storage.GetStorage().WebdavProxy() && downProxyUrl != "" { - u := fmt.Sprintf("%s%s?sign=%s", - strings.Split(downProxyUrl, "\n")[0], - utils.EncodePath(reqPath, true), - sign.Sign(reqPath)) - w.Header().Set("Cache-Control", "max-age=0, no-cache, no-store, must-revalidate") - http.Redirect(w, r, u, http.StatusFound) - } else { + if storage.GetStorage().Webdav302() { link, _, err := fs.Link(ctx, reqPath, model.LinkArgs{IP: utils.ClientIP(r), Header: r.Header, Redirect: true}) if err != nil { return http.StatusInternalServerError, err } defer link.Close() http.Redirect(w, r, link.URL, http.StatusFound) + return 0, nil + } + + if storage.GetStorage().WebdavProxyURL() { + if url := common.GenerateDownProxyURL(storage.GetStorage(), reqPath); url != "" { + w.Header().Set("Cache-Control", "max-age=0, no-cache, no-store, must-revalidate") + http.Redirect(w, r, url, http.StatusFound) + return 0, nil + } + } + + link, _, err := fs.Link(ctx, reqPath, model.LinkArgs{Header: r.Header}) + if err != nil { + return http.StatusInternalServerError, err + } + defer link.Close() + + if storage.GetStorage().ProxyRange { + link = common.ProxyRange(ctx, link, fi.GetSize()) + } + err = common.Proxy(w, r, link, fi) + if err != nil { + if statusCode, ok := errors.Unwrap(err).(net.ErrorHttpStatusCode); ok { + return int(statusCode), err + } + return http.StatusInternalServerError, fmt.Errorf("webdav proxy error: %+v", err) } return 0, nil }