mirror of
https://github.com/rclone/rclone.git
synced 2024-11-26 02:14:42 +01:00
onedrive: fix "unauthenticated: Unauthenticated" errors when uploading
Before this change, sometimes when uploading files the onedrive servers return 401 Unauthorized errors with the text "unauthenticated: Unauthenticated". This is because we are sending the Authorization header with the request and it says in the docs that we shouldn't. https://learn.microsoft.com/en-us/graph/api/driveitem-createuploadsession?view=graph-rest-1.0#remarks > If you include the Authorization header when issuing the PUT call, > it may result in an HTTP 401 Unauthorized response. Only send the > Authorization header and bearer token when issuing the POST during > the first step. Don't include it when you issue the PUT call. This patch fixes the problem by doing the PUT request with an unauthenticated client. Fixes #7405 See: https://forum.rclone.org/t/onedrive-unauthenticated-when-trying-to-copy-sync-but-can-use-lsd/41149/ See: https://forum.rclone.org/t/onedrive-unauthenticated-issue/43792/
This commit is contained in:
parent
1f6271fa15
commit
dedad9f071
@ -27,6 +27,7 @@ import (
|
|||||||
"github.com/rclone/rclone/fs/config/configstruct"
|
"github.com/rclone/rclone/fs/config/configstruct"
|
||||||
"github.com/rclone/rclone/fs/config/obscure"
|
"github.com/rclone/rclone/fs/config/obscure"
|
||||||
"github.com/rclone/rclone/fs/fserrors"
|
"github.com/rclone/rclone/fs/fserrors"
|
||||||
|
"github.com/rclone/rclone/fs/fshttp"
|
||||||
"github.com/rclone/rclone/fs/hash"
|
"github.com/rclone/rclone/fs/hash"
|
||||||
"github.com/rclone/rclone/fs/operations"
|
"github.com/rclone/rclone/fs/operations"
|
||||||
"github.com/rclone/rclone/fs/walk"
|
"github.com/rclone/rclone/fs/walk"
|
||||||
@ -688,6 +689,7 @@ type Fs struct {
|
|||||||
ci *fs.ConfigInfo // global config
|
ci *fs.ConfigInfo // global config
|
||||||
features *fs.Features // optional features
|
features *fs.Features // optional features
|
||||||
srv *rest.Client // the connection to the OneDrive server
|
srv *rest.Client // the connection to the OneDrive server
|
||||||
|
unAuth *rest.Client // no authentication connection to the OneDrive server
|
||||||
dirCache *dircache.DirCache // Map of directory path to directory id
|
dirCache *dircache.DirCache // Map of directory path to directory id
|
||||||
pacer *fs.Pacer // pacer for API calls
|
pacer *fs.Pacer // pacer for API calls
|
||||||
tokenRenewer *oauthutil.Renew // renew the token on expiry
|
tokenRenewer *oauthutil.Renew // renew the token on expiry
|
||||||
@ -946,8 +948,9 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e
|
|||||||
TokenURL: authEndpoint[opt.Region] + tokenPath,
|
TokenURL: authEndpoint[opt.Region] + tokenPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
client := fshttp.NewClient(ctx)
|
||||||
root = parsePath(root)
|
root = parsePath(root)
|
||||||
oAuthClient, ts, err := oauthutil.NewClient(ctx, name, m, oauthConfig)
|
oAuthClient, ts, err := oauthutil.NewClientWithBaseClient(ctx, name, m, oauthConfig, client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to configure OneDrive: %w", err)
|
return nil, fmt.Errorf("failed to configure OneDrive: %w", err)
|
||||||
}
|
}
|
||||||
@ -961,6 +964,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e
|
|||||||
driveID: opt.DriveID,
|
driveID: opt.DriveID,
|
||||||
driveType: opt.DriveType,
|
driveType: opt.DriveType,
|
||||||
srv: rest.NewClient(oAuthClient).SetRoot(rootURL),
|
srv: rest.NewClient(oAuthClient).SetRoot(rootURL),
|
||||||
|
unAuth: rest.NewClient(client).SetRoot(rootURL),
|
||||||
pacer: fs.NewPacer(ctx, pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant))),
|
pacer: fs.NewPacer(ctx, pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant))),
|
||||||
hashType: QuickXorHashType,
|
hashType: QuickXorHashType,
|
||||||
}
|
}
|
||||||
@ -2245,7 +2249,7 @@ func (o *Object) uploadFragment(ctx context.Context, url string, start int64, to
|
|||||||
Options: options,
|
Options: options,
|
||||||
}
|
}
|
||||||
_, _ = chunk.Seek(skip, io.SeekStart)
|
_, _ = chunk.Seek(skip, io.SeekStart)
|
||||||
resp, err = o.fs.srv.Call(ctx, &opts)
|
resp, err = o.fs.unAuth.Call(ctx, &opts)
|
||||||
if err != nil && resp != nil && resp.StatusCode == http.StatusRequestedRangeNotSatisfiable {
|
if err != nil && resp != nil && resp.StatusCode == http.StatusRequestedRangeNotSatisfiable {
|
||||||
fs.Debugf(o, "Received 416 error - reading current position from server: %v", err)
|
fs.Debugf(o, "Received 416 error - reading current position from server: %v", err)
|
||||||
pos, posErr := o.getPosition(ctx, url)
|
pos, posErr := o.getPosition(ctx, url)
|
||||||
|
Loading…
Reference in New Issue
Block a user