drive: supply correct scopes to when using --drive-impersonate

This fixes using --drive-impersonate and appfolders.
This commit is contained in:
Nick Craig-Wood 2019-01-05 20:53:42 +00:00
parent 60e6af2605
commit b8280521a5
2 changed files with 56 additions and 11 deletions

View file

@ -125,6 +125,29 @@ var (
_linkTemplates map[string]*template.Template // available link types _linkTemplates map[string]*template.Template // available link types
) )
// Parse the scopes option returning a slice of scopes
func driveScopes(scopesString string) (scopes []string) {
if scopesString == "" {
scopesString = defaultScope
}
for _, scope := range strings.Split(scopesString, ",") {
scope = strings.TrimSpace(scope)
scopes = append(scopes, scopePrefix+scope)
}
return scopes
}
// Returns true if one of the scopes was "drive.appfolder"
func driveScopesContainsAppFolder(scopes []string) bool {
for _, scope := range scopes {
if scope == scopePrefix+"drive.appfolder" {
return true
}
}
return false
}
// Register with Fs // Register with Fs
func init() { func init() {
fs.Register(&fs.RegInfo{ fs.Register(&fs.RegInfo{
@ -139,18 +162,14 @@ func init() {
fs.Errorf(nil, "Couldn't parse config into struct: %v", err) fs.Errorf(nil, "Couldn't parse config into struct: %v", err)
return return
} }
// Fill in the scopes // Fill in the scopes
if opt.Scope == "" { driveConfig.Scopes = driveScopes(opt.Scope)
opt.Scope = defaultScope
}
driveConfig.Scopes = nil
for _, scope := range strings.Split(opt.Scope, ",") {
driveConfig.Scopes = append(driveConfig.Scopes, scopePrefix+strings.TrimSpace(scope))
// Set the root_folder_id if using drive.appfolder // Set the root_folder_id if using drive.appfolder
if scope == "drive.appfolder" { if driveScopesContainsAppFolder(driveConfig.Scopes) {
m.Set("root_folder_id", "appDataFolder") m.Set("root_folder_id", "appDataFolder")
} }
}
if opt.ServiceAccountFile == "" { if opt.ServiceAccountFile == "" {
err = oauthutil.Config("drive", name, m, driveConfig) err = oauthutil.Config("drive", name, m, driveConfig)
if err != nil { if err != nil {
@ -756,7 +775,8 @@ func newPacer() *pacer.Pacer {
} }
func getServiceAccountClient(opt *Options, credentialsData []byte) (*http.Client, error) { func getServiceAccountClient(opt *Options, credentialsData []byte) (*http.Client, error) {
conf, err := google.JWTConfigFromJSON(credentialsData, driveConfig.Scopes...) scopes := driveScopes(opt.Scope)
conf, err := google.JWTConfigFromJSON(credentialsData, scopes...)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "error processing credentials") return nil, errors.Wrap(err, "error processing credentials")
} }

View file

@ -22,6 +22,31 @@ import (
"google.golang.org/api/drive/v3" "google.golang.org/api/drive/v3"
) )
func TestDriveScopes(t *testing.T) {
for _, test := range []struct {
in string
want []string
wantFlag bool
}{
{"", []string{
"https://www.googleapis.com/auth/drive",
}, false},
{" drive.file , drive.readonly", []string{
"https://www.googleapis.com/auth/drive.file",
"https://www.googleapis.com/auth/drive.readonly",
}, false},
{" drive.file , drive.appfolder", []string{
"https://www.googleapis.com/auth/drive.file",
"https://www.googleapis.com/auth/drive.appfolder",
}, true},
} {
got := driveScopes(test.in)
assert.Equal(t, test.want, got, test.in)
gotFlag := driveScopesContainsAppFolder(got)
assert.Equal(t, test.wantFlag, gotFlag, test.in)
}
}
/* /*
var additionalMimeTypes = map[string]string{ var additionalMimeTypes = map[string]string{
"application/vnd.ms-excel.sheet.macroenabled.12": ".xlsm", "application/vnd.ms-excel.sheet.macroenabled.12": ".xlsm",