diff --git a/backend/amazonclouddrive/amazonclouddrive.go b/backend/amazonclouddrive/amazonclouddrive.go index 2dee8a61f..21f109da7 100644 --- a/backend/amazonclouddrive/amazonclouddrive.go +++ b/backend/amazonclouddrive/amazonclouddrive.go @@ -70,8 +70,8 @@ func init() { Prefix: "acd", Description: "Amazon Drive", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { - err := oauthutil.Config("amazon cloud drive", name, m, acdConfig, nil) + Config: func(ctx context.Context, name string, m configmap.Mapper) { + err := oauthutil.Config(ctx, "amazon cloud drive", name, m, acdConfig, nil) if err != nil { log.Fatalf("Failed to configure token: %v", err) } @@ -255,7 +255,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } else { fs.Debugf(name+":", "Couldn't add request filter - large file downloads will fail") } - oAuthClient, ts, err := oauthutil.NewClientWithBaseClient(name, m, acdConfig, baseClient) + oAuthClient, ts, err := oauthutil.NewClientWithBaseClient(ctx, name, m, acdConfig, baseClient) if err != nil { return nil, errors.Wrap(err, "failed to configure Amazon Drive") } diff --git a/backend/box/box.go b/backend/box/box.go index ce3b75961..9f5eb90b9 100644 --- a/backend/box/box.go +++ b/backend/box/box.go @@ -84,7 +84,7 @@ func init() { Name: "box", Description: "Box", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { + Config: func(ctx context.Context, name string, m configmap.Mapper) { jsonFile, ok := m.Get("box_config_file") boxSubType, boxSubTypeOk := m.Get("box_sub_type") boxAccessToken, boxAccessTokenOk := m.Get("access_token") @@ -97,7 +97,7 @@ func init() { } // Else, if not using an access token, use oauth2 } else if boxAccessToken == "" || !boxAccessTokenOk { - err = oauthutil.Config("box", name, m, oauthConfig, nil) + err = oauthutil.Config(ctx, "box", name, m, oauthConfig, nil) if err != nil { log.Fatalf("Failed to configure token with oauth authentication: %v", err) } @@ -390,7 +390,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e var ts *oauthutil.TokenSource // If not using an accessToken, create an oauth client and tokensource if opt.AccessToken == "" { - client, ts, err = oauthutil.NewClient(name, m, oauthConfig) + client, ts, err = oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { return nil, errors.Wrap(err, "failed to configure Box") } diff --git a/backend/drive/drive.go b/backend/drive/drive.go index 56b171311..9bd3465de 100755 --- a/backend/drive/drive.go +++ b/backend/drive/drive.go @@ -176,8 +176,7 @@ func init() { Description: "Google Drive", NewFs: NewFs, CommandHelp: commandHelp, - Config: func(name string, m configmap.Mapper) { - ctx := context.TODO() + Config: func(ctx context.Context, name string, m configmap.Mapper) { // Parse config into Options struct opt := new(Options) err := configstruct.Set(m, opt) @@ -194,7 +193,7 @@ func init() { } if opt.ServiceAccountFile == "" { - err = oauthutil.Config("drive", name, m, driveConfig, nil) + err = oauthutil.Config(ctx, "drive", name, m, driveConfig, nil) if err != nil { log.Fatalf("Failed to configure token: %v", err) } @@ -991,7 +990,7 @@ func getClient(opt *Options) *http.Client { } } -func getServiceAccountClient(opt *Options, credentialsData []byte) (*http.Client, error) { +func getServiceAccountClient(ctx context.Context, opt *Options, credentialsData []byte) (*http.Client, error) { scopes := driveScopes(opt.Scope) conf, err := google.JWTConfigFromJSON(credentialsData, scopes...) if err != nil { @@ -1000,11 +999,11 @@ func getServiceAccountClient(opt *Options, credentialsData []byte) (*http.Client if opt.Impersonate != "" { conf.Subject = opt.Impersonate } - ctxWithSpecialClient := oauthutil.Context(getClient(opt)) + ctxWithSpecialClient := oauthutil.Context(ctx, getClient(opt)) return oauth2.NewClient(ctxWithSpecialClient, conf.TokenSource(ctxWithSpecialClient)), nil } -func createOAuthClient(opt *Options, name string, m configmap.Mapper) (*http.Client, error) { +func createOAuthClient(ctx context.Context, opt *Options, name string, m configmap.Mapper) (*http.Client, error) { var oAuthClient *http.Client var err error @@ -1017,12 +1016,12 @@ func createOAuthClient(opt *Options, name string, m configmap.Mapper) (*http.Cli opt.ServiceAccountCredentials = string(loadedCreds) } if opt.ServiceAccountCredentials != "" { - oAuthClient, err = getServiceAccountClient(opt, []byte(opt.ServiceAccountCredentials)) + oAuthClient, err = getServiceAccountClient(ctx, opt, []byte(opt.ServiceAccountCredentials)) if err != nil { return nil, errors.Wrap(err, "failed to create oauth client from service account") } } else { - oAuthClient, _, err = oauthutil.NewClientWithBaseClient(name, m, driveConfig, getClient(opt)) + oAuthClient, _, err = oauthutil.NewClientWithBaseClient(ctx, name, m, driveConfig, getClient(opt)) if err != nil { return nil, errors.Wrap(err, "failed to create oauth client") } @@ -1081,7 +1080,7 @@ func newFs(ctx context.Context, name, path string, m configmap.Mapper) (*Fs, err return nil, errors.Wrap(err, "drive: chunk size") } - oAuthClient, err := createOAuthClient(opt, name, m) + oAuthClient, err := createOAuthClient(ctx, opt, name, m) if err != nil { return nil, errors.Wrap(err, "drive: failed when making oauth client") } @@ -2770,7 +2769,7 @@ func (f *Fs) changeChunkSize(chunkSizeString string) (err error) { return err } -func (f *Fs) changeServiceAccountFile(file string) (err error) { +func (f *Fs) changeServiceAccountFile(ctx context.Context, file string) (err error) { fs.Debugf(nil, "Changing Service Account File from %s to %s", f.opt.ServiceAccountFile, file) if file == f.opt.ServiceAccountFile { return nil @@ -2792,7 +2791,7 @@ func (f *Fs) changeServiceAccountFile(file string) (err error) { }() f.opt.ServiceAccountFile = file f.opt.ServiceAccountCredentials = "" - oAuthClient, err := createOAuthClient(&f.opt, f.name, f.m) + oAuthClient, err := createOAuthClient(ctx, &f.opt, f.name, f.m) if err != nil { return errors.Wrap(err, "drive: failed when making oauth client") } @@ -3160,7 +3159,7 @@ func (f *Fs) Command(ctx context.Context, name string, arg []string, opt map[str if serviceAccountFile, ok := opt["service_account_file"]; ok { serviceAccountMap := make(map[string]string) serviceAccountMap["previous"] = f.opt.ServiceAccountFile - if err = f.changeServiceAccountFile(serviceAccountFile); err != nil { + if err = f.changeServiceAccountFile(ctx, serviceAccountFile); err != nil { return out, err } f.m.Set("service_account_file", serviceAccountFile) diff --git a/backend/dropbox/dropbox.go b/backend/dropbox/dropbox.go index 161362311..f03acf990 100755 --- a/backend/dropbox/dropbox.go +++ b/backend/dropbox/dropbox.go @@ -116,11 +116,11 @@ func init() { Name: "dropbox", Description: "Dropbox", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { + Config: func(ctx context.Context, name string, m configmap.Mapper) { opt := oauthutil.Options{ NoOffline: true, } - err := oauthutil.Config("dropbox", name, m, dropboxConfig, &opt) + err := oauthutil.Config(ctx, "dropbox", name, m, dropboxConfig, &opt) if err != nil { log.Fatalf("Failed to configure token: %v", err) } @@ -316,7 +316,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } } - oAuthClient, _, err := oauthutil.NewClient(name, m, dropboxConfig) + oAuthClient, _, err := oauthutil.NewClient(ctx, name, m, dropboxConfig) if err != nil { return nil, errors.Wrap(err, "failed to configure dropbox") } diff --git a/backend/fichier/fichier.go b/backend/fichier/fichier.go index 085c14dd9..18782257f 100644 --- a/backend/fichier/fichier.go +++ b/backend/fichier/fichier.go @@ -35,7 +35,7 @@ func init() { fs.Register(&fs.RegInfo{ Name: "fichier", Description: "1Fichier", - Config: func(name string, config configmap.Mapper) { + Config: func(ctx context.Context, name string, config configmap.Mapper) { }, NewFs: NewFs, Options: []fs.Option{{ diff --git a/backend/googlecloudstorage/googlecloudstorage.go b/backend/googlecloudstorage/googlecloudstorage.go index e4331777a..9e91530a7 100644 --- a/backend/googlecloudstorage/googlecloudstorage.go +++ b/backend/googlecloudstorage/googlecloudstorage.go @@ -76,14 +76,14 @@ func init() { Prefix: "gcs", Description: "Google Cloud Storage (this is not Google Drive)", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { + Config: func(ctx context.Context, name string, m configmap.Mapper) { saFile, _ := m.Get("service_account_file") saCreds, _ := m.Get("service_account_credentials") anonymous, _ := m.Get("anonymous") if saFile != "" || saCreds != "" || anonymous == "true" { return } - err := oauthutil.Config("google cloud storage", name, m, storageConfig, nil) + err := oauthutil.Config(ctx, "google cloud storage", name, m, storageConfig, nil) if err != nil { log.Fatalf("Failed to configure token: %v", err) } @@ -370,12 +370,12 @@ func (o *Object) split() (bucket, bucketPath string) { return o.fs.split(o.remote) } -func getServiceAccountClient(credentialsData []byte) (*http.Client, error) { +func getServiceAccountClient(ctx context.Context, credentialsData []byte) (*http.Client, error) { conf, err := google.JWTConfigFromJSON(credentialsData, storageConfig.Scopes...) if err != nil { return nil, errors.Wrap(err, "error processing credentials") } - ctxWithSpecialClient := oauthutil.Context(fshttp.NewClient(fs.Config)) + ctxWithSpecialClient := oauthutil.Context(ctx, fshttp.NewClient(fs.Config)) return oauth2.NewClient(ctxWithSpecialClient, conf.TokenSource(ctxWithSpecialClient)), nil } @@ -413,12 +413,12 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e if opt.Anonymous { oAuthClient = &http.Client{} } else if opt.ServiceAccountCredentials != "" { - oAuthClient, err = getServiceAccountClient([]byte(opt.ServiceAccountCredentials)) + oAuthClient, err = getServiceAccountClient(ctx, []byte(opt.ServiceAccountCredentials)) if err != nil { return nil, errors.Wrap(err, "failed configuring Google Cloud Storage Service Account") } } else { - oAuthClient, _, err = oauthutil.NewClient(name, m, storageConfig) + oAuthClient, _, err = oauthutil.NewClient(ctx, name, m, storageConfig) if err != nil { ctx := context.Background() oAuthClient, err = google.DefaultClient(ctx, storage.DevstorageFullControlScope) diff --git a/backend/googlephotos/googlephotos.go b/backend/googlephotos/googlephotos.go index eb5285376..858349f97 100644 --- a/backend/googlephotos/googlephotos.go +++ b/backend/googlephotos/googlephotos.go @@ -78,7 +78,7 @@ func init() { Prefix: "gphotos", Description: "Google Photos", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { + Config: func(ctx context.Context, name string, m configmap.Mapper) { // Parse config into Options struct opt := new(Options) err := configstruct.Set(m, opt) @@ -95,7 +95,7 @@ func init() { } // Do the oauth - err = oauthutil.Config("google photos", name, m, oauthConfig, nil) + err = oauthutil.Config(ctx, "google photos", name, m, oauthConfig, nil) if err != nil { golog.Fatalf("Failed to configure token: %v", err) } @@ -255,7 +255,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } baseClient := fshttp.NewClient(fs.Config) - oAuthClient, ts, err := oauthutil.NewClientWithBaseClient(name, m, oauthConfig, baseClient) + oAuthClient, ts, err := oauthutil.NewClientWithBaseClient(ctx, name, m, oauthConfig, baseClient) if err != nil { return nil, errors.Wrap(err, "failed to configure Box") } diff --git a/backend/hubic/hubic.go b/backend/hubic/hubic.go index 6d1956ca9..b945e90d9 100644 --- a/backend/hubic/hubic.go +++ b/backend/hubic/hubic.go @@ -56,8 +56,8 @@ func init() { Name: "hubic", Description: "Hubic", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { - err := oauthutil.Config("hubic", name, m, oauthConfig, nil) + Config: func(ctx context.Context, name string, m configmap.Mapper) { + err := oauthutil.Config(ctx, "hubic", name, m, oauthConfig, nil) if err != nil { log.Fatalf("Failed to configure token: %v", err) } @@ -147,7 +147,7 @@ func (f *Fs) getCredentials(ctx context.Context) (err error) { // NewFs constructs an Fs from the path, container:path func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, error) { - client, _, err := oauthutil.NewClient(name, m, oauthConfig) + client, _, err := oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { return nil, errors.Wrap(err, "failed to configure Hubic") } diff --git a/backend/jottacloud/jottacloud.go b/backend/jottacloud/jottacloud.go index 482eb22b3..f44fb6c52 100644 --- a/backend/jottacloud/jottacloud.go +++ b/backend/jottacloud/jottacloud.go @@ -83,9 +83,7 @@ func init() { Name: "jottacloud", Description: "Jottacloud", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { - ctx := context.TODO() - + Config: func(ctx context.Context, name string, m configmap.Mapper) { refresh := false if version, ok := m.Get("configVersion"); ok { ver, err := strconv.Atoi(version) @@ -275,7 +273,7 @@ func v1config(ctx context.Context, name string, m configmap.Mapper) { fmt.Printf("\nDo you want to use a non standard device/mountpoint e.g. for accessing files uploaded using the official Jottacloud client?\n\n") if config.Confirm(false) { - oAuthClient, _, err := oauthutil.NewClient(name, m, oauthConfig) + oAuthClient, _, err := oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { log.Fatalf("Failed to load oAuthClient: %s", err) } @@ -387,7 +385,7 @@ func v2config(ctx context.Context, name string, m configmap.Mapper) { fmt.Printf("\nDo you want to use a non standard device/mountpoint e.g. for accessing files uploaded using the official Jottacloud client?\n\n") if config.Confirm(false) { - oAuthClient, _, err := oauthutil.NewClient(name, m, oauthConfig) + oAuthClient, _, err := oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { log.Fatalf("Failed to load oAuthClient: %s", err) } @@ -699,7 +697,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } // Create OAuth Client - oAuthClient, ts, err := oauthutil.NewClientWithBaseClient(name, m, oauthConfig, baseClient) + oAuthClient, ts, err := oauthutil.NewClientWithBaseClient(ctx, name, m, oauthConfig, baseClient) if err != nil { return nil, errors.Wrap(err, "Failed to configure Jottacloud oauth client") } diff --git a/backend/mailru/mailru.go b/backend/mailru/mailru.go index 74d59f590..9141c54f7 100644 --- a/backend/mailru/mailru.go +++ b/backend/mailru/mailru.go @@ -420,7 +420,7 @@ func (f *Fs) authorize(ctx context.Context, force bool) (err error) { if err != nil || !tokenIsValid(t) { fs.Infof(f, "Valid token not found, authorizing.") - ctx := oauthutil.Context(f.cli) + ctx := oauthutil.Context(ctx, f.cli) t, err = oauthConfig.PasswordCredentialsToken(ctx, f.opt.Username, f.opt.Password) } if err == nil && !tokenIsValid(t) { @@ -443,7 +443,7 @@ func (f *Fs) authorize(ctx context.Context, force bool) (err error) { // crashing with panic `comparing uncomparable type map[string]interface{}` // As a workaround, mimic oauth2.NewClient() wrapping token source in // oauth2.ReuseTokenSource - _, ts, err := oauthutil.NewClientWithBaseClient(f.name, f.m, oauthConfig, f.cli) + _, ts, err := oauthutil.NewClientWithBaseClient(ctx, f.name, f.m, oauthConfig, f.cli) if err == nil { f.source = oauth2.ReuseTokenSource(nil, ts) } diff --git a/backend/onedrive/onedrive.go b/backend/onedrive/onedrive.go index 915dfd9dc..94224665a 100755 --- a/backend/onedrive/onedrive.go +++ b/backend/onedrive/onedrive.go @@ -80,9 +80,8 @@ func init() { Name: "onedrive", Description: "Microsoft OneDrive", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { - ctx := context.TODO() - err := oauthutil.Config("onedrive", name, m, oauthConfig, nil) + Config: func(ctx context.Context, name string, m configmap.Mapper) { + err := oauthutil.Config(ctx, "onedrive", name, m, oauthConfig, nil) if err != nil { log.Fatalf("Failed to configure token: %v", err) return @@ -111,7 +110,7 @@ func init() { Sites []siteResource `json:"value"` } - oAuthClient, _, err := oauthutil.NewClient(name, m, oauthConfig) + oAuthClient, _, err := oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { log.Fatalf("Failed to configure OneDrive: %v", err) } @@ -233,7 +232,7 @@ func init() { fmt.Printf("Found drive '%s' of type '%s', URL: %s\nIs that okay?\n", rootItem.Name, rootItem.ParentReference.DriveType, rootItem.WebURL) // This does not work, YET :) - if !config.ConfirmWithConfig(m, "config_drive_ok", true) { + if !config.ConfirmWithConfig(ctx, m, "config_drive_ok", true) { log.Fatalf("Cancelled by user") } @@ -614,7 +613,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } root = parsePath(root) - oAuthClient, ts, err := oauthutil.NewClient(name, m, oauthConfig) + oAuthClient, ts, err := oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { return nil, errors.Wrap(err, "failed to configure OneDrive") } diff --git a/backend/pcloud/pcloud.go b/backend/pcloud/pcloud.go index a162709fd..d8c533036 100644 --- a/backend/pcloud/pcloud.go +++ b/backend/pcloud/pcloud.go @@ -72,7 +72,7 @@ func init() { Name: "pcloud", Description: "Pcloud", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { + Config: func(ctx context.Context, name string, m configmap.Mapper) { optc := new(Options) err := configstruct.Set(m, optc) if err != nil { @@ -98,7 +98,7 @@ func init() { CheckAuth: checkAuth, StateBlankOK: true, // pCloud seems to drop the state parameter now - see #4210 } - err = oauthutil.Config("pcloud", name, m, oauthConfig, &opt) + err = oauthutil.Config(ctx, "pcloud", name, m, oauthConfig, &opt) if err != nil { log.Fatalf("Failed to configure token: %v", err) } @@ -288,7 +288,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e return nil, err } root = parsePath(root) - oAuthClient, ts, err := oauthutil.NewClient(name, m, oauthConfig) + oAuthClient, ts, err := oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { return nil, errors.Wrap(err, "failed to configure Pcloud") } diff --git a/backend/premiumizeme/premiumizeme.go b/backend/premiumizeme/premiumizeme.go index 99e497dd8..ac41e43f2 100644 --- a/backend/premiumizeme/premiumizeme.go +++ b/backend/premiumizeme/premiumizeme.go @@ -78,8 +78,8 @@ func init() { Name: "premiumizeme", Description: "premiumize.me", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { - err := oauthutil.Config("premiumizeme", name, m, oauthConfig, nil) + Config: func(ctx context.Context, name string, m configmap.Mapper) { + err := oauthutil.Config(ctx, "premiumizeme", name, m, oauthConfig, nil) if err != nil { log.Fatalf("Failed to configure token: %v", err) } @@ -247,7 +247,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e var client *http.Client var ts *oauthutil.TokenSource if opt.APIKey == "" { - client, ts, err = oauthutil.NewClient(name, m, oauthConfig) + client, ts, err = oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { return nil, errors.Wrap(err, "failed to configure premiumize.me") } diff --git a/backend/putio/fs.go b/backend/putio/fs.go index 28ee2abdc..888e28592 100644 --- a/backend/putio/fs.go +++ b/backend/putio/fs.go @@ -78,7 +78,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (f fs.Fs, } root = parsePath(root) httpClient := fshttp.NewClient(fs.Config) - oAuthClient, _, err := oauthutil.NewClientWithBaseClient(name, m, putioConfig, httpClient) + oAuthClient, _, err := oauthutil.NewClientWithBaseClient(ctx, name, m, putioConfig, httpClient) if err != nil { return nil, errors.Wrap(err, "failed to configure putio") } diff --git a/backend/putio/putio.go b/backend/putio/putio.go index 3ee74f869..3d9102d5d 100644 --- a/backend/putio/putio.go +++ b/backend/putio/putio.go @@ -1,6 +1,7 @@ package putio import ( + "context" "log" "regexp" "time" @@ -59,11 +60,11 @@ func init() { Name: "putio", Description: "Put.io", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { + Config: func(ctx context.Context, name string, m configmap.Mapper) { opt := oauthutil.Options{ NoOffline: true, } - err := oauthutil.Config("putio", name, m, putioConfig, &opt) + err := oauthutil.Config(ctx, "putio", name, m, putioConfig, &opt) if err != nil { log.Fatalf("Failed to configure token: %v", err) } diff --git a/backend/seafile/seafile.go b/backend/seafile/seafile.go index 535c4e2d6..751b0ac16 100644 --- a/backend/seafile/seafile.go +++ b/backend/seafile/seafile.go @@ -296,7 +296,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } // Config callback for 2FA -func Config(name string, m configmap.Mapper) { +func Config(ctx context.Context, name string, m configmap.Mapper) { serverURL, ok := m.Get(configURL) if !ok || serverURL == "" { // If there's no server URL, it means we're trying an operation at the backend level, like a "rclone authorize seafile" diff --git a/backend/sharefile/sharefile.go b/backend/sharefile/sharefile.go index e3467655c..fb56872e7 100644 --- a/backend/sharefile/sharefile.go +++ b/backend/sharefile/sharefile.go @@ -136,7 +136,7 @@ func init() { Name: "sharefile", Description: "Citrix Sharefile", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { + Config: func(ctx context.Context, name string, m configmap.Mapper) { oauthConfig := newOauthConfig("") checkAuth := func(oauthConfig *oauth2.Config, auth *oauthutil.AuthResult) error { if auth == nil || auth.Form == nil { @@ -155,7 +155,7 @@ func init() { opt := oauthutil.Options{ CheckAuth: checkAuth, } - err := oauthutil.Config("sharefile", name, m, oauthConfig, &opt) + err := oauthutil.Config(ctx, "sharefile", name, m, oauthConfig, &opt) if err != nil { log.Fatalf("Failed to configure token: %v", err) } @@ -436,7 +436,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e oauthConfig := newOauthConfig(opt.Endpoint + tokenPath) var client *http.Client var ts *oauthutil.TokenSource - client, ts, err = oauthutil.NewClient(name, m, oauthConfig) + client, ts, err = oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { return nil, errors.Wrap(err, "failed to configure sharefile") } diff --git a/backend/sugarsync/sugarsync.go b/backend/sugarsync/sugarsync.go index 4521c9a45..039e29870 100644 --- a/backend/sugarsync/sugarsync.go +++ b/backend/sugarsync/sugarsync.go @@ -76,7 +76,7 @@ func init() { Name: "sugarsync", Description: "Sugarsync", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { + Config: func(ctx context.Context, name string, m configmap.Mapper) { opt := new(Options) err := configstruct.Set(m, opt) if err != nil { @@ -85,7 +85,7 @@ func init() { if opt.RefreshToken != "" { fmt.Printf("Already have a token - refresh?\n") - if !config.ConfirmWithConfig(m, "config_refresh_token", true) { + if !config.ConfirmWithConfig(ctx, m, "config_refresh_token", true) { return } } diff --git a/backend/tardigrade/fs.go b/backend/tardigrade/fs.go index 483eb47fd..371dbbfd5 100644 --- a/backend/tardigrade/fs.go +++ b/backend/tardigrade/fs.go @@ -42,7 +42,7 @@ func init() { Name: "tardigrade", Description: "Tardigrade Decentralized Cloud Storage", NewFs: NewFs, - Config: func(name string, configMapper configmap.Mapper) { + Config: func(ctx context.Context, name string, configMapper configmap.Mapper) { provider, _ := configMapper.Get(fs.ConfigProvider) config.FileDeleteKey(name, fs.ConfigProvider) diff --git a/backend/yandex/yandex.go b/backend/yandex/yandex.go index 74bc0c85c..08a2b6250 100644 --- a/backend/yandex/yandex.go +++ b/backend/yandex/yandex.go @@ -60,8 +60,8 @@ func init() { Name: "yandex", Description: "Yandex Disk", NewFs: NewFs, - Config: func(name string, m configmap.Mapper) { - err := oauthutil.Config("yandex", name, m, oauthConfig, nil) + Config: func(ctx context.Context, name string, m configmap.Mapper) { + err := oauthutil.Config(ctx, "yandex", name, m, oauthConfig, nil) if err != nil { log.Fatalf("Failed to configure token: %v", err) return @@ -260,7 +260,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } log.Printf("Automatically upgraded OAuth config.") } - oAuthClient, _, err := oauthutil.NewClient(name, m, oauthConfig) + oAuthClient, _, err := oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { log.Fatalf("Failed to configure Yandex: %v", err) } diff --git a/cmd/authorize/authorize.go b/cmd/authorize/authorize.go index 178ca306c..d93cdb306 100644 --- a/cmd/authorize/authorize.go +++ b/cmd/authorize/authorize.go @@ -1,6 +1,8 @@ package authorize import ( + "context" + "github.com/rclone/rclone/cmd" "github.com/rclone/rclone/fs/config" "github.com/rclone/rclone/fs/config/flags" @@ -29,6 +31,6 @@ Use the --auth-no-open-browser to prevent rclone to open auth link in default browser automatically.`, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 3, command, args) - config.Authorize(args, noAutoBrowser) + config.Authorize(context.Background(), args, noAutoBrowser) }, } diff --git a/cmd/config/config.go b/cmd/config/config.go index 51ce4746b..b94895a6d 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -142,7 +142,7 @@ using remote authorization you would do this: if err != nil { return err } - err = config.CreateRemote(args[0], args[1], in, configObscure, configNoObscure) + err = config.CreateRemote(context.Background(), args[0], args[1], in, configObscure, configNoObscure) if err != nil { return err } @@ -181,7 +181,7 @@ require this add an extra parameter thus: if err != nil { return err } - err = config.UpdateRemote(args[0], in, configObscure, configNoObscure) + err = config.UpdateRemote(context.Background(), args[0], in, configObscure, configNoObscure) if err != nil { return err } @@ -219,7 +219,7 @@ both support obscuring passwords directly. if err != nil { return err } - err = config.PasswordRemote(args[0], in) + err = config.PasswordRemote(context.Background(), args[0], in) if err != nil { return err } @@ -253,6 +253,7 @@ To disconnect the remote use "rclone config disconnect". This normally means going through the interactive oauth flow again. `, RunE: func(command *cobra.Command, args []string) error { + ctx := context.Background() cmd.CheckArgs(1, 1, command, args) fsInfo, configName, _, config, err := fs.ConfigFs(args[0]) if err != nil { @@ -261,7 +262,7 @@ This normally means going through the interactive oauth flow again. if fsInfo.Config == nil { return errors.Errorf("%s: doesn't support Reconnect", configName) } - fsInfo.Config(configName, config) + fsInfo.Config(ctx, configName, config) return nil }, } diff --git a/fs/config/config.go b/fs/config/config.go index fb3d90189..b4e669fc4 100644 --- a/fs/config/config.go +++ b/fs/config/config.go @@ -745,7 +745,7 @@ func Confirm(Default bool) bool { // If AutoConfirm is set, it will look up the value in m and return // that, but if it isn't set then it will return the Default value // passed in -func ConfirmWithConfig(m configmap.Getter, configName string, Default bool) bool { +func ConfirmWithConfig(ctx context.Context, m configmap.Getter, configName string, Default bool) bool { if fs.Config.AutoConfirm { configString, ok := m.Get(configName) if ok { @@ -902,7 +902,7 @@ func RemoteConfig(name string) { f := MustFindByName(name) if f.Config != nil { m := fs.ConfigMap(f, name) - f.Config(name, m) + f.Config(context.Background(), name, m) } } @@ -1024,7 +1024,7 @@ func ChooseOption(o *fs.Option, name string) string { } // Suppress the confirm prompts and return a function to undo that -func suppressConfirm() func() { +func suppressConfirm(ctx context.Context) func() { old := fs.Config.AutoConfirm fs.Config.AutoConfirm = true return func() { @@ -1034,7 +1034,7 @@ func suppressConfirm() func() { // UpdateRemote adds the keyValues passed in to the remote of name. // keyValues should be key, value pairs. -func UpdateRemote(name string, keyValues rc.Params, doObscure, noObscure bool) error { +func UpdateRemote(ctx context.Context, name string, keyValues rc.Params, doObscure, noObscure bool) error { if doObscure && noObscure { return errors.New("can't use --obscure and --no-obscure together") } @@ -1042,7 +1042,7 @@ func UpdateRemote(name string, keyValues rc.Params, doObscure, noObscure bool) e if err != nil { return err } - defer suppressConfirm()() + defer suppressConfirm(ctx)() // Work out which options need to be obscured needsObscure := map[string]struct{}{} @@ -1087,7 +1087,7 @@ func UpdateRemote(name string, keyValues rc.Params, doObscure, noObscure bool) e // CreateRemote creates a new remote with name, provider and a list of // parameters which are key, value pairs. If update is set then it // adds the new keys rather than replacing all of them. -func CreateRemote(name string, provider string, keyValues rc.Params, doObscure, noObscure bool) error { +func CreateRemote(ctx context.Context, name string, provider string, keyValues rc.Params, doObscure, noObscure bool) error { err := fspath.CheckConfigName(name) if err != nil { return err @@ -1097,21 +1097,21 @@ func CreateRemote(name string, provider string, keyValues rc.Params, doObscure, // Set the type getConfigData().SetValue(name, "type", provider) // Set the remaining values - return UpdateRemote(name, keyValues, doObscure, noObscure) + return UpdateRemote(ctx, name, keyValues, doObscure, noObscure) } // PasswordRemote adds the keyValues passed in to the remote of name. // keyValues should be key, value pairs. -func PasswordRemote(name string, keyValues rc.Params) error { +func PasswordRemote(ctx context.Context, name string, keyValues rc.Params) error { err := fspath.CheckConfigName(name) if err != nil { return err } - defer suppressConfirm()() + defer suppressConfirm(ctx)() for k, v := range keyValues { keyValues[k] = obscure.MustObscure(fmt.Sprint(v)) } - return UpdateRemote(name, keyValues, false, true) + return UpdateRemote(ctx, name, keyValues, false, true) } // JSONListProviders prints all the providers and options in JSON format @@ -1387,8 +1387,8 @@ func SetPassword() { // // rclone authorize "fs name" // rclone authorize "fs name" "client id" "client secret" -func Authorize(args []string, noAutoBrowser bool) { - defer suppressConfirm()() +func Authorize(ctx context.Context, args []string, noAutoBrowser bool) { + defer suppressConfirm(ctx)() switch len(args) { case 1, 3: default: @@ -1417,7 +1417,7 @@ func Authorize(args []string, noAutoBrowser bool) { } m := fs.ConfigMap(f, name) - f.Config(name, m) + f.Config(ctx, name, m) } // FileGetFlag gets the config key under section returning the diff --git a/fs/config/config_test.go b/fs/config/config_test.go index eb05e9242..dd4cdbd1d 100644 --- a/fs/config/config_test.go +++ b/fs/config/config_test.go @@ -180,6 +180,7 @@ func TestNewRemoteName(t *testing.T) { } func TestCreateUpdatePasswordRemote(t *testing.T) { + ctx := context.Background() defer testConfigFile(t, "update.conf")() for _, doObscure := range []bool{false, true} { @@ -188,7 +189,7 @@ func TestCreateUpdatePasswordRemote(t *testing.T) { break } t.Run(fmt.Sprintf("doObscure=%v,noObscure=%v", doObscure, noObscure), func(t *testing.T) { - require.NoError(t, CreateRemote("test2", "config_test_remote", rc.Params{ + require.NoError(t, CreateRemote(ctx, "test2", "config_test_remote", rc.Params{ "bool": true, "pass": "potato", }, doObscure, noObscure)) @@ -203,7 +204,7 @@ func TestCreateUpdatePasswordRemote(t *testing.T) { assert.Equal(t, "potato", gotPw) wantPw := obscure.MustObscure("potato2") - require.NoError(t, UpdateRemote("test2", rc.Params{ + require.NoError(t, UpdateRemote(ctx, "test2", rc.Params{ "bool": false, "pass": wantPw, "spare": "spare", @@ -218,7 +219,7 @@ func TestCreateUpdatePasswordRemote(t *testing.T) { } assert.Equal(t, wantPw, gotPw) - require.NoError(t, PasswordRemote("test2", rc.Params{ + require.NoError(t, PasswordRemote(ctx, "test2", rc.Params{ "pass": "potato3", })) @@ -427,8 +428,9 @@ func TestMatchProvider(t *testing.T) { } func TestFileRefresh(t *testing.T) { + ctx := context.Background() defer testConfigFile(t, "refresh.conf")() - require.NoError(t, CreateRemote("refresh_test", "config_test_remote", rc.Params{ + require.NoError(t, CreateRemote(ctx, "refresh_test", "config_test_remote", rc.Params{ "bool": true, }, false, false)) b, err := ioutil.ReadFile(ConfigPath) diff --git a/fs/config/rc.go b/fs/config/rc.go index d264f1c3b..3a08448ce 100644 --- a/fs/config/rc.go +++ b/fs/config/rc.go @@ -152,11 +152,11 @@ func rcConfig(ctx context.Context, in rc.Params, what string) (out rc.Params, er if err != nil { return nil, err } - return nil, CreateRemote(name, remoteType, parameters, doObscure, noObscure) + return nil, CreateRemote(ctx, name, remoteType, parameters, doObscure, noObscure) case "update": - return nil, UpdateRemote(name, parameters, doObscure, noObscure) + return nil, UpdateRemote(ctx, name, parameters, doObscure, noObscure) case "password": - return nil, PasswordRemote(name, parameters) + return nil, PasswordRemote(ctx, name, parameters) } panic("unknown rcConfig type") } diff --git a/fs/fs.go b/fs/fs.go index 0ea87d897..31ff742b9 100644 --- a/fs/fs.go +++ b/fs/fs.go @@ -86,7 +86,7 @@ type RegInfo struct { // the parent of that object and ErrorIsFile. NewFs func(ctx context.Context, name string, root string, config configmap.Mapper) (Fs, error) `json:"-"` // Function to call to help with config - Config func(name string, config configmap.Mapper) `json:"-"` + Config func(ctx context.Context, name string, config configmap.Mapper) `json:"-"` // Options for the Fs configuration Options Options // The command help, if any diff --git a/lib/oauthutil/oauthutil.go b/lib/oauthutil/oauthutil.go index 2b87b1b7d..8d54d71ce 100644 --- a/lib/oauthutil/oauthutil.go +++ b/lib/oauthutil/oauthutil.go @@ -288,8 +288,8 @@ func (ts *TokenSource) OnExpiry() <-chan time.Time { var _ oauth2.TokenSource = (*TokenSource)(nil) // Context returns a context with our HTTP Client baked in for oauth2 -func Context(client *http.Client) context.Context { - return context.WithValue(context.Background(), oauth2.HTTPClient, client) +func Context(ctx context.Context, client *http.Client) context.Context { + return context.WithValue(ctx, oauth2.HTTPClient, client) } // overrideCredentials sets the ClientID and ClientSecret from the @@ -327,7 +327,7 @@ func overrideCredentials(name string, m configmap.Mapper, origConfig *oauth2.Con // configures a Client with it. It returns the client and a // TokenSource which Invalidate may need to be called on. It uses the // httpClient passed in as the base client. -func NewClientWithBaseClient(name string, m configmap.Mapper, config *oauth2.Config, baseClient *http.Client) (*http.Client, *TokenSource, error) { +func NewClientWithBaseClient(ctx context.Context, name string, m configmap.Mapper, config *oauth2.Config, baseClient *http.Client) (*http.Client, *TokenSource, error) { config, _ = overrideCredentials(name, m, config) token, err := GetToken(name, m) if err != nil { @@ -335,7 +335,7 @@ func NewClientWithBaseClient(name string, m configmap.Mapper, config *oauth2.Con } // Set our own http client in the context - ctx := Context(baseClient) + ctx = Context(ctx, baseClient) // Wrap the TokenSource in our TokenSource which saves changed // tokens in the config file @@ -352,8 +352,8 @@ func NewClientWithBaseClient(name string, m configmap.Mapper, config *oauth2.Con // NewClient gets a token from the config file and configures a Client // with it. It returns the client and a TokenSource which Invalidate may need to be called on -func NewClient(name string, m configmap.Mapper, oauthConfig *oauth2.Config) (*http.Client, *TokenSource, error) { - return NewClientWithBaseClient(name, m, oauthConfig, fshttp.NewClient(fs.Config)) +func NewClient(ctx context.Context, name string, m configmap.Mapper, oauthConfig *oauth2.Config) (*http.Client, *TokenSource, error) { + return NewClientWithBaseClient(ctx, name, m, oauthConfig, fshttp.NewClient(fs.Config)) } // AuthResult is returned from the web server after authorization @@ -394,7 +394,7 @@ type Options struct { // If opt is nil it will use the default Options // // It may run an internal webserver to receive the results -func Config(id, name string, m configmap.Mapper, oauthConfig *oauth2.Config, opt *Options) error { +func Config(ctx context.Context, id, name string, m configmap.Mapper, oauthConfig *oauth2.Config, opt *Options) error { if opt == nil { opt = &Options{} } @@ -408,7 +408,7 @@ func Config(id, name string, m configmap.Mapper, oauthConfig *oauth2.Config, opt tokenString, ok := m.Get("token") if ok && tokenString != "" { fmt.Printf("Already have a token - refresh?\n") - if !config.ConfirmWithConfig(m, "config_refresh_token", true) { + if !config.ConfirmWithConfig(ctx, m, "config_refresh_token", true) { return nil } } @@ -418,7 +418,7 @@ func Config(id, name string, m configmap.Mapper, oauthConfig *oauth2.Config, opt fmt.Printf("Use auto config?\n") fmt.Printf(" * Say Y if not sure\n") fmt.Printf(" * Say N if you are working on a remote or headless machine\n") - return config.ConfirmWithConfig(m, "config_is_local", true) + return config.ConfirmWithConfig(ctx, m, "config_is_local", true) } // Detect whether we should use internal web server @@ -526,7 +526,7 @@ version recommended): } // Exchange the code for a token - ctx := Context(fshttp.NewClient(fs.Config)) + ctx = Context(ctx, fshttp.NewClient(fs.Config)) token, err := oauthConfig.Exchange(ctx, auth.Code) if err != nil { return errors.Wrap(err, "failed to get token")