aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--models/access.go29
-rw-r--r--models/models.go14
-rw-r--r--models/publickey.go55
-rw-r--r--models/repo.go4
4 files changed, 87 insertions, 15 deletions
diff --git a/models/access.go b/models/access.go
new file mode 100644
index 0000000000..11bb360afa
--- /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 1c8ce73011..0d49162dc8 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 0000000000..bc9fbb33bd
--- /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 485eee89f6..489530f2a4 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
}