]> git.ipfire.org Git - pakfire.git/commitdiff
_pakfire: Import/export keys as strings
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 1 Jun 2023 20:28:50 +0000 (20:28 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 1 Jun 2023 20:28:50 +0000 (20:28 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/key.c
src/_pakfire/pakfire.c

index a1b3f4647fa486c6b948552688fbb5dd804ead8e..ef4e936599127ee2944e949caeeb48d239148165 100644 (file)
@@ -99,38 +99,42 @@ static PyObject* Key_get_algorithm(KeyObject* self) {
 }
 
 static PyObject* Key_export(KeyObject* self, PyObject* args) {
-       PyObject* file = NULL;
+       pakfire_key_export_mode_t mode = PAKFIRE_KEY_EXPORT_MODE_PUBLIC;
+       PyObject* object = NULL;
        int secret = 0;
 
-       if (!PyArg_ParseTuple(args, "O|p", &file, &secret))
+       if (!PyArg_ParseTuple(args, "|p", &secret))
                return NULL;
 
-       // Get a file descriptor
-       int fd = PyObject_AsFileDescriptor(file);
-       if (fd < 0)
-               return NULL;
+       char* data = NULL;
+       size_t data_length = 0;
 
-       // Convert to FILE*
-       FILE* f = fdopen(fd, "w");
+       // Create buffer to write the key to
+       FILE* f = open_memstream(&data, &data_length);
        if (!f) {
                PyErr_SetFromErrno(PyExc_OSError);
-               return NULL;
+               goto ERROR;
        }
 
-       pakfire_key_export_mode_t mode;
        if (secret)
                mode = PAKFIRE_KEY_EXPORT_MODE_PRIVATE;
-       else
-               mode = PAKFIRE_KEY_EXPORT_MODE_PUBLIC;
 
        // Export the key
        int r = pakfire_key_export(self->key, f, mode);
        if (r) {
                PyErr_SetFromErrno(PyExc_OSError);
-               return NULL;
+               goto ERROR;
        }
 
-       Py_RETURN_NONE;
+       object = PyUnicode_FromStringAndSize(data, data_length);
+
+ERROR:
+       if (f)
+               fclose(f);
+       if (data)
+               free(data);
+
+       return object;
 }
 
 static PyObject* Key_sign(KeyObject* self, PyObject* args, PyObject* kwargs) {
index 17cf72c0079a1fb45e53ad55a45cbe139a62a4ad..d40e0d5dfc79c771ae74519d3d9bbaa6dc44e1df 100644 (file)
@@ -619,15 +619,16 @@ static PyObject* Pakfire_generate_key(PakfireObject* self, PyObject* args, PyObj
 static PyObject* Pakfire_import_key(PakfireObject* self, PyObject* args) {
        struct pakfire_key* key = NULL;
        PyObject* object = NULL;
-       PyObject* file = NULL;
+       char* data = NULL;
+       Py_ssize_t data_length = 0;
        int r;
 
        // Parse arguments
-       if (!PyArg_ParseTuple(args, "O", &file))
+       if (!PyArg_ParseTuple(args, "s#", &data, &data_length))
                return NULL;
 
-       // Treat the object as a file
-       FILE* f = PyObject_AsFileHandle(file, "r");
+       // Map the object
+       FILE* f = fmemopen(data, data_length, "r");
        if (!f)
                return NULL;