xi-keyring

simple and extensible alternative for gnome-keyring
git clone https://git.ce9e.org/xi-keyring.git

commit
eceb30725063041e36dc5f5c4a549ad953f5db8f
parent
13aa5c9c87164c56108ac9d6056b0c6a1df5ddba
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2024-05-30 19:43
dbus: close sessions on disconnect

Diffstat

M xikeyring/dbus.py 33 +++++++++++++++++++++++++++------

1 files changed, 27 insertions, 6 deletions


diff --git a/xikeyring/dbus.py b/xikeyring/dbus.py

@@ -199,9 +199,30 @@ class DBusService(BaseDBusService):
  199   199         self.session_counter += 1
  200   200         session_path = f'{OFSP}/sessions/{self.session_counter}'
  201   201         sid = self.register_object(conn, session_path, f'{OFSI}.Session')
  202    -1         self.sessions[session_path] = (sid, session)
   -1   202         self.sessions[session_path] = (sid, sender, session)
   -1   203 
   -1   204         conn.signal_subscribe(
   -1   205             None,
   -1   206             'org.freedesktop.DBus',
   -1   207             'NameOwnerChanged',
   -1   208             '/org/freedesktop/DBus',
   -1   209             None,
   -1   210             Gio.DBusSignalFlags.NONE,
   -1   211             self.on_name_owner_changed,
   -1   212             None
   -1   213         )
  203   214         return GLib.Variant('(vo)', (GLib.Variant('ay', output), session_path))
  204   215 
   -1   216     def on_name_owner_changed(
   -1   217         self, conn, sender, path, iface, signal, params, user_data=None
   -1   218     ):
   -1   219         _name, old, new = params.unpack()
   -1   220         if not new:
   -1   221             for path in [
   -1   222                 path for path, value in self.sessions.items() if value[1] == old
   -1   223             ]:
   -1   224                 self.session_close(conn, sender, path)
   -1   225 
  205   226     def service_search_items(self, conn, sender, path, query):
  206   227         exe = self.get_exe(conn, sender)
  207   228         items = self.search_items(exe, conn, query)
@@ -215,7 +236,7 @@ class DBusService(BaseDBusService):
  215   236         return GLib.Variant('(aoo)', ([], '/'))
  216   237 
  217   238     def service_get_secrets(self, conn, sender, path, items, session_path):
  218    -1         _sid, session = self.sessions[session_path]
   -1   239         session = self.sessions[session_path][2]
  219   240         exe = self.get_exe(conn, sender)
  220   241         result = []
  221   242         for path in items:
@@ -242,7 +263,7 @@ class DBusService(BaseDBusService):
  242   263     def collection_create_item(
  243   264         self, conn, sender, path, properties, secret_tuple, replace
  244   265     ):
  245    -1         _sid, session = self.sessions[secret_tuple[0]]
   -1   266         session = self.sessions[secret_tuple[0]][2]
  246   267         secret = session.decode(secret_tuple)
  247   268         attributes = properties.get(f'{OFSI}.Item.Attributes', {})
  248   269         exe = self.get_exe(conn, sender)
@@ -285,13 +306,13 @@ class DBusService(BaseDBusService):
  285   306         id = int(path.rsplit('/', 1)[1], 10)
  286   307         exe = self.get_exe(conn, sender)
  287   308         secret = self.keyring.get_secret(exe, id)
  288    -1         _sid, session = self.sessions[session_path]
   -1   309         session = self.sessions[session_path][2]
  289   310         secret_tuple = session.encode(session_path, secret)
  290   311         return GLib.Variant('((oayays))', [secret_tuple])
  291   312 
  292   313     def item_set_secret(self, conn, sender, path, secret_tuple):
  293   314         id = int(path.rsplit('/', 1)[1], 10)
  294    -1         _sid, session = self.sessions[secret_tuple[0]]
   -1   315         session = self.sessions[secret_tuple[0]][2]
  295   316         secret = session.decode(secret_tuple)
  296   317         exe = self.get_exe(conn, sender)
  297   318         self.keyring.update_secret(exe, id, secret)
@@ -341,5 +362,5 @@ class DBusService(BaseDBusService):
  341   362         )
  342   363 
  343   364     def session_close(self, conn, sender, path):
  344    -1         sid, _session = self.sessions.pop(path)
   -1   365         sid, _owner, _session = self.sessions.pop(path)
  345   366         conn.unregister_object(sid)