From 5ed43fd17d7b4ea15fbc7fd9731a05f2da842e1b Mon Sep 17 00:00:00 2001 From: Noah Hsu Date: Sat, 10 Sep 2022 13:54:10 +0800 Subject: [PATCH] fix(123): pass ip when getting download link --- drivers/123/driver.go | 46 ++++++++++++++++++++++++++++++++++++++++--- pkg/utils/ip.go | 23 ++++++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/drivers/123/driver.go b/drivers/123/driver.go index f400b679..18fd0a6b 100644 --- a/drivers/123/driver.go +++ b/drivers/123/driver.go @@ -9,6 +9,7 @@ import ( "fmt" "io" "net/http" + "net/url" "os" "github.com/alist-org/alist/v3/drivers/base" @@ -22,6 +23,7 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3/s3manager" "github.com/go-resty/resty/v2" + log "github.com/sirupsen/logrus" ) type Pan123 struct { @@ -68,9 +70,47 @@ func (d *Pan123) List(ctx context.Context, dir model.Obj, args model.ListArgs) ( func (d *Pan123) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { if f, ok := file.(File); ok { - return &model.Link{ - URL: f.DownloadUrl, - }, nil + var resp DownResp + var headers map[string]string + if !utils.IsLocalIPAddr(args.IP) { + headers = map[string]string{ + //"X-Real-IP": "1.1.1.1", + "X-Forwarded-For": args.IP, + } + } + data := base.Json{ + "driveId": 0, + "etag": f.Etag, + "fileId": f.FileId, + "fileName": f.FileName, + "s3keyFlag": f.S3KeyFlag, + "size": f.Size, + "type": f.Type, + } + _, err := d.request("https://www.123pan.com/api/file/download_info", http.MethodPost, func(req *resty.Request) { + req.SetBody(data).SetHeaders(headers) + }, &resp) + if err != nil { + return nil, err + } + u, err := url.Parse(resp.Data.DownloadUrl) + if err != nil { + return nil, err + } + u_ := fmt.Sprintf("https://%s%s", u.Host, u.Path) + res, err := base.NoRedirectClient.R().SetQueryParamsFromValues(u.Query()).Head(u_) + if err != nil { + return nil, err + } + log.Debug(res.String()) + link := model.Link{ + URL: resp.Data.DownloadUrl, + } + log.Debugln("res code: ", res.StatusCode()) + if res.StatusCode() == 302 { + link.URL = res.Header().Get("location") + } + return &link, nil } else { return nil, fmt.Errorf("can't convert obj") } diff --git a/pkg/utils/ip.go b/pkg/utils/ip.go index a8b7df37..5d108179 100644 --- a/pkg/utils/ip.go +++ b/pkg/utils/ip.go @@ -24,3 +24,26 @@ func ClientIP(r *http.Request) string { return "" } + +func IsLocalIPAddr(ip string) bool { + return IsLocalIP(net.ParseIP(ip)) +} + +func IsLocalIP(ip net.IP) bool { + if ip == nil { + return false + } + if ip.IsLoopback() { + return true + } + + ip4 := ip.To4() + if ip4 == nil { + return false + } + + return ip4[0] == 10 || // 10.0.0.0/8 + (ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31) || // 172.16.0.0/12 + (ip4[0] == 169 && ip4[1] == 254) || // 169.254.0.0/16 + (ip4[0] == 192 && ip4[1] == 168) // 192.168.0.0/16 +}