fix(server): use canonical repos dir

Ayman Bagabas created

Change summary

server/backend/file/file.go |  5 +++
server/backend/repo.go      |  2 +
server/daemon.go            |  3 -
server/git/daemon/conn.go   | 55 ---------------------------------------
server/ssh.go               |  3 -
5 files changed, 9 insertions(+), 59 deletions(-)

Detailed changes

server/backend/file/file.go 🔗

@@ -80,6 +80,11 @@ func (fb *FileBackend) reposPath() string {
 	return filepath.Join(fb.path, repos)
 }
 
+// RepositoryStorePath returns the path to the repository store.
+func (fb *FileBackend) RepositoryStorePath() string {
+	return fb.reposPath()
+}
+
 func (fb *FileBackend) settingsPath() string {
 	return filepath.Join(fb.path, settings)
 }

server/backend/repo.go 🔗

@@ -11,6 +11,8 @@ type RepositoryStore interface {
 	Repository(repo string) (Repository, error)
 	// Repositories returns a list of all repositories.
 	Repositories() ([]Repository, error)
+	// RepositoryStorePath returns the path to the repository store.
+	RepositoryStorePath() string
 	// CreateRepository creates a new repository.
 	CreateRepository(name string, private bool) (Repository, error)
 	// DeleteRepository deletes a repository.

server/daemon.go 🔗

@@ -207,8 +207,7 @@ func (d *GitDaemon) handleClient(conn net.Conn) {
 		// git bare repositories should end in ".git"
 		// https://git-scm.com/docs/gitrepository-layout
 		repo := name + ".git"
-		// FIXME: determine repositories path
-		reposDir := filepath.Join(d.cfg.DataPath, "repos")
+		reposDir := d.cfg.Backend.RepositoryStorePath()
 		if err := ensureWithin(reposDir, repo); err != nil {
 			fatal(c, err)
 			return

server/git/daemon/conn.go 🔗

@@ -1,55 +0,0 @@
-package daemon
-
-import (
-	"context"
-	"net"
-	"time"
-)
-
-type serverConn struct {
-	net.Conn
-
-	idleTimeout   time.Duration
-	maxDeadline   time.Time
-	closeCanceler context.CancelFunc
-}
-
-func (c *serverConn) Write(p []byte) (n int, err error) {
-	c.updateDeadline()
-	n, err = c.Conn.Write(p)
-	if _, isNetErr := err.(net.Error); isNetErr && c.closeCanceler != nil {
-		c.closeCanceler()
-	}
-	return
-}
-
-func (c *serverConn) Read(b []byte) (n int, err error) {
-	c.updateDeadline()
-	n, err = c.Conn.Read(b)
-	if _, isNetErr := err.(net.Error); isNetErr && c.closeCanceler != nil {
-		c.closeCanceler()
-	}
-	return
-}
-
-func (c *serverConn) Close() (err error) {
-	err = c.Conn.Close()
-	if c.closeCanceler != nil {
-		c.closeCanceler()
-	}
-	return
-}
-
-func (c *serverConn) updateDeadline() {
-	switch {
-	case c.idleTimeout > 0:
-		idleDeadline := time.Now().Add(c.idleTimeout)
-		if idleDeadline.Unix() < c.maxDeadline.Unix() || c.maxDeadline.IsZero() {
-			c.Conn.SetDeadline(idleDeadline)
-			return
-		}
-		fallthrough
-	default:
-		c.Conn.SetDeadline(c.maxDeadline)
-	}
-}

server/ssh.go 🔗

@@ -94,8 +94,7 @@ func (s *SSHServer) Middleware(cfg *config.Config) wish.Middleware {
 					// https://git-scm.com/docs/gitrepository-layout
 					repo := name + ".git"
 
-					// FIXME: determine repositories path
-					reposDir := filepath.Join(cfg.DataPath, "repos")
+					reposDir := cfg.Backend.RepositoryStorePath()
 					if err := ensureWithin(reposDir, repo); err != nil {
 						sshFatal(s, err)
 						return