diff --git a/drivers/onedrive/driver.go b/drivers/onedrive/driver.go index efce767e0..559a73f89 100644 --- a/drivers/onedrive/driver.go +++ b/drivers/onedrive/driver.go @@ -37,9 +37,14 @@ func (d *Onedrive) Init(ctx context.Context) error { if d.ChunkSize < 1 { d.ChunkSize = 5 } - if d.ref != nil { + d.mutex.Lock() + hasRef := d.ref != nil + if hasRef { d.AccessToken = d.ref.AccessToken d.RefreshToken = d.ref.RefreshToken + } + d.mutex.Unlock() + if hasRef { return nil } return d.refreshToken() @@ -47,14 +52,18 @@ func (d *Onedrive) Init(ctx context.Context) error { func (d *Onedrive) InitReference(refStorage driver.Driver) error { if ref, ok := refStorage.(*Onedrive); ok { + d.mutex.Lock() d.ref = ref + d.mutex.Unlock() return nil } return errs.NotSupport } func (d *Onedrive) Drop(ctx context.Context) error { + d.mutex.Lock() d.ref = nil + d.mutex.Unlock() return nil } diff --git a/drivers/onedrive/util.go b/drivers/onedrive/util.go index 7fa233dd7..713e4961a 100644 --- a/drivers/onedrive/util.go +++ b/drivers/onedrive/util.go @@ -73,13 +73,19 @@ func (d *Onedrive) refreshToken() error { } func (d *Onedrive) _refreshToken() error { - if d.ref != nil { - err := d.ref._refreshToken() + d.mutex.Lock() + ref := d.ref + d.mutex.Unlock() + + if ref != nil { + err := ref._refreshToken() if err != nil { return err } - d.AccessToken = d.ref.AccessToken - d.RefreshToken = d.ref.RefreshToken + d.mutex.Lock() + d.AccessToken = ref.AccessToken + d.RefreshToken = ref.RefreshToken + d.mutex.Unlock() return nil } @@ -146,10 +152,12 @@ func (d *Onedrive) _refreshToken() error { func (d *Onedrive) Request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) { req := base.RestyClient.R() + d.mutex.Lock() token := d.AccessToken if d.ref != nil { token = d.ref.AccessToken } + d.mutex.Unlock() req.SetHeader("Authorization", "Bearer "+token) if callback != nil {