Diff
1diff --git a/cmd/soft/hook.go b/cmd/soft/hook.go
2index 0e3d78fcc9d3b8c4b9c411baae754366e2b7b8d4..52619c409ac8d84105062c22bc9fc8ea97dad14d 100644
3--- a/cmd/soft/hook.go
4+++ b/cmd/soft/hook.go
5@@ -176,28 +176,20 @@ func commonInit() (c *gossh.Client, s *gossh.Session, err error) {
6
7 func newClient(cfg *config.Config) (*gossh.Client, error) {
8 // Only accept the server's host key.
9- pk, err := keygen.New(cfg.SSH.KeyPath, nil, keygen.Ed25519)
10+ pk, err := keygen.New(cfg.SSH.KeyPath, keygen.WithKeyType(keygen.Ed25519))
11 if err != nil {
12 return nil, err
13 }
14- hostKey, err := gossh.ParsePrivateKey(pk.PrivateKeyPEM())
15- if err != nil {
16- return nil, err
17- }
18- ik, err := keygen.New(cfg.SSH.InternalKeyPath, nil, keygen.Ed25519)
19- if err != nil {
20- return nil, err
21- }
22- k, err := gossh.ParsePrivateKey(ik.PrivateKeyPEM())
23+ ik, err := keygen.New(cfg.SSH.InternalKeyPath, keygen.WithKeyType(keygen.Ed25519))
24 if err != nil {
25 return nil, err
26 }
27 cc := &gossh.ClientConfig{
28 User: "internal",
29 Auth: []gossh.AuthMethod{
30- gossh.PublicKeys(k),
31+ gossh.PublicKeys(ik.Signer()),
32 },
33- HostKeyCallback: gossh.FixedHostKey(hostKey.PublicKey()),
34+ HostKeyCallback: gossh.FixedHostKey(pk.PublicKey()),
35 }
36 c, err := gossh.Dial("tcp", cfg.SSH.ListenAddr, cc)
37 if err != nil {
38diff --git a/go.mod b/go.mod
39index 33acc20812d6494b3becd8bf33005b65d2a51626..e6c7c0fe02ae29e8dc6eb4c6d5da581ee5d5bea9 100644
40--- a/go.mod
41+++ b/go.mod
42@@ -8,7 +8,7 @@ require (
43 github.com/charmbracelet/bubbletea v0.23.2
44 github.com/charmbracelet/glamour v0.6.0
45 github.com/charmbracelet/lipgloss v0.7.1
46- github.com/charmbracelet/wish v1.1.0
47+ github.com/charmbracelet/wish v1.1.1
48 github.com/dustin/go-humanize v1.0.1
49 github.com/go-git/go-git/v5 v5.6.1
50 github.com/matryer/is v1.4.1
51@@ -20,7 +20,7 @@ require (
52 require (
53 github.com/aymanbagabas/go-osc52 v1.2.2
54 github.com/caarlos0/env/v7 v7.1.0
55- github.com/charmbracelet/keygen v0.3.0
56+ github.com/charmbracelet/keygen v0.4.2
57 github.com/charmbracelet/log v0.2.1
58 github.com/charmbracelet/ssh v0.0.0-20221117183211-483d43d97103
59 github.com/gobwas/glob v0.2.3
60@@ -33,7 +33,7 @@ require (
61 github.com/robfig/cron/v3 v3.0.1
62 github.com/spf13/cobra v1.6.1
63 goji.io v2.0.2+incompatible
64- golang.org/x/crypto v0.7.0
65+ golang.org/x/crypto v0.8.0
66 golang.org/x/sync v0.1.0
67 gopkg.in/yaml.v3 v3.0.1
68 modernc.org/sqlite v1.21.1
69@@ -62,7 +62,6 @@ require (
70 github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
71 github.com/mcuadros/go-version v0.0.0-20190308113854-92cdf37c5b75 // indirect
72 github.com/microcosm-cc/bluemonday v1.0.21 // indirect
73- github.com/mitchellh/go-homedir v1.1.0 // indirect
74 github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 // indirect
75 github.com/muesli/cancelreader v0.2.2 // indirect
76 github.com/muesli/mango v0.1.0 // indirect
77@@ -78,10 +77,10 @@ require (
78 github.com/yuin/goldmark v1.5.2 // indirect
79 github.com/yuin/goldmark-emoji v1.0.1 // indirect
80 golang.org/x/mod v0.8.0 // indirect
81- golang.org/x/net v0.8.0 // indirect
82- golang.org/x/sys v0.6.0 // indirect
83- golang.org/x/term v0.6.0 // indirect
84- golang.org/x/text v0.8.0 // indirect
85+ golang.org/x/net v0.9.0 // indirect
86+ golang.org/x/sys v0.7.0 // indirect
87+ golang.org/x/term v0.7.0 // indirect
88+ golang.org/x/text v0.9.0 // indirect
89 golang.org/x/tools v0.6.0 // indirect
90 google.golang.org/protobuf v1.28.1 // indirect
91 lukechampine.com/uint128 v1.2.0 // indirect
92diff --git a/go.sum b/go.sum
93index f1d281db3f42f8f34bd08653b8d7bd3ac0d618e7..7dd4d1913889a7507f073ebeb5bf7e27d033ec1d 100644
94--- a/go.sum
95+++ b/go.sum
96@@ -79,8 +79,11 @@ github.com/charmbracelet/bubbletea v0.23.2/go.mod h1:FaP3WUivcTM0xOKNmhciz60M6I+
97 github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc=
98 github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc=
99 github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
100-github.com/charmbracelet/keygen v0.3.0 h1:mXpsQcH7DDlST5TddmXNXjS0L7ECk4/kLQYyBcsan2Y=
101 github.com/charmbracelet/keygen v0.3.0/go.mod h1:1ukgO8806O25lUZ5s0IrNur+RlwTBERlezdgW71F5rM=
102+github.com/charmbracelet/keygen v0.4.1 h1:ylwHCcCrb4UL2nHrUvVwME+/RFACcX1sjopOrIkc14g=
103+github.com/charmbracelet/keygen v0.4.1/go.mod h1:4e4FT3HSdLU/u83RfJWvzJIaVb8aX4MxtDlfXwpDJaI=
104+github.com/charmbracelet/keygen v0.4.2 h1:TNHua2MlXc6W1dQB2iW4msSZGKlb8RtxtmYDWUs4iRw=
105+github.com/charmbracelet/keygen v0.4.2/go.mod h1:4e4FT3HSdLU/u83RfJWvzJIaVb8aX4MxtDlfXwpDJaI=
106 github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs=
107 github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk=
108 github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E=
109@@ -92,6 +95,10 @@ github.com/charmbracelet/ssh v0.0.0-20221117183211-483d43d97103 h1:wpHMERIN0pQZE
110 github.com/charmbracelet/ssh v0.0.0-20221117183211-483d43d97103/go.mod h1:0Vm2/8yBljiLDnGJHU8ehswfawrEybGk33j5ssqKQVM=
111 github.com/charmbracelet/wish v1.1.0 h1:0ArX9SOG70saqd23NYjoS56oLPVNgqcQegkz1Lw+4zY=
112 github.com/charmbracelet/wish v1.1.0/go.mod h1:yHbm0hs/qX4lFE7nrhAcXjFYc8bxMIfSqJOfOYfwyYo=
113+github.com/charmbracelet/wish v1.1.1-0.20230412142535-b02fea5b2633 h1:39rtZkUFcDgFfmgejfKYmBvsFYbEXEaFF2JmB28o2vY=
114+github.com/charmbracelet/wish v1.1.1-0.20230412142535-b02fea5b2633/go.mod h1:Q8b4DURo6cmQ4G3LnyoxDlWmN3LHYdiXfOjEw8oZcEM=
115+github.com/charmbracelet/wish v1.1.1 h1:KdICASKd2oh2JPvk1Z4CJtAi97cFErXF7NKienPICO4=
116+github.com/charmbracelet/wish v1.1.1/go.mod h1:xh4KZpSULw+Xqb9bcbhw92QAinVB75CVLWrFuyY6IVs=
117 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
118 github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=
119 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
120@@ -278,7 +285,6 @@ github.com/mcuadros/go-version v0.0.0-20190308113854-92cdf37c5b75 h1:Pijfgr7ZuvX
121 github.com/mcuadros/go-version v0.0.0-20190308113854-92cdf37c5b75/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo=
122 github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg=
123 github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM=
124-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
125 github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
126 github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM=
127 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
128@@ -414,8 +420,9 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0
129 golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
130 golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
131 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
132-golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
133 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
134+golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
135+golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
136 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
137 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
138 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
139@@ -490,8 +497,9 @@ golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfS
140 golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
141 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
142 golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
143-golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
144 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
145+golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
146+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
147 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
148 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
149 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
150@@ -570,15 +578,17 @@ golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBc
151 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
152 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
153 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
154-golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
155 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
156+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
157+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
158 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
159 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
160 golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
161 golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
162 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
163-golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=
164 golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
165+golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
166+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
167 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
168 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
169 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
170@@ -588,8 +598,9 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
171 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
172 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
173 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
174-golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
175 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
176+golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
177+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
178 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
179 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
180 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
181diff --git a/server/cmd/hook.go b/server/cmd/hook.go
182index ee071f65ab91e3ec70942fccfb63f7e581693880..87a9184cb46e988aa5646a328dca6654f1b4a0b8 100644
183--- a/server/cmd/hook.go
184+++ b/server/cmd/hook.go
185@@ -9,7 +9,6 @@ import (
186 "github.com/charmbracelet/soft-serve/server/hooks"
187 "github.com/charmbracelet/ssh"
188 "github.com/spf13/cobra"
189- gossh "golang.org/x/crypto/ssh"
190 )
191
192 // hookCommand handles Soft Serve internal API git hook requests.
193@@ -118,16 +117,12 @@ func hookCommand() *cobra.Command {
194 func checkIfInternal(cmd *cobra.Command, _ []string) error {
195 cfg, s := fromContext(cmd)
196 pk := s.PublicKey()
197- kp, err := keygen.New(cfg.SSH.InternalKeyPath, nil, keygen.Ed25519)
198+ kp, err := keygen.New(cfg.SSH.InternalKeyPath, keygen.WithKeyType(keygen.Ed25519))
199 if err != nil {
200 logger.Errorf("failed to read internal key: %v", err)
201 return err
202 }
203- priv, err := gossh.ParsePrivateKey(kp.PrivateKeyPEM())
204- if err != nil {
205- return err
206- }
207- if !ssh.KeysEqual(pk, priv.PublicKey()) {
208+ if !ssh.KeysEqual(pk, kp.PublicKey()) {
209 return ErrUnauthorized
210 }
211 return nil
212diff --git a/server/config/config.go b/server/config/config.go
213index d23d29d6cdeb506325da2c4a49a3e096a5f15a81..b0d74a041a5c5263feb73374b28df0dfb068208e 100644
214--- a/server/config/config.go
215+++ b/server/config/config.go
216@@ -142,9 +142,9 @@ func DefaultConfig() *Config {
217 SSH: SSHConfig{
218 ListenAddr: ":23231",
219 PublicURL: "ssh://localhost:23231",
220- KeyPath: filepath.Join("ssh", "soft_serve_host"),
221- ClientKeyPath: filepath.Join("ssh", "soft_serve_client"),
222- InternalKeyPath: filepath.Join("ssh", "soft_serve_internal"),
223+ KeyPath: filepath.Join("ssh", "soft_serve_host_ed25519"),
224+ ClientKeyPath: filepath.Join("ssh", "soft_serve_client_ed25519"),
225+ InternalKeyPath: filepath.Join("ssh", "soft_serve_internal_ed25519"),
226 MaxTimeout: 0,
227 IdleTimeout: 120,
228 },
229diff --git a/server/server.go b/server/server.go
230index ab34933a0b928d1070353f75613fd83fa154ee6e..84fe0fda6292303e9610fb63fe7b76b1d16bd498 100644
231--- a/server/server.go
232+++ b/server/server.go
233@@ -52,26 +52,26 @@ func NewServer(ctx context.Context, cfg *config.Config) (*Server, error) {
234 cfg = cfg.WithBackend(sb)
235
236 // Create internal key.
237- ikp, err := keygen.NewWithWrite(
238+ ikp, err := keygen.New(
239 cfg.SSH.InternalKeyPath,
240- nil,
241- keygen.Ed25519,
242+ keygen.WithKeyType(keygen.Ed25519),
243+ keygen.WithWrite(),
244 )
245 if err != nil {
246 return nil, err
247 }
248- cfg.InternalPublicKey = string(ikp.PublicKey())
249+ cfg.InternalPublicKey = ikp.AuthorizedKey()
250
251 // Create client key.
252- ckp, err := keygen.NewWithWrite(
253+ ckp, err := keygen.New(
254 cfg.SSH.ClientKeyPath,
255- nil,
256- keygen.Ed25519,
257+ keygen.WithKeyType(keygen.Ed25519),
258+ keygen.WithWrite(),
259 )
260 if err != nil {
261 return nil, err
262 }
263- cfg.ClientPublicKey = string(ckp.PublicKey())
264+ cfg.ClientPublicKey = ckp.AuthorizedKey()
265 }
266
267 srv := &Server{