github.com/itscaro/cli@v0.0.0-20190705081621-c9db0fe93829/cli/config/credentials/file_store.go (about)

     1  package credentials
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/docker/cli/cli/config/types"
     7  )
     8  
     9  type store interface {
    10  	Save() error
    11  	GetAuthConfigs() map[string]types.AuthConfig
    12  	GetFilename() string
    13  }
    14  
    15  // fileStore implements a credentials store using
    16  // the docker configuration file to keep the credentials in plain text.
    17  type fileStore struct {
    18  	file store
    19  }
    20  
    21  // NewFileStore creates a new file credentials store.
    22  func NewFileStore(file store) Store {
    23  	return &fileStore{file: file}
    24  }
    25  
    26  // Erase removes the given credentials from the file store.
    27  func (c *fileStore) Erase(serverAddress string) error {
    28  	delete(c.file.GetAuthConfigs(), serverAddress)
    29  	return c.file.Save()
    30  }
    31  
    32  // Get retrieves credentials for a specific server from the file store.
    33  func (c *fileStore) Get(serverAddress string) (types.AuthConfig, error) {
    34  	authConfig, ok := c.file.GetAuthConfigs()[serverAddress]
    35  	if !ok {
    36  		// Maybe they have a legacy config file, we will iterate the keys converting
    37  		// them to the new format and testing
    38  		for r, ac := range c.file.GetAuthConfigs() {
    39  			if serverAddress == ConvertToHostname(r) {
    40  				return ac, nil
    41  			}
    42  		}
    43  
    44  		authConfig = types.AuthConfig{}
    45  	}
    46  	return authConfig, nil
    47  }
    48  
    49  func (c *fileStore) GetAll() (map[string]types.AuthConfig, error) {
    50  	return c.file.GetAuthConfigs(), nil
    51  }
    52  
    53  // Store saves the given credentials in the file store.
    54  func (c *fileStore) Store(authConfig types.AuthConfig) error {
    55  	c.file.GetAuthConfigs()[authConfig.ServerAddress] = authConfig
    56  	return c.file.Save()
    57  }
    58  
    59  func (c *fileStore) GetFilename() string {
    60  	return c.file.GetFilename()
    61  }
    62  
    63  func (c *fileStore) IsFileStore() bool {
    64  	return true
    65  }
    66  
    67  // ConvertToHostname converts a registry url which has http|https prepended
    68  // to just an hostname.
    69  // Copied from github.com/docker/docker/registry.ConvertToHostname to reduce dependencies.
    70  func ConvertToHostname(url string) string {
    71  	stripped := url
    72  	if strings.HasPrefix(url, "http://") {
    73  		stripped = strings.TrimPrefix(url, "http://")
    74  	} else if strings.HasPrefix(url, "https://") {
    75  		stripped = strings.TrimPrefix(url, "https://")
    76  	}
    77  
    78  	nameParts := strings.SplitN(stripped, "/", 2)
    79  
    80  	return nameParts[0]
    81  }