package sshx import "testing" func TestParse(t *testing.T) { good := map[string]Request{ "git-upload-pack 'john/johnbot.git'": {"git-upload-pack", "john", "johnbot"}, "git-upload-pack 'john/johnbot'": {"git-upload-pack", "john", "johnbot"}, "git-receive-pack '/john/johnbot.git'": {"git-receive-pack", "john", "johnbot"}, "git-receive-pack '~/john/johnbot.git'": {"git-receive-pack", "john", "johnbot"}, "git-upload-archive 'john/johnbot.git'": {"git-upload-archive", "john", "johnbot"}, " git-upload-pack 'john/johnbot.git' ": {"git-upload-pack", "john", "johnbot"}, } for cmd, want := range good { got, err := Parse(cmd) if err != nil || got != want { t.Errorf("Parse(%q) = %+v, %v; want %+v", cmd, got, err, want) } } // Chapter 45.4: every one must fail, and none may reach a shell to fail in. bad := []string{ "", "rm -rf /", "bash", "git-upload-pack", "git-upload-pack 'john/johnbot.git'; rm -rf /", "git-upload-pack 'john/johnbot.git' && rm -rf /", "git-upload-pack '$(rm -rf /)'", "git-upload-pack '`rm -rf /`'", "git-upload-pack '../../etc/passwd'", "git-upload-pack 'john/../../etc'", "git-upload-pack 'john'", "git-upload-pack 'john/john/bot'", "git-upload-pack john/johnbot.git", "git-upload-pack 'john/johnbot.git", "git-shell -c 'git-upload-pack'", "git-receive-pack '--upload-pack=/bin/sh'", "scp -t /tmp/x", } for _, cmd := range bad { if got, err := Parse(cmd); err == nil { t.Errorf("Parse(%q) = %+v, want an error", cmd, got) } } } // A system-looking path is only the account "etc", because containment is repo.Dir's job. func TestSystemLookingPathIsJustAName(t *testing.T) { got, err := Parse("git-upload-pack '/etc/passwd'") if err != nil { t.Fatalf("Parse: %v", err) } if want := (Request{"git-upload-pack", "etc", "passwd"}); got != want { t.Errorf("got %+v, want %+v", got, want) } } func TestWrite(t *testing.T) { for cmd, want := range map[string]bool{ "git-receive-pack 'john/johnbot.git'": true, "git-upload-pack 'john/johnbot.git'": false, "git-upload-archive 'john/johnbot.git'": false, } { r, err := Parse(cmd) if err != nil { t.Fatal(err) } if r.Write() != want { t.Errorf("%q: Write() = %v, want %v", cmd, r.Write(), want) } } }