}
static PyObject* Key_export(KeyObject* self, PyObject* args) {
+ PyObject* file = NULL;
int secret = 0;
- if (!PyArg_ParseTuple(args, "|p", &secret))
+ if (!PyArg_ParseTuple(args, "O|p", &file, &secret))
return NULL;
+ // Get a file descriptor
+ int fd = PyObject_AsFileDescriptor(file);
+ if (fd < 0)
+ return NULL;
+
+ // Convert to FILE*
+ FILE* f = fdopen(fd, "w");
+ if (!f) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
pakfire_key_export_mode_t mode;
if (secret)
mode = PAKFIRE_KEY_EXPORT_MODE_SECRET;
mode = PAKFIRE_KEY_EXPORT_MODE_PUBLIC;
// Export the key
- char* export = pakfire_key_export(self->key, mode);
-
- PyObject* object = PyUnicode_FromFormat("%s", export);
- free(export);
+ int r = pakfire_key_export(self->key, f, mode);
+ if (r) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
- return object;
+ Py_RETURN_NONE;
}
static PyObject* Key_delete(KeyObject* self) {
int pakfire_key_generate(struct pakfire_key** key, Pakfire pakfire,
const char* algo, const char* userid);
-char* pakfire_key_export(struct pakfire_key* key, pakfire_key_export_mode_t mode);
+int pakfire_key_export(struct pakfire_key* key, FILE* f, pakfire_key_export_mode_t mode);
int pakfire_key_import(Pakfire pakfire, FILE* f, struct pakfire_key*** keys);
char* pakfire_key_dump(struct pakfire_key* key);
return pakfire_find_key(key, pakfire, result->fpr);
}
-PAKFIRE_EXPORT char* pakfire_key_export(struct pakfire_key* key, pakfire_key_export_mode_t mode) {
+PAKFIRE_EXPORT int pakfire_key_export(struct pakfire_key* key, FILE* f,
+ pakfire_key_export_mode_t mode) {
+ if (!f) {
+ errno = EINVAL;
+ return 1;
+ }
+
gpgme_ctx_t gpgctx = pakfire_get_gpgctx(key->pakfire);
+ if (!gpgctx)
+ return 1;
gpgme_export_mode_t gpgmode = 0;
switch (mode) {
const char* fingerprint = pakfire_key_get_fingerprint(key);
+ gpgme_data_t data = NULL;
+ char* buffer = NULL;
+ int r = 1;
+
// Initialize the buffer
- gpgme_data_t keydata;
- gpgme_error_t error = gpgme_data_new(&keydata);
- if (gpg_err_code(error) != GPG_ERR_NO_ERROR)
- goto FAIL;
+ gpgme_error_t e = gpgme_data_new(&data);
+ if (gpg_err_code(e) != GPG_ERR_NO_ERROR)
+ goto ERROR;
// Encode output as ASCII
- error = gpgme_data_set_encoding(keydata, GPGME_DATA_ENCODING_ARMOR);
- if (gpg_err_code(error) != GPG_ERR_NO_ERROR)
- goto FAIL;
+ e = gpgme_data_set_encoding(data, GPGME_DATA_ENCODING_ARMOR);
+ if (gpg_err_code(e) != GPG_ERR_NO_ERROR)
+ goto ERROR;
// Copy the key to the buffer
- error = gpgme_op_export(gpgctx, fingerprint, gpgmode, keydata);
- if (gpg_err_code(error) != GPG_ERR_NO_ERROR)
- goto FAIL;
+ e = gpgme_op_export(gpgctx, fingerprint, gpgmode, data);
+ if (gpg_err_code(e) != GPG_ERR_NO_ERROR)
+ goto ERROR;
+
+ size_t size;
- // Export key in ASCII format
- size_t length;
- char* mem = gpgme_data_release_and_get_mem(keydata, &length);
+ // Fetch data from buffer
+ buffer = gpgme_data_release_and_get_mem(data, &size);
- // Terminate the string
- mem[length] = '\0';
+ // Reset data
+ data = NULL;
- // Copy to our own string buffer
- char* buffer = strdup(mem);
+ // Write key to file
+ size_t bytes_written = fwrite(buffer, 1, size, f);
+ if (bytes_written < size)
+ goto ERROR;
- // Release the exported key
- gpgme_free(mem);
+ // Flush f
+ r = fflush(f);
+ if (r)
+ goto ERROR;
- return buffer;
+ // Success
+ r = 0;
-FAIL:
- gpgme_data_release(keydata);
+ERROR:
+ if (buffer)
+ gpgme_free(buffer);
+ if (data)
+ gpgme_data_release(data);
- return NULL;
+ return r;
}
PAKFIRE_EXPORT int pakfire_key_import(Pakfire pakfire, FILE* f,
help=_("Export a key to a file"))
key_export.add_argument("fingerprint",
help=_("The fingerprint of the key to export"))
- key_export.add_argument("--filename", nargs="?",
- help=_("Write the key to this file"))
+ key_export.add_argument("--file", nargs="?", type=argparse.FileType("w"),
+ help=_("Write the key to this file"), default=sys.stdout)
key_export.add_argument("--secret", action="store_true",
help=_("Include the secret key"))
key_export.set_defaults(func=self._key_export)
print(_("Could not find key with fingerprint %s") % fingerprint)
return
- # Convert key to text
- data = key.export(args.secret)
-
- # Write out the key
- if args.filename:
- with open(args.filename, "w") as f:
- f.write(data)
- else:
- print(data)
+ # Export the key
+ key.export(args.file, args.secret)
def _key_fetch(self, p, args):
key = p.fetch_key(userid=args.userid, fingerprint=args.fingerprint)