From b00bf6566406bc8abd6f4dcd38a70f8600bdfda4 Mon Sep 17 00:00:00 2001 From: samuel-w Date: Tue, 6 Oct 2020 19:11:31 -0500 Subject: [PATCH 1/4] Add mount option override checkbox --- src/vorta/assets/UI/archivetab.ui | 10 ++++++++++ src/vorta/borg/mount.py | 9 ++++++--- src/vorta/views/archive_tab.py | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/vorta/assets/UI/archivetab.ui b/src/vorta/assets/UI/archivetab.ui index 19208fe7d..03913189d 100644 --- a/src/vorta/assets/UI/archivetab.ui +++ b/src/vorta/assets/UI/archivetab.ui @@ -178,6 +178,16 @@ + + + + Override mount permissions + + + Tick this box if there are permission errors on the mounted archive + + + diff --git a/src/vorta/borg/mount.py b/src/vorta/borg/mount.py index d07a206cc..ddc1c7144 100644 --- a/src/vorta/borg/mount.py +++ b/src/vorta/borg/mount.py @@ -1,4 +1,4 @@ -import os +from os import getuid from .borg_thread import BorgThread @@ -8,14 +8,17 @@ def started_event(self): self.updated.emit(self.tr('Mounting archive into folder...')) @classmethod - def prepare(cls, profile): + def prepare(cls, profile, override_mount_opts): ret = super().prepare(profile) if not ret['ok']: return ret else: ret['ok'] = False # Set back to false, so we can do our own checks here. - cmd = ['borg', '--log-json', 'mount', '-o', f"umask=0277,uid={os.getuid()}", f"{profile.repo.url}"] + cmd = ['borg', '--log-json', 'mount', f"{profile.repo.url}"] + + if override_mount_opts: + cmd[3:3] = ['-o', f"umask=0277,uid={getuid()}"] ret['ok'] = True ret['cmd'] = cmd diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index 8271544ef..4486699a0 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -235,7 +235,7 @@ def set_mount_button_mode(self, mode): def mount_action(self): profile = self.profile() - params = BorgMountThread.prepare(profile) + params = BorgMountThread.prepare(profile, self.overrideMountOpts.isChecked()) if not params['ok']: self._set_status(params['message']) return From 171b20574f3cd13b5d2e4e406043f3afd34a2ff9 Mon Sep 17 00:00:00 2001 From: Manu Date: Thu, 18 Feb 2021 14:15:35 +0800 Subject: [PATCH 2/4] Tests: avoid clicking other window --- tests/test_repo.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/test_repo.py b/tests/test_repo.py index 3d34a74bc..b48e9c85a 100644 --- a/tests/test_repo.py +++ b/tests/test_repo.py @@ -91,12 +91,9 @@ def test_repo_add_success(qapp, qtbot, mocker, borg_json_output): popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0) mocker.patch.object(vorta.borg.borg_thread, 'Popen', return_value=popen_result) - qtbot.mouseClick(add_repo_window.saveButton, QtCore.Qt.LeftButton) - - with qtbot.waitSignal(add_repo_window.thread.result, **pytest._wait_defaults) as _: - pass + add_repo_window.run() + qtbot.waitUntil(lambda: EventLogModel.select().count() == 2, **pytest._wait_defaults) - assert EventLogModel.select().count() == 2 assert RepoModel.get(id=2).url == test_repo_url keyring = VortaKeyring.get_keyring() From 6427ea95eab60136956fd96d60bf79df30c6da5a Mon Sep 17 00:00:00 2001 From: Manu Date: Thu, 18 Feb 2021 14:24:55 +0800 Subject: [PATCH 3/4] Move mount option to Misc tab. --- src/vorta/assets/UI/archivetab.ui | 10 ---------- src/vorta/borg/mount.py | 12 ++++++++---- src/vorta/models.py | 5 +++++ src/vorta/views/archive_tab.py | 2 +- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/vorta/assets/UI/archivetab.ui b/src/vorta/assets/UI/archivetab.ui index 6485df600..9ddca1b43 100644 --- a/src/vorta/assets/UI/archivetab.ui +++ b/src/vorta/assets/UI/archivetab.ui @@ -161,16 +161,6 @@ - - - - Override mount permissions - - - Tick this box if there are permission errors on the mounted archive - - - diff --git a/src/vorta/borg/mount.py b/src/vorta/borg/mount.py index ddc1c7144..a5c2c0a89 100644 --- a/src/vorta/borg/mount.py +++ b/src/vorta/borg/mount.py @@ -1,5 +1,6 @@ from os import getuid from .borg_thread import BorgThread +from vorta.models import SettingsModel class BorgMountThread(BorgThread): @@ -8,17 +9,20 @@ def started_event(self): self.updated.emit(self.tr('Mounting archive into folder...')) @classmethod - def prepare(cls, profile, override_mount_opts): + def prepare(cls, profile): ret = super().prepare(profile) if not ret['ok']: return ret else: ret['ok'] = False # Set back to false, so we can do our own checks here. - cmd = ['borg', '--log-json', 'mount', f"{profile.repo.url}"] + cmd = ['borg', '--log-json', 'mount'] - if override_mount_opts: - cmd[3:3] = ['-o', f"umask=0277,uid={getuid()}"] + override_mount_permissions = SettingsModel.get(key='override_mount_permissions').value + if override_mount_permissions: + cmd += ['-o', f"umask=0277,uid={getuid()}"] + + cmd += [f"{profile.repo.url}"] ret['ok'] = True ret['cmd'] = cmd diff --git a/src/vorta/models.py b/src/vorta/models.py index 1b5f81851..512d7143d 100644 --- a/src/vorta/models.py +++ b/src/vorta/models.py @@ -237,6 +237,11 @@ def get_misc_settings(): 'key': 'previous_window_height', 'str_value': '600', 'type': 'internal', 'label': 'Previous window height' }, + { + 'key': 'override_mount_permissions', 'value': False, 'type': 'checkbox', + 'label': trans_late('settings', + 'Try to replace existing permissions when mounting an archive.') + }, ] if sys.platform == 'darwin': diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index 382bfae8e..201c0d081 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -268,7 +268,7 @@ def selected_archive_name(self): def mount_action(self): profile = self.profile() - params = BorgMountThread.prepare(profile, self.overrideMountOpts.isChecked()) + params = BorgMountThread.prepare(profile) if not params['ok']: self._set_status(params['message']) return From 5be3279f434f1c9f174de30de0b8b7b78aa0af7e Mon Sep 17 00:00:00 2001 From: Manu Date: Thu, 18 Feb 2021 14:30:12 +0800 Subject: [PATCH 4/4] Comment new mount override setting. --- src/vorta/borg/mount.py | 6 ++++-- src/vorta/models.py | 11 +++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/vorta/borg/mount.py b/src/vorta/borg/mount.py index a5c2c0a89..5d00aa687 100644 --- a/src/vorta/borg/mount.py +++ b/src/vorta/borg/mount.py @@ -1,4 +1,4 @@ -from os import getuid +import os from .borg_thread import BorgThread from vorta.models import SettingsModel @@ -18,9 +18,11 @@ def prepare(cls, profile): cmd = ['borg', '--log-json', 'mount'] + # Try to override existing permissions when mounting an archive. May help to read + # files that come from a different system, like a restrictive NAS. override_mount_permissions = SettingsModel.get(key='override_mount_permissions').value if override_mount_permissions: - cmd += ['-o', f"umask=0277,uid={getuid()}"] + cmd += ['-o', f"umask=0277,uid={os.getuid()}"] cmd += [f"{profile.repo.url}"] diff --git a/src/vorta/models.py b/src/vorta/models.py index 512d7143d..9ad1db73c 100644 --- a/src/vorta/models.py +++ b/src/vorta/models.py @@ -225,6 +225,11 @@ def get_misc_settings(): 'label': trans_late('settings', 'Get statistics of file/folder when added') }, + { + 'key': 'override_mount_permissions', 'value': False, 'type': 'checkbox', + 'label': trans_late('settings', + 'Try to replace existing permissions when mounting an archive.') + }, { 'key': 'previous_profile_id', 'str_value': '1', 'type': 'internal', 'label': 'Previously selected profile' @@ -237,12 +242,6 @@ def get_misc_settings(): 'key': 'previous_window_height', 'str_value': '600', 'type': 'internal', 'label': 'Previous window height' }, - { - 'key': 'override_mount_permissions', 'value': False, 'type': 'checkbox', - 'label': trans_late('settings', - 'Try to replace existing permissions when mounting an archive.') - }, - ] if sys.platform == 'darwin': settings += [