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

View file

@ -1,6 +1,7 @@
package cmd package cmd
import ( import (
"bytes"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
"io" "io"
@ -8,6 +9,7 @@ import (
"os/exec" "os/exec"
"strconv" "strconv"
"testing" "testing"
"time"
) )
func getAvailableTcpPort() int { func getAvailableTcpPort() int {
@ -49,6 +51,43 @@ func assertNoExec(t *testing.T, client *ssh.Client) {
assert.Equal(t, "ssh: command whoami failed", err.Error()) 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) { func assertLocalPortForwarding(t *testing.T, client *ssh.Client) {
var remoteTcpPort int var remoteTcpPort int
acceptedConnChan := make(chan net.Conn) acceptedConnChan := make(chan net.Conn)