Skip to content

Commit 26aa02b

Browse files
committed
Deserialize device from qrexec arg properly
Avoid ':' and '*' in the argument, as those are not allowed over qrexec. Fixes QubesOS/qubes-issues#10040
1 parent 1186794 commit 26aa02b

1 file changed

Lines changed: 25 additions & 1 deletion

File tree

qubes/device_protocol.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,16 @@ def __lt__(self, other):
536536
def __repr__(self):
537537
return f"{self.port!r}:{self.device_id}"
538538

539+
@property
540+
def repr_for_qarg(self):
541+
"""Object representation for qrexec argument"""
542+
res = repr(self).replace(":", "+")
543+
# replace '?' in category
544+
unknown_dev = repr(DeviceInterface.unknown())
545+
if res.endswith(unknown_dev):
546+
res = res[:-len(unknown_dev)] + "_" * len(unknown_dev)
547+
return res.replace("*", "_")
548+
539549
def __str__(self):
540550
return f"{self.port}:{self.device_id}"
541551

@@ -595,12 +605,21 @@ def _parse(
595605
"""
596606
if backend is None:
597607
backend_name, identity = representation.split(sep, 1)
608+
if backend_name == "_":
609+
backend_name = "*"
598610
if backend_name != "*":
599611
backend = get_domain(backend_name)
600612
else:
601613
identity = representation
602614

603-
port_id, _, devid = identity.partition(":")
615+
port_id, _, devid = identity.replace(sep, ":").partition(":")
616+
if port_id == "_":
617+
port_id = "*"
618+
if devid == "_":
619+
devid = "*"
620+
unknown_dev = repr(DeviceInterface.unknown())
621+
if devid.endswith("_" * (len(unknown_dev))):
622+
devid = devid[:-len(unknown_dev)] + unknown_dev
604623
return cls(
605624
Port(backend_domain=backend, port_id=port_id, devclass=devclass),
606625
device_id=devid or None,
@@ -1276,6 +1295,11 @@ def clone(self, **kwargs):
12761295
def __repr__(self):
12771296
return f"{self.virtual_device!r}"
12781297

1298+
@property
1299+
def repr_for_qarg(self):
1300+
"""Object representation for qrexec argument"""
1301+
return self.virtual_device.repr_for_qarg
1302+
12791303
def __str__(self):
12801304
return f"{self.virtual_device}"
12811305

0 commit comments

Comments
 (0)