func()

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
		}
	}
}