From f5fd2fb0585ec1966d7a2170c9645b66743944eb Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Tue, 8 Dec 2020 12:14:21 +0100 Subject: [PATCH 1/2] normalise permission denied error as file not found error --- client.go | 2 ++ client_integration_test.go | 9 +++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/client.go b/client.go index e329ed5..5d825ee 100644 --- a/client.go +++ b/client.go @@ -1363,6 +1363,8 @@ func normaliseError(err error) error { return io.EOF case sshFxNoSuchFile: return os.ErrNotExist + case sshFxPermissionDenied: + return os.ErrPermission case sshFxOk: return nil default: diff --git a/client_integration_test.go b/client_integration_test.go index eda5d32..caf15cb 100644 --- a/client_integration_test.go +++ b/client_integration_test.go @@ -453,16 +453,13 @@ func TestClientCreateFailed(t *testing.T) { defer sftp.Close() f, err := ioutil.TempFile("", "sftptest-createfailed") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) + defer f.Close() defer os.Remove(f.Name()) f2, err := sftp.Create(f.Name()) - if err1, ok := err.(*StatusError); !ok || err1.Code != sshFxPermissionDenied { - t.Fatalf("Create: want: %v, got %#v", sshFxPermissionDenied, err) - } + require.True(t, os.IsPermission(err)) if err == nil { f2.Close() } From c811ca3a25d024907df9ec22fd61f8b160017332 Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Tue, 8 Dec 2020 14:43:19 +0100 Subject: [PATCH 2/2] Remove: permission denied is now os.ErrPermission fix TestClientRemoveDir test case on macOS --- client.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/client.go b/client.go index 5d825ee..cdd5669 100644 --- a/client.go +++ b/client.go @@ -655,14 +655,18 @@ func (c *Client) Join(elem ...string) string { return path.Join(elem...) } // is not empty. func (c *Client) Remove(path string) error { err := c.removeFile(path) + // some servers, *cough* osx *cough*, return EPERM, not ENODIR. + // serv-u returns ssh_FX_FILE_IS_A_DIRECTORY + // EPERM is converted to os.ErrPermission so it is not a StatusError if err, ok := err.(*StatusError); ok { switch err.Code { - // some servers, *cough* osx *cough*, return EPERM, not ENODIR. - // serv-u returns ssh_FX_FILE_IS_A_DIRECTORY - case sshFxPermissionDenied, sshFxFailure, sshFxFileIsADirectory: + case sshFxFailure, sshFxFileIsADirectory: return c.RemoveDirectory(path) } } + if os.IsPermission(err) { + return c.RemoveDirectory(path) + } return err }