Blame SOURCES/0109-winbind-idmap-plugin-support-inferface-version-6.patch

ab1ddb
From 9ae62c07c579fa9b3f0804c12cc0715f5f2524d4 Mon Sep 17 00:00:00 2001
ab1ddb
From: Sumit Bose <sbose@redhat.com>
ab1ddb
Date: Tue, 15 May 2018 11:55:35 +0200
ab1ddb
Subject: [PATCH] winbind idmap plugin: support inferface version 6
ab1ddb
MIME-Version: 1.0
ab1ddb
Content-Type: text/plain; charset=UTF-8
ab1ddb
Content-Transfer-Encoding: 8bit
ab1ddb
ab1ddb
With Samba 4.7 the interface version of the idmap plugin was updated to
ab1ddb
6. The patch adds support for this new version but can be complied with
ab1ddb
the older version as well.
ab1ddb
ab1ddb
A configure option is added to select the version, if no version is
ab1ddb
given configure tries to detect the version with the help of an internal
ab1ddb
Samba library libidmap-samba4.so.
ab1ddb
ab1ddb
To make sure that always the right version is used configure will fail
ab1ddb
if Samba is used (--with-samba, default) and no version can be
ab1ddb
determined.
ab1ddb
ab1ddb
Resolves https://pagure.io/SSSD/sssd/issue/3741
ab1ddb
ab1ddb
Reviewed-by: Alexander Bokovoy <abokovoy@redhat.com>
ab1ddb
Reviewed-by: Fabiano FidĂȘncio <fidencio@redhat.com>
ab1ddb
(cherry picked from commit c6b99b070268c3807833e9f894d9a36304014417)
ab1ddb
ab1ddb
DOWNSTREAM:
ab1ddb
Resolves: rhbz#1580281 - Samba can not register sss idmap module because it's using an outdated SMB_IDMAP_INTERFACE_VERSION [rhel-7.5.z]
ab1ddb
---
ab1ddb
 contrib/ci/configure.sh                       |  9 ++
ab1ddb
 contrib/sssd.spec.in                          | 12 +++
ab1ddb
 src/external/samba.m4                         | 82 +++++++++++++++++++
ab1ddb
 src/lib/winbind_idmap_sss/winbind_idmap_sss.c |  6 ++
ab1ddb
 src/lib/winbind_idmap_sss/winbind_idmap_sss.h |  6 +-
ab1ddb
 5 files changed, 114 insertions(+), 1 deletion(-)
ab1ddb
ab1ddb
diff --git a/contrib/ci/configure.sh b/contrib/ci/configure.sh
ab1ddb
index 9d18d0c187561a2dc3bc47d3e8913626e7ff3046..09da5b4e7b0b4a7859bcf81db987394ac91f4fa2 100644
ab1ddb
--- a/contrib/ci/configure.sh
ab1ddb
+++ b/contrib/ci/configure.sh
ab1ddb
@@ -35,6 +35,7 @@ declare -a CONFIGURE_ARG_LIST=(
ab1ddb
 if [[ "$DISTRO_BRANCH" == -redhat-redhatenterprise*-6.*- ||
ab1ddb
       "$DISTRO_BRANCH" == -redhat-centos-6.*- ]]; then
ab1ddb
     CONFIGURE_ARG_LIST+=(
ab1ddb
+        "--with-smb-idmap-interface-version=5"
ab1ddb
         "--disable-cifs-idmap-plugin"
ab1ddb
         "--with-syslog=syslog"
ab1ddb
         "--without-python3-bindings"
ab1ddb
@@ -56,6 +57,14 @@ if [[ "$DISTRO_BRANCH" == -redhat-redhatenterprise*-7.*- ||
ab1ddb
     )
ab1ddb
 fi
ab1ddb
 
ab1ddb
+# Different versions of Debian might need different versions here but this is
ab1ddb
+# sufficient to make the CI work
ab1ddb
+if [[ "$DISTRO_BRANCH" == -debian-* ]]; then
ab1ddb
+    CONFIGURE_ARG_LIST+=(
ab1ddb
+        "--with-smb-idmap-interface-version=5"
ab1ddb
+    )
ab1ddb
+fi
ab1ddb
+
ab1ddb
 declare -r -a CONFIGURE_ARG_LIST
ab1ddb
 
ab1ddb
 fi # _CONFIGURE_SH
ab1ddb
diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
ab1ddb
index d9323bf1a2d84f4219f8ab11886e5ce87b401c15..3ddd054dea8a4b5dd46457acf9aaabed29ab754e 100644
ab1ddb
--- a/contrib/sssd.spec.in
ab1ddb
+++ b/contrib/sssd.spec.in
ab1ddb
@@ -127,6 +127,14 @@
ab1ddb
     %global with_gdm_pam_extensions 0
ab1ddb
 %endif
ab1ddb
 
ab1ddb
+# Do not try to detect the idmap version on RHEL6 to avoid conflicts between
ab1ddb
+# samba and samba4 package
ab1ddb
+%if (0%{?fedora} || 0%{?rhel} >= 7)
ab1ddb
+    %global detect_idmap_version 1
ab1ddb
+%else
ab1ddb
+    %global with_idmap_version --with-smb-idmap-interface-version=5
ab1ddb
+%endif
ab1ddb
+
ab1ddb
 Name: @PACKAGE_NAME@
ab1ddb
 Version: @PACKAGE_VERSION@
ab1ddb
 Release: 0@PRERELEASE_VERSION@%{?dist}
ab1ddb
@@ -225,6 +233,9 @@ BuildRequires: nfs-utils-lib-devel
ab1ddb
 
ab1ddb
 BuildRequires: samba4-devel
ab1ddb
 BuildRequires: libsmbclient-devel
ab1ddb
+%if (0%{?detect_idmap_version} == 1)
ab1ddb
+BuildRequires: samba-winbind
ab1ddb
+%endif
ab1ddb
 
ab1ddb
 %if (0%{?enable_systemtap} == 1)
ab1ddb
 BuildRequires: systemtap-sdt-devel
ab1ddb
@@ -747,6 +758,7 @@ autoreconf -ivf
ab1ddb
     %{?enable_systemtap_opt} \
ab1ddb
     %{?with_secret_responder} \
ab1ddb
     %{?with_kcm_option} \
ab1ddb
+    %{?with_idmap_version} \
ab1ddb
     %{?experimental}
ab1ddb
 
ab1ddb
 make %{?_smp_mflags} all
ab1ddb
diff --git a/src/external/samba.m4 b/src/external/samba.m4
ab1ddb
index 91a583a0d0f514dab40d4f65cc32b17d0368f540..610831bf054e3687eb13025e954acf345fca1a00 100644
ab1ddb
--- a/src/external/samba.m4
ab1ddb
+++ b/src/external/samba.m4
ab1ddb
@@ -39,4 +39,86 @@ them. In this case, you will need to execute configure script with argument
ab1ddb
 --without-samba
ab1ddb
         ]])
