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
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki