No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

176 líneas
5.0 KiB

  1. package provider
  2. import (
  3. "bufio"
  4. "gitlab.ecloud.com/ecloud/ecloudsdkcore/auth"
  5. "gitlab.ecloud.com/ecloud/ecloudsdkcore/errs"
  6. "gitlab.ecloud.com/ecloud/ecloudsdkcore/utils"
  7. "os"
  8. "path/filepath"
  9. "strings"
  10. )
  11. type ICredentialProvider interface {
  12. GetCredential() (*auth.Credential, error)
  13. }
  14. type BasicCredentialProvider struct {
  15. credential *auth.Credential
  16. }
  17. func NewBasicCredentialProvider(credential *auth.Credential) *BasicCredentialProvider {
  18. if utils.IsUnSet(credential) {
  19. return nil
  20. }
  21. if utils.IsUnSet(credential.CredentialType) {
  22. credential.CredentialType = auth.CredentialTypePointer(auth.CredentialAkSk)
  23. }
  24. if utils.IsUnSet(credential.EncryptionType) {
  25. credential.EncryptionType = auth.EncryptionTypePointer(auth.EncrytNone)
  26. }
  27. return &BasicCredentialProvider{
  28. credential: credential,
  29. }
  30. }
  31. func (p *BasicCredentialProvider) GetCredential() (*auth.Credential, error) {
  32. return p.credential, nil
  33. }
  34. func CreateBasicCredentialProvider(credential *auth.Credential) *BasicCredentialProvider {
  35. return NewBasicCredentialProvider(credential)
  36. }
  37. type EnvCredentialProvider struct {
  38. }
  39. func NewEnvCredentialProvider() *EnvCredentialProvider {
  40. return &EnvCredentialProvider{}
  41. }
  42. func (p *EnvCredentialProvider) GetCredential() (*auth.Credential, error) {
  43. accessKey := os.Getenv(auth.EnvAkKey)
  44. secretKey := os.Getenv(auth.EnvSkKey)
  45. privateKey := os.Getenv(auth.EnvMopPrivateKey)
  46. publicKey := os.Getenv(auth.EnvMopPublicKey)
  47. if utils.IsSet(accessKey) && utils.IsSet(secretKey) {
  48. return auth.NewCredentialBuilder().
  49. AccessKey(accessKey).
  50. SecretKey(secretKey).
  51. PrivateKey(privateKey).
  52. PublicKey(publicKey).
  53. Build(), nil
  54. }
  55. return nil, errs.NewCredentialError("EnvCredentialProvider: accessKey or secretKey cannot be empty", nil)
  56. }
  57. func CreateEnvCredentialProvider() *EnvCredentialProvider {
  58. return NewEnvCredentialProvider()
  59. }
  60. type ProfileCredentialProvider struct {
  61. Credential *auth.Credential
  62. profilePath string
  63. }
  64. func NewProfileCredentialProvider(credential *auth.Credential, profilePath string) *ProfileCredentialProvider {
  65. return &ProfileCredentialProvider{Credential: credential, profilePath: profilePath}
  66. }
  67. func getProfilePath(profilePath string) (string, error) {
  68. _, err := os.Stat(profilePath)
  69. if err != nil {
  70. return "", errs.NewCredentialError("Get the profile directory error", err)
  71. }
  72. return profilePath, nil
  73. }
  74. func getProfilePathByDefault() (string, error) {
  75. dir, err := os.UserHomeDir()
  76. if err != nil {
  77. return "", errs.NewCredentialError("Get the user home directory error", err)
  78. }
  79. dir = filepath.Join(dir, strings.ReplaceAll(auth.PathCredentialFile, "/", string(filepath.Separator)))
  80. _, err = os.Stat(dir)
  81. if err != nil {
  82. return "", errs.NewCredentialError("Get the profile directory error", err)
  83. }
  84. return dir, nil
  85. }
  86. func (p *ProfileCredentialProvider) GetCredential() (*auth.Credential, error) {
  87. path, ok := os.LookupEnv(auth.EnvCredentialFile)
  88. if !ok {
  89. var err error
  90. if p.profilePath != "" {
  91. path, err = getProfilePath(p.profilePath)
  92. } else {
  93. path, err = getProfilePathByDefault()
  94. }
  95. if err != nil {
  96. return nil, err
  97. }
  98. }
  99. if path == "" {
  100. return nil, errs.NewCredentialError(auth.EnvCredentialFile+" cannot be empty", nil)
  101. }
  102. file, err := os.Open(path)
  103. if err != nil {
  104. return nil, errs.NewCredentialError("Open the profile file error", err)
  105. }
  106. defer file.Close()
  107. scanner := bufio.NewScanner(file)
  108. config := make(map[string]string)
  109. for scanner.Scan() {
  110. line := scanner.Text()
  111. parts := strings.SplitN(line, "=", 2)
  112. if len(parts) == 2 {
  113. key := strings.TrimSpace(parts[0])
  114. value := strings.TrimSpace(parts[1])
  115. config[key] = value
  116. }
  117. }
  118. return auth.NewCredentialBuilder().
  119. AccessKey(config[auth.ProfileAccessKey]).
  120. SecretKey(config[auth.ProfileSecretKey]).
  121. PrivateKey(config[auth.ProfileMopPrivateKey]).
  122. PublicKey(config[auth.ProfileMopPublicKey]).
  123. Build(), nil
  124. }
  125. func CreateProfileCredentialProvider(credential *auth.Credential, profilePath string) *ProfileCredentialProvider {
  126. return NewProfileCredentialProvider(credential, profilePath)
  127. }
  128. func CreateProfileCredentialProviderByDefault() *ProfileCredentialProvider {
  129. return NewProfileCredentialProvider(auth.NewCredential(), "")
  130. }
  131. func CreateProfileCredentialProviderByPath(profilePath string) *ProfileCredentialProvider {
  132. return NewProfileCredentialProvider(auth.NewCredential(), profilePath)
  133. }
  134. type CredentialProviderChain struct {
  135. providers []ICredentialProvider
  136. }
  137. func NewCredentialProviderChain(providers ...ICredentialProvider) *CredentialProviderChain {
  138. return &CredentialProviderChain{providers: providers}
  139. }
  140. func (c *CredentialProviderChain) GetCredential() (*auth.Credential, error) {
  141. for _, provider := range c.providers {
  142. credential, err := provider.GetCredential()
  143. if err == nil && credential != nil {
  144. return credential, nil
  145. }
  146. }
  147. return nil, errs.NewCredentialError("no valid credential found", nil)
  148. }
  149. func CreateCredentialProviderChain(providers ...ICredentialProvider) *CredentialProviderChain {
  150. return NewCredentialProviderChain(providers...)
  151. }