[SSSD] [PATCHES] Add SID related lookups to the NSS responder - part 2

Sumit Bose sbose at redhat.com
Mon May 13 09:03:31 UTC 2013


On Fri, May 10, 2013 at 05:34:27PM +0200, Jakub Hrozek wrote:
> On Fri, May 03, 2013 at 06:39:17PM +0200, Sumit Bose wrote:
> > I added a 5th patch which adds support for tuples and Unicode to the
> > python API as inquired by Alexander. I didn't squeezed them because I'm
> > not sure if Alexander was already able to test them. This way they can
> > easily be dropped from this release and can be added to the next.
> > 
> > bye,
> > Sumit
> 
> The first four patches were pushed upstream already. See below for some
> comments about the last patch.
> 
> Sorry at first I thought this patch only handled the list input, so I
> split Alexander's comments into a separate ticket. I will also mark the
> second one (#1914) as assigned to you and set the patch boolean.

Thank you for the review, I've included all your comments, new version
attached.

bye,
Sumit
-------------- next part --------------
From dd847024cc56d655a42165a2be1dab4aada0eb5f Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose at redhat.com>
Date: Fri, 3 May 2013 14:05:23 +0200
Subject: [PATCH] Add support for tuples and unicode pysss_nss_idmap.so

This patch allows tuples as well as lists as input and adds support for
Unicode objects as input and always returns the results as Unicode
objects.
---
 src/python/pysss_nss_idmap.c |   59 +++++++++++++++++++++++++++--------------
 1 files changed, 39 insertions(+), 20 deletions(-)

diff --git a/src/python/pysss_nss_idmap.c b/src/python/pysss_nss_idmap.c
index c98054e..0d59639 100644
--- a/src/python/pysss_nss_idmap.c
+++ b/src/python/pysss_nss_idmap.c
@@ -64,6 +64,22 @@ static int add_dict(PyObject *py_result, PyObject *key, PyObject *res_type,
     return ret;
 }
 
+static char *py_string_or_unicode_as_string(PyObject *inp)
+{
+    PyObject *py_str = NULL;
+
+    if (PyUnicode_Check(inp)) {
+        py_str = PyUnicode_AsUTF8String(inp);
+    } else if (PyString_Check(inp)) {
+        py_str = inp;
+    } else {
+        PyErr_Format(PyExc_TypeError, "input must be unicode or a string");
+        return NULL;
+    }
+
+    return PyString_AS_STRING(py_str);
+}
+
 static int do_getsidbyname(PyObject *py_result, PyObject *py_name)
 {
     int ret;
@@ -71,7 +87,7 @@ static int do_getsidbyname(PyObject *py_result, PyObject *py_name)
     char *sid = NULL;
     enum sss_id_type id_type;
 
-    name = PyString_AS_STRING(py_name);
+    name = py_string_or_unicode_as_string(py_name);
     if (name == NULL) {
         return EINVAL;
     }
@@ -79,7 +95,7 @@ static int do_getsidbyname(PyObject *py_result, PyObject *py_name)
     ret = sss_nss_getsidbyname(name, &sid, &id_type);
     if (ret == 0) {
         ret = add_dict(py_result, py_name, PyString_FromString(SSS_SID_KEY),
-                       PyString_FromString(sid), PyInt_FromLong(id_type));
+                       PyUnicode_FromString(sid), PyInt_FromLong(id_type));
     }
     free(sid);
 
@@ -93,7 +109,7 @@ static int do_getnamebysid(PyObject *py_result, PyObject *py_sid)
     char *name = NULL;
     enum sss_id_type id_type;
 
-    sid = PyString_AS_STRING(py_sid);
+    sid = py_string_or_unicode_as_string(py_sid);
     if (sid == NULL) {
         return EINVAL;
     }
@@ -101,7 +117,7 @@ static int do_getnamebysid(PyObject *py_result, PyObject *py_sid)
     ret = sss_nss_getnamebysid(sid, &name, &id_type);
     if (ret == 0) {
         ret = add_dict(py_result, py_sid, PyString_FromString(SSS_NAME_KEY),
-                       PyString_FromString(name), PyInt_FromLong(id_type));
+                       PyUnicode_FromString(name), PyInt_FromLong(id_type));
     }
     free(name);
 
