mirror of
https://github.com/minio/mc.git
synced 2025-11-14 23:42:27 +03:00
Fix a config corruption bug when config.json has wrong json format, would lead to overwriting the previous config.json
This commit is contained in:
10
cmd_test.go
10
cmd_test.go
@@ -99,15 +99,15 @@ func (s *CmdTestSuite) TearDownSuite(c *C) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *CmdTestSuite) TestGetNewClient(c *C) {
|
func (s *CmdTestSuite) TestGetNewClient(c *C) {
|
||||||
_, err := getNewClient("http://example.com/bucket1", &hostConfig{})
|
_, err := getNewClient("http://example.com/bucket1", hostConfig{})
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
_, err = getNewClient("https://example.com/bucket1", &hostConfig{})
|
_, err = getNewClient("https://example.com/bucket1", hostConfig{})
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
_, err = getNewClient("C:\\Users\\Administrator\\MyDocuments", &hostConfig{})
|
_, err = getNewClient("C:\\Users\\Administrator\\MyDocuments", hostConfig{})
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
_, err = getNewClient("/usr/bin/pandoc", &hostConfig{})
|
_, err = getNewClient("/usr/bin/pandoc", hostConfig{})
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
_, err = getNewClient("pkg/client", &hostConfig{})
|
_, err = getNewClient("pkg/client", hostConfig{})
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -135,16 +135,13 @@ func putTargets(targetURLs []string, length int64, reader io.Reader) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// getNewClient gives a new client interface
|
// getNewClient gives a new client interface
|
||||||
func getNewClient(urlStr string, auth *hostConfig) (clnt client.Client, err error) {
|
func getNewClient(urlStr string, auth hostConfig) (clnt client.Client, err error) {
|
||||||
url, err := client.Parse(urlStr)
|
url, err := client.Parse(urlStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewIodine(iodine.New(errInvalidURL{URL: urlStr}, map[string]string{"URL": urlStr}))
|
return nil, iodine.New(errInvalidURL{URL: urlStr}, map[string]string{"URL": urlStr})
|
||||||
}
|
}
|
||||||
switch url.Type {
|
switch url.Type {
|
||||||
case client.Object: // Minio and S3 compatible cloud storage
|
case client.Object: // Minio and S3 compatible cloud storage
|
||||||
if auth == nil {
|
|
||||||
return nil, NewIodine(iodine.New(errInvalidArgument{}, nil))
|
|
||||||
}
|
|
||||||
s3Config := new(s3.Config)
|
s3Config := new(s3.Config)
|
||||||
s3Config.AccessKeyID = func() string {
|
s3Config.AccessKeyID = func() string {
|
||||||
if auth.AccessKeyID == globalAccessKeyID {
|
if auth.AccessKeyID == globalAccessKeyID {
|
||||||
@@ -167,19 +164,19 @@ func getNewClient(urlStr string, auth *hostConfig) (clnt client.Client, err erro
|
|||||||
case client.Filesystem:
|
case client.Filesystem:
|
||||||
return fs.New(urlStr)
|
return fs.New(urlStr)
|
||||||
}
|
}
|
||||||
return nil, NewIodine(iodine.New(errInvalidURL{URL: urlStr}, nil))
|
return nil, iodine.New(errInvalidURL{URL: urlStr}, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// url2Stat - Returns client, config and its stat Content from the URL
|
// url2Stat - Returns client, config and its stat Content from the URL
|
||||||
func url2Stat(urlStr string) (client client.Client, content *client.Content, err error) {
|
func url2Stat(urlStr string) (client client.Client, content *client.Content, err error) {
|
||||||
client, err = url2Client(urlStr)
|
client, err = url2Client(urlStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, NewIodine(iodine.New(err, map[string]string{"URL": urlStr}))
|
return nil, nil, iodine.New(err, map[string]string{"URL": urlStr})
|
||||||
}
|
}
|
||||||
|
|
||||||
content, err = client.Stat()
|
content, err = client.Stat()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, NewIodine(iodine.New(err, map[string]string{"URL": urlStr}))
|
return nil, nil, iodine.New(err, map[string]string{"URL": urlStr})
|
||||||
}
|
}
|
||||||
|
|
||||||
return client, content, nil
|
return client, content, nil
|
||||||
@@ -189,21 +186,21 @@ func url2Client(url string) (client.Client, error) {
|
|||||||
// Empty source arg?
|
// Empty source arg?
|
||||||
urlParse, err := client.Parse(url)
|
urlParse, err := client.Parse(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewIodine(iodine.New(err, map[string]string{"URL": url}))
|
return nil, iodine.New(err, map[string]string{"URL": url})
|
||||||
}
|
}
|
||||||
|
|
||||||
if urlParse.Path == "" {
|
if urlParse.Path == "" {
|
||||||
return nil, NewIodine(iodine.New(errInvalidURL{URL: url}, map[string]string{"URL": url}))
|
return nil, iodine.New(errInvalidURL{URL: url}, map[string]string{"URL": url})
|
||||||
}
|
}
|
||||||
|
|
||||||
urlconfig, err := getHostConfig(url)
|
urlconfig, err := getHostConfig(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewIodine(iodine.New(err, map[string]string{"URL": url}))
|
return nil, iodine.New(err, map[string]string{"URL": url})
|
||||||
}
|
}
|
||||||
|
|
||||||
client, err := getNewClient(url, urlconfig)
|
client, err := getNewClient(url, urlconfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewIodine(iodine.New(err, map[string]string{"URL": url}))
|
return nil, iodine.New(err, map[string]string{"URL": url})
|
||||||
}
|
}
|
||||||
|
|
||||||
return client, nil
|
return client, nil
|
||||||
@@ -213,7 +210,7 @@ func url2Client(url string) (client.Client, error) {
|
|||||||
func source2Client(sourceURL string) (client.Client, error) {
|
func source2Client(sourceURL string) (client.Client, error) {
|
||||||
sourceClient, err := url2Client(sourceURL)
|
sourceClient, err := url2Client(sourceURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewIodine(iodine.New(errInvalidSource{URL: sourceURL}, map[string]string{"URL": sourceURL}))
|
return nil, iodine.New(errInvalidSource{URL: sourceURL}, map[string]string{"URL": sourceURL})
|
||||||
}
|
}
|
||||||
return sourceClient, nil
|
return sourceClient, nil
|
||||||
}
|
}
|
||||||
@@ -222,7 +219,7 @@ func source2Client(sourceURL string) (client.Client, error) {
|
|||||||
func target2Client(targetURL string) (client.Client, error) {
|
func target2Client(targetURL string) (client.Client, error) {
|
||||||
targetClient, err := url2Client(targetURL)
|
targetClient, err := url2Client(targetURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewIodine(iodine.New(errInvalidTarget{URL: targetURL}, map[string]string{"URL": targetURL}))
|
return nil, iodine.New(errInvalidTarget{URL: targetURL}, map[string]string{"URL": targetURL})
|
||||||
}
|
}
|
||||||
return targetClient, nil
|
return targetClient, nil
|
||||||
}
|
}
|
||||||
|
|||||||
22
config.go
22
config.go
@@ -31,7 +31,7 @@ import (
|
|||||||
type configV1 struct {
|
type configV1 struct {
|
||||||
Version string
|
Version string
|
||||||
Aliases map[string]string
|
Aliases map[string]string
|
||||||
Hosts map[string]*hostConfig
|
Hosts map[string]hostConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
// cached variables should *NEVER* be accessed directly from outside this file.
|
// cached variables should *NEVER* be accessed directly from outside this file.
|
||||||
@@ -186,7 +186,9 @@ func migrateConfigV1ToV101() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
console.Fatalln(NewIodine(iodine.New(err, nil)))
|
console.Fatalln(NewIodine(iodine.New(err, nil)))
|
||||||
}
|
}
|
||||||
config.Load(mustGetMcConfigPath())
|
if err := config.Load(mustGetMcConfigPath()); err != nil {
|
||||||
|
console.Fatalln(NewIodine(iodine.New(err, nil)))
|
||||||
|
}
|
||||||
conf = config.Data().(*configV1)
|
conf = config.Data().(*configV1)
|
||||||
// version is the same return
|
// version is the same return
|
||||||
if conf.Version == mcCurrentConfigVersion {
|
if conf.Version == mcCurrentConfigVersion {
|
||||||
@@ -194,7 +196,7 @@ func migrateConfigV1ToV101() {
|
|||||||
}
|
}
|
||||||
conf.Version = mcCurrentConfigVersion
|
conf.Version = mcCurrentConfigVersion
|
||||||
|
|
||||||
localHostConfig := new(hostConfig)
|
localHostConfig := hostConfig{}
|
||||||
localHostConfig.AccessKeyID = ""
|
localHostConfig.AccessKeyID = ""
|
||||||
localHostConfig.SecretAccessKey = ""
|
localHostConfig.SecretAccessKey = ""
|
||||||
|
|
||||||
@@ -218,7 +220,7 @@ func newConfigV1() *configV1 {
|
|||||||
conf.Version = mcPreviousConfigVersion
|
conf.Version = mcPreviousConfigVersion
|
||||||
// make sure to allocate map's otherwise Golang
|
// make sure to allocate map's otherwise Golang
|
||||||
// exits silently without providing any errors
|
// exits silently without providing any errors
|
||||||
conf.Hosts = make(map[string]*hostConfig)
|
conf.Hosts = make(map[string]hostConfig)
|
||||||
conf.Aliases = make(map[string]string)
|
conf.Aliases = make(map[string]string)
|
||||||
return conf
|
return conf
|
||||||
}
|
}
|
||||||
@@ -229,27 +231,27 @@ func newConfigV101() *configV1 {
|
|||||||
conf.Version = mcCurrentConfigVersion
|
conf.Version = mcCurrentConfigVersion
|
||||||
// make sure to allocate map's otherwise Golang
|
// make sure to allocate map's otherwise Golang
|
||||||
// exits silently without providing any errors
|
// exits silently without providing any errors
|
||||||
conf.Hosts = make(map[string]*hostConfig)
|
conf.Hosts = make(map[string]hostConfig)
|
||||||
conf.Aliases = make(map[string]string)
|
conf.Aliases = make(map[string]string)
|
||||||
|
|
||||||
localHostConfig := new(hostConfig)
|
localHostConfig := hostConfig{}
|
||||||
localHostConfig.AccessKeyID = ""
|
localHostConfig.AccessKeyID = ""
|
||||||
localHostConfig.SecretAccessKey = ""
|
localHostConfig.SecretAccessKey = ""
|
||||||
|
|
||||||
s3HostConf := new(hostConfig)
|
s3HostConf := hostConfig{}
|
||||||
s3HostConf.AccessKeyID = globalAccessKeyID
|
s3HostConf.AccessKeyID = globalAccessKeyID
|
||||||
s3HostConf.SecretAccessKey = globalSecretAccessKey
|
s3HostConf.SecretAccessKey = globalSecretAccessKey
|
||||||
|
|
||||||
// Your example host config
|
// Your example host config
|
||||||
exampleHostConf := new(hostConfig)
|
exampleHostConf := hostConfig{}
|
||||||
exampleHostConf.AccessKeyID = globalAccessKeyID
|
exampleHostConf.AccessKeyID = globalAccessKeyID
|
||||||
exampleHostConf.SecretAccessKey = globalSecretAccessKey
|
exampleHostConf.SecretAccessKey = globalSecretAccessKey
|
||||||
|
|
||||||
playHostConfig := new(hostConfig)
|
playHostConfig := hostConfig{}
|
||||||
playHostConfig.AccessKeyID = ""
|
playHostConfig.AccessKeyID = ""
|
||||||
playHostConfig.SecretAccessKey = ""
|
playHostConfig.SecretAccessKey = ""
|
||||||
|
|
||||||
dlHostConfig := new(hostConfig)
|
dlHostConfig := hostConfig{}
|
||||||
dlHostConfig.AccessKeyID = ""
|
dlHostConfig.AccessKeyID = ""
|
||||||
dlHostConfig.SecretAccessKey = ""
|
dlHostConfig.SecretAccessKey = ""
|
||||||
|
|
||||||
|
|||||||
@@ -29,18 +29,18 @@ type hostConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// getHostConfig retrieves host specific configuration such as access keys, certs.
|
// getHostConfig retrieves host specific configuration such as access keys, certs.
|
||||||
func getHostConfig(URL string) (*hostConfig, error) {
|
func getHostConfig(URL string) (hostConfig, error) {
|
||||||
config, err := getMcConfig()
|
config, err := getMcConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewIodine(iodine.New(err, nil))
|
return hostConfig{}, NewIodine(iodine.New(err, nil))
|
||||||
}
|
}
|
||||||
url, err := client.Parse(URL)
|
url, err := client.Parse(URL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewIodine(iodine.New(errInvalidURL{URL: URL}, nil))
|
return hostConfig{}, NewIodine(iodine.New(errInvalidURL{URL: URL}, nil))
|
||||||
}
|
}
|
||||||
// No host matching or keys needed for filesystem requests
|
// No host matching or keys needed for filesystem requests
|
||||||
if url.Type == client.Filesystem {
|
if url.Type == client.Filesystem {
|
||||||
hostCfg := &hostConfig{
|
hostCfg := hostConfig{
|
||||||
AccessKeyID: "",
|
AccessKeyID: "",
|
||||||
SecretAccessKey: "",
|
SecretAccessKey: "",
|
||||||
}
|
}
|
||||||
@@ -50,14 +50,11 @@ func getHostConfig(URL string) (*hostConfig, error) {
|
|||||||
for globURL, hostCfg := range config.Hosts {
|
for globURL, hostCfg := range config.Hosts {
|
||||||
match, err := filepath.Match(globURL, url.Host)
|
match, err := filepath.Match(globURL, url.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewIodine(iodine.New(errInvalidGlobURL{glob: globURL, request: URL}, nil))
|
return hostConfig{}, NewIodine(iodine.New(errInvalidGlobURL{glob: globURL, request: URL}, nil))
|
||||||
}
|
}
|
||||||
if match {
|
if match {
|
||||||
if hostCfg == nil {
|
|
||||||
return nil, NewIodine(iodine.New(errInvalidAuth{}, nil))
|
|
||||||
}
|
|
||||||
return hostCfg, nil
|
return hostCfg, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, NewIodine(iodine.New(errNoMatchingHost{}, nil))
|
return hostConfig{}, NewIodine(iodine.New(errNoMatchingHost{}, nil))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user