From 555ef0eb1aad5e68f1b4e6fcbe04c04219f6f7f5 Mon Sep 17 00:00:00 2001 From: Andy Hsu Date: Wed, 10 Jan 2024 16:58:10 +0800 Subject: [PATCH] feat: add `feijipan` driver (close #5856) --- drivers/ilanzou/driver.go | 22 +++++++------ drivers/ilanzou/meta.go | 65 +++++++++++++++++++++++++++++++-------- drivers/ilanzou/util.go | 20 ++++-------- 3 files changed, 70 insertions(+), 37 deletions(-) diff --git a/drivers/ilanzou/driver.go b/drivers/ilanzou/driver.go index 85ba27e2e23..434994d89f9 100644 --- a/drivers/ilanzou/driver.go +++ b/drivers/ilanzou/driver.go @@ -30,10 +30,12 @@ type ILanZou struct { userID string account string upClient *resty.Client + conf Conf + config driver.Config } func (d *ILanZou) Config() driver.Config { - return config + return d.config } func (d *ILanZou) GetAddition() driver.Additional { @@ -123,19 +125,19 @@ func (d *ILanZou) Link(ctx context.Context, file model.Obj, args model.LinkArgs) query.Set("devModel", "chrome") query.Set("devVersion", "120") query.Set("appVersion", "") - ts, err := getTimestamp() + ts, err := getTimestamp(d.conf.secret) if err != nil { return nil, err } query.Set("timestamp", ts) //query.Set("appToken", d.Token) query.Set("enable", "1") - downloadId, err := mopan.AesEncrypt([]byte(fmt.Sprintf("%s|%s", file.GetID(), d.userID)), AesSecret) + downloadId, err := mopan.AesEncrypt([]byte(fmt.Sprintf("%s|%s", file.GetID(), d.userID)), d.conf.secret) if err != nil { return nil, err } query.Set("downloadId", hex.EncodeToString(downloadId)) - auth, err := mopan.AesEncrypt([]byte(fmt.Sprintf("%s|%d", file.GetID(), time.Now().UnixMilli())), AesSecret) + auth, err := mopan.AesEncrypt([]byte(fmt.Sprintf("%s|%d", file.GetID(), time.Now().UnixMilli())), d.conf.secret) if err != nil { return nil, err } @@ -281,7 +283,7 @@ func (d *ILanZou) Put(ctx context.Context, dstDir model.Obj, stream model.FileSt now := time.Now() key := fmt.Sprintf("disk/%d/%d/%d/%s/%016d", now.Year(), now.Month(), now.Day(), d.account, now.UnixMilli()) var token string - if stream.GetSize() > DefaultPartSize { + if stream.GetSize() <= DefaultPartSize { res, err := d.upClient.R().SetMultipartFormData(map[string]string{ "token": upToken, "key": key, @@ -294,7 +296,7 @@ func (d *ILanZou) Put(ctx context.Context, dstDir model.Obj, stream model.FileSt token = utils.Json.Get(res.Body(), "token").ToString() } else { keyBase64 := base64.URLEncoding.EncodeToString([]byte(key)) - res, err := d.upClient.R().Post(fmt.Sprintf("https://upload.qiniup.com/buckets/wpanstore-lanzou/objects/%s/uploads", keyBase64)) + res, err := d.upClient.R().SetHeader("Authorization", "UpToken "+upToken).Post(fmt.Sprintf("https://upload.qiniup.com/buckets/%s/objects/%s/uploads", d.conf.bucket, keyBase64)) if err != nil { return nil, err } @@ -302,8 +304,8 @@ func (d *ILanZou) Put(ctx context.Context, dstDir model.Obj, stream model.FileSt parts := make([]Part, 0) partNum := (stream.GetSize() + DefaultPartSize - 1) / DefaultPartSize for i := 1; i <= int(partNum); i++ { - u := fmt.Sprintf("https://upload.qiniup.com/buckets/wpanstore-lanzou/objects/%s/uploads/%s/%d", keyBase64, uploadId, i) - res, err = d.upClient.R().SetBody(io.LimitReader(tempFile, DefaultPartSize)).Put(u) + u := fmt.Sprintf("https://upload.qiniup.com/buckets/%s/objects/%s/uploads/%s/%d", d.conf.bucket, keyBase64, uploadId, i) + res, err = d.upClient.R().SetHeader("Authorization", "UpToken "+upToken).SetBody(io.LimitReader(tempFile, DefaultPartSize)).Put(u) if err != nil { return nil, err } @@ -313,10 +315,10 @@ func (d *ILanZou) Put(ctx context.Context, dstDir model.Obj, stream model.FileSt ETag: etag, }) } - res, err = d.upClient.R().SetBody(base.Json{ + res, err = d.upClient.R().SetHeader("Authorization", "UpToken "+upToken).SetBody(base.Json{ "fnmae": stream.GetName(), "parts": parts, - }).Post(fmt.Sprintf("https://upload.qiniup.com/buckets/wpanstore-lanzou/objects/%s/uploads/%s", keyBase64, uploadId)) + }).Post(fmt.Sprintf("https://upload.qiniup.com/buckets/%s/objects/%s/uploads/%s", d.conf.bucket, keyBase64, uploadId)) if err != nil { return nil, err } diff --git a/drivers/ilanzou/meta.go b/drivers/ilanzou/meta.go index 44adbf0a6f7..f7c61e5a7fe 100644 --- a/drivers/ilanzou/meta.go +++ b/drivers/ilanzou/meta.go @@ -14,22 +14,61 @@ type Addition struct { UUID string } -var config = driver.Config{ - Name: "ILanZou", - LocalSort: false, - OnlyLocal: false, - OnlyProxy: false, - NoCache: false, - NoUpload: false, - NeedMs: false, - DefaultRoot: "0", - CheckStatus: false, - Alert: "", - NoOverwriteUpload: false, +type Conf struct { + base string + secret []byte + bucket string + unproved string + proved string } func init() { op.RegisterDriver(func() driver.Driver { - return &ILanZou{} + return &ILanZou{ + config: driver.Config{ + Name: "ILanZou", + LocalSort: false, + OnlyLocal: false, + OnlyProxy: false, + NoCache: false, + NoUpload: false, + NeedMs: false, + DefaultRoot: "0", + CheckStatus: false, + Alert: "", + NoOverwriteUpload: false, + }, + conf: Conf{ + base: "https://api.ilanzou.com", + secret: []byte("lanZouY-disk-app"), + bucket: "wpanstore-lanzou", + unproved: "unproved", + proved: "proved", + }, + } + }) + op.RegisterDriver(func() driver.Driver { + return &ILanZou{ + config: driver.Config{ + Name: "FeijiPan", + LocalSort: false, + OnlyLocal: false, + OnlyProxy: false, + NoCache: false, + NoUpload: false, + NeedMs: false, + DefaultRoot: "0", + CheckStatus: false, + Alert: "", + NoOverwriteUpload: false, + }, + conf: Conf{ + base: "https://api.feijipan.com", + secret: []byte("dingHao-disk-app"), + bucket: "wpanstore", + unproved: "ws", + proved: "app", + }, + } }) } diff --git a/drivers/ilanzou/util.go b/drivers/ilanzou/util.go index 2ccaf52e165..d8995523ea0 100644 --- a/drivers/ilanzou/util.go +++ b/drivers/ilanzou/util.go @@ -14,14 +14,6 @@ import ( log "github.com/sirupsen/logrus" ) -const ( - Base = "https://api.ilanzou.com" -) - -var ( - AesSecret = []byte("lanZouY-disk-app") -) - func (d *ILanZou) login() error { res, err := d.unproved("/login", http.MethodPost, func(req *resty.Request) { req.SetBody(base.Json{ @@ -39,10 +31,10 @@ func (d *ILanZou) login() error { return nil } -func getTimestamp() (string, error) { +func getTimestamp(secret []byte) (string, error) { ts := time.Now().UnixMilli() tsStr := strconv.FormatInt(ts, 10) - res, err := mopan.AesEncrypt([]byte(tsStr), AesSecret) + res, err := mopan.AesEncrypt([]byte(tsStr), secret) if err != nil { return "", err } @@ -51,7 +43,7 @@ func getTimestamp() (string, error) { func (d *ILanZou) request(pathname, method string, callback base.ReqCallback, proved bool, retry ...bool) ([]byte, error) { req := base.RestyClient.R() - ts, err := getTimestamp() + ts, err := getTimestamp(d.conf.secret) if err != nil { return nil, err } @@ -72,7 +64,7 @@ func (d *ILanZou) request(pathname, method string, callback base.ReqCallback, pr if callback != nil { callback(req) } - res, err := req.Execute(method, Base+pathname) + res, err := req.Execute(method, d.conf.base+pathname) if err != nil { if res != nil { log.Errorf("[iLanZou] request error: %s", res.String()) @@ -97,9 +89,9 @@ func (d *ILanZou) request(pathname, method string, callback base.ReqCallback, pr } func (d *ILanZou) unproved(pathname, method string, callback base.ReqCallback) ([]byte, error) { - return d.request("/unproved"+pathname, method, callback, false) + return d.request("/"+d.conf.unproved+pathname, method, callback, false) } func (d *ILanZou) proved(pathname, method string, callback base.ReqCallback) ([]byte, error) { - return d.request("/proved"+pathname, method, callback, true) + return d.request("/"+d.conf.proved+pathname, method, callback, true) }