client.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package client
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "strings"
  7. "github.com/docker/docker-credential-helpers/credentials"
  8. )
  9. // Store uses an external program to save credentials.
  10. func Store(program ProgramFunc, credentials *credentials.Credentials) error {
  11. cmd := program("store")
  12. buffer := new(bytes.Buffer)
  13. if err := json.NewEncoder(buffer).Encode(credentials); err != nil {
  14. return err
  15. }
  16. cmd.Input(buffer)
  17. out, err := cmd.Output()
  18. if err != nil {
  19. t := strings.TrimSpace(string(out))
  20. return fmt.Errorf("error storing credentials - err: %v, out: `%s`", err, t)
  21. }
  22. return nil
  23. }
  24. // Get executes an external program to get the credentials from a native store.
  25. func Get(program ProgramFunc, serverURL string) (*credentials.Credentials, error) {
  26. cmd := program("get")
  27. cmd.Input(strings.NewReader(serverURL))
  28. out, err := cmd.Output()
  29. if err != nil {
  30. t := strings.TrimSpace(string(out))
  31. if credentials.IsErrCredentialsNotFoundMessage(t) {
  32. return nil, credentials.NewErrCredentialsNotFound()
  33. }
  34. return nil, fmt.Errorf("error getting credentials - err: %v, out: `%s`", err, t)
  35. }
  36. resp := &credentials.Credentials{
  37. ServerURL: serverURL,
  38. }
  39. if err := json.NewDecoder(bytes.NewReader(out)).Decode(resp); err != nil {
  40. return nil, err
  41. }
  42. return resp, nil
  43. }
  44. // Erase executes a program to remove the server credentials from the native store.
  45. func Erase(program ProgramFunc, serverURL string) error {
  46. cmd := program("erase")
  47. cmd.Input(strings.NewReader(serverURL))
  48. out, err := cmd.Output()
  49. if err != nil {
  50. t := strings.TrimSpace(string(out))
  51. return fmt.Errorf("error erasing credentials - err: %v, out: `%s`", err, t)
  52. }
  53. return nil
  54. }
  55. // List executes a program to list server credentials in the native store.
  56. func List(program ProgramFunc) (map[string]string, error) {
  57. cmd := program("list")
  58. cmd.Input(strings.NewReader("unused"))
  59. out, err := cmd.Output()
  60. if err != nil {
  61. t := strings.TrimSpace(string(out))
  62. return nil, fmt.Errorf("error listing credentials - err: %v, out: `%s`", err, t)
  63. }
  64. var resp map[string]string
  65. if err = json.NewDecoder(bytes.NewReader(out)).Decode(&resp); err != nil {
  66. return nil, err
  67. }
  68. return resp, nil
  69. }