- 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 118119 -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 -1125 -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 165133 -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 179146 -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 signal206 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 signal230 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 signal244 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]