Skip to content

Commit a91bd54

Browse files
committed
api/admin: prevent removing dom0
Fixes QubesOS/qubes-issues#7188
1 parent 065c6e4 commit a91bd54

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

qubes/api/admin.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,10 @@ async def vm_remove(self):
11641164

11651165
self.fire_event_for_permission()
11661166

1167+
if self.dest.name == 'dom0':
1168+
raise qubes.exc.QubesVMInUseError(
1169+
self.dest, msg="'dom0' cannot be removed")
1170+
11671171
async with self.dest.startup_lock:
11681172
if not self.dest.is_halted():
11691173
raise qubes.exc.QubesVMNotHaltedError(self.dest)

qubes/tests/api_admin.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2171,6 +2171,16 @@ def test_502_vm_remove_attached(self, mock_rmtree, mock_remove):
21712171
self.assertFalse(mock_remove.called)
21722172
self.assertFalse(self.app.save.called)
21732173

2174+
@unittest.mock.patch('qubes.storage.Storage.remove')
2175+
@unittest.mock.patch('shutil.rmtree')
2176+
def test_503_vm_remove_dom0(self, mock_rmtree, mock_remove):
2177+
mock_remove.side_effect = self.dummy_coro
2178+
with self.assertRaises(qubes.exc.QubesVMInUseError):
2179+
self.call_mgmt_func(b'admin.vm.Remove', b'dom0')
2180+
self.assertFalse(mock_rmtree.called)
2181+
self.assertFalse(mock_remove.called)
2182+
self.assertFalse(self.app.save.called)
2183+
21742184
# Import tests
21752185
# (internal methods, normally called from qubes-rpc script)
21762186

0 commit comments

Comments
 (0)