ref(config): use DB() to retrieve db

Ayman Bagabas created

Change summary

server/config/access.go      | 12 ++++++++----
server/config/config.go      | 22 +++++++++++-----------
server/config/config_test.go |  8 +++++---
server/config/default.go     |  5 ++---
server/config/repo.go        | 19 ++++++++++---------
server/config/user.go        |  2 +-
6 files changed, 37 insertions(+), 31 deletions(-)

Detailed changes

server/config/access.go 🔗

@@ -20,7 +20,7 @@ func (c *Config) AuthRepo(repo string, pk ssh.PublicKey) proto.AccessLevel {
 // found.
 func (c *Config) User(pk ssh.PublicKey) (proto.User, error) {
 	k := authorizedKey(pk)
-	u, err := c.db.GetUserByPublicKey(k)
+	u, err := c.DB().GetUserByPublicKey(k)
 	if err != nil {
 		log.Printf("error getting user for key: %s", err)
 		return nil, err
@@ -41,7 +41,7 @@ func (c *Config) IsCollab(repo string, pk ssh.PublicKey) bool {
 		return true
 	}
 
-	isCollab, err := c.db.IsRepoPublicKeyCollab(repo, authorizedKey(pk))
+	isCollab, err := c.DB().IsRepoPublicKeyCollab(repo, authorizedKey(pk))
 	if err != nil {
 		log.Printf("error checking if key is repo collab: %v", err)
 		return false
@@ -101,6 +101,7 @@ func (c *Config) accessForKey(repo string, pk ssh.PublicKey) proto.AccessLevel {
 		return anon
 	}
 	private := info.IsPrivate()
+	log.Printf("auth key %s", authorizedKey(pk))
 	if pk != nil {
 		isAdmin := c.IsAdmin(pk)
 		if isAdmin {
@@ -122,14 +123,14 @@ func (c *Config) accessForKey(repo string, pk ssh.PublicKey) proto.AccessLevel {
 	}
 	// Don't restrict access to private repos if no users are configured.
 	// Return anon access level.
-	if private && c.countUsers() > 0 {
+	if private {
 		return proto.NoAccess
 	}
 	return anon
 }
 
 func (c *Config) countUsers() int {
-	count, err := c.db.CountUsers()
+	count, err := c.DB().CountUsers()
 	if err != nil {
 		return 0
 	}
@@ -151,5 +152,8 @@ func (c *Config) isInitialAdminKey(key ssh.PublicKey) bool {
 }
 
 func authorizedKey(key ssh.PublicKey) string {
+	if key == nil {
+		return ""
+	}
 	return strings.TrimSpace(string(gossh.MarshalAuthorizedKey(key)))
 }

server/config/config.go 🔗

@@ -37,10 +37,11 @@ type SSHConfig struct {
 
 // GitConfig is the Git daemon configuration for the server.
 type GitConfig struct {
-	Port           int `env:"PORT" envDefault:"9418"`
-	MaxTimeout     int `env:"MAX_TIMEOUT" envDefault:"0"`
-	IdleTimeout    int `env:"IDLE_TIMEOUT" envDefault:"3"`
-	MaxConnections int `env:"SOFT_SERVE_GIT_MAX_CONNECTIONS" envDefault:"32"`
+	Enabled        bool `env:"ENABLED" envDefault:"true"`
+	Port           int  `env:"PORT" envDefault:"9418"`
+	MaxTimeout     int  `env:"MAX_TIMEOUT" envDefault:"0"`
+	IdleTimeout    int  `env:"IDLE_TIMEOUT" envDefault:"3"`
+	MaxConnections int  `env:"SOFT_SERVE_GIT_MAX_CONNECTIONS" envDefault:"32"`
 }
 
 // DBConfig is the database configuration for the server.
@@ -172,26 +173,25 @@ func DefaultConfig() *Config {
 		// store the key in the config
 		cfg.InitialAdminKeys[i] = pk
 	}
-	log.Printf("initial admin keys are: %v", cfg.InitialAdminKeys)
 	// init data path and db
 	if err := os.MkdirAll(cfg.RepoPath(), 0755); err != nil {
 		log.Fatalln(err)
 	}
-	if err := cfg.createDefaultConfigRepoAndUsers(); err != nil {
-		log.Fatalln(err)
-	}
-	var db db.Store
 	switch cfg.Db.Driver {
 	case "sqlite":
 		if err := os.MkdirAll(filepath.Dir(cfg.DBPath()), 0755); err != nil {
 			log.Fatalln(err)
 		}
-		db, err = sqlite.New(cfg.DBPath())
+		db, err := sqlite.New(cfg.DBPath())
 		if err != nil {
 			log.Fatalln(err)
 		}
+		cfg.WithDB(db)
+	}
+	if err := cfg.createDefaultConfigRepoAndUsers(); err != nil {
+		log.Fatalln(err)
 	}
-	return cfg.WithDB(db).WithDataPath(cfg.DataPath)
+	return &cfg
 }
 
 // DB returns the database for the configuration.

server/config/config_test.go 🔗

@@ -9,11 +9,13 @@ import (
 
 func TestParseMultipleKeys(t *testing.T) {
 	is := is.New(t)
-	is.NoErr(os.Setenv("SOFT_SERVE_INITIAL_ADMIN_KEY", "testdata/k1.pub\ntestdata/k2.pub"))
+	is.NoErr(os.Setenv("SOFT_SERVE_INITIAL_ADMIN_KEY", "testdata/k1.pub\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxIobhwtfdwN7m1TFt9wx3PsfvcAkISGPxmbmbauST8"))
 	t.Cleanup(func() { is.NoErr(os.Unsetenv("SOFT_SERVE_INITIAL_ADMIN_KEY")) })
+	is.NoErr(os.Setenv("SOFT_SERVE_DATA_PATH", t.TempDir()))
+	t.Cleanup(func() { is.NoErr(os.Unsetenv("SOFT_SERVE_DATA_PATH")) })
 	cfg := DefaultConfig()
 	is.Equal(cfg.InitialAdminKeys, []string{
-		"testdata/k1.pub",
-		"testdata/k2.pub",
+		"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINMwLvyV3ouVrTysUYGoJdl5Vgn5BACKov+n9PlzfPwH a@b",
+		"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxIobhwtfdwN7m1TFt9wx3PsfvcAkISGPxmbmbauST8",
 	})
 }

server/config/default.go 🔗

@@ -21,11 +21,10 @@ func (cfg *Config) createDefaultConfigRepoAndUsers() error {
 	rp := filepath.Join(cfg.RepoPath(), defaultConfigRepo) + ".git"
 	_, err := gogit.PlainOpen(rp)
 	if errors.Is(err, gogit.ErrRepositoryNotExists) {
-		repo, err := gogit.PlainInit(rp, true)
-		if err != nil {
+		if err := cfg.Create(defaultConfigRepo, "Config", "Soft Serve Config", true); err != nil {
 			return err
 		}
-		repo, err = gogit.Clone(memory.NewStorage(), memfs.New(), &gogit.CloneOptions{
+		repo, err := gogit.Clone(memory.NewStorage(), memfs.New(), &gogit.CloneOptions{
 			URL: rp,
 		})
 		if err != nil && err != transport.ErrEmptyRemoteRepository {

server/config/repo.go 🔗

@@ -16,10 +16,11 @@ var _ proto.MetadataProvider = &Config{}
 
 // Metadata returns the repository's metadata.
 func (c *Config) Metadata(name string) (proto.Metadata, error) {
-	i, err := c.db.GetRepo(name)
+	i, err := c.DB().GetRepo(name)
 	if err != nil {
 		return nil, err
 	}
+	log.Printf("info for %q: %v", name, i.Private)
 	return &repo{
 		cfg:  c,
 		info: i,
@@ -52,7 +53,7 @@ func (c *Config) ListRepos() ([]proto.Metadata, error) {
 	}
 	for _, d := range ds {
 		name := strings.TrimSuffix(d.Name(), ".git")
-		r, err := c.db.GetRepo(name)
+		r, err := c.DB().GetRepo(name)
 		if err != nil || r == nil {
 			md = append(md, &emptyMetadata{
 				name: name,
@@ -75,7 +76,7 @@ func (c *Config) Create(name string, projectName string, description string, isP
 	if _, err := git.Init(filepath.Join(c.RepoPath(), name+".git"), true); err != nil {
 		return err
 	}
-	if err := c.db.AddRepo(name, projectName, description, isPrivate); err != nil {
+	if err := c.DB().AddRepo(name, projectName, description, isPrivate); err != nil {
 		return err
 	}
 	return nil
@@ -87,7 +88,7 @@ func (c *Config) Delete(name string) error {
 	if err := os.RemoveAll(filepath.Join(c.RepoPath(), name+".git")); err != nil {
 		return err
 	}
-	if err := c.db.DeleteRepo(name); err != nil {
+	if err := c.DB().DeleteRepo(name); err != nil {
 		return err
 	}
 	return nil
@@ -100,7 +101,7 @@ func (c *Config) Rename(name string, newName string) error {
 	if err := os.Rename(filepath.Join(c.RepoPath(), name+".git"), filepath.Join(c.RepoPath(), newName+".git")); err != nil {
 		return err
 	}
-	if err := c.db.SetRepoName(name, newName); err != nil {
+	if err := c.DB().SetRepoName(name, newName); err != nil {
 		return err
 	}
 	return nil
@@ -109,7 +110,7 @@ func (c *Config) Rename(name string, newName string) error {
 // SetProjectName sets the repository's project name.
 func (c *Config) SetProjectName(name string, projectName string) error {
 	name = strings.TrimSuffix(name, ".git")
-	if err := c.db.SetRepoProjectName(name, projectName); err != nil {
+	if err := c.DB().SetRepoProjectName(name, projectName); err != nil {
 		return err
 	}
 	return nil
@@ -118,7 +119,7 @@ func (c *Config) SetProjectName(name string, projectName string) error {
 // SetDescription sets the repository's description.
 func (c *Config) SetDescription(name string, description string) error {
 	name = strings.TrimSuffix(name, ".git")
-	if err := c.db.SetRepoDescription(name, description); err != nil {
+	if err := c.DB().SetRepoDescription(name, description); err != nil {
 		return err
 	}
 	return nil
@@ -127,7 +128,7 @@ func (c *Config) SetDescription(name string, description string) error {
 // SetPrivate sets the repository's privacy.
 func (c *Config) SetPrivate(name string, isPrivate bool) error {
 	name = strings.TrimSuffix(name, ".git")
-	if err := c.db.SetRepoPrivate(name, isPrivate); err != nil {
+	if err := c.DB().SetRepoPrivate(name, isPrivate); err != nil {
 		return err
 	}
 	return nil
@@ -223,7 +224,7 @@ func (r *repo) IsPrivate() bool {
 // Collabs returns the repository's collaborators.
 func (r *repo) Collabs() []proto.User {
 	collabs := make([]proto.User, 0)
-	cs, err := r.cfg.db.ListRepoCollabs(r.Name())
+	cs, err := r.cfg.DB().ListRepoCollabs(r.Name())
 	if err != nil {
 		return collabs
 	}

server/config/user.go 🔗

@@ -58,7 +58,7 @@ func (u *user) PublicKeys() []ssh.PublicKey {
 	}
 	keys := u.keys
 	if keys == nil || len(keys) == 0 {
-		ks, err := u.cfg.db.GetUserPublicKeys(u.user)
+		ks, err := u.cfg.DB().GetUserPublicKeys(u.user)
 		if err != nil {
 			log.Printf("error getting public keys for %q: %v", u.Name(), err)
 			return nil