Skip to content

Commit c0dce5f

Browse files
committed
Set NetVM and DispVM properly for StandaloneVMs
Previously, when creating a Whonix-Workstation standalone, the NetVM would be sys-firewall by default, and the default DispVM would be default-dvm. Both of these are wrong for most Whonix-Workstation qubes, so now when a qube has the whonix-ws feature set on it, it will automtically have its NetVM and DispVM changed to appropriate values for a Whonix-Workstation machine. This makes standalone creation work as expected.
1 parent d1fb89a commit c0dce5f

File tree

1 file changed

+64
-31
lines changed

1 file changed

+64
-31
lines changed

qubeswhonix/__init__.py

Lines changed: 64 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,59 @@
2525

2626
class QubesWhonixExtension(qubes.ext.Extension):
2727
'''qubes-core-admin extension for handling Whonix related settings'''
28+
@staticmethod
29+
def set_ws_netvm(app, vm):
30+
'''Set the default NetVM for a Whonix-Workstation qube.'''
31+
if isinstance(vm, qubes.vm.templatevm.TemplateVM):
32+
return
33+
template = getattr(vm, 'template', None)
34+
# look for appropriate whonix-gateway
35+
if (
36+
template is not None
37+
and 'whonix-default-gw' in template.features
38+
):
39+
netvm = template.features['whonix-default-gw']
40+
else:
41+
netvm = 'sys-whonix'
42+
if netvm in app.domains:
43+
vm.netvm = netvm
44+
else:
45+
# expected netvm does not exists, log an error and set netvm
46+
# to None
47+
vm.log.error('QubesWhonixExtension: netvm \'%s\' does not '
48+
'exists', netvm)
49+
vm.netvm = None
50+
51+
@staticmethod
52+
def set_ws_dispvm(app, vm):
53+
'''Set the default DispVM for a Whonix-Workstation qube.'''
54+
if isinstance(vm, qubes.vm.templatevm.TemplateVM):
55+
return
56+
template = getattr(vm, 'template', None)
57+
# look for appropriate default dispvm
58+
if (
59+
template is not None
60+
and 'whonix-default-dispvm' in template.features
61+
):
62+
default_dispvm = template.features['whonix-default-dispvm']
63+
elif template is not None:
64+
# example template.name: whonix-ws-14
65+
# example default_dispvm: whonix-ws-14-dvm
66+
default_dispvm = template.name + '-dvm'
67+
else:
68+
# assume whonix-workstation-17-dvm is right
69+
# HARDCODED.
70+
default_dispvm = 'whonix-workstation-17-dvm'
71+
72+
if default_dispvm in app.domains:
73+
vm.default_dispvm = default_dispvm
74+
else:
75+
# expected default dispvm does not exists, log an error and set
76+
# default dispvm to None
77+
vm.log.error('QubesWhonixExtension: default dispvm\'%s\' does '
78+
'not exists', default_dispvm)
79+
vm.default_dispvm = None
80+
2881
@qubes.ext.handler('domain-add', system=True)
2982
def on_domain_add(self, app, _event, vm, **_kwargs):
3083
'''Handle new AppVM created on whonix-ws/whonix-gw template and
@@ -41,41 +94,21 @@ def on_domain_add(self, app, _event, vm, **_kwargs):
4194
# this is new VM based on whonix-ws, adjust its default settings
4295

4396
vm.tags.add('anon-vm')
44-
45-
# look for appropriate whonix-gateway
46-
if 'whonix-default-gw' in template.features:
47-
netvm = template.features['whonix-default-gw']
48-
else:
49-
netvm = 'sys-whonix'
50-
if netvm in app.domains:
51-
vm.netvm = netvm
52-
else:
53-
# expected netvm does not exists, log an error and set netvm
54-
# to None
55-
vm.log.error('QubesWhonixExtension: netvm \'%s\' does not '
56-
'exists', netvm)
57-
vm.netvm = None
58-
59-
# look for appropriate default dispvm
60-
if 'whonix-default-dispvm' in template.features:
61-
default_dispvm = template.features['whonix-default-dispvm']
62-
else:
63-
# example template.name: whonix-ws-14
64-
# example default_dispvm: whonix-ws-14-dvm
65-
default_dispvm = template.name + '-dvm'
66-
67-
if default_dispvm in app.domains:
68-
vm.default_dispvm = default_dispvm
69-
else:
70-
# expected default dispvm does not exists, log an error and set
71-
# default dispvm to None
72-
vm.log.error('QubesWhonixExtension: default dispvm\'%s\' does '
73-
'not exists', default_dispvm)
74-
vm.default_dispvm = None
97+
self.set_ws_netvm(app, vm)
98+
self.set_ws_dispvm(app, vm)
7599

76100
if 'gui-events-max-delay' not in vm.features:
77101
vm.features['gui-events-max-delay'] = 100
78102

103+
@qubes.ext.handler('domain-feature-set:whonix-ws')
104+
def on_whonix_ws_feature_set(self, vm, event, feature, value, oldvalue=None):
105+
'''Set NetVM and DispVM appropriately on VMs that are newly set as a
106+
Whonix-Workstation VM (mostly useful for configuring StandaloneVMs
107+
'''
108+
if value == '1':
109+
self.set_ws_netvm(vm.app, vm)
110+
self.set_ws_dispvm(vm.app, vm)
111+
79112
@qubes.ext.handler('features-request')
80113
def on_features_request(self, vm, _event, untrusted_features):
81114
'''Handle whonix-ws/whonix-gw template advertising itself'''

0 commit comments

Comments
 (0)