in cmd/copy.go [1386:1429]
func (cca *CookedCopyCmdArgs) getSrcCredential(ctx context.Context, jpo *common.CopyJobPartOrderRequest) (common.CredentialInfo, error) {
switch cca.FromTo.From() {
case common.ELocation.Local(), common.ELocation.Benchmark():
return common.CredentialInfo{CredentialType: common.ECredentialType.Anonymous()}, nil
case common.ELocation.S3():
return common.CredentialInfo{CredentialType: common.ECredentialType.S3AccessKey()}, nil
case common.ELocation.GCP():
return common.CredentialInfo{CredentialType: common.ECredentialType.GoogleAppCredentials()}, nil
case common.ELocation.Pipe():
panic("Invalid Source")
}
srcCredInfo, isPublic, err := GetCredentialInfoForLocation(ctx, cca.FromTo.From(), cca.Source, true, cca.CpkOptions)
if err != nil {
return srcCredInfo, err
// If S2S and source takes OAuthToken as its cred type (OR) source takes anonymous as its cred type, but it's not public and there's no SAS
} else if cca.FromTo.IsS2S() &&
((srcCredInfo.CredentialType == common.ECredentialType.OAuthToken() && !cca.FromTo.To().CanForwardOAuthTokens()) || // Blob can forward OAuth tokens; BlobFS inherits this.
(srcCredInfo.CredentialType == common.ECredentialType.Anonymous() && !isPublic && cca.Source.SAS == "")) {
return srcCredInfo, errors.New("a SAS token (or S3 access key) is required as a part of the source in S2S transfers, unless the source is a public resource. Blob and BlobFS additionally support OAuth on both source and destination")
} else if cca.FromTo.IsS2S() && (srcCredInfo.CredentialType == common.ECredentialType.SharedKey() || jpo.CredentialInfo.CredentialType == common.ECredentialType.SharedKey()) {
return srcCredInfo, errors.New("shared key auth is not supported for S2S operations")
}
if cca.Source.SAS != "" && cca.FromTo.IsS2S() && jpo.CredentialInfo.CredentialType == common.ECredentialType.OAuthToken() {
glcm.Info("Authentication: If the source and destination accounts are in the same AAD tenant & the user/spn/msi has appropriate permissions on both, the source SAS token is not required and OAuth can be used round-trip.")
}
if cca.FromTo.IsS2S() {
jpo.S2SSourceCredentialType = srcCredInfo.CredentialType
if jpo.S2SSourceCredentialType.IsAzureOAuth() {
uotm := GetUserOAuthTokenManagerInstance()
// get token from env var or cache
if tokenInfo, err := uotm.GetTokenInfo(ctx); err != nil {
return srcCredInfo, err
} else if _, err := tokenInfo.GetTokenCredential(); err != nil {
// we just verified we can get a token credential
return srcCredInfo, err
}
}
}
return srcCredInfo, nil
}