This commit is contained in:
Ryo Ota 2023-08-11 00:30:26 +09:00
parent 695d0603b3
commit 3b0b650318
2 changed files with 45 additions and 6 deletions

View file

@ -57,10 +57,10 @@ func TestAllPermissionsAllowed(t *testing.T) {
assert.NoError(t, err)
defer client.Close()
assert.NoError(t, err)
assertExec(t, client)
assertLocalPortForwarding(t, client)
assertRemotePortForwardingTODO(t, client)
// TODO: pty
assertLocalPortForwarding(t, client)
assertExec(t, client)
assertPtyTerminal(t, client)
// TODO: sftp
}
@ -172,7 +172,7 @@ func TestAllowExecute(t *testing.T) {
assertNoRemotePortForwarding(t, client)
assertNoLocalPortForwarding(t, client)
assertExec(t, client)
// TODO: no pty
assertPtyTerminal(t, client)
// TODO: no sftp
}
@ -203,7 +203,7 @@ func TestAllowTcpipForward(t *testing.T) {
assertRemotePortForwardingTODO(t, client)
assertNoLocalPortForwarding(t, client)
assertNoExec(t, client)
// TODO: no pty
assertNoPtyTerminal(t, client)
// TODO: no sftp
}
@ -234,7 +234,7 @@ func TestAllowDirectTcpip(t *testing.T) {
assertNoRemotePortForwarding(t, client)
assertLocalPortForwarding(t, client)
assertNoExec(t, client)
// TODO: no pty
assertNoPtyTerminal(t, client)
// TODO: no sftp
}

View file

@ -1,6 +1,7 @@
package cmd
import (
"bytes"
"github.com/stretchr/testify/assert"
"golang.org/x/crypto/ssh"
"io"
@ -8,6 +9,7 @@ import (
"os/exec"
"strconv"
"testing"
"time"
)
func getAvailableTcpPort() int {
@ -49,6 +51,43 @@ func assertNoExec(t *testing.T, client *ssh.Client) {
assert.Equal(t, "ssh: command whoami failed", err.Error())
}
func assertPtyTerminal(t *testing.T, client *ssh.Client) {
session, err := client.NewSession()
assert.NoError(t, err)
defer session.Close()
err = session.RequestPty("xterm", 100, 200, ssh.TerminalModes{})
assert.NoError(t, err)
stdin, err := session.StdinPipe()
assert.NoError(t, err)
_, err = stdin.Write([]byte("echo helloworldviapty\r"))
assert.NoError(t, err)
stdout, err := session.StdoutPipe()
assert.NoError(t, err)
stdoutBytesChan := make(chan []byte)
go func() {
var buff bytes.Buffer
_, err := io.Copy(&buff, stdout)
assert.NoError(t, err)
stdoutBytesChan <- buff.Bytes()
}()
err = session.Shell()
assert.NoError(t, err)
time.Sleep(1 * time.Second)
session.Close()
stdoutBytes := <-stdoutBytesChan
assert.Contains(t, string(stdoutBytes), "helloworldviapty")
}
func assertNoPtyTerminal(t *testing.T, client *ssh.Client) {
session, err := client.NewSession()
assert.NoError(t, err)
defer session.Close()
err = session.RequestPty("xterm", 100, 200, ssh.TerminalModes{})
assert.Error(t, err)
assert.Equal(t, "ssh: pty-req failed", err.Error())
}
func assertLocalPortForwarding(t *testing.T, client *ssh.Client) {
var remoteTcpPort int
acceptedConnChan := make(chan net.Conn)