133728e barerepo 1mo
1
package sshx
133728e barerepo 1mo
3
import "testing"
133728e barerepo 1mo
5
func TestParse(t *testing.T) {
133728e barerepo 1mo
6
good := map[string]Request{
133728e barerepo 1mo
7
"git-upload-pack 'john/johnbot.git'": {"git-upload-pack", "john", "johnbot"},
133728e barerepo 1mo
8
"git-upload-pack 'john/johnbot'": {"git-upload-pack", "john", "johnbot"},
133728e barerepo 1mo
9
"git-receive-pack '/john/johnbot.git'": {"git-receive-pack", "john", "johnbot"},
133728e barerepo 1mo
10
"git-receive-pack '~/john/johnbot.git'": {"git-receive-pack", "john", "johnbot"},
133728e barerepo 1mo
11
"git-upload-archive 'john/johnbot.git'": {"git-upload-archive", "john", "johnbot"},
133728e barerepo 1mo
12
" git-upload-pack 'john/johnbot.git' ": {"git-upload-pack", "john", "johnbot"},
133728e barerepo 1mo
14
for cmd, want := range good {
133728e barerepo 1mo
15
got, err := Parse(cmd)
133728e barerepo 1mo
16
if err != nil || got != want {
133728e barerepo 1mo
17
t.Errorf("Parse(%q) = %+v, %v; want %+v", cmd, got, err, want)
133728e barerepo 1mo
21
// Chapter 45.4: every one must fail, and none may reach a shell to fail in.
133728e barerepo 1mo
22
bad := []string{
133728e barerepo 1mo
23
"",
133728e barerepo 1mo
24
"rm -rf /",
133728e barerepo 1mo
25
"bash",
133728e barerepo 1mo
26
"git-upload-pack",
133728e barerepo 1mo
27
"git-upload-pack 'john/johnbot.git'; rm -rf /",
133728e barerepo 1mo
28
"git-upload-pack 'john/johnbot.git' && rm -rf /",
133728e barerepo 1mo
29
"git-upload-pack '$(rm -rf /)'",
133728e barerepo 1mo
30
"git-upload-pack '`rm -rf /`'",
133728e barerepo 1mo
31
"git-upload-pack '../../etc/passwd'",
133728e barerepo 1mo
32
"git-upload-pack 'john/../../etc'",
133728e barerepo 1mo
33
"git-upload-pack 'john'",
133728e barerepo 1mo
34
"git-upload-pack 'john/john/bot'",
133728e barerepo 1mo
35
"git-upload-pack john/johnbot.git",
133728e barerepo 1mo
36
"git-upload-pack 'john/johnbot.git",
133728e barerepo 1mo
37
"git-shell -c 'git-upload-pack'",
133728e barerepo 1mo
38
"git-receive-pack '--upload-pack=/bin/sh'",
133728e barerepo 1mo
39
"scp -t /tmp/x",
133728e barerepo 1mo
41
for _, cmd := range bad {
133728e barerepo 1mo
42
if got, err := Parse(cmd); err == nil {
133728e barerepo 1mo
43
t.Errorf("Parse(%q) = %+v, want an error", cmd, got)
133728e barerepo 1mo
48
// A system-looking path is only the account "etc", because containment is repo.Dir's job.
133728e barerepo 1mo
49
func TestSystemLookingPathIsJustAName(t *testing.T) {
133728e barerepo 1mo
50
got, err := Parse("git-upload-pack '/etc/passwd'")
133728e barerepo 1mo
51
if err != nil {
133728e barerepo 1mo
52
t.Fatalf("Parse: %v", err)
133728e barerepo 1mo
54
if want := (Request{"git-upload-pack", "etc", "passwd"}); got != want {
133728e barerepo 1mo
55
t.Errorf("got %+v, want %+v", got, want)
133728e barerepo 1mo
59
func TestWrite(t *testing.T) {
133728e barerepo 1mo
60
for cmd, want := range map[string]bool{
133728e barerepo 1mo
61
"git-receive-pack 'john/johnbot.git'": true,
133728e barerepo 1mo
62
"git-upload-pack 'john/johnbot.git'": false,
133728e barerepo 1mo
63
"git-upload-archive 'john/johnbot.git'": false,
133728e barerepo 1mo
64
} {
133728e barerepo 1mo
65
r, err := Parse(cmd)
133728e barerepo 1mo
66
if err != nil {
133728e barerepo 1mo
67
t.Fatal(err)
133728e barerepo 1mo
69
if r.Write() != want {
133728e barerepo 1mo
70
t.Errorf("%q: Write() = %v, want %v", cmd, r.Write(), want)