@@ -121,15 +137,16 @@ static int do_getsidbyid(PyObject *py_result, PyObject *py_id)
         id = PyInt_AS_LONG(py_id);
     } else if (PyLong_Check(py_id)) {
         id = PyLong_AsLong(py_id);
-    } else if (PyString_Check(py_id)) {
-        id_str = PyString_AS_STRING(py_id);
+    } else {
+        id_str = py_string_or_unicode_as_string(py_id);
+        if (id_str == NULL) {
+            return EINVAL;
+        }
         errno = 0;
         id = strtol(id_str, &endptr, 10);
         if (errno != 0 || *endptr != '\0') {
             return EINVAL;
         }
-    } else {
-        return EINVAL;
     }
 
     if (id < 0 || id > UINT32_MAX) {
@@ -139,7 +156,7 @@ static int do_getsidbyid(PyObject *py_result, PyObject *py_id)
     ret = sss_nss_getsidbyid((uint32_t) id, &sid, &id_type);
     if (ret == 0) {
         ret = add_dict(py_result, py_id, PyString_FromString(SSS_SID_KEY),
-                       PyString_FromString(sid), PyInt_FromLong(id_type));
+                       PyUnicode_FromString(sid), PyInt_FromLong(id_type));
     }
     free(sid);
 
@@ -153,7 +170,7 @@ static int do_getidbysid(PyObject *py_result, PyObject *py_sid)
     enum sss_id_type id_type;
     int ret;
 
-    sid = PyString_AS_STRING(py_sid);
+    sid = py_string_or_unicode_as_string(py_sid);
     if (sid == NULL) {
         return EINVAL;
     }
@@ -202,10 +219,12 @@ static PyObject *check_args(enum lookup_type type, PyObject *args)
         return NULL;
     }
 
-    if (!(PyList_Check(obj) || PyString_Check(obj) ||
+    if (!(PyList_Check(obj) || PyTuple_Check(obj) ||
+          PyString_Check(obj) || PyUnicode_Check(obj) ||
           (type == SIDBYID && (PyInt_Check(obj) || PyLong_Check(obj))))) {
         PyErr_Format(PyExc_ValueError,
-                     "Only string, long or list of them are accepted\n");
+                     "Only string, long or list or tuples of them " \
+                     "are accepted\n");
         return NULL;
     }
 
@@ -217,12 +236,12 @@ static PyObject *check_args(enum lookup_type type, PyObject *args)
         return NULL;
     }
 
-    if (PyList_Check(obj)) {
-        len = PyList_Size(obj);
+    if (PySequence_Check(obj)) {
+        len = PySequence_Size(obj);
         for(i=0; i < len; i++) {
-            py_value = PyList_GetItem(obj, i);
+            py_value = PySequence_GetItem(obj, i);
             if ((py_value != NULL) &&
-                (PyString_Check(py_value) ||
+                (PyString_Check(py_value) || PyUnicode_Check(py_value) ||
                  (type == SIDBYID &&
                   (PyInt_Check(py_value) || PyLong_Check(py_value))))) {
                 ret = do_lookup(type, py_result, py_value);
@@ -256,7 +275,7 @@ static PyObject *check_args(enum lookup_type type, PyObject *args)
 }
 
 PyDoc_STRVAR(getsidbyname_doc,
-"getsidbyname(name or list of names) -> dict(name => dict(results))\n\
+"getsidbyname(name or list/tuple of names) -> dict(name => dict(results))\n\
 \n\
 Returns a dictionary with a dictonary of results for each given name.\n\
 The result dictonary contain the SID and the type of the object which can be\n\
@@ -275,7 +294,7 @@ static PyObject * py_getsidbyname(PyObject *module, PyObject *args)
 }
 
 PyDoc_STRVAR(getsidbyid_doc,
-"getsidbyid(id or list of id) -> dict(id => dict(results))\n\
+"getsidbyid(id or list/tuple of id) -> dict(id => dict(results))\n\
 \n\
 Returns a dictionary with a dictonary of results for each given POSIX ID.\n\
 The result dictonary contain the SID and the type of the object which can be\n\
@@ -288,7 +307,7 @@ static PyObject * py_getsidbyid(PyObject *module, PyObject *args)
 }
 
 PyDoc_STRVAR(getnamebysid_doc,
-"getnamebysid(sid or list of sid) -> dict(sid => dict(results))\n\
+"getnamebysid(sid or list/tuple of sid) -> dict(sid => dict(results))\n\
 \n\
 Returns a dictionary with a dictonary of results for each given SID.\n\
 The result dictonary contain the name and the type of the object which can be\n\
@@ -304,7 +323,7 @@ PyDoc_STRVAR(getidbysid_doc,
 "getidbysid(sid) -> POSIX ID\n\
 \n\
 Returns the POSIX ID of the object with the given SID."
-"getidbysid(sid or list of sid) -> dict(sid => dict(results))\n\
+"getidbysid(sid or list/tuple of sid) -> dict(sid => dict(results))\n\
 \n\
 Returns a dictionary with a dictonary of results for each given SID.\n\
 The result dictonary contain the POSIX ID and the type of the object which\n\
-- 
1.7.7.6



More information about the sssd-devel mailing list