xi-keyring

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

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>