On (23/07/14 12:34), Sumit Bose wrote:
>On Wed, Jul 23, 2014 at 12:58:56AM +0200, Lukas Slebodnik wrote:
>> 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 ..."
>
>Thank you for the fast review.
>
>> 
>> >@@ -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.
>
>done
>
>> 
>> > 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
>
>done, I wonder if this should be done for the other *.exports
>DEPENDNECIES as well?
Dependencies are automatically detected from variable libname_LIBADD. In your
case, this variable contain local library libsss_nss_idmap.la. Without prefix
EXTRA_ dependencies are overridden and libsss_nss_idmap was not build before
libwbclient. Other libraries in sssd are independent and prefix EXTRA_ isn't
needed.

>
>> 
>> >+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.
>
>ah, sorry, I've build the library outside of the SSSD tree for some
>time, looks like this is a left-over.
>
>I have changed the #include in the related files and added the full path
>there as we do with other internal includes as well. I think this might
>be even safer because with adding -I... to the compiler flags there is
>still a chance that the header file from the system is used and if this
>from a different version we might fail.
I agree.

>> >+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?
>
>done
>
>> 
>> > if BUILD_IFP
>> > lib_LTLIBRARIES += libsss_simpleifp.la
>> >diff --git a/configure.ac b/configure.ac
>> >index 3865421..d20cb9c 100644
>> > 
>
>> >@@ -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.
>
>This is intentional because only the SSSD or Samba version should be
>installed.
>
>> Do we need conflicts or something different? Do we want to have different 
>> name
>> for package?
>
>I think the two packages will conflict automatically and no additional
>options are needed here (I'm not an expert here, please correct me if
>I'm wrong).
>
>If distribution do not like the conflict schemes like /sbin/alternatives
>can be used, but this will be distribution specific and requires changes
>in the samba package as well, so I think it is not suitable for the
>upstream spec file.
>
I realised that libwbclient will have prefix sssd-. I didn't test it at frst
time, because macro "%files" does not have argument -n.

The problem is that it will cause problems with installation sssd.
    sssd will require sssd-libwbclient
    sssd-ad(gpo) -> libsmbclient -> samba-common -> libwbclient

    There is conflict which we need to solve.

[root@host ~]# dnf install -y sssd-libwbclient
Dependencies resolved.

===============================================================================
 Package      Arch   Version                                    Repository
                                                                           Size
===============================================================================
Installing:
 sssd-libwbclient
              x86_64 1.12.1-0.20140723.1323.gitcd61aff.mit.fc20 localrepo  14 k

Transaction Summary
===============================================================================
Install  1 Package

Total size: 14 k
Installed size: 27 k
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Error: Transaction check error:
  file /usr/lib64/libwbclient.so.0 from install of 
sssd-libwbclient-1.12.1-0.fc20.x86_64 conflicts with file from package 
libwbclient-2:4.1.9-3.fc20.x86_64

Error Summary
-------------

Some more experinced fedora package maintaner should help us wit this.
Jakub? :-)


>> 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
>> 
>> >+
>
>
>> >+
>> >+/* Required Headers */
>> >+#include <sss_nss_idmap.h>
>> We will not include external header file. it would work, but it can be
>> confusing.
>
>done, I've change it to
>#include "sss_client/idmap/sss_nss_idmap.h"
>(see above)
>
>> 
>> >+
>> >+
>
>
>> >+    memset(&params, 0, sizeof(params));
>>                        Could you use "= {0,}" for initialisation.
>>                        I saw it on another place in libwbclient code.
>
>done
>
>> 
>> >+
>> >+    memset(&params, 0, sizeof(params));
>>         the same here
>
>done
>
>> 
>
>
>
>> >+
>> >+    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
>
>done, please note that I have introduced DEFAULT_BUFSIZE_HALF to avoid
>the division.
>
>> 
>
>
>> >+    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
>
>fixed
>
>> >+    }
>> >+/* 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.
>
>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.
>
>fixed
>
>> >+    }
>
>
>> >        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
>> 
>
>I copied the file that is used to build the Samba version of the library
>and I would prefer to keep it unchanged to avoid issues. This file is
>auto-generated during the samba build process based on ABI definitions.
>I guess this is the reason why it looks a bit odd.
I agree.
If this generated file is copied from samba then we chould not change it.
I found only wbclient-*.sigs files in samba git (nsswitch/libwbclient/ABI/),
but I dind't build samba.


>
>> 
>> 
>> 
>> 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*);
>
>I've added a cast to (void *) instead of using the macro, I hope this
>will fix the warning.
>
Problem fixed. Do we want to send patch to samba upstream to keep files the
same?

>>  }
>>  
>>  void *wbcAllocateMemory(size_t nelem, size_t elsize,
>> 
>> LS
>
>new version attached.
>
>bye,
>Sumit

>From 3a0976abbca796a163a855d90c146b04d811c1ae Mon Sep 17 00:00:00 2001
>From: Sumit Bose <sb...@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
>---
Memory leaks were fixed, build issues and nitpicks as well. We need to just
solve packaging.

Patch LGTM. I know there was some review on samba-technical, but it would be
good to have ACK from more experienced samba developer in CC (Alexander, Simo)

LS
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to