/// <param name="uri">The uri of a web resource for which credentials are needed.</param> /// <param name="proxy">Ignored. Proxy information will not be passed to plugins.</param> /// <param name="type"> /// The type of credential request that is being made. Note that this implementation of /// <see cref="ICredentialProvider"/> does not support providing proxy credenitials and treats /// all other types the same. /// </param> /// <param name="isRetry">If true, credentials were previously supplied by this /// provider for the same uri.</param> /// <param name="message">A message provided by NuGet to show to the user when prompting.</param> /// <param name="nonInteractive">If true, the plugin must not prompt for credentials.</param> /// <param name="cancellationToken">A cancellation token.</param> /// <returns>A credential object.</returns> public async Task <CredentialResponse> GetAsync(Uri uri, IWebProxy proxy, CredentialRequestType type, string message, bool isRetry, bool nonInteractive, CancellationToken cancellationToken) { CredentialResponse taskResponse = null; if (type == CredentialRequestType.Proxy || !_isAnAuthenticationPlugin) { taskResponse = new CredentialResponse(CredentialStatus.ProviderNotApplicable); return(taskResponse); } var plugin = await _pluginManager.CreateSourceAgnosticPluginAsync(_discoveredPlugin, cancellationToken); if (!string.IsNullOrEmpty(plugin.Message)) { // There is a potential here for double logging as the CredentialService itself catches the exceptions and tries to log it. // In reality the logger in the Credential Service will be null because the first request always comes from a resource provider (ServiceIndex provider) _logger.LogError(plugin.Message); throw new PluginException(plugin.Message); // Throwing here will block authentication and ensure that the complete operation fails } _isAnAuthenticationPlugin = plugin.Claims.Contains(OperationClaim.Authentication); if (_isAnAuthenticationPlugin) { AddOrUpdateLogger(plugin.Plugin); await SetPluginLogLevelAsync(plugin, _logger, cancellationToken); if (proxy != null) { await SetProxyCredentialsToPlugin(uri, proxy, plugin, cancellationToken); } var request = new GetAuthenticationCredentialsRequest(uri, isRetry, nonInteractive); var credentialResponse = await plugin.Plugin.Connection.SendRequestAndReceiveResponseAsync <GetAuthenticationCredentialsRequest, GetAuthenticationCredentialsResponse>( MessageMethod.GetAuthenticationCredentials, request, cancellationToken); if (credentialResponse.ResponseCode == MessageResponseCode.NotFound && nonInteractive) { _logger.LogWarning( string.Format( CultureInfo.CurrentCulture, Resources.SecurePluginWarning_UseInteractiveOption) ); } taskResponse = GetAuthenticationCredentialsResponseToCredentialResponse(credentialResponse); } else { taskResponse = new CredentialResponse(CredentialStatus.ProviderNotApplicable); } return(taskResponse); }
/// <param name="uri">The uri of a web resource for which credentials are needed.</param> /// <param name="proxy">Ignored. Proxy information will not be passed to plugins.</param> /// <param name="type"> /// The type of credential request that is being made. Note that this implementation of /// <see cref="ICredentialProvider"/> does not support providing proxy credenitials and treats /// all other types the same. /// </param> /// <param name="isRetry">If true, credentials were previously supplied by this /// provider for the same uri.</param> /// <param name="message">A message provided by NuGet to show to the user when prompting.</param> /// <param name="nonInteractive">If true, the plugin must not prompt for credentials.</param> /// <param name="cancellationToken">A cancellation token.</param> /// <returns>A credential object.</returns> public async Task <CredentialResponse> GetAsync(Uri uri, IWebProxy proxy, CredentialRequestType type, string message, bool isRetry, bool nonInteractive, CancellationToken cancellationToken) { CredentialResponse taskResponse = null; if (type == CredentialRequestType.Proxy || !_isAnAuthenticationPlugin) { taskResponse = new CredentialResponse(CredentialStatus.ProviderNotApplicable); return(taskResponse); } var plugin = await _pluginManager.CreateSourceAgnosticPluginAsync(_discoveredPlugin, cancellationToken); _isAnAuthenticationPlugin = plugin.Claims.Contains(OperationClaim.Authentication); if (_isAnAuthenticationPlugin) { AddOrUpdateLogger(plugin.Plugin); if (proxy != null) { await SetProxyCredentialsToPlugin(uri, proxy, plugin, cancellationToken); } var request = new GetAuthenticationCredentialsRequest(uri, isRetry, nonInteractive); var credentialResponse = await plugin.Plugin.Connection.SendRequestAndReceiveResponseAsync <GetAuthenticationCredentialsRequest, GetAuthenticationCredentialsResponse>( MessageMethod.GetAuthenticationCredentials, request, cancellationToken); taskResponse = GetAuthenticationCredentialsResponseToCredentialResponse(credentialResponse); } else { taskResponse = new CredentialResponse(CredentialStatus.ProviderNotApplicable); } return(taskResponse); }