- commit
- 362344710134583725d38b47ab5453dc703e333d
- parent
- 22fda93a86aef7e705a0c6857c8da49ffec9b9f7
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2024-07-27 15:48
portal: implement org.freedesktop.impl.portal.Secret
Diffstat
| M | PKGBUILD | 1 | + |
| A | system/portal | 4 | ++++ |
| M | xikeyring/dbus.py | 27 | +++++++++++++++++++++++++++ |
| M | xikeyring/org.freedesktop.Secrets.xml | 16 | ++++++++++++++++ |
4 files changed, 48 insertions, 0 deletions
diff --git a/PKGBUILD b/PKGBUILD
@@ -17,4 +17,5 @@ package() {
17 17 install -Dm 644 README.md "$pkgdir/usr/share/docs/xi-keyring/README.md"
18 18 install -Dm 644 system/dbus.service "$pkgdir/usr/share/dbus-1/services/org.xi.keyring.service"
19 19 install -Dm 644 system/systemd.service "$pkgdir/usr/lib/systemd/user/xi-keyring.service"
-1 20 install -Dm 644 system/portal "$pkgdir/usr/share/xdg-desktop-portal/portals/xi-keyring.portal"
20 21 }
diff --git a/system/portal b/system/portal
@@ -0,0 +1,4 @@ -1 1 [portal] -1 2 DBusName=org.freedesktop.secrets -1 3 Interfaces=org.freedesktop.impl.portal.Secret -1 4 UseIn=wlroots
diff --git a/xikeyring/dbus.py b/xikeyring/dbus.py
@@ -192,6 +192,11 @@ class DBusService(BaseDBusService): 192 192 self.register_object(conn, OFSP, f'{OFSI}.Service') 193 193 self.register_object(conn, f'{OFSP}/aliases/default', f'{OFSI}.Collection') 194 194 self.register_object(conn, f'{OFSP}/collection/it', f'{OFSI}.Collection') -1 195 self.register_object( -1 196 conn, -1 197 '/org/freedesktop/portal/desktop', -1 198 'org.freedesktop.impl.portal.Secret', -1 199 ) 195 200 196 201 def service_open_session(self, conn, sender, path, algorithm, input): 197 202 output, session = create_session(algorithm, input) @@ -363,3 +368,25 @@ class DBusService(BaseDBusService): 363 368 def session_close(self, conn, sender, path): 364 369 sid, _owner, _session = self.sessions.pop(path) 365 370 conn.unregister_object(sid) -1 371 -1 372 def secret_get_version(self, conn, sender, path): -1 373 return GLib.Variant('u', 1) -1 374 -1 375 def secret_retrieve_secret(self, conn, sender, path, handle, app_id, fd, options): -1 376 reg_id = self.register_object(conn, handle, 'org.freedesktop.impl.portal.Request') -1 377 try: -1 378 exe = self.get_exe(conn, sender) -1 379 attrs = { -1 380 'application': 'org.freedesktop.portal.Secret', -1 381 'app_id': app_id, -1 382 } -1 383 ids = self.keyring.search_items(exe, attrs) -1 384 if ids: -1 385 secret = self.keyring.get_secret(exe, ids[0]) -1 386 else: -1 387 secret = os.urandom(64) -1 388 self.keyring.create_item(exe, attrs, secret) -1 389 os.write(fd, secret) -1 390 finally: -1 391 conn.unregister_object(reg_id) -1 392 return GLib.Variant('(ua{sv})', (0, []))
diff --git a/xikeyring/org.freedesktop.Secrets.xml b/xikeyring/org.freedesktop.Secrets.xml
@@ -143,4 +143,20 @@ 143 143 <arg name="result" type="v"/> 144 144 </signal> 145 145 </interface> -1 146 -1 147 <interface name="org.freedesktop.impl.portal.Secret"> -1 148 <property name="Version" type="u" access="read"/> -1 149 -1 150 <method name="RetrieveSecret"> -1 151 <arg name="handle" type="o" direction="in"/> -1 152 <arg name="app_id" type="s" direction="in"/> -1 153 <arg name="fd" type="h" direction="in"/> -1 154 <arg name="options" type="a{sv}" direction="in"/> -1 155 <arg name="response" type="u" direction="out"/> -1 156 <arg name="results" type="a{sv}" direction="out"/> -1 157 </method> -1 158 </interface> -1 159 -1 160 <interface name="org.freedesktop.impl.portal.Request"> -1 161 </interface> 146 162 </node>