Skip to content

Commit 0eeb6e7

Browse files
committed
Use new policy admin exceptions
For: QubesOS/qubes-issues#10746 Requires: QubesOS/qubes-core-qrexec#223
1 parent d56bb9e commit 0eeb6e7

4 files changed

Lines changed: 52 additions & 9 deletions

File tree

qubes_config/global_config/policy_manager.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,16 @@
2121
import subprocess
2222
from typing import Optional, List, Tuple
2323

24+
from qubes_config.widgets.utils import compare_rule_lists
2425
from qrexec.policy.admin_client import PolicyClient
2526
from qrexec.policy.parser import StringPolicy, Rule
26-
from qubes_config.widgets.utils import compare_rule_lists
27+
try:
28+
from qrexec.policy.admin import (
29+
PolicyAdminException,
30+
PolicyAdminFileNotFoundException,
31+
)
32+
except ImportError:
33+
pass
2734

2835
import gettext
2936

@@ -51,7 +58,7 @@ def get_all_policy_files(self, service: str) -> List[str]:
5158
"""Just get a straightforward list of all relevant policy files."""
5259
try:
5360
return self.policy_client.policy_get_files(service)
54-
except subprocess.CalledProcessError:
61+
except (PolicyAdminException, subprocess.CalledProcessError):
5562
return []
5663

5764
def get_conflicting_policy_files(self, service: str, own_file: str) -> List[str]:
@@ -83,7 +90,7 @@ def get_rules_from_filename(
8390
for the file."""
8491
try:
8592
rules_text, token = self.policy_client.policy_get(filename)
86-
except subprocess.CalledProcessError:
93+
except (PolicyAdminFileNotFoundException, subprocess.CalledProcessError):
8794
if not default_policy:
8895
return [], None
8996
rules_text, token = default_policy, None

qubes_config/policy_editor/policy_editor.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@
3030
from qrexec.policy.admin_client import PolicyClient
3131
from qrexec.policy.parser import StringPolicy
3232
from qrexec.exc import PolicySyntaxError
33+
try:
34+
from qrexec.policy.admin import (
35+
PolicyAdminException,
36+
PolicyAdminFileNotFoundException,
37+
)
38+
except ImportError:
39+
pass
3340

3441
from qubes_config.widgets.gtk_utils import (
3542
load_theme,
@@ -446,13 +453,14 @@ def _new(self, *_args):
446453

447454
def _save(self, *_args):
448455
"""Save changes. If successful, return True."""
456+
err_msg = None
449457
try:
450458
self.policy_client.policy_replace(
451459
self.filename, self.policy_text, self.token
452460
)
453-
except subprocess.CalledProcessError as ex:
454-
err_msg = "An error occurred while trying to save the policy file:\n"
455-
if ex.stdout:
461+
except (PolicyAdminException, subprocess.CalledProcessError) as ex:
462+
err_msg = f"Failed to replace policy {self.filename!r}: {ex}"
463+
if hasattr(ex, "stdout"):
456464
err_msg += ex.stdout.decode()
457465
else:
458466
err_msg += str(ex)
@@ -533,8 +541,8 @@ def open_policy_file(self, name: Optional[str]):
533541
else:
534542
try:
535543
text, self.token = self.policy_client.policy_get(name)
536-
except subprocess.CalledProcessError as ex:
537-
if ex.returncode == 126:
544+
except (PolicyAdminFileNotFoundException, subprocess.CalledProcessError) as ex:
545+
if getattr(ex, "returncode", None) == 126:
538546
show_error(
539547
self.main_window,
540548
"Access denied",

qubes_config/tests/conftest.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@
4646
MockDevice,
4747
)
4848

49+
try:
50+
from qrexec.policy.admin import (
51+
PolicyAdminFileNotFoundException,
52+
PolicyAdminTokenException,
53+
)
54+
except ImportError:
55+
pass
56+
4957

5058
@pytest.fixture
5159
def test_qapp():
@@ -291,6 +299,8 @@ def policy_get(self, file_name):
291299
"""Get file contents; takes into account policy_replace."""
292300
if file_name in self.files:
293301
return self.files[file_name], self.file_tokens[file_name]
302+
if "PolicyAdminFileNotFoundException" in globals():
303+
raise PolicyAdminFileNotFoundException
294304
raise subprocess.CalledProcessError(2, "test")
295305

296306
def policy_include_get(self, file_name):
@@ -300,15 +310,21 @@ def policy_include_get(self, file_name):
300310
self.include_files[file_name],
301311
self.include_file_tokens[file_name],
302312
)
313+
if "PolicyAdminFileNotFoundException" in globals():
314+
raise PolicyAdminFileNotFoundException
303315
raise subprocess.CalledProcessError(2, "test")
304316

305317
def policy_replace(self, filename, policy_text, token="any"):
306318
"""Replace file contents with provided contents."""
307319
if token == "new":
308320
if filename in self.file_tokens:
321+
if "PolicyAdminTokenException" in globals():
322+
raise PolicyAdminTokenException
309323
raise subprocess.CalledProcessError(2, "test")
310324
elif token != "any":
311325
if token != self.file_tokens.get(filename, ""):
326+
if "PolicyAdminTokenException" in globals():
327+
raise PolicyAdminTokenException
312328
raise subprocess.CalledProcessError(2, "test")
313329
self.files[filename] = policy_text
314330
self.file_tokens[filename] = str(len(policy_text))
@@ -317,6 +333,8 @@ def policy_include_replace(self, filename, policy_text, token="any"):
317333
"""Replace file contents with provided contents."""
318334
if token != "any":
319335
if token != self.include_file_tokens.get(filename, ""):
336+
if "PolicyAdminTokenException" in globals():
337+
raise PolicyAdminTokenException
320338
raise subprocess.CalledProcessError(2, "test")
321339
self.include_files[filename] = policy_text
322340
self.include_file_tokens[filename] = str(len(policy_text))

qubes_config/tests/test_policy_manager.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424

2525
from ..global_config.policy_manager import PolicyManager
2626
from qrexec.policy.parser import Rule
27+
try:
28+
from qrexec.policy.admin import PolicyAdminFileNotFoundException
29+
except ImportError:
30+
pass
2731

2832

2933
def test_conflict_files():
@@ -58,10 +62,14 @@ def test_get_policy_from_file_new_no_default(mock_replace, mock_get):
5862
manager = PolicyManager()
5963

6064
mock_get.side_effect = subprocess.CalledProcessError(2, "test")
61-
6265
assert manager.get_rules_from_filename("test", "") == ([], None)
6366
assert not mock_replace.mock_calls
6467

68+
if "PolicyAdminFileNotFoundException" in globals():
69+
mock_get.side_effect = PolicyAdminFileNotFoundException
70+
assert manager.get_rules_from_filename("test", "") == ([], None)
71+
assert not mock_replace.mock_calls
72+
6573

6674
def test_get_policy_from_file_new():
6775
class MockPolicy:
@@ -71,6 +79,8 @@ def __init__(self):
7179
def policy_get(self, filename):
7280
if filename in self.files:
7381
return self.files[filename], filename
82+
if "PolicyAdminFileNotFoundException" in globals():
83+
raise PolicyAdminFileNotFoundException
7484
raise subprocess.CalledProcessError(2, "test")
7585

7686
def policy_replace(self, filename, text):

0 commit comments

Comments
 (0)