[SSSD] [PATCH] libwbclient: SSSD implementation

Lukas Slebodnik lslebodn at redhat.com
Tue Jul 22 22:58:56 UTC 2014


On (22/07/14 10:51), Sumit Bose wrote:
>Hi,
>
>this patch contains the libwbclient implementation for SSSD to allow
>Samba file-servers and utilities to use SSSD instead of winbind to map
>SIDs, names and POSIX IDs. The related ticket is
>https://fedorahosted.org/sssd/ticket/1588.
>
>The SSSD specific calls can be found in files with '_sssd' as part of
>the name, the other files are mainly taken from the original Samba
>sources because they contain API calls which are independent of the
>backend. I have made some minor modification to meet the SSSD coding
>style but tried to avoid major changes to make a diff to the original
>version more easy. If major issue are found during review I think it
>would be a good idea to try to bring the changes back to samba as well.
>
>In wbc_pwd_sssd.c instead of linking in the related sources of the NSS
>client I dlopen-ed libnss_sss.so.2 to have more flexibility about where
>and how to build the library. I you think this is too much overhead I'd
>be happy to change the code to use the NSS client call directly.
>
>The patch does not contain unit test because the Samba source code
>already contains some basic tests. I'll try to work with the samba
>package maintainer to make this code in a samba-devel or samba-test
>package available so that it can be used by SSSD as well.
>
>Basic functional test can be run manually with wbinfo, e.g.:
>
>$ /usr/bin/wbinfo -n 'AD18\Administrator'
>S-1-5-21-3090815309-2627318493-3395719201-500 SID_USER (1)
>$ /usr/bin/wbinfo -S S-1-5-21-3090815309-2627318493-3395719201-500
>1670800500
>
>bye,
>Sumit

It is quite big patch. I think some files are copied from samba.
I read just patches with header "Author: sbose ..."

