parent
33f3fedca1
commit
010d40dc1e
@ -104,6 +104,10 @@ class Label(object):
|
|||||||
self.color,
|
self.color,
|
||||||
self.name)
|
self.name)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
if isinstance(other, Label):
|
||||||
|
return self.name == other.name
|
||||||
|
return NotImplemented
|
||||||
|
|
||||||
@builtins.property
|
@builtins.property
|
||||||
def icon_path(self):
|
def icon_path(self):
|
||||||
|
@ -859,6 +859,7 @@ class Qubes(qubes.PropertyHolder):
|
|||||||
7: qubes.Label(7, '0x75507b', 'purple'),
|
7: qubes.Label(7, '0x75507b', 'purple'),
|
||||||
8: qubes.Label(8, '0x000000', 'black'),
|
8: qubes.Label(8, '0x000000', 'black'),
|
||||||
}
|
}
|
||||||
|
assert max(self.labels.keys()) == qubes.config.max_default_label
|
||||||
|
|
||||||
# check if the default LVM Thin pool qubes_dom0/pool00 exists
|
# check if the default LVM Thin pool qubes_dom0/pool00 exists
|
||||||
if os.path.exists('/dev/mapper/qubes_dom0-pool00-tpool'):
|
if os.path.exists('/dev/mapper/qubes_dom0-pool00-tpool'):
|
||||||
|
@ -109,3 +109,6 @@ defaults = {
|
|||||||
max_qid = 254
|
max_qid = 254
|
||||||
max_netid = 254
|
max_netid = 254
|
||||||
max_dispid = 10000
|
max_dispid = 10000
|
||||||
|
#: built-in standard labels, if creating new one, allocate them above this
|
||||||
|
# number, at least until label index is removed from API
|
||||||
|
max_default_label = 8
|
||||||
|
@ -415,3 +415,87 @@ class QubesMgmt(object):
|
|||||||
|
|
||||||
self.app.remove_pool(self.arg)
|
self.app.remove_pool(self.arg)
|
||||||
self.app.save()
|
self.app.save()
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def label_list(self, untrusted_payload):
|
||||||
|
assert self.dest.name == 'dom0'
|
||||||
|
assert not self.arg
|
||||||
|
assert not untrusted_payload
|
||||||
|
del untrusted_payload
|
||||||
|
|
||||||
|
labels = self.fire_event_for_filter(self.app.labels.values())
|
||||||
|
|
||||||
|
return ''.join('{}\n'.format(label.name) for label in labels)
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def label_get(self, untrusted_payload):
|
||||||
|
assert self.dest.name == 'dom0'
|
||||||
|
assert not untrusted_payload
|
||||||
|
del untrusted_payload
|
||||||
|
|
||||||
|
try:
|
||||||
|
label = self.app.get_label(self.arg)
|
||||||
|
except KeyError:
|
||||||
|
raise qubes.exc.QubesValueError
|
||||||
|
|
||||||
|
self.fire_event_for_permission(label=label)
|
||||||
|
|
||||||
|
return label.color
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def label_create(self, untrusted_payload):
|
||||||
|
assert self.dest.name == 'dom0'
|
||||||
|
|
||||||
|
# don't confuse label name with label index
|
||||||
|
assert not self.arg.isdigit()
|
||||||
|
allowed_chars = string.ascii_letters + string.digits + '-_.'
|
||||||
|
assert all(c in allowed_chars for c in self.arg)
|
||||||
|
try:
|
||||||
|
self.app.get_label(self.arg)
|
||||||
|
except KeyError:
|
||||||
|
# ok, no such label yet
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise qubes.exc.QubesValueError('label already exists')
|
||||||
|
|
||||||
|
untrusted_payload = untrusted_payload.decode('ascii').strip()
|
||||||
|
assert len(untrusted_payload) == 8
|
||||||
|
assert untrusted_payload.startswith('0x')
|
||||||
|
# besides prefix, only hex digits are allowed
|
||||||
|
assert all(x in string.hexdigits for x in untrusted_payload[2:])
|
||||||
|
|
||||||
|
# TODO: try to avoid creating label too similar to existing one?
|
||||||
|
color = untrusted_payload
|
||||||
|
|
||||||
|
self.fire_event_for_permission(color=color)
|
||||||
|
|
||||||
|
# allocate new index, but make sure it's outside of default labels set
|
||||||
|
new_index = max(
|
||||||
|
qubes.config.max_default_label, *self.app.labels.keys()) + 1
|
||||||
|
|
||||||
|
label = qubes.Label(new_index, color, self.arg)
|
||||||
|
self.app.labels[new_index] = label
|
||||||
|
self.app.save()
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def label_remove(self, untrusted_payload):
|
||||||
|
assert self.dest.name == 'dom0'
|
||||||
|
assert not untrusted_payload
|
||||||
|
del untrusted_payload
|
||||||
|
|
||||||
|
try:
|
||||||
|
label = self.app.get_label(self.arg)
|
||||||
|
except KeyError:
|
||||||
|
raise qubes.exc.QubesValueError
|
||||||
|
# don't allow removing default labels
|
||||||
|
assert label.index > qubes.config.max_default_label
|
||||||
|
|
||||||
|
# FIXME: this should be in app.add_label()
|
||||||
|
for vm in self.app.domains:
|
||||||
|
if vm.label == label:
|
||||||
|
raise qubes.exc.QubesException('label still in use')
|
||||||
|
|
||||||
|
self.fire_event_for_permission(label=label)
|
||||||
|
|
||||||
|
del self.app.labels[label.index]
|
||||||
|
self.app.save()
|
||||||
|
Loading…
Reference in New Issue
Block a user