in internal/api/acrsdk.go [116:153]
func GetAcrCLIClientWithAuth(loginURL string, username string, password string, configs []string) (*AcrCLIClient, error) {
if username == "" && password == "" {
// If both username and password are empty then the docker config file will be used, it can be found in the default
// location or in a location specified by the configs string array
store, err := oras.NewStore(configs...)
if err != nil {
return nil, errors.Wrap(err, "error resolving authentication")
}
cred, err := store.Credential(context.Background(), loginURL)
if err != nil {
return nil, errors.Wrap(err, "error resolving authentication")
}
username = cred.Username
password = cred.Password
// fallback to refresh token if it is available
if password == "" && cred.RefreshToken != "" {
password = cred.RefreshToken
}
}
// If the password is empty then the authentication failed.
if password == "" {
return nil, errors.New("unable to resolve authentication, missing identity token or password")
}
var acrClient AcrCLIClient
if username == "" || username == "00000000-0000-0000-0000-000000000000" {
// If the username is empty an ACR refresh token was used.
var err error
acrClient, err = newAcrCLIClientWithBearerAuth(loginURL, password)
if err != nil {
return nil, errors.Wrap(err, "error resolving authentication")
}
return &acrClient, nil
}
// if both the username and password were specified basic authentication can be assumed.
acrClient = newAcrCLIClientWithBasicAuth(loginURL, username, password)
return &acrClient, nil
}