File 0001-request_key.patch of Package python-keyring-keyutils

From 71d42faf460c13a35dc516d243c9cba85eecfa81 Mon Sep 17 00:00:00 2001
From: Lucas Mulling <lucas.mulling@suse.com>
Date: Tue, 21 Oct 2025 19:31:44 -0300
Subject: [PATCH] request_key

Signed-off-by: Lucas Mulling <lucas.mulling@suse.com>
---
 keyutils/backend.py | 15 +++++++++++++--
 keyutils/keys.py    |  9 +++++++++
 keyutils/raw.c      | 37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/keyutils/backend.py b/keyutils/backend.py
index cff116f..c93c151 100644
--- a/keyutils/backend.py
+++ b/keyutils/backend.py
@@ -3,7 +3,7 @@
 import errno
 
 from keyring.backend import KeyringBackend
-from keyring.util import properties
+from jaraco.classes import properties
 from keyring.errors import PasswordDeleteError
 
 from keyutils.keys import session_keyring
@@ -20,7 +20,7 @@ class KeyutilsKeyringBackend(KeyringBackend):
         self._key_type = key_type
         self._payload_encoding = payload_encoding
 
-    @properties.ClassProperty
+    @properties.classproperty
     @classmethod
     def priority(cls):
         return 1
@@ -47,8 +47,19 @@ class KeyutilsKeyringBackend(KeyringBackend):
         return payload.decode(self._payload_encoding)
 
     def _find_key(self, service, username, missing_ok=True):
+
+        print("USING REQUEST KEY")
+
         keyring = self._keyring()
         key_id = self._key_id(service, username)
+
+        try:
+            key = keyring.request_key(*key_id, "pass")
+        except OSError as e:
+            key = None
+        if key is not None:
+            return key
+
         try:
             key = keyring.search(*key_id, missing_ok=missing_ok)
         except OSError as e:
diff --git a/keyutils/keys.py b/keyutils/keys.py
index 68d9653..f6b42c4 100644
--- a/keyutils/keys.py
+++ b/keyutils/keys.py
@@ -107,6 +107,15 @@ class Keyring(KeyEntity):
         """
         return Keyring._add_key(self._key_type, description, None, self)
 
+    def request_key(self, key_type, description, callout_info):
+        try:
+            serial = raw.request_key(key_type, description, "pass", self.serial)
+        except OSError as e:
+            if e.errno == errno.ENOKEY:
+                return None
+            raise
+        return Key.from_serial(serial)
+
     @classmethod
     def join_session_keyring(cls, name=None):
         """Change the session keyring.
diff --git a/keyutils/raw.c b/keyutils/raw.c
index e44c825..c533fc1 100644
--- a/keyutils/raw.c
+++ b/keyutils/raw.c
@@ -67,6 +67,42 @@ if ((s) != NULL) {                                                          \
     (s) = s ## _nul;                                                        \
 }
 
+PyDoc_STRVAR(raw_request_key_doc,
+"request_key(type, description, callout_info, ringid) -> serial");
+
+static PyObject *raw_request_key(PyObject *self, PyObject *args) {
+    const char *type;
+    Py_ssize_t type_len;
+    const char *description;
+    Py_ssize_t description_len;
+    const char *callout_info;
+    Py_ssize_t callout_info_len;
+    long ringid;
+    key_serial_t serial;
+
+    if (!PyArg_ParseTuple(args, "s#z#z#l", &type, &type_len, &description,
+                          &description_len, &callout_info, &callout_info_len, &ringid)) {
+        return NULL;
+    }
+
+    assert_no_embedded_nul(type);
+    assert_no_embedded_nul(description);
+
+    assert_long_key(ringid);
+
+    nul_terminate(type);
+    nul_terminate(description);
+
+    serial = request_key(type, description, callout_info, ringid);
+    if (serial < 0) {
+        PyErr_SetFromErrno(PyExc_OSError);
+        return NULL;
+    }
+
+    assert_key_long(serial);
+    return PyLong_FromLong((long) serial);
+}
+
 PyDoc_STRVAR(raw_add_key_doc,
 "add_key(type, description, payload, ringid) -> serial\n\
 \n\
@@ -238,6 +274,7 @@ PyObject *raw_keyctl_join_session_keyring(PyObject *self, PyObject *args) {
 }
 
 static PyMethodDef raw_methods[] = {
+    {"request_key", raw_request_key, METH_VARARGS, raw_request_key_doc},
     {"add_key", raw_add_key, METH_VARARGS, raw_add_key_doc},
     {"keyring_search", raw_keyring_search, METH_VARARGS,
      raw_keyring_search_doc},
-- 
2.51.1

openSUSE Build Service is sponsored by