xi-keyring

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

commit
f9fd654d2af37224709c19210ca11701cb55f691
parent
cce57295be2e03642fc3b1e5edddb6e63d516578
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2024-04-05 09:17
emit events

Diffstat

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

1 files changed, 70 insertions, 22 deletions


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

@@ -116,25 +116,59 @@ class DBusService(BaseDBusService):
  116   116     def ids_to_paths(self, items):
  117   117         return [f'{OFSP}/collection/it/{id}' for id in items]
  118   118 
  119    -1     def update_items(self, conn, *, keep=None, add=[], rm=[]):
  120    -1         for id, reg_id in list(self.registered_items.items()):
  121    -1             if id in rm or (keep is not None and id not in keep):
  122    -1                 conn.unregister_object(reg_id)
  123    -1                 del self.registered_items[id]
  124    -1 
  125    -1         for id in add:
  126    -1             if id not in self.registered_items:
  127    -1                 self.registered_items[id] = self.register_object(
  128    -1                     conn,
  129    -1                     f'{OFSP}/collection/it/{id}',
  130    -1                     f'{OFSI}.Item',
   -1   119     def update_items(self, conn, *, keep=None, add=[], rm=[], emit=True):
   -1   120         real_rm = [
   -1   121             id
   -1   122             for id, reg_id in list(self.registered_items.items())
   -1   123             if id in rm or (keep is not None and id not in keep)
   -1   124         ]
   -1   125         real_add = [id for id in add if id not in self.registered_items]
   -1   126 
   -1   127         for id in real_rm:
   -1   128             reg_id = self.registered_items.pop(id)
   -1   129             conn.unregister_object(reg_id)
   -1   130 
   -1   131         for id in real_add:
   -1   132             self.registered_items[id] = self.register_object(
   -1   133                 conn, f'{OFSP}/collection/it/{id}', f'{OFSI}.Item'
   -1   134             )
   -1   135 
   -1   136         if emit:
   -1   137             for id in real_rm:
   -1   138                 conn.emit_signal(
   -1   139                     None,
   -1   140                     f'{OFSP}/collection/it',
   -1   141                     f'{OFSI}.Collection',
   -1   142                     'ItemDeleted',
   -1   143                     GLib.Variant('(o)', [f'{OFSP}/collection/it/{id}']),
   -1   144                 )
   -1   145             for id in real_add:
   -1   146                 conn.emit_signal(
   -1   147                     None,
   -1   148                     f'{OFSP}/collection/it',
   -1   149                     f'{OFSI}.Collection',
   -1   150                     'ItemCreated',
   -1   151                     GLib.Variant('(o)', [f'{OFSP}/collection/it/{id}']),
   -1   152                 )
   -1   153             if real_rm or real_add:
   -1   154                 items = GLib.Variant('ao', self.ids_to_paths(self.registered_items))
   -1   155                 conn.emit_signal(
   -1   156                     None,
   -1   157                     f'{OFSP}/collection/it',
   -1   158                     'org.freedesktop.DBus.Properties',
   -1   159                     'PropertiesChanged',
   -1   160                     GLib.Variant(
   -1   161                         '(sa{sv}as)',
   -1   162                         (f'{OFSI}.Collection', {'Items': items}.items(), []),
   -1   163                     ),
  131   164                 )
  132   165 
  133    -1     def search_items(self, conn, query={}):
   -1   166     def search_items(self, conn, query={}, *, emit=True):
  134   167         items = self.keyring.search_items(query)
  135    -1         self.update_items(conn, add=items)
  136    -1         if not query:
  137    -1             self.update_items(conn, keep=items)
   -1   168         if query:
   -1   169             self.update_items(conn, add=items, emit=emit)
   -1   170         else:
   -1   171             self.update_items(conn, add=items, keep=items, emit=emit)
  138   172         return items
  139   173 
  140   174     def on_bus_acquired(self, conn, bus):
@@ -143,7 +177,7 @@ class DBusService(BaseDBusService):
  143   177         self.register_object(conn, f'{OFSP}/aliases/default', f'{OFSI}.Collection')
  144   178         self.register_object(conn, f'{OFSP}/collection/it', f'{OFSI}.Collection')
  145   179 
  146    -1         self.search_items(conn)
   -1   180         self.search_items(conn, emit=False)
  147   181 
  148   182     def service_open_session(self, conn, sender, path, algorithm, input):
  149   183         output, session = create_session(algorithm, input)
@@ -202,7 +236,6 @@ class DBusService(BaseDBusService):
  202   236         if not id:
  203   237             id = self.keyring.create_item(attributes, secret)
  204   238             self.update_items(conn, add=[id])
  205    -1         # TODO: trigger signal
  206   239         return GLib.Variant('(oo)', (f'{OFSP}/collection/it/{id}', '/'))
  207   240 
  208   241     def collection_get_items(self, conn, sender, path):
@@ -226,7 +259,6 @@ class DBusService(BaseDBusService):
  226   259         self.keyring.delete_item(id)
  227   260         self.update_items(conn, rm=[id])
  228   261         return GLib.Variant('(o)', ['/'])
  229    -1         # TODO: trigger signal
  230   262 
  231   263     def item_get_secret(self, conn, sender, path, session_path):
  232   264         id = int(path.rsplit('/', 1)[1], 10)
@@ -240,7 +272,6 @@ class DBusService(BaseDBusService):
  240   272         session = self.sessions[secret_tuple[0]]
  241   273         secret = session.decode(secret_tuple)
  242   274         self.keyring.update_secret(id, secret)
  243    -1         # TODO: trigger signal
  244   275 
  245   276     def item_get_label(self, conn, sender, path):
  246   277         return GLib.Variant('s', path.rsplit('/', 1)[1])
@@ -264,8 +295,25 @@ class DBusService(BaseDBusService):
  264   295 
  265   296     def item_set_attributes(self, conn, sender, path, value):
  266   297         id = int(path.rsplit('/', 1)[1], 10)
  267    -1         self.keyring.update_attributes(id, value.unpack())
  268    -1         # TODO: trigger signal
   -1   298         attributes = value.unpack()
   -1   299         self.keyring.update_attributes(id, attributes)
   -1   300 
   -1   301         conn.emit_signal(
   -1   302             None,
   -1   303             f'{OFSP}/collection/it',
   -1   304             f'{OFSI}.Collection',
   -1   305             'ItemChanged',
   -1   306             GLib.Variant('(o)', [path]),
   -1   307         )
   -1   308         conn.emit_signal(
   -1   309             None,
   -1   310             path,
   -1   311             'org.freedesktop.DBus.Properties',
   -1   312             'PropertiesChanged',
   -1   313             GLib.Variant(
   -1   314                 '(sa{sv}as)', (f'{OFSI}.Item', {'Attributes': attributes}, [])
   -1   315             ),
   -1   316         )
  269   317 
  270   318     def session_close(self, conn, sender, path):
  271   319         del self.sessions[path]