1package server
2
3import (
4 "bytes"
5 "errors"
6 "os"
7 "strings"
8 "testing"
9 "time"
10
11 appCfg "github.com/charmbracelet/soft-serve/config"
12 cm "github.com/charmbracelet/soft-serve/server/cmd"
13 "github.com/charmbracelet/soft-serve/server/config"
14 bm "github.com/charmbracelet/wish/bubbletea"
15 "github.com/charmbracelet/wish/testsession"
16 "github.com/gliderlabs/ssh"
17 "github.com/matryer/is"
18 "github.com/muesli/termenv"
19 gossh "golang.org/x/crypto/ssh"
20)
21
22func TestSession(t *testing.T) {
23 is := is.New(t)
24 t.Run("unauthorized repo access", func(t *testing.T) {
25 var out bytes.Buffer
26 s := setup(t)
27 s.Stderr = &out
28 defer s.Close()
29 err := s.RequestPty("xterm", 80, 40, nil)
30 is.NoErr(err)
31 err = s.Run("config")
32 // Session writes error and exits
33 is.True(strings.Contains(out.String(), cm.ErrUnauthorized.Error()))
34 var ee *gossh.ExitError
35 is.True(errors.As(err, &ee) && ee.ExitStatus() == 1)
36 })
37 t.Run("authorized repo access", func(t *testing.T) {
38 s := setup(t)
39 s.Stderr = os.Stderr
40 defer s.Close()
41 err := s.RequestPty("xterm", 80, 40, nil)
42 is.NoErr(err)
43 go func() {
44 time.Sleep(1 * time.Second)
45 s.Signal(gossh.SIGTERM)
46 // FIXME: exit with code 0 instead of forcibly closing the session
47 s.Close()
48 }()
49 err = s.Run("test")
50 var ee *gossh.ExitMissingError
51 is.True(errors.As(err, &ee))
52 })
53}
54
55func setup(tb testing.TB) *gossh.Session {
56 is := is.New(tb)
57 tb.Helper()
58 cfg.DataPath = tb.TempDir()
59 ac, err := appCfg.NewConfig(&config.Config{
60 SSH: config.SSHConfig{Port: 22226},
61 DataPath: tb.TempDir(),
62 InitialAdminKeys: []string{
63 "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMJlb/qf2B2kMNdBxfpCQqI2ctPcsOkdZGVh5zTRhKtH",
64 },
65 })
66 ac.AnonAccess = "read-only"
67 is.NoErr(err)
68 return testsession.New(tb, &ssh.Server{
69 Handler: bm.MiddlewareWithProgramHandler(SessionHandler(ac), termenv.ANSI256)(func(s ssh.Session) {
70 _, _, active := s.Pty()
71 tb.Logf("PTY active %v", active)
72 tb.Log(s.Command())
73 s.Exit(0)
74 }),
75 }, nil)
76}