From 58101044fc10ef2dc9e45f0998053bd3ec67e717 Mon Sep 17 00:00:00 2001 From: James Cameron Date: Fri, 10 Jul 2020 14:26:54 +1000 Subject: [PATCH] Coerce BaseBuddyModel.props.key to str In Group View when a friend is made a traceback occurs. Traceback (most recent call last): File "/usr/lib/python3/dist-packages/jarabe/view/buddymenu.py", line 205, in _make_friend_cb friends.get_model().makefriend(self._buddy) File "/usr/lib/python3/dist-packages/jarabe/model/friends.py", line 130, in make_friend self.save() File "/usr/lib/python3/dist-packages,jarabe/model/friends.py", line 160, in save cp.add_section(section) File "/usr/lib/python3.8/configparser.py", line 1207, in add_section self._validate_value_types(section=section) File "/usr/lib/python3.8/configparser.py", line 1180, in _validate_value_types raise TypeError("section names must be strings") TypeError: section names must be strings In Group View when a friend is removed a traceback occurs. Traceback (most recent call last): File "/usr/lib/python3/dist-packages/jarabe/desktop/groupbox.py", line 67, in _friend_removed_cb icon = self._friend[key] KeyError: "b'AAAA0...'" Regression introduced aa18879e9717dfe2d30f249549e9a43d6dd6da4f; a BaseBuddyModel.props.key is coerced to bytes before being sent to Telepathy. Telepathy API for connection interface buddy info key uses a dbus.ByteArray. A dbus.ByteArray is now a subclass of bytes, where in Python 2 it is a subclass of str. https://dbus.freedesktop.org/doc/dbus-python/PY3PORT.html When the buddy key is set from bytes, convert to str in utf-8 encoding. When the buddy key is sent to Telepathy, convert to bytes. Signed-off-by: James Cameron --- src/jarabe/model/buddy.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/jarabe/model/buddy.py b/src/jarabe/model/buddy.py index 6683a52bb8..179d67eb8d 100644 --- a/src/jarabe/model/buddy.py +++ b/src/jarabe/model/buddy.py @@ -57,6 +57,9 @@ def get_key(self): return self._key def set_key(self, key): + if isinstance(key, bytes): + key = key.decode('utf-8') + self._key = key key = GObject.Property(type=object, getter=get_key, setter=set_key) @@ -160,9 +163,8 @@ def _sync_properties_on_connection(self, connection): if CONNECTION_INTERFACE_BUDDY_INFO in connection: properties = {} if self.props.key is not None: - if isinstance(self.props.key, str): - self.props.key = self.props.key.encode() - properties['key'] = dbus.ByteArray(self.props.key) + properties['key'] = dbus.ByteArray( + self.props.key.encode('utf-8')) if self.props.color is not None: properties['color'] = self.props.color.to_string()