예제 #1
0
        /// <inheritdoc />
        public Task <ConnectionStringResult> GetConnectionString()
        {
            var value = Environment.GetEnvironmentVariable(_connectionStringVariableName);

            return(Task.FromResult(value == null
                ? ConnectionStringResult.CreateFailure(
                                       $"Expected connection string environment variable not defined: [{_connectionStringVariableName}]'")
                : ConnectionStringResult.CreateSuccess(value)));
        }
예제 #2
0
 public Task <ConnectionStringResult> GetConnectionString()
 {
     return(Task.Run(() =>
     {
         try
         {
             _logger.Debug("Deserializing secret for CB with secret name {0}.", _secretKeyName);
             var secret = _host.GetSecretStoreValue(_secretKeyName);
             return ConnectionStringResult.CreateSuccess(secret);
         }
         catch (Exception ex)
         {
             return ConnectionStringResult.CreateFailure(ex);
         }
     }));
 }
예제 #3
0
        private ConnectionStringResult Execute(CancellationToken cancellationToken)
        {
            try
            {
                var    stdOut         = new StringBuilder();
                var    stdError       = new StringBuilder();
                string argumentString = $"-intent \"{_redisConnectionIntent}\"";

                string environmentVariable = Environment.GetEnvironmentVariable(CredentialProviderVariableName);
                if (string.IsNullOrEmpty(environmentVariable))
                {
                    return
                        (ConnectionStringResult.CreateFailure(
                             $"Credential provider environment variable {CredentialProviderVariableName} not set."));
                }

                var startInfo = new ProcessStartInfo
                {
                    FileName               = environmentVariable,
                    Arguments              = argumentString,
                    WindowStyle            = ProcessWindowStyle.Hidden,
                    UseShellExecute        = false,
                    RedirectStandardOutput = true,
                    RedirectStandardError  = true,
                    StandardOutputEncoding = Encoding.UTF8,
                    StandardErrorEncoding  = Encoding.UTF8,
                    ErrorDialog            = false
                };

                var process = Process.Start(startInfo);
                if (process == null)
                {
                    return(ConnectionStringResult.CreateFailure($"Failed to start credential provider process {environmentVariable}."));
                }

                process.OutputDataReceived += (o, e) => { stdOut.Append(e.Data); };
                process.ErrorDataReceived  += (o, e) => { stdError.Append(e.Data); };
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();

                using (cancellationToken.Register(() => Kill(process)))
                {
                    if (!process.WaitForExit((int)_credentialProviderTimeout.TotalMilliseconds))
                    {
                        Kill(process);
                        return
                            (ConnectionStringResult.CreateFailure(
                                 $"Credential provider took longer {_credentialProviderTimeout.TotalSeconds} secs."));
                    }

                    // Give time for the Async event handlers to finish by calling WaitForExit again.
                    // if the first one succeeded
                    // Note: Read remarks from https://msdn.microsoft.com/en-us/library/ty0d8k56(v=vs.110).aspx
                    // for reason.
                    process.WaitForExit();
                }

                process.CancelErrorRead();
                process.CancelOutputRead();

                if (process.ExitCode != 0)
                {
                    return(ConnectionStringResult.CreateFailure(
                               $"Credential provider execution failed with exit code {process.ExitCode}",
                               $"StdOut: \n{stdOut}\nStdErr: \n{stdError}\n"));
                }

                return(ConnectionStringResult.CreateSuccess(stdOut.ToString()));
            }
            catch (Exception e)
            {
                return(ConnectionStringResult.CreateFailure(e));
            }
        }
예제 #4
0
 /// <inheritdoc />
 public Task <ConnectionStringResult> GetConnectionString() => Task.FromResult(ConnectionStringResult.CreateSuccess(_connectionString));
 public Task <ConnectionStringResult> GetConnectionString()
 {
     return(Task.FromResult(ConnectionStringResult.CreateFailure(_errorMessage)));
 }