diff --git a/sftpd/sftpd_test.go b/sftpd/sftpd_test.go index 53260f26..5f6c6030 100644 --- a/sftpd/sftpd_test.go +++ b/sftpd/sftpd_test.go @@ -159,6 +159,10 @@ func TestBasicSFTPHandling(t *testing.T) { if err != nil { t.Errorf("file upload error: %v", err) } + err = client.Chown(testFileName, 1000, 1000) + if err != nil { + t.Errorf("chown error: %v", err) + } localDownloadPath := filepath.Join(homeBasePath, "test_download.dat") err = sftpDownloadFile(testFileName, localDownloadPath, testFileSize, client) if err != nil { @@ -205,6 +209,11 @@ func TestDirCommands(t *testing.T) { if err != nil { t.Errorf("unable to add user: %v", err) } + // remove the home dir to test auto creation + _, err = os.Stat(user.HomeDir) + if err == nil { + os.RemoveAll(user.HomeDir) + } client, err := getSftpClient(user, usePubKey) if err != nil { t.Errorf("unable to create sftp client: %v", err) @@ -709,6 +718,10 @@ func TestPermList(t *testing.T) { if err == nil { t.Errorf("read remote dir without permission should not succeed") } + _, err = client.Stat("test_file") + if err == nil { + t.Errorf("stat remote file without permission should not succeed") + } } err = api.RemoveUser(user, http.StatusOK) if err != nil { @@ -883,6 +896,17 @@ func TestPermCreateDirs(t *testing.T) { if err == nil { t.Errorf("mkdir without permission should not succeed") } + testFileName := "test_file.dat" + testFilePath := filepath.Join(homeBasePath, testFileName) + testFileSize := int64(65535) + err = createTestFile(testFilePath, testFileSize) + if err != nil { + t.Errorf("unable to create test file: %v", err) + } + err = sftpUploadFile(testFilePath, "/dir/subdir/test_file.dat", testFileSize, client) + if err == nil { + t.Errorf("mkdir without permission should not succeed") + } } err = api.RemoveUser(user, http.StatusOK) if err != nil { @@ -930,6 +954,22 @@ func TestPermSymlink(t *testing.T) { } } +func TestSSHConnection(t *testing.T) { + usePubKey := false + user, err := api.AddUser(getTestUser(usePubKey), http.StatusOK) + if err != nil { + t.Errorf("unable to add user: %v", err) + } + err = doSSH(user, usePubKey) + if err == nil { + t.Errorf("ssh connection must fail: %v", err) + } + err = api.RemoveUser(user, http.StatusOK) + if err != nil { + t.Errorf("unable to remove user: %v", err) + } +} + func waitTCPListening(address string) { for { conn, err := net.Dial("tcp", address) @@ -944,6 +984,50 @@ func waitTCPListening(address string) { } } +func getTestUser(usePubKey bool) dataprovider.User { + user := dataprovider.User{ + Username: defaultUsername, + Password: defaultPassword, + HomeDir: filepath.Join(homeBasePath, defaultUsername), + Permissions: allPerms, + } + if usePubKey { + user.PublicKey = testPubKey + user.Password = "" + } + return user +} + +func doSSH(user dataprovider.User, usePubKey bool) error { + var sshSession *ssh.Session + config := &ssh.ClientConfig{ + User: defaultUsername, + HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { + return nil + }, + } + if usePubKey { + key, err := ssh.ParsePrivateKey([]byte(testPrivateKey)) + if err != nil { + return err + } + config.Auth = []ssh.AuthMethod{ssh.PublicKeys(key)} + } else { + config.Auth = []ssh.AuthMethod{ssh.Password(defaultPassword)} + } + conn, err := ssh.Dial("tcp", sftpServerAddr, config) + if err != nil { + return err + } + defer conn.Close() + sshSession, err = conn.NewSession() + if err != nil { + return err + } + _, err = sshSession.CombinedOutput("ls") + return err +} + func getSftpClient(user dataprovider.User, usePubKey bool) (*sftp.Client, error) { var sftpClient *sftp.Client config := &ssh.ClientConfig{ @@ -978,20 +1062,6 @@ func createTestFile(path string, size int64) error { return ioutil.WriteFile(path, content, 0666) } -func getTestUser(usePubKey bool) dataprovider.User { - user := dataprovider.User{ - Username: defaultUsername, - Password: defaultPassword, - HomeDir: filepath.Join(homeBasePath, defaultUsername), - Permissions: allPerms, - } - if usePubKey { - user.PublicKey = testPubKey - user.Password = "" - } - return user -} - func sftpUploadFile(localSourcePath string, remoteDestPath string, expectedSize int64, client *sftp.Client) error { srcFile, err := os.Open(localSourcePath) if err != nil {