From 7a9543c75b9a16eef99f7437dda4db248be40eba Mon Sep 17 00:00:00 2001 From: foxxorcat <95907542+foxxorcat@users.noreply.github.com> Date: Tue, 2 Jan 2024 15:41:32 +0800 Subject: [PATCH] fix(115): support null `UserAgent` (#5787) --- drivers/115/driver.go | 6 +--- drivers/115/util.go | 70 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 65 insertions(+), 11 deletions(-) diff --git a/drivers/115/driver.go b/drivers/115/driver.go index 96bf9d458370..57b6c45f9e7d 100644 --- a/drivers/115/driver.go +++ b/drivers/115/driver.go @@ -64,11 +64,7 @@ func (d *Pan115) Link(ctx context.Context, file model.Obj, args model.LinkArgs) return nil, err } var userAgent = args.Header.Get("User-Agent") - if userAgent == "" { - userAgent = driver115.UA115Browser - } - - downloadInfo, err := d.client. + downloadInfo, err := d. DownloadWithUA(file.(*FileObj).PickCode, userAgent) if err != nil { return nil, err diff --git a/drivers/115/util.go b/drivers/115/util.go index 8e638d79a6a1..fb425c8eef73 100644 --- a/drivers/115/util.go +++ b/drivers/115/util.go @@ -5,12 +5,8 @@ import ( "crypto/tls" "encoding/json" "fmt" - "github.com/alist-org/alist/v3/internal/model" - "github.com/alist-org/alist/v3/pkg/http_range" - "github.com/alist-org/alist/v3/pkg/utils" - "github.com/aliyun/aliyun-oss-go-sdk/oss" - "github.com/orzogc/fake115uploader/cipher" "io" + "net/http" "net/url" "path/filepath" "strconv" @@ -18,8 +14,15 @@ import ( "sync" "time" - driver115 "github.com/SheltonZhu/115driver/pkg/driver" "github.com/alist-org/alist/v3/internal/conf" + "github.com/alist-org/alist/v3/internal/model" + "github.com/alist-org/alist/v3/pkg/http_range" + "github.com/alist-org/alist/v3/pkg/utils" + "github.com/aliyun/aliyun-oss-go-sdk/oss" + + driver115 "github.com/SheltonZhu/115driver/pkg/driver" + crypto "github.com/gaoyb7/115drive-webdav/115" + "github.com/orzogc/fake115uploader/cipher" "github.com/pkg/errors" ) @@ -74,6 +77,61 @@ const ( appVer = "2.0.3.6" ) +func (c *Pan115) DownloadWithUA(pickCode, ua string) (*driver115.DownloadInfo, error) { + key := crypto.GenerateKey() + result := driver115.DownloadResp{} + params, err := utils.Json.Marshal(map[string]string{"pickcode": pickCode}) + if err != nil { + return nil, err + } + + data := crypto.Encode(params, key) + + bodyReader := strings.NewReader(url.Values{"data": []string{data}}.Encode()) + reqUrl := fmt.Sprintf("%s?t=%s", driver115.ApiDownloadGetUrl, driver115.Now().String()) + req, _ := http.NewRequest(http.MethodPost, reqUrl, bodyReader) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Cookie", c.Cookie) + req.Header.Set("User-Agent", ua) + + resp, err := c.client.Client.GetClient().Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + if err := utils.Json.Unmarshal(body, &result); err != nil { + return nil, err + } + + if err = result.Err(string(body)); err != nil { + return nil, err + } + + bytes, err := crypto.Decode(string(result.EncodedData), key) + if err != nil { + return nil, err + } + + downloadInfo := driver115.DownloadData{} + if err := utils.Json.Unmarshal(bytes, &downloadInfo); err != nil { + return nil, err + } + + for _, info := range downloadInfo { + if info.FileSize < 0 { + return nil, driver115.ErrDownloadEmpty + } + info.Header = resp.Request.Header + return info, nil + } + return nil, driver115.ErrUnexpected +} + func (d *Pan115) rapidUpload(fileSize int64, fileName, dirID, preID, fileID string, stream model.FileStreamer) (*driver115.UploadInitResp, error) { var ( ecdhCipher *cipher.EcdhCipher