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.
func (c *Client) Remove(path string) error {
err := c.removeFile(path)
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:
// EPERM is converted to os.ErrPermission so it is not a StatusError
if err, ok := err.(*StatusError); ok {
switch err.Code {
case sshFxFailure, sshFxFileIsADirectory:
return c.RemoveDirectory(path)
}
}
if os.IsPermission(err) {
return c.RemoveDirectory(path)
}
return err
}
@ -1363,6 +1367,8 @@ func normaliseError(err error) error {
return io.EOF
case sshFxNoSuchFile:
return os.ErrNotExist
case sshFxPermissionDenied:
return os.ErrPermission
case sshFxOk:
return nil
default:

View File

@ -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()
}