| @@ -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}) | |||||
| } | |||||
| @@ -4,25 +4,13 @@ | |||||
| package models | package models | ||||
| import ( | |||||
| "time" | |||||
| "github.com/lunny/xorm" | |||||
| ) | |||||
| import "github.com/lunny/xorm" | |||||
| var ( | var ( | ||||
| orm *xorm.Engine | orm *xorm.Engine | ||||
| repoRootPath string | 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 { | type Members struct { | ||||
| Id int64 | Id int64 | ||||
| OrgId int64 `xorm:"unique(s) index"` | OrgId int64 `xorm:"unique(s) index"` | ||||
| @@ -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 | |||||
| } | |||||
| @@ -39,7 +39,7 @@ func IsRepositoryExist(user *User, reposName string) (bool, error) { | |||||
| func CreateRepository(user *User, reposName string) (*Repo, error) { | func CreateRepository(user *User, reposName string) (*Repo, error) { | ||||
| p := filepath.Join(repoRootPath, user.Name) | p := filepath.Join(repoRootPath, user.Name) | ||||
| os.MkdirAll(p, os.ModePerm) | os.MkdirAll(p, os.ModePerm) | ||||
| f := filepath.Join(p, reposName) | |||||
| f := filepath.Join(p, reposName+".git") | |||||
| _, err := git.InitRepository(f, false) | _, err := git.InitRepository(f, false) | ||||
| if err != nil { | if err != nil { | ||||
| return nil, err | return nil, err | ||||
| @@ -108,7 +108,7 @@ func DeleteRepository(user *User, reposName string) (err error) { | |||||
| session.Rollback() | session.Rollback() | ||||
| return err | 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 | // TODO: log and delete manully | ||||
| return err | return err | ||||
| } | } | ||||