aboutsummaryrefslogtreecommitdiffstats
path: root/lang/python/helpers.c
diff options
context:
space:
mode:
authorJustus Winter <[email protected]>2016-05-19 08:55:34 +0000
committerJustus Winter <[email protected]>2016-05-19 09:09:45 +0000
commitc1c893e3384a07ff864507902fbac4a7fee4d6f1 (patch)
tree28e1965c5d81b9134188b31d2495b3d16c6cefa5 /lang/python/helpers.c
parentpython: Fix import. (diff)
downloadgpgme-c1c893e3384a07ff864507902fbac4a7fee4d6f1.tar.gz
gpgme-c1c893e3384a07ff864507902fbac4a7fee4d6f1.zip
python: More type conversion fixes.
* lang/python/helpers.c (pyPassphraseCb): Cope with 'uid_hint' being NULL, convert it to an Unicode object, and cope with the callback returning both Unicode and bytes objects. Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'lang/python/helpers.c')
-rw-r--r--lang/python/helpers.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/lang/python/helpers.c b/lang/python/helpers.c
index 285b1da4..447a29fb 100644
--- a/lang/python/helpers.c
+++ b/lang/python/helpers.c
@@ -82,7 +82,15 @@ static gpgme_error_t pyPassphraseCb(void *hook,
args = PyTuple_New(3);
}
- PyTuple_SetItem(args, 0, PyBytes_FromString(uid_hint));
+ if (uid_hint == NULL)
+ {
+ Py_INCREF(Py_None);
+ PyTuple_SetItem(args, 0, Py_None);
+ }
+ else
+ PyTuple_SetItem(args, 0, PyUnicode_DecodeUTF8(uid_hint, strlen (uid_hint),
+ "strict"));
+
PyTuple_SetItem(args, 1, PyBytes_FromString(passphrase_info));
PyTuple_SetItem(args, 2, PyBool_FromLong((long)prev_was_bad));
if (dataarg) {
@@ -98,7 +106,21 @@ static gpgme_error_t pyPassphraseCb(void *hook,
if (!retval) {
write(fd, "\n", 1);
} else {
- write(fd, PyBytes_AsString(retval), PyBytes_Size(retval));
+ char *buf;
+ size_t len;
+ if (PyBytes_Check(retval))
+ buf = PyBytes_AsString(retval), len = PyBytes_Size(retval);
+ else if (PyUnicode_Check(retval))
+ buf = PyUnicode_AsUTF8AndSize(retval, &len);
+ else
+ {
+ PyErr_Format(PyExc_TypeError,
+ "expected str or bytes from passphrase callback, got %s",
+ retval->ob_type->tp_name);
+ return gpg_error(GPG_ERR_GENERAL);
+ }
+
+ write(fd, buf, len);
write(fd, "\n", 1);
Py_DECREF(retval);
}