On Thu, Jun 09, 2016 at 12:09:49PM +0200, Lukas Slebodnik wrote:
> On (09/06/16 11:41), Sumit Bose wrote:
> >On Thu, Jun 09, 2016 at 11:20:14AM +0200, Lukas Slebodnik wrote:
> >> On (08/06/16 15:39), Sumit Bose wrote:
> >> >On Tue, Jun 07, 2016 at 04:40:42PM +0200, Jakub Hrozek wrote:
> >> >> On Tue, Jun 07, 2016 at 02:55:40PM +0200, Sumit Bose wrote:
> >> >> > On Tue, Jun 07, 2016 at 01:56:10PM +0200, Jakub Hrozek wrote:
> >> >> > > On Tue, Jun 07, 2016 at 12:28:22PM +0200, Sumit Bose wrote:
> >> >> > > > sure, here you are.
> >> >> > > > 
> >> >> > > > bye,
> >> >> > > > Sumit
> >> >> > > 
> >> >> > > Hmm, are these the correct patches?
> >> >> > > 
> >> >> > > /home/remote/jhrozek/devel/sssd/src/db/sysdb_views.c: In function 
> >> >> > > 'sysdb_search_override_by_cert':
> >> >> > > /home/remote/jhrozek/devel/sssd/src/db/sysdb_views.c:880:11: error: 
> >> >> > > too many arguments to function 'sss_cert_derb64_to_ldap_filter'
> >> >> > >      ret = sss_cert_derb64_to_ldap_filter(tmp_ctx, cert, 
> >> >> > > SYSDB_USER_CERT, NULL,
> >> >> > >            ^
> >> >> > > In file included from 
> >> >> > > /home/remote/jhrozek/devel/sssd/src/db/sysdb_views.c:23:0:
> >> >> > > /home/remote/jhrozek/devel/sssd/src/util/cert.h:40:9: note: 
> >> >> > > declared here
> >> >> > >  errno_t sss_cert_derb64_to_ldap_filter(TALLOC_CTX *mem_ctx, const 
> >> >> > > char *derb64,
> >> >> > >          ^
> >> >> > 
> >> >> > ah, sorry, I picked the patches from a wrong branch.
> >> >> > 
> >> >> > Please try the new version.
> >> >> 
> >> >> OK, this looks better, but there CI still complains on Debian:
> >> >> /bin/bash ./libtool  --tag=CC   --mode=link gcc  -Wall -Wshadow
> >> >> -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Wcast-align
> >> >> -Wwrite-strings -Wundef -Werror-implicit-function-declaration
> >> >> -Winit-self -Wmissing-include-dirs -fno-strict-aliasing -std=gnu99  -g3
> >> >> -O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
> >> >> -o proxy_child src/providers/proxy/proxy_child-proxy_child.o
> >> >> src/providers/proxy_child-data_provider_iface_generated.o -lpam -ltalloc
> >> >> -ltevent -ltalloc -lpopt -lldb -ldbus-1 -lpcre -lini_config
> >> >> -lbasicobjects -lref_array -lcollection -lcollection -ldhash -llber
> >> >> -lldap -lselinux -ltdb libsss_util.la libsss_crypt.la libsss_debug.la
> >> >> libsss_child.la  
> >> >> /usr/bin/ld: src/responder/nss/nsssrv_cmd.o: undefined reference to
> >> >> symbol 'sss_cert_derb64_to_pem'
> >> >> //var/lib/jenkins/workspace/ci/label/debian_testing/ci-build-debug/.libs/libsss_cert.so:
> >> >> //error adding symbols: DSO missing from command line
> >> >> collect2: error: ld returned 1 exit status
> >> >> Makefile:10585: recipe for target 'sssd_nss' failed
> >> >> make[2]: *** [sssd_nss] Error 1
> >> >> make[2]: *** Waiting for unfinished jobs...
> >> >> 
> >> >> CI link:
> >> >> http://sssd-ci.duckdns.org/logs/job/44/61/debian_testing/ci-build-debug/ci-make-tests.log
> >> >
> >> >ok, I added libsss_cert.la to the nss responder binary and the test.
> >> >
> >> >New version attached.
> >> >
> >> >bye,
> >> >Sumit
> >> >
> >> 
> >> >From cb3f7bc55b22140b997d6b94f76893798731d79f Mon Sep 17 00:00:00 2001
> >> >From: Sumit Bose <sb...@redhat.com>
> >> >Date: Tue, 26 Apr 2016 13:13:43 +0200
> >> >Subject: [PATCH 12/12] nss-idmap: add sss_nss_getnamebycert()
> >> >
> >> >---
> >> > Makefile.am                                |  2 +-
> >> > src/python/pysss_nss_idmap.c               | 47 
> >> > ++++++++++++++++++++++++++++--
> >> > src/responder/nss/nsssrv_cmd.c             |  1 +
> >> > src/sss_client/idmap/sss_nss_idmap.c       | 26 ++++++++++++++++-
> >> > src/sss_client/idmap/sss_nss_idmap.exports |  6 ++++
> >> > src/sss_client/idmap/sss_nss_idmap.h       | 15 ++++++++++
> >> > 6 files changed, 93 insertions(+), 4 deletions(-)
> >> >
> >> >diff --git a/Makefile.am b/Makefile.am
> >> >index 
> >> >fdd129d326d092989a92506cc86694dded58ff72..a504a4f613b881afcbc096a03de0f284ebf34896
> >> > 100644
> >> >--- a/Makefile.am
> >> >+++ b/Makefile.am
> >> >@@ -989,7 +989,7 @@ libsss_nss_idmap_la_LIBADD = \
> >> >     $(CLIENT_LIBS)
> >> > libsss_nss_idmap_la_LDFLAGS = \
> >> >     
> >> > -Wl,--version-script,$(srcdir)/src/sss_client/idmap/sss_nss_idmap.exports
> >> >  \
> >> >-    -version-info 1:0:1
> >> >+    -version-info 2:0:2
> >> > 
> >> > dist_noinst_DATA += src/sss_client/idmap/sss_nss_idmap.exports
> >> > 
> >> >diff --git a/src/python/pysss_nss_idmap.c b/src/python/pysss_nss_idmap.c
> >> >index 
> >> >36d66f405442d63e430f92862990f1656486112d..a88ef77a3c8056e4962c35811de3dbbb18f4c9a4
> >> > 100644
> >> >--- a/src/python/pysss_nss_idmap.c
> >> >+++ b/src/python/pysss_nss_idmap.c
> >> >@@ -33,7 +33,8 @@ enum lookup_type {
> >> >     SIDBYNAME,
> >> >     SIDBYID,
> >> >     NAMEBYSID,
> >> >-    IDBYSID
> >> >+    IDBYSID,
> >> >+    NAMEBYCERT
> >> > };
> >> > 
> >> > static int add_dict(PyObject *py_result, PyObject *key, PyObject 
> >> > *res_type,
> >> >@@ -166,6 +167,28 @@ static int do_getsidbyid(PyObject *py_result, 
> >> >PyObject *py_id)
> >> >     return ret;
> >> > }
> >> > 
> >> >+static int do_getnamebycert(PyObject *py_result, PyObject *py_cert)
> >> >+{
> >> >+    int ret;
> >> >+    const char *cert;
> >> >+    char *name = NULL;
> >> >+    enum sss_id_type id_type;
> >> >+
> >> >+    cert = py_string_or_unicode_as_string(py_cert);
> >> >+    if (cert == NULL) {
> >> >+        return EINVAL;
> >> >+    }
> >> >+
> >> >+    ret = sss_nss_getnamebycert(cert, &name, &id_type);
> >> >+    if (ret == 0) {
> >> >+        ret = add_dict(py_result, py_cert, 
> >> >PyBytes_FromString(SSS_NAME_KEY),
> >> >+                       PyUnicode_FromString(name), 
> >> >PYNUMBER_FROMLONG(id_type));
> >> >+    }
> >> >+    free(name);
> >> >+
> >> >+    return ret;
> >> >+}
> >> >+
> >> > static int do_getidbysid(PyObject *py_result, PyObject *py_sid)
> >> > {
> >> >     const char *sid;
> >> >@@ -203,6 +226,9 @@ static int do_lookup(enum lookup_type type, PyObject 
> >> >*py_result,
> >> >     case IDBYSID:
> >> >         return do_getidbysid(py_result, py_inp);
> >> >         break;
> >> >+    case NAMEBYCERT:
> >> >+        return do_getnamebycert(py_result, py_inp);
> >> >+        break;
> >> >     default:
> >> >         return ENOSYS;
> >> >     }
> >> >@@ -260,7 +286,7 @@ static PyObject *check_args(enum lookup_type type, 
> >> >PyObject *args)
> >> >         case ENOENT: /* nothing found, return empty dict */
> >> >             break;
> >> >         case EINVAL:
> >> >-            PyErr_Format(PyExc_ValueError, "Unable to retrieve 
> >> >argument\n");
> >> >+            PyErr_Format(PyExc_ValueError, "Unable to retrieve 
> >> >result\n");
> >> >             Py_XDECREF(py_result);
> >> >             return NULL;
> >> >             break;
> >> >@@ -339,6 +365,21 @@ static PyObject * py_getidbysid(PyObject *module, 
> >> >PyObject *args)
> >> >     return check_args(IDBYSID, args);
> >> > }
> >> > 
> >> >+PyDoc_STRVAR(getnamebycert_doc,
> >> >+"getnamebycert(sid or list/tuple of certificates) -> dict(sid => 
> >> >dict(results))\n\
> >> >+\n\
> >> >+Returns a dictionary with a dictonary of results for each given 
> >> >certificates.\n\
> >> >+The result dictonary contain the name and the type of the object which 
> >> >can be\n\
> >> >+accessed with the key constants NAME_KEY and TYPE_KEY, respectively.\n\
> >> >+\n\
> >> >+NOTE: getnamebycert currently works only with id_provider set as \"ad\" 
> >> >or \"ipa\""
> >> >+);
> >> >+
> >> >+static PyObject * py_getnamebycert(PyObject *module, PyObject *args)
> >> >+{
> >> >+    return check_args(NAMEBYCERT, args);
> >> >+}
> >> >+
> >> > static PyMethodDef methods[] = {
> >> >     { sss_py_const_p(char, "getsidbyname"), (PyCFunction) 
> >> > py_getsidbyname,
> >> >       METH_VARARGS, getsidbyname_doc },
> >> >@@ -348,6 +389,8 @@ static PyMethodDef methods[] = {
> >> >       METH_VARARGS, getnamebysid_doc },
> >> >     { sss_py_const_p(char, "getidbysid"), (PyCFunction) py_getidbysid,
> >> >       METH_VARARGS, getidbysid_doc },
> >> >+    { sss_py_const_p(char, "getnamebycert"), (PyCFunction) 
> >> >py_getnamebycert,
> >> >+      METH_VARARGS, getnamebycert_doc },
> >> >     { NULL,NULL, 0, NULL }
> >> > };
> >> > 
> >> >diff --git a/src/responder/nss/nsssrv_cmd.c 
> >> >b/src/responder/nss/nsssrv_cmd.c
> >> >index 
> >> >762c26b74581acb5568b602caaef2586521f6903..64e2945a99a6f3262517aa7c817475904418a1ed
> >> > 100644
> >> >--- a/src/responder/nss/nsssrv_cmd.c
> >> >+++ b/src/responder/nss/nsssrv_cmd.c
> >> >@@ -5525,6 +5525,7 @@ static int nss_cmd_getbycert(enum sss_cli_command 
> >> >cmd, struct cli_ctx *cctx)
> >> >     }
> >> > 
> >> >     derb64 = (const char *) body;
> >> >+    DEBUG(SSSDBG_TRACE_ALL, "cert [%s]\n", derb64);
> >> > 
> >> >     /* check input */
> >> >     ret = sss_cert_derb64_to_pem(cctx, derb64, &pem_cert, &pem_size);
> >> >diff --git a/src/sss_client/idmap/sss_nss_idmap.c 
> >> >b/src/sss_client/idmap/sss_nss_idmap.c
> >> >index 
> >> >55d8043bd992bebf82a46206a9f3aecbe1e88238..fa5a499e3606f7e45a406de4d63002ba35365cb1
> >> > 100644
> >> >--- a/src/sss_client/idmap/sss_nss_idmap.c
> >> >+++ b/src/sss_client/idmap/sss_nss_idmap.c
> >> >@@ -159,7 +159,8 @@ static int sss_nss_getyyybyxxx(union input inp, enum 
> >> >sss_cli_command cmd ,
> >> >     case SSS_NSS_GETNAMEBYSID:
> >> >     case SSS_NSS_GETIDBYSID:
> >> >     case SSS_NSS_GETORIGBYNAME:
> >> >-        ret = sss_strnlen(inp.str, SSS_NAME_MAX, &inp_len);
> >> >+    case SSS_NSS_GETNAMEBYCERT:
> >> >+        ret = sss_strnlen(inp.str, 2048, &inp_len);
> >> >         if (ret != EOK) {
> >> >             return EINVAL;
> >> >         }
> >> >@@ -209,6 +210,7 @@ static int sss_nss_getyyybyxxx(union input inp, enum 
> >> >sss_cli_command cmd ,
> >> >     case SSS_NSS_GETSIDBYID:
> >> >     case SSS_NSS_GETSIDBYNAME:
> >> >     case SSS_NSS_GETNAMEBYSID:
> >> >+    case SSS_NSS_GETNAMEBYCERT:
> >> >         if (data_len <= 1 || repbuf[replen - 1] != '\0') {
> >> >             ret = EBADMSG;
> >> >             goto done;
> >> >@@ -368,3 +370,25 @@ int sss_nss_getorigbyname(const char *fq_name, 
> >> >struct sss_nss_kv **kv_list,
> >> > 
> >> >     return ret;
> >> > }
> >> >+
> >> >+int sss_nss_getnamebycert(const char *cert, char **fq_name,
> >> >+                          enum sss_id_type *type)
> >> >+{
> >> >+    int ret;
> >> >+    union input inp;
> >> >+    struct output out;
> >> >+
> >> >+    if (fq_name == NULL || cert == NULL || *cert == '\0') {
> >> >+        return EINVAL;
> >> >+    }
> >> >+
> >> >+    inp.str = cert;
> >> >+
> >> >+    ret = sss_nss_getyyybyxxx(inp, SSS_NSS_GETNAMEBYCERT, &out);
> >> >+    if (ret == EOK) {
> >> >+        *fq_name = out.d.str;
> >> >+        *type = out.type;
> >> >+    }
> >> >+
> >> >+    return ret;
> >> >+}
> >> >diff --git a/src/sss_client/idmap/sss_nss_idmap.exports 
> >> >b/src/sss_client/idmap/sss_nss_idmap.exports
> >> >index 
> >> >8aa4702416534c49176d29cee381e1c9292c4847..bd5d80212017d38334c3cdeefa47d6029f42aebb
> >> > 100644
> >> >--- a/src/sss_client/idmap/sss_nss_idmap.exports
> >> >+++ b/src/sss_client/idmap/sss_nss_idmap.exports
> >> >@@ -19,3 +19,9 @@ SSS_NSS_IDMAP_0.1.0 {
> >> >         sss_nss_getorigbyname;
> >> >         sss_nss_free_kv;
> >> > } SSS_NSS_IDMAP_0.0.1;
> >> >+
> >> >+SSS_NSS_IDMAP_0.2.0 {
> >> >+    # public functions
> >> >+    global:
> >> >+        sss_nss_getnamebycert;
> >> >+} SSS_NSS_IDMAP_0.1.0;
> >> I wanted to push these patches.
> >> But I noticed that this function does not suit to this library.
> >> 
> >> Summary and description says something else.
> >> 
> >> sh$ rpm -q --info libsss_nss_idmap | tail -n4
> >> URL         : http://fedorahosted.org/sssd/
> >> Summary     : Library for SID based lookups
> >> Description :
> >> Utility library for SID based lookups
> >
> >Would you agree if I change summary and description to '... for SID and
> >certificate based ...'
> >
> 
> that would be the easiest solution and I am not against :-)
> 
> I just wanted to hear other optinions.
> 
> 
> BTW feel free to send just diff for spec file.
> I can squash it before pushing to master.
> 

Please find attached an updated version of the 12th patch.

bye,
Sumit

From 1decd1940a4278cb6c2b19c3f995e8e601c15d75 Mon Sep 17 00:00:00 2001
From: Sumit Bose <sb...@redhat.com>
Date: Tue, 26 Apr 2016 13:13:43 +0200
Subject: [PATCH 12/12] nss-idmap: add sss_nss_getnamebycert()

---
 Makefile.am                                |  2 +-
 contrib/sssd.spec.in                       |  8 ++---
 src/python/pysss_nss_idmap.c               | 47 ++++++++++++++++++++++++++++--
 src/responder/nss/nsssrv_cmd.c             |  1 +
 src/sss_client/idmap/sss_nss_idmap.c       | 26 ++++++++++++++++-
 src/sss_client/idmap/sss_nss_idmap.exports |  6 ++++
 src/sss_client/idmap/sss_nss_idmap.h       | 15 ++++++++++
 7 files changed, 97 insertions(+), 8 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 
fdd129d326d092989a92506cc86694dded58ff72..a504a4f613b881afcbc096a03de0f284ebf34896
 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -989,7 +989,7 @@ libsss_nss_idmap_la_LIBADD = \
     $(CLIENT_LIBS)
 libsss_nss_idmap_la_LDFLAGS = \
     -Wl,--version-script,$(srcdir)/src/sss_client/idmap/sss_nss_idmap.exports \
-    -version-info 1:0:1
+    -version-info 2:0:2
 
 dist_noinst_DATA += src/sss_client/idmap/sss_nss_idmap.exports
 
diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
index 
355b9510994b2f5ea470febca670d8982ad4bfce..ad072204cec41e764c6f46263fb5af8f2a37913e
 100644
--- a/contrib/sssd.spec.in
+++ b/contrib/sssd.spec.in
@@ -467,23 +467,23 @@ used by Python applications.
 %endif
 
 %package -n libsss_nss_idmap
-Summary: Library for SID based lookups
+Summary: Library for SID and certificate based lookups
 Group: Development/Libraries
 License: LGPLv3+
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 
 %description -n libsss_nss_idmap
-Utility library for SID based lookups
+Utility library for SID and certificate based lookups
 
 %package -n libsss_nss_idmap-devel
-Summary: Library for SID based lookups
+Summary: Library for SID and certificate based lookups
 Group: Development/Libraries
 License: LGPLv3+
 Requires: libsss_nss_idmap = %{version}-%{release}
 
 %description -n libsss_nss_idmap-devel
-Utility library for SID based lookups
+Utility library for SID and certificate based lookups
 
 %package -n python-libsss_nss_idmap
 Summary: Python2 bindings for libsss_nss_idmap
diff --git a/src/python/pysss_nss_idmap.c b/src/python/pysss_nss_idmap.c
index 
36d66f405442d63e430f92862990f1656486112d..a88ef77a3c8056e4962c35811de3dbbb18f4c9a4
 100644
--- a/src/python/pysss_nss_idmap.c
+++ b/src/python/pysss_nss_idmap.c
@@ -33,7 +33,8 @@ enum lookup_type {
     SIDBYNAME,
     SIDBYID,
     NAMEBYSID,
-    IDBYSID
+    IDBYSID,
+    NAMEBYCERT
 };
 
 static int add_dict(PyObject *py_result, PyObject *key, PyObject *res_type,
@@ -166,6 +167,28 @@ static int do_getsidbyid(PyObject *py_result, PyObject 
*py_id)
     return ret;
 }
 
+static int do_getnamebycert(PyObject *py_result, PyObject *py_cert)
+{
+    int ret;
+    const char *cert;
+    char *name = NULL;
+    enum sss_id_type id_type;
+
+    cert = py_string_or_unicode_as_string(py_cert);
+    if (cert == NULL) {
+        return EINVAL;
+    }
+
+    ret = sss_nss_getnamebycert(cert, &name, &id_type);
+    if (ret == 0) {
+        ret = add_dict(py_result, py_cert, PyBytes_FromString(SSS_NAME_KEY),
+                       PyUnicode_FromString(name), PYNUMBER_FROMLONG(id_type));
+    }
+    free(name);
+
+    return ret;
+}
+
 static int do_getidbysid(PyObject *py_result, PyObject *py_sid)
 {
     const char *sid;
@@ -203,6 +226,9 @@ static int do_lookup(enum lookup_type type, PyObject 
*py_result,
     case IDBYSID:
         return do_getidbysid(py_result, py_inp);
         break;
+    case NAMEBYCERT:
+        return do_getnamebycert(py_result, py_inp);
+        break;
     default:
         return ENOSYS;
     }
@@ -260,7 +286,7 @@ static PyObject *check_args(enum lookup_type type, PyObject 
*args)
         case ENOENT: /* nothing found, return empty dict */
             break;
         case EINVAL:
-            PyErr_Format(PyExc_ValueError, "Unable to retrieve argument\n");
+            PyErr_Format(PyExc_ValueError, "Unable to retrieve result\n");
             Py_XDECREF(py_result);
             return NULL;
             break;
@@ -339,6 +365,21 @@ static PyObject * py_getidbysid(PyObject *module, PyObject 
*args)
     return check_args(IDBYSID, args);
 }
 
+PyDoc_STRVAR(getnamebycert_doc,
+"getnamebycert(sid or list/tuple of certificates) -> dict(sid => 
dict(results))\n\
+\n\
+Returns a dictionary with a dictonary of results for each given 
certificates.\n\
+The result dictonary contain the name and the type of the object which can 
be\n\
+accessed with the key constants NAME_KEY and TYPE_KEY, respectively.\n\
+\n\
+NOTE: getnamebycert currently works only with id_provider set as \"ad\" or 
\"ipa\""
+);
+
+static PyObject * py_getnamebycert(PyObject *module, PyObject *args)
+{
+    return check_args(NAMEBYCERT, args);
+}
+
 static PyMethodDef methods[] = {
     { sss_py_const_p(char, "getsidbyname"), (PyCFunction) py_getsidbyname,
       METH_VARARGS, getsidbyname_doc },
@@ -348,6 +389,8 @@ static PyMethodDef methods[] = {
       METH_VARARGS, getnamebysid_doc },
     { sss_py_const_p(char, "getidbysid"), (PyCFunction) py_getidbysid,
       METH_VARARGS, getidbysid_doc },
+    { sss_py_const_p(char, "getnamebycert"), (PyCFunction) py_getnamebycert,
+      METH_VARARGS, getnamebycert_doc },
     { NULL,NULL, 0, NULL }
 };
 
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
index 
762c26b74581acb5568b602caaef2586521f6903..64e2945a99a6f3262517aa7c817475904418a1ed
 100644
--- a/src/responder/nss/nsssrv_cmd.c
+++ b/src/responder/nss/nsssrv_cmd.c
@@ -5525,6 +5525,7 @@ static int nss_cmd_getbycert(enum sss_cli_command cmd, 
struct cli_ctx *cctx)
     }
 
     derb64 = (const char *) body;
+    DEBUG(SSSDBG_TRACE_ALL, "cert [%s]\n", derb64);
 
     /* check input */
     ret = sss_cert_derb64_to_pem(cctx, derb64, &pem_cert, &pem_size);
diff --git a/src/sss_client/idmap/sss_nss_idmap.c 
b/src/sss_client/idmap/sss_nss_idmap.c
index 
55d8043bd992bebf82a46206a9f3aecbe1e88238..fa5a499e3606f7e45a406de4d63002ba35365cb1
 100644
--- a/src/sss_client/idmap/sss_nss_idmap.c
+++ b/src/sss_client/idmap/sss_nss_idmap.c
@@ -159,7 +159,8 @@ static int sss_nss_getyyybyxxx(union input inp, enum 
sss_cli_command cmd ,
     case SSS_NSS_GETNAMEBYSID:
     case SSS_NSS_GETIDBYSID:
     case SSS_NSS_GETORIGBYNAME:
-        ret = sss_strnlen(inp.str, SSS_NAME_MAX, &inp_len);
+    case SSS_NSS_GETNAMEBYCERT:
+        ret = sss_strnlen(inp.str, 2048, &inp_len);
         if (ret != EOK) {
             return EINVAL;
         }
@@ -209,6 +210,7 @@ static int sss_nss_getyyybyxxx(union input inp, enum 
sss_cli_command cmd ,
     case SSS_NSS_GETSIDBYID:
     case SSS_NSS_GETSIDBYNAME:
     case SSS_NSS_GETNAMEBYSID:
+    case SSS_NSS_GETNAMEBYCERT:
         if (data_len <= 1 || repbuf[replen - 1] != '\0') {
             ret = EBADMSG;
             goto done;
@@ -368,3 +370,25 @@ int sss_nss_getorigbyname(const char *fq_name, struct 
sss_nss_kv **kv_list,
 
     return ret;
 }
+
+int sss_nss_getnamebycert(const char *cert, char **fq_name,
+                          enum sss_id_type *type)
+{
+    int ret;
+    union input inp;
+    struct output out;
+
+    if (fq_name == NULL || cert == NULL || *cert == '\0') {
+        return EINVAL;
+    }
+
+    inp.str = cert;
+
+    ret = sss_nss_getyyybyxxx(inp, SSS_NSS_GETNAMEBYCERT, &out);
+    if (ret == EOK) {
+        *fq_name = out.d.str;
+        *type = out.type;
+    }
+
+    return ret;
+}
diff --git a/src/sss_client/idmap/sss_nss_idmap.exports 
b/src/sss_client/idmap/sss_nss_idmap.exports
index 
8aa4702416534c49176d29cee381e1c9292c4847..bd5d80212017d38334c3cdeefa47d6029f42aebb
 100644
--- a/src/sss_client/idmap/sss_nss_idmap.exports
+++ b/src/sss_client/idmap/sss_nss_idmap.exports
@@ -19,3 +19,9 @@ SSS_NSS_IDMAP_0.1.0 {
         sss_nss_getorigbyname;
         sss_nss_free_kv;
 } SSS_NSS_IDMAP_0.0.1;
+
+SSS_NSS_IDMAP_0.2.0 {
+    # public functions
+    global:
+        sss_nss_getnamebycert;
+} SSS_NSS_IDMAP_0.1.0;
diff --git a/src/sss_client/idmap/sss_nss_idmap.h 
b/src/sss_client/idmap/sss_nss_idmap.h
index 
78a8a11c1d597e7d19bb692dcaeb566b770b900e..8a6299194e7b91e084b26c0c96e2f93875a832e7
 100644
--- a/src/sss_client/idmap/sss_nss_idmap.h
+++ b/src/sss_client/idmap/sss_nss_idmap.h
@@ -124,6 +124,21 @@ int sss_nss_getorigbyname(const char *fq_name, struct 
sss_nss_kv **kv_list,
                           enum sss_id_type *type);
 
 /**
+ * @brief Return the fully qualified name for the given base64 encoded
+ * X.509 certificate in DER format
+ *
+ * @param[in] cert     base64 encoded certificate
+ * @param[out] fq_name Fully qualified name of a user or a group,
+ *                     must be freed by the caller
+ * @param[out] type    Type of the object related to the SID
+ *
+ * @return
+ *  - see #sss_nss_getsidbyname
+ */
+int sss_nss_getnamebycert(const char *cert, char **fq_name,
+                          enum sss_id_type *type);
+
+/**
  * @brief Free key-value list returned by sss_nss_getorigbyname()
  *
  * @param[in] kv_list Key-value list returned by sss_nss_getorigbyname().
-- 
2.1.0

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/admin/lists/sssd-devel@lists.fedorahosted.org

Reply via email to