>From 676cf42d5749c9a76f145968c9e0afa6438ba700 Mon Sep 17 00:00:00 2001
>From: Sumit Bose <sbose at redhat.com>
>Date: Tue, 15 Jul 2014 18:13:24 +0200
>Subject: [PATCH] libwbclient: SSSD implementation
>
>This patch implements the libwbclient API for Samba daemons and
>utilities. The main purpose is to map Active Directory users and groups
>identified by their SID to POSIX users and groups identified by their
>POSIX UIDs and GIDs respectively.
>
>The API is not fully implemented because SSSD does not support some AD
>features like WINS or NTLM. Additionally this implementation has its
>focus on the file-server use case and hence does not implement some
>features which might be needed for a domain controller use case.
>
>Some API calls are generic and independent of the backend like e.g.
>converting binary SIDs and GUIDs into a string representation and back
>or memory allocation and deallocation. These parts are taken from the
>original Samba sources together with copyright and authors. Files
>with'_sssd' as part of the name contain the SSSD related calls.
>
>Resolves: https://fedorahosted.org/sssd/ticket/1588
>---
> Makefile.am                                    |   33 +-
> configure.ac                                   |    1 +
> contrib/sssd.spec.in                           |   26 +
> src/sss_client/libwbclient/libwbclient.h       |   46 +
> src/sss_client/libwbclient/wbc_err_internal.h  |   44 +
> src/sss_client/libwbclient/wbc_guid.c          |  100 ++
> src/sss_client/libwbclient/wbc_idmap_common.c  |   89 ++
> src/sss_client/libwbclient/wbc_idmap_sssd.c    |  204 ++++
> src/sss_client/libwbclient/wbc_pam_sssd.c      |  151 +++
> src/sss_client/libwbclient/wbc_pwd_sssd.c      |  659 ++++++++++++
> src/sss_client/libwbclient/wbc_sid_common.c    |  199 ++++
> src/sss_client/libwbclient/wbc_sid_sssd.c      |  276 +++++
> src/sss_client/libwbclient/wbc_sssd_internal.h |   41 +
> src/sss_client/libwbclient/wbc_util_common.c   |   97 ++
> src/sss_client/libwbclient/wbc_util_sssd.c     |  160 +++
> src/sss_client/libwbclient/wbclient.exports    |   90 ++
> src/sss_client/libwbclient/wbclient.h          | 1372 ++++++++++++++++++++++++
> src/sss_client/libwbclient/wbclient.pc.in      |   11 +
> src/sss_client/libwbclient/wbclient_common.c   |  178 +++
> src/sss_client/libwbclient/wbclient_internal.h |   44 +
> src/sss_client/libwbclient/wbclient_sssd.c     |   40 +
> 21 files changed, 3859 insertions(+), 2 deletions(-)
> create mode 100644 src/sss_client/libwbclient/libwbclient.h
> create mode 100644 src/sss_client/libwbclient/wbc_err_internal.h
> create mode 100644 src/sss_client/libwbclient/wbc_guid.c
> create mode 100644 src/sss_client/libwbclient/wbc_idmap_common.c
> create mode 100644 src/sss_client/libwbclient/wbc_idmap_sssd.c
> create mode 100644 src/sss_client/libwbclient/wbc_pam_sssd.c
> create mode 100644 src/sss_client/libwbclient/wbc_pwd_sssd.c
> create mode 100644 src/sss_client/libwbclient/wbc_sid_common.c
> create mode 100644 src/sss_client/libwbclient/wbc_sid_sssd.c
> create mode 100644 src/sss_client/libwbclient/wbc_sssd_internal.h
> create mode 100644 src/sss_client/libwbclient/wbc_util_common.c
> create mode 100644 src/sss_client/libwbclient/wbc_util_sssd.c
> create mode 100644 src/sss_client/libwbclient/wbclient.exports
> create mode 100644 src/sss_client/libwbclient/wbclient.h
> create mode 100644 src/sss_client/libwbclient/wbclient.pc.in
> create mode 100644 src/sss_client/libwbclient/wbclient_common.c
> create mode 100644 src/sss_client/libwbclient/wbclient_internal.h
> create mode 100644 src/sss_client/libwbclient/wbclient_sssd.c
>
>diff --git a/Makefile.am b/Makefile.am
>index e359286..adb981b 100644
>--- a/Makefile.am
>+++ b/Makefile.am
>@@ -574,6 +574,10 @@ dist_noinst_HEADERS = \
>     src/tests/cmocka/common_mock_sysdb_objects.h \
>     src/sss_client/ssh/sss_ssh_client.h \
>     src/sss_client/sudo/sss_sudo.h \
>+    src/sss_client/libwbclient/libwbclient.h \
>+    src/sss_client/libwbclient/wbc_err_internal.h \
>+    src/sss_client/libwbclient/wbclient_internal.h \
>+    src/sss_client/libwbclient/wbc_sssd_internal.h \
>     src/lib/idmap/sss_idmap_private.h \
>     src/lib/sifp/sss_sifp_private.h
> 
>@@ -713,7 +717,7 @@ libsss_config_la_LDFLAGS = \
> endif # BUILD_CONFIG_LIB
> endif # BUILD_IFP
> 
>-lib_LTLIBRARIES = libipa_hbac.la libsss_idmap.la libsss_nss_idmap.la
>+lib_LTLIBRARIES = libipa_hbac.la libsss_idmap.la libsss_nss_idmap.la libwbclient.la
     Could you put each library to separate line and use $(NULL) at the end.

> pkgconfig_DATA += src/providers/ipa/ipa_hbac.pc
> libipa_hbac_la_DEPENDENCIES = src/providers/ipa/ipa_hbac.exports
> libipa_hbac_la_SOURCES = \
>@@ -753,11 +757,36 @@ libsss_nss_idmap_la_LDFLAGS = \
> 
> dist_noinst_DATA += src/sss_client/idmap/sss_nss_idmap.exports
> 
>+pkgconfig_DATA += src/sss_client/libwbclient/wbclient.pc
>+libwbclient_la_DEPENDENCIES = src/sss_client/libwbclient/wbclient.exports
Use prefix EXTRA_, otherwise parallel build will fail.
  CCLD     libwbclient.la
libtool: link: cannot find the library `libsss_nss_idmap.la' or unhandled argument `libsss_nss_idmap.la'
make[2]: *** [libwbclient.la] Error 1

