-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(onedrive): support application authorization method (#3906)
- Loading branch information
Showing
5 changed files
with
459 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
package onedrive_app | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
"net/http" | ||
"path" | ||
|
||
"github.com/alist-org/alist/v3/drivers/base" | ||
"github.com/alist-org/alist/v3/internal/driver" | ||
"github.com/alist-org/alist/v3/internal/errs" | ||
"github.com/alist-org/alist/v3/internal/model" | ||
"github.com/alist-org/alist/v3/pkg/utils" | ||
"github.com/go-resty/resty/v2" | ||
) | ||
|
||
type OnedriveAPP struct { | ||
model.Storage | ||
Addition | ||
AccessToken string | ||
} | ||
|
||
func (d *OnedriveAPP) Config() driver.Config { | ||
return config | ||
} | ||
|
||
func (d *OnedriveAPP) GetAddition() driver.Additional { | ||
return &d.Addition | ||
} | ||
|
||
func (d *OnedriveAPP) Init(ctx context.Context) error { | ||
if d.ChunkSize < 1 { | ||
d.ChunkSize = 5 | ||
} | ||
return d.accessToken() | ||
} | ||
|
||
func (d *OnedriveAPP) Drop(ctx context.Context) error { | ||
return nil | ||
} | ||
|
||
func (d *OnedriveAPP) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) { | ||
files, err := d.getFiles(dir.GetPath()) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return utils.SliceConvert(files, func(src File) (model.Obj, error) { | ||
return fileToObj(src, dir.GetID()), nil | ||
}) | ||
} | ||
|
||
func (d *OnedriveAPP) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { | ||
f, err := d.GetFile(file.GetPath()) | ||
if err != nil { | ||
return nil, err | ||
} | ||
if f.File == nil { | ||
return nil, errs.NotFile | ||
} | ||
return &model.Link{ | ||
URL: f.Url, | ||
}, nil | ||
} | ||
|
||
func (d *OnedriveAPP) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error { | ||
url := d.GetMetaUrl(false, parentDir.GetPath()) + "/children" | ||
data := base.Json{ | ||
"name": dirName, | ||
"folder": base.Json{}, | ||
"@microsoft.graph.conflictBehavior": "rename", | ||
} | ||
_, err := d.Request(url, http.MethodPost, func(req *resty.Request) { | ||
req.SetBody(data) | ||
}, nil) | ||
return err | ||
} | ||
|
||
func (d *OnedriveAPP) Move(ctx context.Context, srcObj, dstDir model.Obj) error { | ||
parentPath := "" | ||
if dstDir.GetID() == "" { | ||
parentPath = dstDir.GetPath() | ||
if utils.PathEqual(parentPath, "/") { | ||
parentPath = path.Join("/drive/root", parentPath) | ||
} else { | ||
parentPath = path.Join("/drive/root:/", parentPath) | ||
} | ||
} | ||
data := base.Json{ | ||
"parentReference": base.Json{ | ||
"id": dstDir.GetID(), | ||
"path": parentPath, | ||
}, | ||
"name": srcObj.GetName(), | ||
} | ||
url := d.GetMetaUrl(false, srcObj.GetPath()) | ||
_, err := d.Request(url, http.MethodPatch, func(req *resty.Request) { | ||
req.SetBody(data) | ||
}, nil) | ||
return err | ||
} | ||
|
||
func (d *OnedriveAPP) Rename(ctx context.Context, srcObj model.Obj, newName string) error { | ||
var parentID string | ||
if o, ok := srcObj.(*Object); ok { | ||
parentID = o.ParentID | ||
} else { | ||
return fmt.Errorf("srcObj is not Object") | ||
} | ||
if parentID == "" { | ||
parentID = "root" | ||
} | ||
data := base.Json{ | ||
"parentReference": base.Json{ | ||
"id": parentID, | ||
}, | ||
"name": newName, | ||
} | ||
url := d.GetMetaUrl(false, srcObj.GetPath()) | ||
_, err := d.Request(url, http.MethodPatch, func(req *resty.Request) { | ||
req.SetBody(data) | ||
}, nil) | ||
return err | ||
} | ||
|
||
func (d *OnedriveAPP) Copy(ctx context.Context, srcObj, dstDir model.Obj) error { | ||
dst, err := d.GetFile(dstDir.GetPath()) | ||
if err != nil { | ||
return err | ||
} | ||
data := base.Json{ | ||
"parentReference": base.Json{ | ||
"driveId": dst.ParentReference.DriveId, | ||
"id": dst.Id, | ||
}, | ||
"name": srcObj.GetName(), | ||
} | ||
url := d.GetMetaUrl(false, srcObj.GetPath()) + "/copy" | ||
_, err = d.Request(url, http.MethodPost, func(req *resty.Request) { | ||
req.SetBody(data) | ||
}, nil) | ||
return err | ||
} | ||
|
||
func (d *OnedriveAPP) Remove(ctx context.Context, obj model.Obj) error { | ||
url := d.GetMetaUrl(false, obj.GetPath()) | ||
_, err := d.Request(url, http.MethodDelete, nil, nil) | ||
return err | ||
} | ||
|
||
func (d *OnedriveAPP) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error { | ||
var err error | ||
if stream.GetSize() <= 4*1024*1024 { | ||
err = d.upSmall(ctx, dstDir, stream) | ||
} else { | ||
err = d.upBig(ctx, dstDir, stream, up) | ||
} | ||
return err | ||
} | ||
|
||
var _ driver.Driver = (*OnedriveAPP)(nil) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package onedrive_app | ||
|
||
import ( | ||
"github.com/alist-org/alist/v3/internal/driver" | ||
"github.com/alist-org/alist/v3/internal/op" | ||
) | ||
|
||
type Addition struct { | ||
driver.RootPath | ||
Region string `json:"region" type:"select" required:"true" options:"global,cn,us,de" default:"global"` | ||
ClientID string `json:"client_id" required:"true"` | ||
ClientSecret string `json:"client_secret" required:"true"` | ||
TenantID string `json:"tenant_id"` | ||
Email string `json:"email"` | ||
ChunkSize int64 `json:"chunk_size" type:"number" default:"5"` | ||
} | ||
|
||
var config = driver.Config{ | ||
Name: "OnedriveAPP", | ||
LocalSort: true, | ||
DefaultRoot: "/", | ||
} | ||
|
||
func init() { | ||
op.RegisterDriver(func() driver.Driver { | ||
return &OnedriveAPP{} | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
package onedrive_app | ||
|
||
import ( | ||
"time" | ||
|
||
"github.com/alist-org/alist/v3/internal/model" | ||
) | ||
|
||
type Host struct { | ||
Oauth string | ||
Api string | ||
} | ||
|
||
type TokenErr struct { | ||
Error string `json:"error"` | ||
ErrorDescription string `json:"error_description"` | ||
} | ||
|
||
type RespErr struct { | ||
Error struct { | ||
Code string `json:"code"` | ||
Message string `json:"message"` | ||
} `json:"error"` | ||
} | ||
|
||
type File struct { | ||
Id string `json:"id"` | ||
Name string `json:"name"` | ||
Size int64 `json:"size"` | ||
LastModifiedDateTime time.Time `json:"lastModifiedDateTime"` | ||
Url string `json:"@microsoft.graph.downloadUrl"` | ||
File *struct { | ||
MimeType string `json:"mimeType"` | ||
} `json:"file"` | ||
Thumbnails []struct { | ||
Medium struct { | ||
Url string `json:"url"` | ||
} `json:"medium"` | ||
} `json:"thumbnails"` | ||
ParentReference struct { | ||
DriveId string `json:"driveId"` | ||
} `json:"parentReference"` | ||
} | ||
|
||
type Object struct { | ||
model.ObjThumb | ||
ParentID string | ||
} | ||
|
||
func fileToObj(f File, parentID string) *Object { | ||
thumb := "" | ||
if len(f.Thumbnails) > 0 { | ||
thumb = f.Thumbnails[0].Medium.Url | ||
} | ||
return &Object{ | ||
ObjThumb: model.ObjThumb{ | ||
Object: model.Object{ | ||
ID: f.Id, | ||
Name: f.Name, | ||
Size: f.Size, | ||
Modified: f.LastModifiedDateTime, | ||
IsFolder: f.File == nil, | ||
}, | ||
Thumbnail: model.Thumbnail{Thumbnail: thumb}, | ||
//Url: model.Url{Url: f.Url}, | ||
}, | ||
ParentID: parentID, | ||
} | ||
} | ||
|
||
type Files struct { | ||
Value []File `json:"value"` | ||
NextLink string `json:"@odata.nextLink"` | ||
} |
Oops, something went wrong.