From 2625414fbf9cd3a9020e3e26b1f35fa07079101c Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Sat, 25 Mar 2023 03:09:56 -0400 Subject: [PATCH] fix(server): use canonical repos dir --- 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(-) delete mode 100644 server/git/daemon/conn.go diff --git a/server/backend/file/file.go b/server/backend/file/file.go index 05949556bb186e35b05fe5e7e144b37fb46a5eb0..84d2f2db5e605ed873eeff54cddd7b9229284494 100644 --- a/server/backend/file/file.go +++ b/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) } diff --git a/server/backend/repo.go b/server/backend/repo.go index d9238ae762438130e9260e421112b086a0bc3b8e..6cf46c807e7ca42bb0a0deeb32e1a786715a0e8a 100644 --- a/server/backend/repo.go +++ b/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. diff --git a/server/daemon.go b/server/daemon.go index 34600792da6c289c3cb860d30849a07bf73093b7..d1f0c438724dabc7b7dc04acc4261a2761d85907 100644 --- a/server/daemon.go +++ b/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 diff --git a/server/git/daemon/conn.go b/server/git/daemon/conn.go deleted file mode 100644 index 1ab35242405bc4c2cad2673eec3091cead55213f..0000000000000000000000000000000000000000 --- a/server/git/daemon/conn.go +++ /dev/null @@ -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) - } -} diff --git a/server/ssh.go b/server/ssh.go index 9ee3d0ace68c00662070b9023dd058a31e48eeee..c0f3529fd25958b3b5a827ee6a56d16542154a29 100644 --- a/server/ssh.go +++ b/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