in dubboctl/pkg/hub/credentials/credentials.go [130:217]
func (c *credentialsProvider) getCredentials(ctx context.Context, image string) (pusher.Credentials, error) {
var err error
result := pusher.Credentials{}
ref, err := name.ParseReference(image)
if err != nil {
return pusher.Credentials{}, fmt.Errorf("cannot parse the image reference: %w", err)
}
registry := ref.Context().RegistryStr()
for _, load := range c.credentialLoaders {
result, err = load(registry)
if err != nil {
if errors.Is(err, errCredentialsNotFound) {
continue
}
return pusher.Credentials{}, err
}
err = c.verifyCredentials(ctx, image, result)
if err == nil {
return result, nil
} else {
if !errors.Is(err, errUnauthorized) {
return pusher.Credentials{}, err
}
}
}
if c.promptForCredentials == nil {
return pusher.Credentials{}, errCredentialsNotFound
}
for {
result, err = c.promptForCredentials(registry)
if err != nil {
return pusher.Credentials{}, err
}
err = c.verifyCredentials(ctx, image, result)
if err == nil {
err = setCredentialsByCredentialHelper(c.authFilePath, registry, result.Username, result.Password)
if err != nil {
if strings.Contains(err.Error(), "not implemented") {
fmt.Fprintf(os.Stderr, "the cred-helper does not support write operation (consider changing the cred-helper it in auth.json)\n")
return pusher.Credentials{}, nil
}
if !errors.Is(err, errNoCredentialHelperConfigured) {
return pusher.Credentials{}, err
}
helpers := listCredentialHelpers()
helper, err := c.promptForCredentialStore(helpers)
if err != nil {
return pusher.Credentials{}, err
}
helper = strings.TrimPrefix(helper, "docker-credential-")
err = setCredentialHelperToConfig(c.authFilePath, helper)
if err != nil {
return pusher.Credentials{}, fmt.Errorf("faild to set the helper to the config: %w", err)
}
err = setCredentialsByCredentialHelper(c.authFilePath, registry, result.Username, result.Password)
if err != nil {
if strings.Contains(err.Error(), "not implemented") {
fmt.Fprintf(os.Stderr, "the cred-helper does not support write operation (consider changing the cred-helper it in auth.json)\n")
return pusher.Credentials{}, nil
}
if !errors.Is(err, errNoCredentialHelperConfigured) {
return pusher.Credentials{}, err
}
}
}
return result, nil
} else {
if errors.Is(err, errUnauthorized) {
continue
}
return pusher.Credentials{}, err
}
}
}