diff options
author | Unknwon <joe2010xtmf@163.com> | 2015-02-01 17:21:56 -0500 |
---|---|---|
committer | Unknwon <joe2010xtmf@163.com> | 2015-02-01 17:21:56 -0500 |
commit | 0a2068d7fbd447de1135d3b16e9f26de5dd18d56 (patch) | |
tree | 17d5b4cf7ec4e9b68730fd6e99694c98a2e24829 /models | |
parent | cd6376f0930d6d0848936756675ffa4c96f6cea8 (diff) | |
download | gitea-0a2068d7fbd447de1135d3b16e9f26de5dd18d56.tar.gz gitea-0a2068d7fbd447de1135d3b16e9f26de5dd18d56.zip |
models: code fix on #818
Diffstat (limited to 'models')
-rw-r--r-- | models/publickey.go | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/models/publickey.go b/models/publickey.go index 41233d0c39..67ab4242f2 100644 --- a/models/publickey.go +++ b/models/publickey.go @@ -33,7 +33,7 @@ const ( ) var ( - ErrKeyAlreadyExist = errors.New("Public key already exist") + ErrKeyAlreadyExist = errors.New("Public key already exists") ErrKeyNotExist = errors.New("Public key does not exist") ErrKeyUnableVerify = errors.New("Unable to verify public key") ) @@ -41,7 +41,7 @@ var ( var sshOpLocker = sync.Mutex{} var ( - SshPath string // SSH directory. + SSHPath string // SSH directory. appPath string // Execution(binary) path. ) @@ -72,9 +72,9 @@ func init() { appPath = strings.Replace(appPath, "\\", "/", -1) // Determine and create .ssh path. - SshPath = filepath.Join(homeDir(), ".ssh") - if err = os.MkdirAll(SshPath, 0700); err != nil { - log.Fatal(4, "fail to create SshPath(%s): %v\n", SshPath, err) + SSHPath = filepath.Join(homeDir(), ".ssh") + if err = os.MkdirAll(SSHPath, 0700); err != nil { + log.Fatal(4, "fail to create '%s': %v", SSHPath, err) } } @@ -248,12 +248,13 @@ func saveAuthorizedKeyFile(keys ...*PublicKey) error { sshOpLocker.Lock() defer sshOpLocker.Unlock() - fpath := filepath.Join(SshPath, "authorized_keys") + fpath := filepath.Join(SSHPath, "authorized_keys") f, err := os.OpenFile(fpath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600) if err != nil { return err } defer f.Close() + finfo, err := f.Stat() if err != nil { return err @@ -270,8 +271,7 @@ func saveAuthorizedKeyFile(keys ...*PublicKey) error { } for _, key := range keys { - _, err = f.WriteString(key.GetAuthorizedString()) - if err != nil { + if _, err = f.WriteString(key.GetAuthorizedString()); err != nil { return err } } @@ -418,8 +418,8 @@ func DeletePublicKey(key *PublicKey) error { return err } - fpath := filepath.Join(SshPath, "authorized_keys") - tmpPath := filepath.Join(SshPath, "authorized_keys.tmp") + fpath := filepath.Join(SSHPath, "authorized_keys") + tmpPath := filepath.Join(SSHPath, "authorized_keys.tmp") if err = rewriteAuthorizedKeys(key, fpath, tmpPath); err != nil { return err } else if err = os.Remove(fpath); err != nil { @@ -428,20 +428,36 @@ func DeletePublicKey(key *PublicKey) error { return os.Rename(tmpPath, fpath) } -// RewriteAllPublicKeys remove any authorized key and re-write all key from database again +// RewriteAllPublicKeys removes any authorized key and rewrite all keys from database again. func RewriteAllPublicKeys() error { - keys := make([]*PublicKey, 0, 5) - err := x.Find(&keys) + sshOpLocker.Lock() + defer sshOpLocker.Unlock() + + tmpPath := filepath.Join(SSHPath, "authorized_keys.tmp") + f, err := os.Create(tmpPath) if err != nil { return err } + defer os.Remove(tmpPath) - fpath := filepath.Join(SshPath, "authorized_keys") - if _, err := os.Stat(fpath); os.IsNotExist(err) { - return saveAuthorizedKeyFile(keys...) + err = x.Iterate(new(PublicKey), func(idx int, bean interface{}) (err error) { + _, err = f.WriteString((bean.(*PublicKey)).GetAuthorizedString()) + return err + }) + f.Close() + if err != nil { + return err } - if err := os.Remove(fpath); err != nil { + + fpath := filepath.Join(SSHPath, "authorized_keys") + if com.IsExist(fpath) { + if err = os.Remove(fpath); err != nil { + return err + } + } + if err = os.Rename(tmpPath, fpath); err != nil { return err } - return saveAuthorizedKeyFile(keys...) + + return nil } |