diff options
| author | Justus Winter <[email protected]> | 2016-05-19 08:55:34 +0000 | 
|---|---|---|
| committer | Justus Winter <[email protected]> | 2016-05-19 09:09:45 +0000 | 
| commit | c1c893e3384a07ff864507902fbac4a7fee4d6f1 (patch) | |
| tree | 28e1965c5d81b9134188b31d2495b3d16c6cefa5 /lang/python/helpers.c | |
| parent | python: Fix import. (diff) | |
| download | gpgme-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.c | 26 | 
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);      } | 
