diff --git a/pkg/server/api/api-generic-handlers.go b/pkg/server/api/api-generic-handlers.go index 1cff82502..5d7f3fb00 100644 --- a/pkg/server/api/api-generic-handlers.go +++ b/pkg/server/api/api-generic-handlers.go @@ -19,10 +19,13 @@ package api import ( "errors" "net/http" + "os" + "os/user" + "path/filepath" "strings" "time" - "github.com/minio/minio/pkg/server/config" + "github.com/minio/minio/pkg/quick" "github.com/minio/minio/pkg/utils/crypto/keys" ) @@ -179,18 +182,48 @@ func ValidateAuthHeaderHandler(h http.Handler) http.Handler { return validateAuthHandler{h} } +// User context +type User struct { + Version string + Name string + AccessKey string + SecretKey string +} + +func getConfigFile() string { + u, err := user.Current() + if err != nil { + return "" + } + confPath := filepath.Join(u.HomeDir, ".minio") + if err := os.MkdirAll(confPath, 0700); err != nil { + return "" + } + return filepath.Join(confPath, "config.json") +} + // validate auth header handler ServeHTTP() wrapper func (h validateAuthHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { acceptsContentType := getContentType(r) _, err := stripAuth(r) switch err.(type) { case nil: - var conf = config.Config{} - if err := conf.SetupConfig(); err != nil { + users := make(map[string]User) + configFile := getConfigFile() + if configFile == "" { + writeErrorResponse(w, r, InternalError, acceptsContentType, r.URL.Path) + return + } + qconf, err := quick.New(&users) + if err != nil { + writeErrorResponse(w, r, InternalError, acceptsContentType, r.URL.Path) + return + } + if err := qconf.Save(configFile); err != nil { writeErrorResponse(w, r, InternalError, acceptsContentType, r.URL.Path) return } - if err := conf.ReadConfig(); err != nil { + if err := qconf.Load(configFile); err != nil { writeErrorResponse(w, r, InternalError, acceptsContentType, r.URL.Path) return } diff --git a/pkg/server/config/config.go b/pkg/server/config/config.go deleted file mode 100644 index 96f9e9efe..000000000 --- a/pkg/server/config/config.go +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2015 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "encoding/json" - "io" - "os" - "os/user" - "path/filepath" - "sync" - - "github.com/minio/minio/pkg/iodine" -) - -// Config context -type Config struct { - ConfigPath string - ConfigFile string - ConfigLock *sync.RWMutex - Users map[string]User -} - -// User context -type User struct { - Name string - AccessKey string - SecretKey string -} - -// SetupConfig initialize config directory and template config -func (c *Config) SetupConfig() error { - u, err := user.Current() - if err != nil { - return iodine.New(err, nil) - } - - confPath := filepath.Join(u.HomeDir, ".minio") - if err := os.MkdirAll(confPath, 0700); err != nil { - return iodine.New(err, nil) - } - - c.ConfigPath = confPath - c.ConfigFile = filepath.Join(c.ConfigPath, "config.json") - if _, err := os.Stat(c.ConfigFile); os.IsNotExist(err) { - _, err = os.Create(c.ConfigFile) - if err != nil { - return iodine.New(err, nil) - } - } - - c.ConfigLock = new(sync.RWMutex) - return nil -} - -// GetConfigPath config file location -func (c *Config) GetConfigPath() string { - return c.ConfigPath -} - -// IsUserExists verify if user exists -func (c *Config) IsUserExists(username string) bool { - for _, user := range c.Users { - if user.Name == username { - return true - } - } - return false -} - -// GetUser - get user from username -func (c *Config) GetUser(username string) User { - for _, user := range c.Users { - if user.Name == username { - return user - } - } - return User{} -} - -// AddUser - add a user into existing User list -func (c *Config) AddUser(user User) { - var currentUsers map[string]User - if len(c.Users) == 0 { - currentUsers = make(map[string]User) - } else { - currentUsers = c.Users - } - currentUsers[user.AccessKey] = user - c.Users = currentUsers -} - -// WriteConfig - write encoded json in config file -func (c *Config) WriteConfig() error { - c.ConfigLock.Lock() - defer c.ConfigLock.Unlock() - - var file *os.File - var err error - - file, err = os.OpenFile(c.ConfigFile, os.O_WRONLY, 0666) - defer file.Close() - if err != nil { - return iodine.New(err, nil) - } - - encoder := json.NewEncoder(file) - encoder.Encode(c.Users) - return nil -} - -// ReadConfig - read json config file and decode -func (c *Config) ReadConfig() error { - c.ConfigLock.RLock() - defer c.ConfigLock.RUnlock() - - var file *os.File - var err error - - file, err = os.OpenFile(c.ConfigFile, os.O_RDONLY, 0666) - defer file.Close() - if err != nil { - return iodine.New(err, nil) - } - - users := make(map[string]User) - decoder := json.NewDecoder(file) - err = decoder.Decode(&users) - switch err { - case io.EOF: - return nil - case nil: - c.Users = users - return nil - default: - return iodine.New(err, nil) - } -} diff --git a/pkg/server/config/config_test.go b/pkg/server/config/config_test.go deleted file mode 100644 index f2ca5bd2e..000000000 --- a/pkg/server/config/config_test.go +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2015 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "io/ioutil" - "os" - "path/filepath" - "sync" - "testing" - - . "github.com/minio/check" - "github.com/minio/minio/pkg/utils/crypto/keys" -) - -type MySuite struct{} - -var _ = Suite(&MySuite{}) - -func Test(t *testing.T) { TestingT(t) } - -func (s *MySuite) TestConfig(c *C) { - conf := Config{} - conf.ConfigLock = new(sync.RWMutex) - conf.ConfigPath, _ = ioutil.TempDir("/tmp", "minio-test-") - defer os.RemoveAll(conf.ConfigPath) - conf.ConfigFile = filepath.Join(conf.ConfigPath, "config.json") - if _, err := os.Stat(conf.ConfigFile); os.IsNotExist(err) { - _, err = os.Create(conf.ConfigFile) - if err != nil { - c.Fatal(err) - } - } - - accesskey, _ := keys.GenerateRandomAlphaNumeric(keys.MinioAccessID) - secretkey, _ := keys.GenerateRandomBase64(keys.MinioSecretID) - - user := User{ - Name: "gnubot", - AccessKey: string(accesskey), - SecretKey: string(secretkey), - } - - conf.AddUser(user) - err := conf.WriteConfig() - c.Assert(err, IsNil) - - err = conf.ReadConfig() - c.Assert(err, IsNil) - - accesskey, _ = keys.GenerateRandomAlphaNumeric(keys.MinioAccessID) - secretkey, _ = keys.GenerateRandomBase64(keys.MinioSecretID) - user = User{ - Name: "minio", - AccessKey: string(accesskey), - SecretKey: string(secretkey), - } - conf.AddUser(user) - err = conf.WriteConfig() - c.Assert(err, IsNil) -}