c5fa66a6587d587118b6bcdeb4add5c1462a104f

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

fix(backend): use client ssh key to clone ssh repos

Diff

 1diff --git a/server/backend/sqlite/sqlite.go b/server/backend/sqlite/sqlite.go
 2index eb7c3413cefdb7c443300e90d0403af17aca07af..5ddb9529ed278f53ce654ba3ed31aa1dd01320d1 100644
 3--- a/server/backend/sqlite/sqlite.go
 4+++ b/server/backend/sqlite/sqlite.go
 5@@ -10,6 +10,7 @@ import (
 6 	"strings"
 7 	"text/template"
 8 
 9+	"github.com/charmbracelet/keygen"
10 	"github.com/charmbracelet/log"
11 	"github.com/charmbracelet/soft-serve/git"
12 	"github.com/charmbracelet/soft-serve/server/backend"
13@@ -27,6 +28,7 @@ var (
14 type SqliteBackend struct {
15 	dp               string
16 	db               *sqlx.DB
17+	ckp              string
18 	AdditionalAdmins []string
19 }
20 
21@@ -42,6 +44,17 @@ func NewSqliteBackend(dataPath string) (*SqliteBackend, error) {
22 		return nil, err
23 	}
24 
25+	ckp := filepath.Join(dataPath, "ssh", "soft_serve_client")
26+	_, err := keygen.NewWithWrite(ckp, nil, keygen.Ed25519)
27+	if err != nil {
28+		return nil, err
29+	}
30+
31+	ckp, err = filepath.Abs(ckp)
32+	if err != nil {
33+		return nil, err
34+	}
35+
36 	db, err := sqlx.Connect("sqlite", filepath.Join(dataPath, "soft-serve.db"+
37 		"?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)"))
38 	if err != nil {
39@@ -49,8 +62,9 @@ func NewSqliteBackend(dataPath string) (*SqliteBackend, error) {
40 	}
41 
42 	d := &SqliteBackend{
43-		dp: dataPath,
44-		db: db,
45+		dp:  dataPath,
46+		db:  db,
47+		ckp: ckp,
48 	}
49 
50 	if err := d.init(); err != nil {
51@@ -169,7 +183,16 @@ func (d *SqliteBackend) ImportRepository(name string, remote string, opts backen
52 	copts := git.CloneOptions{
53 		Mirror: opts.Mirror,
54 		Quiet:  true,
55+		CommandOptions: git.CommandOptions{
56+			Envs: []string{
57+				fmt.Sprintf(`GIT_SSH_COMMAND=ssh -o UserKnownHostsFile="%s" -o StrictHostKeyChecking=no -i "%s"`,
58+					filepath.Join(filepath.Dir(d.ckp), "known_hosts"),
59+					d.ckp,
60+				),
61+			},
62+		},
63 	}
64+
65 	if err := git.Clone(remote, rp, copts); err != nil {
66 		logger.Debug("failed to clone repository", "err", err, "mirror", opts.Mirror, "remote", remote, "path", rp)
67 		return nil, err
68diff --git a/server/config/config.go b/server/config/config.go
69index 35de493ed86353b3385eb14d4e008b5013a651a6..e9295409ac28808e18d576d08e477f04bd6664cf 100644
70--- a/server/config/config.go
71+++ b/server/config/config.go
72@@ -128,7 +128,7 @@ func DefaultConfig() *Config {
73 		SSH: SSHConfig{
74 			ListenAddr:      ":23231",
75 			PublicURL:       "ssh://localhost:23231",
76-			KeyPath:         filepath.Join("ssh", "soft_serve"),
77+			KeyPath:         filepath.Join("ssh", "soft_serve_host"),
78 			InternalKeyPath: filepath.Join("ssh", "soft_serve_internal"),
79 			MaxTimeout:      0,
80 			IdleTimeout:     120,