>+libwbclient_la_SOURCES = \
>+    src/sss_client/libwbclient/wbc_guid.c \
>+    src/sss_client/libwbclient/wbc_idmap_common.c \
>+    src/sss_client/libwbclient/wbc_idmap_sssd.c \
>+    src/sss_client/libwbclient/wbclient_common.c \
>+    src/sss_client/libwbclient/wbclient_sssd.c \
>+    src/sss_client/libwbclient/wbc_pam_sssd.c \
>+    src/sss_client/libwbclient/wbc_pwd_sssd.c \
>+    src/sss_client/libwbclient/wbc_sid_common.c \
>+    src/sss_client/libwbclient/wbc_sid_sssd.c \
>+    src/sss_client/libwbclient/wbc_sssd_internal.h \
>+    src/sss_client/libwbclient/wbc_util_common.c \
>+    src/sss_client/libwbclient/wbc_util_sssd.c
There was expectation that libsss_nss_idmap.so is external library and header
files are installed. Compilation failed on machine without installed header
files for libsss_nss_idmap. We should use header files from source directory.
e.g.
libwbclient_la_CPPFLAGS = \
    -I$(srcdir)/src/sss_client/idmap/ \
    $(AM_CPPFLAGS)

or directly adding this directory to the AM_CPPFLAGS.

>+libwbclient_la_LIBADD = \
>+    libsss_nss_idmap.la \
>+    $(CLIENT_LIBS)
>+libwbclient_la_LDFLAGS = \
>+    -Wl,--version-script,$(srcdir)/src/sss_client/libwbclient/wbclient.exports \
>+    -version-info 11:0:11
>+
>+dist_noinst_DATA += src/sss_client/libwbclient/wbclient.exports
>+
> 
> include_HEADERS = \
>     src/providers/ipa/ipa_hbac.h \
>     src/lib/idmap/sss_idmap.h \
>-    src/sss_client/idmap/sss_nss_idmap.h
>+    src/sss_client/idmap/sss_nss_idmap.h \
>+    src/sss_client/libwbclient/wbclient.h
Could you add $(NULL) as well?

> if BUILD_IFP
> lib_LTLIBRARIES += libsss_simpleifp.la
>diff --git a/configure.ac b/configure.ac
>index 3865421..d20cb9c 100644
>--- a/configure.ac
>+++ b/configure.ac
>@@ -323,6 +323,7 @@ AC_CONFIG_FILES([Makefile contrib/sssd.spec src/examples/rwtab src/doxy.config
>                  src/sss_client/sudo/sss_sudo.doxy
>                  src/sss_client/idmap/sss_nss_idmap.pc
>                  src/sss_client/idmap/sss_nss_idmap.doxy
>+                 src/sss_client/libwbclient/wbclient.pc
>                  src/lib/sifp/sss_simpleifp.pc
>                  src/lib/sifp/sss_simpleifp.doxy
>                  src/config/setup.py
>diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
>index 82d8e89..d781936 100644
>--- a/contrib/sssd.spec.in
>+++ b/contrib/sssd.spec.in
>@@ -427,6 +427,22 @@ Requires: libsss_simpleifp = %{version}-%{release}
> %description -n libsss_simpleifp-devel
> Provides library that simplifies D-Bus API for the SSSD InfoPipe responder.
> 
>+%package libwbclient
>+Summary: The SSSD libwbclient implementation
>+Group: Applications/System
>+License: GPLv3+ and LGPLv3+
>+
>+%description libwbclient
>+The SSSD libwbclient implementation.
>+
>+%package libwbclient-devel
>+Summary: Development libraries for the SSSD libwbclient implementation
>+Group:  Development/Libraries
>+License: GPLv3+ and LGPLv3+
>+
>+%description libwbclient-devel
>+Development libraries for the SSSD libwbclient implementation.
>+
> %prep
> %setup -q -n %{name}-%{version}
> 
>@@ -821,6 +837,16 @@ rm -rf $RPM_BUILD_ROOT
> %defattr(-,root,root,-)
> %{python_sitearch}/pyhbac.so
> 
>+%files libwbclient
>+%defattr(-,root,root,-)
>+%{_libdir}/libwbclient.so.*
This library will be installed to the default libdir; the same as
libwbclient.so from libwbclient from samba.
Do we need conflicts or something different? Do we want to have different name
for package?

sh-4.2$ rpm -ql libwbclient-4.1.9-3.fc20.x86_64.rpm
/usr/lib64/libwbclient.so.0
/usr/lib64/libwbclient.so.0.11
/usr/lib64/samba/libwinbind-client.so

>+
>+%files libwbclient-devel
>+%defattr(-,root,root,-)
>+%{_includedir}/wbclient.h
>+%{_libdir}/libwbclient.so
>+%{_libdir}/pkgconfig/wbclient.pc
>+
> %if (0%{?use_systemd} == 1)
> # systemd
> %post common
>diff --git a/src/sss_client/libwbclient/libwbclient.h b/src/sss_client/libwbclient/libwbclient.h
>new file mode 100644
>index 0000000..79d9be2
>--- /dev/null
>+++ b/src/sss_client/libwbclient/libwbclient.h
>@@ -0,0 +1,46 @@
>+/*
>+   Unix SMB/CIFS implementation.
>+
>+   Winbind client API
>+
>+   Copyright (C) Gerald (Jerry) Carter 2007
>+
>+   This library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 3 of the License, or (at your option) any later version.
>+:set number 
>+   This library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Library General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public License
>+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
>+*/
>+
>+#ifndef _LIBWBCLIENT_H
>+#define _LIBWBCLIENT_H
>+
>+#include <stdint.h>
>+#include <stdbool.h>
>+#include <stdio.h>
>+#include <stdlib.h>
>+#include <string.h>
>+
>+
>+/* Super header including necessary public and private header files
>+   for building the wbclient library.  __DO NOT__ define anything
>+   in this file.  Only include other headers. */
>+
>+/* Public headers */
>+
>+#include "wbclient.h"
>+
>+/* Private headers */
>+
>+#include "wbc_err_internal.h"
>+#include "wbclient_internal.h"
>+
>+
>+#endif      /* _LIBWBCLIENT_H */
>diff --git a/src/sss_client/libwbclient/wbc_idmap_sssd.c b/src/sss_client/libwbclient/wbc_idmap_sssd.c
>new file mode 100644
>index 0000000..430de0c
>--- /dev/null
>+++ b/src/sss_client/libwbclient/wbc_idmap_sssd.c
>@@ -0,0 +1,204 @@
>+/*
>+   Unix SMB/CIFS implementation.
>+
>+   Winbind client API - SSSD version
>+
>+   Copyright (C) Sumit Bose <sbose at redhat.com> 2014
>+
>+   This library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 3 of the License, or (at your option) any later version.
>+
>+   This library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Library General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public License
>+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
>+*/
>+
>+/* Required Headers */
>+#include <sss_nss_idmap.h>
We will not include external header file. it would work, but it can be
confusing.

>+
>+#include "libwbclient.h"
>+#include "wbc_sssd_internal.h"
>+
>diff --git a/src/sss_client/libwbclient/wbc_pam_sssd.c b/src/sss_client/libwbclient/wbc_pam_sssd.c
>new file mode 100644
>index 0000000..0bd27ce
>--- /dev/null
>+++ b/src/sss_client/libwbclient/wbc_pam_sssd.c
>@@ -0,0 +1,151 @@
>+/*
>+   Unix SMB/CIFS implementation.
>+
>+   Winbind client API - SSSD version
>+
>+   Copyright (C) Sumit Bose <sbose at redhat.com> 2014
>+
>+   This library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 3 of the License, or (at your option) any later version.
>+
>+   This library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Library General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public License
>+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
>+*/
>+
>+/* Required Headers */
>+#include "libwbclient.h"
>+#include "wbc_sssd_internal.h"
>+
>+/* Authenticate a username/password pair */
>+wbcErr wbcAuthenticateUser(const char *username,
>+               const char *password)
>+{
>+    wbcErr wbc_status = WBC_ERR_SUCCESS;
>+    struct wbcAuthUserParams params;
>+
>+    memset(&params, 0, sizeof(params));
                       Could you use "= {0,}" for initialisation.
                       I saw it on another place in libwbclient code.

>+
>+    params.account_name       = username;
>+    params.level              = WBC_AUTH_USER_LEVEL_PLAIN;
>+    params.password.plaintext = password;
>+
>+    wbc_status = wbcAuthenticateUserEx(&params, NULL, NULL);
>+
>+    return wbc_status;
>+}
>+
>+
//snip
>+/* Change a password for a user */
>+wbcErr wbcChangeUserPassword(const char *username,
>+                 const char *old_password,
>+                 const char *new_password)
>+{
>+    wbcErr wbc_status = WBC_ERR_SUCCESS;
>+    struct wbcChangePasswordParams params;
>+
>+    memset(&params, 0, sizeof(params));
        the same here

>+
>+    params.account_name        = username;
>+    params.level            = WBC_CHANGE_PASSWORD_LEVEL_PLAIN;
>+    params.old_password.plaintext    = old_password;
>+    params.new_password.plaintext    = new_password;
>+
>+    wbc_status = wbcChangeUserPasswordEx(&params, NULL, NULL, NULL);
>+
>+    return wbc_status;
>+}
>+
>+/* Logon a User */
>+wbcErr wbcLogonUser(const struct wbcLogonUserParams *params,
>+            struct wbcLogonUserInfo **info,
>+            struct wbcAuthErrorInfo **error,
>+            struct wbcUserPasswordPolicyInfo **policy)
>+{
>+    WBC_SSSD_NOT_IMPLEMENTED;
>+}
>diff --git a/src/sss_client/libwbclient/wbc_pwd_sssd.c b/src/sss_client/libwbclient/wbc_pwd_sssd.c
>new file mode 100644
>index 0000000..8f4f375
>--- /dev/null
>+++ b/src/sss_client/libwbclient/wbc_pwd_sssd.c
>@@ -0,0 +1,659 @@
>+/*
>+   Unix SMB/CIFS implementation.
>+
>+   Winbind client API - SSSD version
>+
>+   Copyright (C) Sumit Bose <sbose at redhat.com> 2014
>+
>+   This library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 3 of the License, or (at your option) any later version.
>+
>+   This library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Library General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public License
>+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
>+*/
>+/* Required Headers */
>+
//snip

>+/* Fill in a struct passwd* for a domain user based on username */
>+wbcErr wbcGetgrnam(const char *name, struct group **grp)
>+{
>+    struct group lgrp;
>+    enum nss_status status;
>+    char *newbuffer = NULL;
>+    char *buffer = NULL;
>+    size_t buflen = 0;
>+    wbcErr wbc_status;
>+    int nss_errno;
>+
>+    if (ctx == NULL && !open_libnss_sss()) {
>+        return WBC_ERR_NSS_ERROR;
>+    }
>+
>+    if (name == NULL || grp == NULL) {
>+        return WBC_ERR_INVALID_PARAM;
>+    }
>+
>+    do {
>+        if (buflen == 0) {
>+            buflen = DEFAULT_BUFSIZE;
>+        } else {
>+            buflen *= 2;
>+        }
I think next linkes look better:
      buflen = DEFAULT_BUFSIZE / 2;
      do {
          buflen *= 2;

The same in function wbcGetgrgid and wbcGetgrent

>+        newbuffer = realloc(buffer, buflen);
>+        if (newbuffer == NULL) {
>+            free(buffer);
>+            return WBC_ERR_NO_MEMORY;
>+        }
>+        buffer = newbuffer;
>+
>+        memset(grp, 0, sizeof(struct group));
>+        status = ctx->getgrnam_r(name, &lgrp, buffer, buflen, &nss_errno);
>+        wbc_status = nss_to_wbc(status);
>+        if (WBC_ERROR_IS_OK(wbc_status)) {
>+            wbc_status = copy_grp(&lgrp, grp);
>+        }
>+    } while (status == NSS_STATUS_TRYAGAIN && nss_errno == ERANGE \
>+         && buflen < MAX_BUFSIZE);
>+
>+    free(buffer);
>+
>+    return wbc_status;
>+}
>+
//snip

>+/* Return the unix group array belonging to the given user */
>+wbcErr wbcGetGroups(const char *account,
>+            uint32_t *num_groups,
>+            gid_t **_groups)
>+{
>+    wbcErr wbc_status;
>+    enum nss_status status;
>+    struct passwd *pwd;
>+    long int gr_size = 0;
>+    long int start = 0;
>+    gid_t *gids = NULL;
>+    int nss_errno;
>+
>+    wbc_status = wbcGetpwnam(account, &pwd);
>+    if (!WBC_ERROR_IS_OK(wbc_status)) {
>+        return wbc_status;
>+    }
>+
>+    gr_size = DEFAULT_BUFSIZE;
>+    gids = calloc(gr_size, sizeof(gid_t));
>+    if (gids == NULL) {
>+        wbc_status = WBC_ERR_NO_MEMORY;
>+        goto done;
>+    }
>+
>+    /* nss modules may skip the primary group when we pass it in so always
>+     * add it in advance */
>+    gids[0] = pwd->pw_gid;
>+    start++;
>+
>+    status = ctx->initgroups_dyn(pwd->pw_name, pwd->pw_gid, &start,
>+                     &gr_size, &gids, -1, &nss_errno);
>+    wbc_status = nss_to_wbc(status);
>+    if (!WBC_ERROR_IS_OK(wbc_status)) {
>+        goto done;
         //alocated memory in gids will be lost in done section
>+    }
>+
>+    *_groups = gids;
>+    *num_groups = start;
>+
>+    wbc_status = WBC_ERR_SUCCESS;
>+
>+done:
>+    wbcFreeMemory(pwd);
>+
>+    return wbc_status;
>+}
>diff --git a/src/sss_client/libwbclient/wbc_sid_sssd.c b/src/sss_client/libwbclient/wbc_sid_sssd.c
>new file mode 100644
>index 0000000..699e1d3
>--- /dev/null
>+++ b/src/sss_client/libwbclient/wbc_sid_sssd.c
>@@ -0,0 +1,276 @@
>+/*
>+   Unix SMB/CIFS implementation.
>+
>+   Winbind client API - SSSD version
>+
>+   Copyright (C) Sumit Bose <sbose at redhat.com> 2014
>+
>+   This library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 3 of the License, or (at your option) any later version.
>+
>+   This library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Library General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public License
>+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
>+*/
>+
>+/* Required Headers */
>+#define _GNU_SOURCE  /* for asprintf */
Could you include "config.h" instaead of using _GNU_SOURCE?
All necessary macros for extensions should be detected in config.h.

>+#include <stdio.h>
>+
>+#include <errno.h>
>+
>+#include <sss_nss_idmap.h>
           s/<sss_nss_idmap.h>/"sss_nss_idmap.h"/
          This is the same situation as in wbc_idmap_sssd.c
>+
>+#include "libwbclient.h"
>+#include "wbc_sssd_internal.h"
>+
>+static int sss_id_type_to_wbcSidType(enum sss_id_type sss_type,
>+                                     enum wbcSidType *name_type)
>+{
>+    switch (sss_type) {
>+    case SSS_ID_TYPE_NOT_SPECIFIED:
>+        *name_type = WBC_SID_NAME_USE_NONE;
>+        break;
//snip

>+/* Convert a SID to a domain and name */
>+wbcErr wbcLookupSid(const struct wbcDomainSid *sid,
>+            char **pdomain,
>+            char **pname,
>+            enum wbcSidType *pname_type)
>+{
>+    char *str_sid;
>+    char *fq_name = NULL;
>+    enum sss_id_type type;
>+    int ret;
>+    char *p;
>+    wbcErr wbc_status;
>+
>+    wbc_status = wbcSidToString(sid, &str_sid);
>+    if (!WBC_ERROR_IS_OK(wbc_status)) {
>+        return wbc_status;
>+    }
>+
>+    ret = sss_nss_getnamebysid(str_sid, &fq_name, &type);
>+    wbcFreeMemory(str_sid);
>+    if (ret != 0) {
>+        return WBC_ERR_UNKNOWN_FAILURE;
>+    }
>+
>+    ret = sss_id_type_to_wbcSidType(type, pname_type);
>+    if (ret != 0) {
>+        wbc_status = WBC_ERR_UNKNOWN_FAILURE;
>+        goto done;
>+    }
>+
>+    /* TODO: it would be nice to have a sss_nss_getnamebysid() call which
>+    * return name and domain separately. */
>+    p = strchr(fq_name, '@');
>+    if (p == NULL) {
>+        wbc_status = WBC_ERR_UNKNOWN_FAILURE;
>+        goto done;
>+    }
>+
>+    *p = '\0';
>+    *pname = wbcStrDup(fq_name);
>+    if (*pname == NULL) {
>+        wbc_status = WBC_ERR_NO_MEMORY;
>+        goto done;
>+    }
>+
>+    *pdomain = wbcStrDup(p + 1);
>+    if (*pdomain == NULL) {
>+        wbc_status = WBC_ERR_NO_MEMORY;
>+        goto done;
          there would be memory leak, because *pname is not freed.
>+    }
>+
>+    wbc_status = WBC_ERR_SUCCESS;
>+done:
>+    free(fq_name);
>+    return wbc_status;
>+}
>+
>diff --git a/src/sss_client/libwbclient/wbc_sssd_internal.h b/src/sss_client/libwbclient/wbc_sssd_internal.h
>new file mode 100644
>index 0000000..e20de48
>--- /dev/null
>+++ b/src/sss_client/libwbclient/wbc_sssd_internal.h
>@@ -0,0 +1,41 @@
>+/*
>+   Unix SMB/CIFS implementation.
>+
>+   Winbind client API - SSSD version
>+
>+   Copyright (C) Sumit Bose <sbose at redhat.com> 2014
>+
>+   This library is free software; you can redistribute it and/or
>+   modify it under the terms of the GNU Lesser General Public
>+   License as published by the Free Software Foundation; either
>+   version 3 of the License, or (at your option) any later version.
>+
>+   This library is distributed in the hope that it will be useful,
>+   but WITHOUT ANY WARRANTY; without even the implied warranty of
>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+   Library General Public License for more details.
>+
>+   You should have received a copy of the GNU Lesser General Public License
>+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
>+*/
>+
>+#ifndef _WBC_SSSD_INTERNAL_H
>+#define _WBC_SSSD_INTERNAL_H
>+
>+#include <syslog.h>
>+
>+#include "libwbclient.h"
>+
>+#if defined(DEVELOPER)
>+#define WBC_SSSD_DEV_LOG syslog(LOG_DEBUG, "libwbclient_sssd: %s", __FUNCTION__);
                                        Would _FILE__, __LINE__ be useful here?
>+#else
>+#define WBC_SSSD_DEV_LOG
>+#endif
>+
>+#define WBC_SSSD_NOT_IMPLEMENTED \
>+    do { \
>+        WBC_SSSD_DEV_LOG; \
>+        return WBC_ERR_NOT_IMPLEMENTED; \
>+    } while(0)
>+
>+#endif    /* _WBC_SSSD_INTERNAL_H */

>src/sss_client/libwbclient/wbclient.exports
>WBCLIENT_0.9 {
>    global:
>        wbcGetpwuid;
>        wbcLogoffUser;
>        wbcSidToStringBuf;
>        wbcLogonUser;
>        wbcGetgrgid;
>        wbcSetGidMapping;
>        wbcQueryGidToSid;
>        wbcListTrusts;
>        wbcGetGroups;
>        wbcDomainInfo;
>        wbcSidToGid;
>        wbcLookupRids;
>        wbcCredentialCache;
>        wbcDcInfo;
>        wbcAuthenticateUserEx;
>        wbcGetpwent;
>        wbcGetSidAliases;
>        wbcGetDisplayName;
>        wbcAllocateUid;
>        wbcSidToUid;
>        wbcChangeTrustCredentials;
>        wbcGetpwsid;
>        wbcPingDc;
>        wbcAllocateStringArray;
>        wbcErrorString;
>        wbcStringToGuid;
>        wbcStrDup;
>        wbcGetgrnam;
>        wbcGetgrlist;
>        wbcListUsers;
>        wbcRemoveUidMapping;
>        wbcLookupDomainController;
>        wbcRemoveGidMapping;
>        wbcSidTypeString;
>        wbcAllocateMemory;
>        wbcInterfaceDetails;
>        wbcCheckTrustCredentials;
>        wbcListGroups;
>        wbcLookupUserSids;
>        wbcResolveWinsByName;
>        wbcSetpwent;
>        wbcSetUidHwm;
>        wbcSidsToUnixIds;
>        wbcQuerySidToGid;
>        wbcChangeUserPasswordEx;
>        wbcPing;
>        wbcQueryUidToSid;
>        wbcEndpwent;
>        wbcLibraryDetails;
>        wbcSetgrent;
>        wbcLookupName;
>        wbcChangeUserPassword;
>        wbcSetGidHwm;
>        wbcAddNamedBlob;
>        wbcGuidToString;
>        wbcLookupSids;
>        wbcRequestResponsePriv;
>        wbcAllocateGid;
>        wbcFreeMemory;
>        wbcResolveWinsByIP;
>        wbcRequestResponse;
>        wbcStringToSid;
>        wbcLookupSid;
>        wbcCredentialSave;
>        wbcGidToSid;
>        wbcQuerySidToUid;
>        wbcEndgrent;
>        wbcGetgrent;
>        wbcAuthenticateUser;
>        wbcGetpwnam;
>        wbcLookupDomainControllerEx;
>        wbcLogoffUserEx;
>        wbcSetUidMapping;
>        wbcSidToString;
>        wbcUidToSid;
>};
>
>WBCLIENT_0.10 {
>    global:
>        wbcPingDc2;
>} WBCLIENT_0.9;
>
>WBCLIENT_0.11 {
>    global:
>        wbc*;
>    local:
>        *;
     ^^^^^^
     In most libraries, local: is in 1st version. (@see libraries in systemd:-)
>};

I checked original libwbclient library and the last version does not have any
functions. It can be empty e.g. "WBCLIENT_0.11 {};"
sh-4.2$ readelf --dyn-syms /usr/lib64/libwbclient.so.0 |  grep WBCLIENT_0.1
    30: 0000000000003890   272 FUNC    GLOBAL DEFAULT   12 wbcPingDc2@@WBCLIENT_0.10
    61: 0000000000000000     0 OBJECT  GLOBAL DEFAULT  ABS WBCLIENT_0.10
    68: 0000000000000000     0 OBJECT  GLOBAL DEFAULT  ABS WBCLIENT_0.11




There is cast-align warning
../sssd/src/sss_client/libwbclient/wbclient_common.c:85:12: error: cast from 'char *' to
      'struct wbcMemPrefix *' increases required alignment from 1 to 8 [-Werror,-Wcast-align]
    return (struct wbcMemPrefix *)(((char *)ptr) - wbcPrefixLen());
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

Next diff should fix problem. We needn't include util_safealign if you don't
want, because this file is from samba.

--- a/src/sss_client/libwbclient/wbclient_common.c
+++ b/src/sss_client/libwbclient/wbclient_common.c
@@ -23,6 +23,7 @@
 /* Required Headers */
 
 #include "libwbclient.h"
+#include "util/util_safealign.h"
 
 /** @brief Translate an error value into a string
  *
@@ -82,7 +83,7 @@ static size_t wbcPrefixLen(void)
 
 static struct wbcMemPrefix *wbcMemToPrefix(void *ptr)
 {
-    return (struct wbcMemPrefix *)(((char *)ptr) - wbcPrefixLen());
+    return DISCARD_ALIGN(((char *)ptr) - wbcPrefixLen(), struct wbcMemPrefix*);
 }
 
 void *wbcAllocateMemory(size_t nelem, size_t elsize,

LS



More information about the sssd-devel mailing list