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