ab1ddb
     fi
ab1ddb
+
ab1ddb
+    AC_ARG_WITH([smb-idmap-interface-version],
ab1ddb
+                [AC_HELP_STRING([--with-smb-idmap-interface-version=[5|6]],
ab1ddb
+                                [Idmap interface version of installed Samba]
ab1ddb
+                               )
ab1ddb
+                ]
ab1ddb
+               )
ab1ddb
+
ab1ddb
+    if test x"$with_smb_idmap_interface_version" != x; then
ab1ddb
+        if test x"$with_smb_idmap_interface_version" = x5 -o x"$with_smb_idmap_interface_version" = x6; then
ab1ddb
+            idmap_test_result=$with_smb_idmap_interface_version
ab1ddb
+        else
ab1ddb
+            AC_MSG_ERROR([Illegal value -$with_smb_idmap_interface_version- for option --with-smb-idmap-interface-version])
ab1ddb
+        fi
ab1ddb
+    else
ab1ddb
+
ab1ddb
+        AC_MSG_CHECKING([Samba's idmap plugin interface version])
ab1ddb
+        sambalibdir="`$PKG_CONFIG --variable=libdir smbclient`"/samba
ab1ddb
+        SAVE_CFLAGS=$CFLAGS
ab1ddb
+        SAVE_LIBS=$LIBS
ab1ddb
+        CFLAGS="$CFLAGS $SMBCLIENT_CFLAGS -I/usr/include/samba-4.0"
ab1ddb
+        LIBS="$LIBS -L${sambalibdir} -lidmap-samba4 -Wl,-rpath ${sambalibdir}"
ab1ddb
+        AC_RUN_IFELSE(
ab1ddb
+            [AC_LANG_SOURCE([
ab1ddb
+#include <stdlib.h>
ab1ddb
+#include <stdint.h>
ab1ddb
+#include <stdbool.h>
ab1ddb
+#include <tevent.h>
ab1ddb
+#include <core/ntstatus.h>
ab1ddb
+
ab1ddb
+struct winbindd_domain;
ab1ddb
+
ab1ddb
+/* overwrite some winbind internal functions */
ab1ddb
+struct winbindd_domain *find_domain_from_name(const char *domain_name)
ab1ddb
+{
ab1ddb
+    return NULL;
ab1ddb
+}
ab1ddb
+
ab1ddb
+bool get_global_winbindd_state_offline(void) {
ab1ddb
+    return false;
ab1ddb
+}
ab1ddb
+
ab1ddb
+struct tevent_context *winbind_event_context(void)
ab1ddb
+{
ab1ddb
+    return NULL;
ab1ddb
+}
ab1ddb
+
ab1ddb
+struct idmap_methods;
ab1ddb
+
ab1ddb
+NTSTATUS smb_register_idmap(int version, const char *name, struct idmap_methods *methods);
ab1ddb
+
ab1ddb
+int main(void)
ab1ddb
+{
ab1ddb
+    int v;
ab1ddb
+    NTSTATUS ret;
ab1ddb
+
ab1ddb
+    /* Check the versions we know about */
ab1ddb
+    for (v = 5; v <= 6; v++) {
ab1ddb
+        ret = smb_register_idmap(v, NULL, NULL);
ab1ddb
+        if (ret != NT_STATUS_OBJECT_TYPE_MISMATCH) {
ab1ddb
+            return v;
ab1ddb
+        }
ab1ddb
+    }
ab1ddb
+
ab1ddb
+    return -1;
ab1ddb
+}])],
ab1ddb
+            [AC_MSG_ERROR([idmap version test program is not expected to return 0])],
ab1ddb
+            [idmap_test_result=$?; AC_MSG_RESULT([idmap test result is: $idmap_test_result])]
ab1ddb
+        )
ab1ddb
+    fi
ab1ddb
+
ab1ddb
+    CFLAGS=$SAVE_CFLAGS
ab1ddb
+    LIBS=$SAVE_LIBS
ab1ddb
+
ab1ddb
+    if test $idmap_test_result -eq 5 -o $idmap_test_result -eq 6 ; then
ab1ddb
+        idmap_version=$idmap_test_result
ab1ddb
+    else
ab1ddb
+        AC_MSG_ERROR([Cannot determine Samba's idmap interface version, please use --with-smb-idmap-interface-version])
ab1ddb
+    fi
ab1ddb
+    AC_MSG_NOTICE([Samba's idmap interface version: $idmap_version])
ab1ddb
+    AC_DEFINE_UNQUOTED(SMB_IDMAP_INTERFACE_VERSION, $idmap_version,
ab1ddb
+                       [Detected version of Samba's idmap plugin interface])
ab1ddb
 fi
ab1ddb
diff --git a/src/lib/winbind_idmap_sss/winbind_idmap_sss.c b/src/lib/winbind_idmap_sss/winbind_idmap_sss.c
ab1ddb
index 26f753708303f513e265de465e4d888f84e22b6a..ea5e727c3461524c3af84ea35c6ee032a5948ddf 100644
ab1ddb
--- a/src/lib/winbind_idmap_sss/winbind_idmap_sss.c
ab1ddb
+++ b/src/lib/winbind_idmap_sss/winbind_idmap_sss.c
ab1ddb
@@ -190,7 +190,13 @@ static struct idmap_methods sss_methods = {
ab1ddb
     .sids_to_unixids = idmap_sss_sids_to_unixids,
ab1ddb
 };
ab1ddb
 
ab1ddb
+#if SMB_IDMAP_INTERFACE_VERSION == 5
ab1ddb
 NTSTATUS idmap_sss_init(void)
ab1ddb
+#elif SMB_IDMAP_INTERFACE_VERSION == 6
ab1ddb
+NTSTATUS idmap_sss_init(TALLOC_CTX *ctx)
ab1ddb
+#else
ab1ddb
+#error Unexpected Samba idmpa inferface version
ab1ddb
+#endif
ab1ddb
 {
ab1ddb
     return smb_register_idmap(SMB_IDMAP_INTERFACE_VERSION, "sss", &sss_methods);
ab1ddb
 }
ab1ddb
diff --git a/src/lib/winbind_idmap_sss/winbind_idmap_sss.h b/src/lib/winbind_idmap_sss/winbind_idmap_sss.h
ab1ddb
index 0f27c8561a540b63fb365edb79867eb4eb8d6e21..868049ffff7bd788507bf02d61245ff254aca465 100644
ab1ddb
--- a/src/lib/winbind_idmap_sss/winbind_idmap_sss.h
ab1ddb
+++ b/src/lib/winbind_idmap_sss/winbind_idmap_sss.h
ab1ddb
@@ -32,6 +32,8 @@
ab1ddb
 #include <ndr.h>
ab1ddb
 #include <gen_ndr/security.h>
ab1ddb
 
ab1ddb
+#include "config.h"
ab1ddb
+
ab1ddb
 /* The following definitions are taken from the Samba header files
ab1ddb
  * - winbindd/idmap_proto.h
ab1ddb
  * - idmap.d
ab1ddb
@@ -64,7 +66,9 @@ struct id_map {
ab1ddb
     enum id_mapping status;
ab1ddb
 };
ab1ddb
 
ab1ddb
-#define SMB_IDMAP_INTERFACE_VERSION 5
ab1ddb
+#ifndef SMB_IDMAP_INTERFACE_VERSION
ab1ddb
+#error Missing Samba idmap interface version
ab1ddb
+#endif
ab1ddb
 
ab1ddb
 struct idmap_domain {
ab1ddb
     const char *name;
ab1ddb
-- 
ab1ddb
2.17.0
ab1ddb