diff --git a/kittens/transfer/receive.go b/kittens/transfer/receive.go index 2591549c4..2f065e698 100644 --- a/kittens/transfer/receive.go +++ b/kittens/transfer/receive.go @@ -500,7 +500,7 @@ func (self *manager) on_file_transfer_response(ftc *FileTransmissionCommand) (er if ftc.Status == `OK` { self.state = state_waiting_for_file_metadata } else { - return fmt.Errorf(`Permission for transfer denied`) + return os.ErrPermission } } else { return fmt.Errorf(`Unexpected response from terminal: %s`, ftc.String()) @@ -780,6 +780,10 @@ func (self *handler) on_file_transfer_response(ftc *FileTransmissionCommand) (er } transfer_started := self.manager.state == state_transferring if merr := self.manager.on_file_transfer_response(ftc); merr != nil { + if merr == os.ErrPermission { + // terminal will not respond to cancel request + return fmt.Errorf("Permission denied by user") + } self.abort_with_error(merr) return } diff --git a/kitty_tests/file_transmission.py b/kitty_tests/file_transmission.py index 33ac5dd26..549b18da6 100644 --- a/kitty_tests/file_transmission.py +++ b/kitty_tests/file_transmission.py @@ -179,6 +179,7 @@ def __init__(self, cmd, cwd, allow=True, env=None): class TestFileTransmission(BaseTest): def setUp(self): + self.direction_receive = False super().setUp() self.tdir = os.path.realpath(tempfile.mkdtemp()) self.responses = [] @@ -327,7 +328,7 @@ def test_rsync_hashers(self): @contextmanager def run_kitten(self, cmd, home_dir='', allow=True): cwd = os.path.realpath(tempfile.mkdtemp(suffix='-cwd', dir=self.tdir)) - cmd = [kitten_exe(), 'transfer'] + cmd + cmd = [kitten_exe(), 'transfer'] + (['--direction=receive'] if self.direction_receive else []) + cmd env = {'PWD': cwd} if home_dir: env['HOME'] = home_dir @@ -342,6 +343,17 @@ def run_kitten(self, cmd, home_dir='', allow=True): if os.path.exists(cwd): shutil.rmtree(cwd) + def test_transfer_receive(self): + self.direction_receive = True + src = os.path.join(self.tdir, 'src') + self.src_data = os.urandom(11113) + with open(src, 'wb') as s: + s.write(self.src_data) + dest = os.path.join(self.tdir, 'dest') + with self.run_kitten([src, dest], allow=False) as pty: + pty.wait_till_child_exits(require_exit_code=1) + self.assertFalse(os.path.exists(dest)) + def test_transfer_send(self): src = os.path.join(self.tdir, 'src') self.src_data = os.urandom(9137) diff --git a/tools/wcswidth/escape-code-parser.go b/tools/wcswidth/escape-code-parser.go index 7cd786831..0a1dfa7db 100644 --- a/tools/wcswidth/escape-code-parser.go +++ b/tools/wcswidth/escape-code-parser.go @@ -5,6 +5,7 @@ package wcswidth import ( "bytes" "fmt" + "kitty/tools/utils" )