From ee9bcf4d9ff41fb0cc02e53c2da2b9bfc520d54b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 17 Feb 2014 23:57:23 +0800 Subject: [PATCH] add publickey & access --- models/access.go | 29 ++++++++++++++++++++++++ models/models.go | 14 +----------- models/publickey.go | 55 +++++++++++++++++++++++++++++++++++++++++++++ models/repo.go | 4 ++-- 4 files changed, 87 insertions(+), 15 deletions(-) create mode 100644 models/access.go create mode 100644 models/publickey.go diff --git a/models/access.go b/models/access.go new file mode 100644 index 00000000..11bb360a --- /dev/null +++ b/models/access.go @@ -0,0 +1,29 @@ +package models + +import ( + "strings" + "time" +) + +const ( + Readable = iota + 1 + Writable +) + +type Access struct { + Id int64 + UserName string `xorm:"unique(s)"` + RepoName string `xorm:"unique(s)"` + Mode int `xorm:"unique(s)"` + Created time.Time `xorm:"created"` +} + +func AddAccess(access *Access) error { + _, err := orm.Insert(access) + return err +} + +// if one user can read or write one repository +func HasAccess(userName, repoName, mode string) (bool, error) { + return orm.Get(&Access{0, strings.ToLower(userName), strings.ToLower(repoName), mode}) +} diff --git a/models/models.go b/models/models.go index 1c8ce730..0d49162d 100644 --- a/models/models.go +++ b/models/models.go @@ -4,25 +4,13 @@ package models -import ( - "time" - - "github.com/lunny/xorm" -) +import "github.com/lunny/xorm" var ( orm *xorm.Engine repoRootPath string ) -type PublicKey struct { - Id int64 - Name string `xorm:"unique not null"` - Content string `xorm:"text not null"` - Created time.Time `xorm:"created"` - Updated time.Time `xorm:"updated"` -} - type Members struct { Id int64 OrgId int64 `xorm:"unique(s) index"` diff --git a/models/publickey.go b/models/publickey.go new file mode 100644 index 00000000..bc9fbb33 --- /dev/null +++ b/models/publickey.go @@ -0,0 +1,55 @@ +package models + +import ( + "fmt" + "os" + "path/filepath" + "time" +) + +var ( + publicKeyRootPath string + tmplPublicKey = "### autogenerated by gitgos, DO NOT EDIT\n" + + "command=\"gitosis-serve %s\",no-port-forwarding," + + "no-X11-forwarding,no-agent-forwarding,no-pty %s" +) + +type PublicKey struct { + Id int64 + OwnerId int64 `xorm:"index"` + Name string `xorm:"unique not null"` + Content string `xorm:"text not null"` + Created time.Time `xorm:"created"` + Updated time.Time `xorm:"updated"` +} + +func GenAuthorizedKey(user, key string) string { + return fmt.Sprintf(tmplPublicKey, user, key) +} + +func AddPublicKey(key *PublicKey, user string) error { + _, err := orm.Insert(key) + if err != nil { + return err + } + + err = SaveAuthorizedKeyFile(user, key.Content) + if err != nil { + _, err2 := orm.Delete(key) + if err2 != nil { + // TODO: logo the error + } + return err + } + + return nil +} + +func SaveAuthorizedKeyFile(user, key string) error { + f, err := os.Create(filepath.Join(publicKeyRootPath, user+".pub")) + if err != nil { + return err + } + _, err = f.WriteString(GenAuthorizedKey(user, key)) + return err +} diff --git a/models/repo.go b/models/repo.go index 485eee89..489530f2 100644 --- a/models/repo.go +++ b/models/repo.go @@ -39,7 +39,7 @@ func IsRepositoryExist(user *User, reposName string) (bool, error) { func CreateRepository(user *User, reposName string) (*Repo, error) { p := filepath.Join(repoRootPath, user.Name) os.MkdirAll(p, os.ModePerm) - f := filepath.Join(p, reposName) + f := filepath.Join(p, reposName+".git") _, err := git.InitRepository(f, false) if err != nil { return nil, err @@ -108,7 +108,7 @@ func DeleteRepository(user *User, reposName string) (err error) { session.Rollback() return err } - if err = os.RemoveAll(filepath.Join(repoRootPath, user.Name, reposName)); err != nil { + if err = os.RemoveAll(filepath.Join(repoRootPath, user.Name, reposName+".git")); err != nil { // TODO: log and delete manully return err }