Merge pull request #401 from drakkan/client_perm

Client perm
This commit is contained in:
Nicola Murino 2020-12-08 17:32:11 +01:00 committed by GitHub
commit ae8947fdf9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 9 deletions

View File

@ -655,14 +655,18 @@ func (c *Client) Join(elem ...string) string { return path.Join(elem...) }
// is not empty. // is not empty.
func (c *Client) Remove(path string) error { func (c *Client) Remove(path string) error {
err := c.removeFile(path) 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 { if err, ok := err.(*StatusError); ok {
switch err.Code { switch err.Code {
// some servers, *cough* osx *cough*, return EPERM, not ENODIR. case sshFxFailure, sshFxFileIsADirectory:
// serv-u returns ssh_FX_FILE_IS_A_DIRECTORY
case sshFxPermissionDenied, sshFxFailure, sshFxFileIsADirectory:
return c.RemoveDirectory(path) return c.RemoveDirectory(path)
} }
} }
if os.IsPermission(err) {
return c.RemoveDirectory(path)
}
return err return err
} }
@ -1363,6 +1367,8 @@ func normaliseError(err error) error {
return io.EOF return io.EOF
case sshFxNoSuchFile: case sshFxNoSuchFile:
return os.ErrNotExist return os.ErrNotExist
case sshFxPermissionDenied:
return os.ErrPermission
case sshFxOk: case sshFxOk:
return nil return nil
default: default:

View File

@ -453,16 +453,13 @@ func TestClientCreateFailed(t *testing.T) {
defer sftp.Close() defer sftp.Close()
f, err := ioutil.TempFile("", "sftptest-createfailed") f, err := ioutil.TempFile("", "sftptest-createfailed")
if err != nil { require.NoError(t, err)
t.Fatal(err)
}
defer f.Close() defer f.Close()
defer os.Remove(f.Name()) defer os.Remove(f.Name())
f2, err := sftp.Create(f.Name()) f2, err := sftp.Create(f.Name())
if err1, ok := err.(*StatusError); !ok || err1.Code != sshFxPermissionDenied { require.True(t, os.IsPermission(err))
t.Fatalf("Create: want: %v, got %#v", sshFxPermissionDenied, err)
}
if err == nil { if err == nil {
f2.Close() f2.Close()
} }