mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
Add the pdb_plugin module from Jelmer Vernooij <jelmer@nl.linux.org>.
This allow the user to select
'passdb backend = plugin : /path/to/plugin.so : pluging args'
And load any arbitary plugin. Apparently Jelmer has a mysql plugin in the
works - hence this patch.
We probably need to rework the interface a bit before 3.0 (add versioning of
some kind) but this is a good start.
Andrew Bartlett
(This used to be commit d6d18b70f0
)
This commit is contained in:
parent
34b31b529e
commit
527aaf6def
@ -16,6 +16,7 @@ CPPFLAGS=@CPPFLAGS@
|
||||
LDFLAGS=@LDFLAGS@
|
||||
LDSHFLAGS=@LDSHFLAGS@ @LDFLAGS@ @CFLAGS@
|
||||
AWK=@AWK@
|
||||
DYNEXP=@DYNEXP@
|
||||
|
||||
TERMLDFLAGS=@TERMLDFLAGS@
|
||||
TERMLIBS=@TERMLIBS@
|
||||
@ -188,7 +189,7 @@ LOCKING_OBJ = locking/locking.o locking/brlock.o locking/posix.o
|
||||
|
||||
PASSDB_OBJ = passdb/passdb.o passdb/pdb_interface.o passdb/pdb_get_set.o \
|
||||
passdb/machine_sid.o passdb/pdb_smbpasswd.o \
|
||||
passdb/pdb_tdb.o passdb/pdb_ldap.o \
|
||||
passdb/pdb_tdb.o passdb/pdb_ldap.o passdb/pdb_plugin.o \
|
||||
passdb/pdb_nisplus.o
|
||||
|
||||
GROUPDB_OBJ = groupdb/mapping.o
|
||||
@ -556,7 +557,7 @@ bin/.dummy:
|
||||
|
||||
bin/smbd: $(SMBD_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(SMBD_OBJ) $(LDFLAGS) $(LIBS)
|
||||
@$(CC) $(FLAGS) -o $@ $(SMBD_OBJ) $(LDFLAGS) $(DYNEXP) $(LIBS)
|
||||
|
||||
bin/nmbd: $(NMBD_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@ -568,15 +569,15 @@ bin/wrepld: $(WREPL_OBJ) bin/.dummy
|
||||
|
||||
bin/swat: $(SWAT_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(SWAT_OBJ) $(LDFLAGS) $(LIBS)
|
||||
@$(CC) $(FLAGS) -o $@ $(SWAT_OBJ) $(LDFLAGS) $(DYNEXP) $(LIBS)
|
||||
|
||||
bin/rpcclient: $(RPCCLIENT_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(RPCCLIENT_OBJ) $(LDFLAGS) $(TERMLDFLAGS) $(TERMLIBS) $(LIBS)
|
||||
@$(CC) $(FLAGS) -o $@ $(RPCCLIENT_OBJ) $(LDFLAGS) $(DYNEXP) $(TERMLDFLAGS) $(TERMLIBS) $(LIBS)
|
||||
|
||||
bin/samsync: $(SAMSYNC_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(SAMSYNC_OBJ) $(LDFLAGS) $(LIBS)
|
||||
@$(CC) $(FLAGS) -o $@ $(SAMSYNC_OBJ) $(DYNEXP) $(LDFLAGS) $(LIBS)
|
||||
|
||||
bin/smbclient: $(CLIENT_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@ -584,7 +585,7 @@ bin/smbclient: $(CLIENT_OBJ) bin/.dummy
|
||||
|
||||
bin/net: $(NET_OBJ) bin/.dummy @BUILD_POPT@
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(NET_OBJ) $(LDFLAGS) $(LIBS) @BUILD_POPT@
|
||||
@$(CC) $(FLAGS) -o $@ $(NET_OBJ) $(DYNEXP) $(LDFLAGS) $(LIBS) @BUILD_POPT@
|
||||
|
||||
bin/smbspool: $(CUPS_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@ -624,11 +625,11 @@ bin/smbtree: $(SMBTREE_OBJ) bin/.dummy
|
||||
|
||||
bin/smbpasswd: $(SMBPASSWD_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(SMBPASSWD_OBJ) $(LDFLAGS) $(LIBS)
|
||||
@$(CC) $(FLAGS) -o $@ $(SMBPASSWD_OBJ) $(LDFLAGS) $(DYNEXP) $(LIBS)
|
||||
|
||||
bin/pdbedit: $(PDBEDIT_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(PDBEDIT_OBJ) $(LDFLAGS) $(LIBS)
|
||||
@$(CC) $(FLAGS) -o $@ $(PDBEDIT_OBJ) $(LDFLAGS) $(DYNEXP) $(LIBS)
|
||||
|
||||
bin/smbgroupedit: $(SMBGROUPEDIT_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@ -660,7 +661,7 @@ bin/msgtest: $(MSGTEST_OBJ) bin/.dummy
|
||||
|
||||
bin/smbcacls: $(SMBCACLS_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(SMBCACLS_OBJ) $(LDFLAGS) $(LIBS)
|
||||
@$(CC) $(FLAGS) -o $@ $(SMBCACLS_OBJ) $(DYNEXP) $(LDFLAGS) $(LIBS)
|
||||
|
||||
bin/locktest: $(LOCKTEST_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@ -676,7 +677,7 @@ bin/locktest2: $(LOCKTEST2_OBJ) bin/.dummy
|
||||
|
||||
bin/rpctorture: $(RPCTORTURE_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(RPCTORTURE_OBJ) $(LDFLAGS) $(LIBS)
|
||||
@$(CC) $(FLAGS) -o $@ $(RPCTORTURE_OBJ) $(DYNEXP) $(LDFLAGS) $(LIBS)
|
||||
|
||||
bin/debug2html: $(DEBUG2HTML_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@ -719,7 +720,7 @@ nsswitch/libnss_wins.so: $(NSS_OBJ)
|
||||
|
||||
bin/winbindd: $(WINBINDD_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(LINK) -o $@ $(WINBINDD_OBJ) $(LIBS)
|
||||
@$(LINK) -o $@ $(WINBINDD_OBJ) $(DYNEXP) $(LIBS)
|
||||
|
||||
nsswitch/libnss_winbind.so: $(WINBIND_NSS_PICOBJS)
|
||||
@echo "Linking $@"
|
||||
@ -737,7 +738,7 @@ bin/wbinfo: $(WBINFO_OBJ) $(PARAM_OBJ) $(LIB_OBJ) $(NOPROTO_OBJ) \
|
||||
|
||||
bin/pam_smbpass.@SHLIBEXT@: $(PAM_SMBPASS_PICOOBJ)
|
||||
@echo "Linking shared library $@"
|
||||
$(SHLD) $(LDSHFLAGS) -symbolic -o $@ $(PAM_SMBPASS_PICOOBJ) -lpam $(LIBS) -lc
|
||||
$(SHLD) $(LDSHFLAGS) -symbolic -o $@ $(PAM_SMBPASS_PICOOBJ) -lpam $(DYNEXP) $(LIBS) -lc
|
||||
|
||||
bin/libmsrpc.a: $(LIBMSRPC_PICOBJ)
|
||||
-$(AR) -rc $@ $(LIBMSRPC_PICOBJ)
|
||||
|
@ -84,6 +84,13 @@ esac
|
||||
|
||||
AC_VALIDATE_CACHE_SYSTEM_TYPE
|
||||
|
||||
DYNEXP=
|
||||
|
||||
# I'm sure gcc supports -rdynamic
|
||||
if test "$ac_cv_prog_gcc" = yes; then
|
||||
DYNEXP="-rdynamic"
|
||||
fi
|
||||
|
||||
#
|
||||
# Config CPPFLAG settings for strange OS's that must be set
|
||||
# before other tests.
|
||||
@ -91,6 +98,7 @@ AC_VALIDATE_CACHE_SYSTEM_TYPE
|
||||
case "$host_os" in
|
||||
# Try to work out if this is the native HPUX compiler that uses the -Ae flag.
|
||||
*hpux*)
|
||||
|
||||
AC_PROG_CC_FLAG(Ae)
|
||||
# mmap on HPUX is completely broken...
|
||||
AC_DEFINE(MMAP_BLACKLIST)
|
||||
@ -112,6 +120,7 @@ case "$host_os" in
|
||||
AC_DEFINE(USE_BOTH_CRYPT_CALLS)
|
||||
;;
|
||||
esac
|
||||
DYNEXP="-Wl,-E"
|
||||
;;
|
||||
|
||||
#
|
||||
@ -157,6 +166,7 @@ case "$host_os" in
|
||||
;;
|
||||
esac
|
||||
else
|
||||
DYNEXP="-dc -dp"
|
||||
CPPFLAGS="$CPPFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
|
||||
fi
|
||||
;;
|
||||
@ -342,7 +352,7 @@ if test x"$ac_cv_lib_cups_httpConnect" = x"yes"; then
|
||||
fi
|
||||
|
||||
############################################
|
||||
# we need libdl for PAM and the new VFS code
|
||||
# we need libdl for PAM, the password database plugins and the new VFS code
|
||||
AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl";
|
||||
AC_DEFINE(HAVE_LIBDL)])
|
||||
|
||||
@ -700,10 +710,12 @@ case "$host_os" in
|
||||
*linux*) AC_DEFINE(LINUX)
|
||||
BLDSHARED="true"
|
||||
LDSHFLAGS="-shared"
|
||||
DYNEXP="-Wl,--export-dynamic"
|
||||
PICFLAG="-fPIC"
|
||||
AC_DEFINE(STAT_ST_BLOCKSIZE,512)
|
||||
;;
|
||||
*solaris*) AC_DEFINE(SUNOS5)
|
||||
*solaris*)
|
||||
AC_DEFINE(SUNOS5)
|
||||
BLDSHARED="true"
|
||||
LDSHFLAGS="-h \$@ -G"
|
||||
if test "${ac_cv_prog_CC}" = "gcc"; then
|
||||
@ -716,6 +728,7 @@ case "$host_os" in
|
||||
AC_DEFINE(STAT_ST_BLOCKSIZE,512)
|
||||
;;
|
||||
*sunos*) AC_DEFINE(SUNOS4)
|
||||
# WL="-Qoption ld "
|
||||
BLDSHARED="true"
|
||||
LDSHFLAGS="-Wl,-h,\$@ -G"
|
||||
PICFLAG="-KPIC" # Is this correct for SunOS
|
||||
@ -755,15 +768,20 @@ case "$host_os" in
|
||||
LDSHFLAGS="-b -z +h \$@"
|
||||
PICFLAG="+z"
|
||||
fi
|
||||
DYNEXP="-Wl,-E"
|
||||
AC_DEFINE(STAT_ST_BLOCKSIZE,8192)
|
||||
;;
|
||||
*qnx*) AC_DEFINE(QNX);;
|
||||
*osf*) AC_DEFINE(OSF1)
|
||||
WL="-Wl,"
|
||||
BLDSHARED="true"
|
||||
LDSHFLAGS="-Wl,-soname,\$@ -shared"
|
||||
PICFLAG="-fPIC"
|
||||
;;
|
||||
*sco*) AC_DEFINE(SCO);;
|
||||
*sco*)
|
||||
DYNEXP="-Wl,-Bexport"
|
||||
AC_DEFINE(SCO)
|
||||
;;
|
||||
*unixware*) AC_DEFINE(UNIXWARE)
|
||||
BLDSHARED="true"
|
||||
LDSHFLAGS="-Wl,-soname,\$@ -shared"
|
||||
@ -777,17 +795,24 @@ case "$host_os" in
|
||||
AC_DEFINE(HAVE_MEMSET)
|
||||
fi
|
||||
LDSHFLAGS="-G"
|
||||
DYNEXP="-Bexport"
|
||||
;;
|
||||
*mips-sni-sysv4*) AC_DEFINE(RELIANTUNIX);;
|
||||
*mips-sni-sysv4*)
|
||||
AC_DEFINE(RELIANTUNIX)
|
||||
WL="-LD"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
*sysv5*)
|
||||
WL="-Wl,"
|
||||
if [ test "$GCC" != yes ]; then
|
||||
AC_DEFINE(HAVE_MEMSET)
|
||||
fi
|
||||
LDSHFLAGS="-G"
|
||||
;;
|
||||
esac
|
||||
AC_SUBST(DYNEXP)
|
||||
AC_MSG_RESULT($BLDSHARED)
|
||||
AC_MSG_CHECKING([linker flags for shared libraries])
|
||||
AC_MSG_RESULT([$LDSHFLAGS])
|
||||
|
@ -82,8 +82,11 @@ typedef struct pdb_methods
|
||||
|
||||
} PDB_METHODS;
|
||||
|
||||
typedef NTSTATUS (*pdb_init_function)(struct pdb_context *,
|
||||
struct pdb_methods **,
|
||||
const char *);
|
||||
|
||||
struct pdb_init_function {
|
||||
struct pdb_init_function_entry {
|
||||
char *name;
|
||||
/* Function to create a member of the authmethods list */
|
||||
NTSTATUS (*init)(struct pdb_context *pdb_context,
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
/** List of various built-in passdb modules */
|
||||
|
||||
const struct pdb_init_function builtin_pdb_init_functions[] = {
|
||||
const struct pdb_init_function_entry builtin_pdb_init_functions[] = {
|
||||
{ "smbpasswd", pdb_init_smbpasswd },
|
||||
{ "smbpasswd_nua", pdb_init_smbpasswd_nua },
|
||||
{ "tdbsam", pdb_init_tdbsam },
|
||||
@ -32,6 +32,7 @@ const struct pdb_init_function builtin_pdb_init_functions[] = {
|
||||
{ "nisplus", pdb_init_nisplus },
|
||||
{ "unix", pdb_init_unix },
|
||||
#endif
|
||||
{ "plugin", pdb_init_plugin },
|
||||
{ NULL, NULL}
|
||||
};
|
||||
|
||||
@ -198,7 +199,7 @@ NTSTATUS make_pdb_context_name(struct pdb_context **context, const char *selecte
|
||||
return nt_status;
|
||||
}
|
||||
|
||||
DEBUG(5,("Attempting to find an passdb backend to match %s\n", selected));
|
||||
DEBUG(5,("Attempting to find an passdb backend to match %s (%s)\n", selected, module_name));
|
||||
for (i = 0; builtin_pdb_init_functions[i].name; i++)
|
||||
{
|
||||
if (strequal(builtin_pdb_init_functions[i].name, module_name))
|
||||
@ -214,7 +215,7 @@ NTSTATUS make_pdb_context_name(struct pdb_context **context, const char *selecte
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!(*context)->pdb_selected) {
|
||||
DEBUG(0,("failed to select passdb backed!\n"));
|
||||
talloc_destroy((*context)->mem_ctx);
|
||||
|
72
source3/passdb/pdb_plugin.c
Normal file
72
source3/passdb/pdb_plugin.c
Normal file
@ -0,0 +1,72 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
Loadable passdb module interface.
|
||||
Copyright (C) Jelmer Vernooij 2002
|
||||
Copyright (C) Andrew Bartlett 2002
|
||||
Copyright (C) Andrew Bartlett 2002
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#ifdef HAVE_LIBDL
|
||||
|
||||
NTSTATUS pdb_init_plugin(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, const char *location)
|
||||
{
|
||||
void * dl_handle;
|
||||
char *plugin_location, *plugin_name, *p;
|
||||
pdb_init_function plugin_init;
|
||||
|
||||
if (location == NULL) {
|
||||
DEBUG(0, ("The plugin module needs an argument!\n"));
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
plugin_name = smb_xstrdup(location);
|
||||
p = strchr(plugin_name, ':');
|
||||
if (p) {
|
||||
*p = 0;
|
||||
plugin_location = p+1;
|
||||
trim_string(plugin_location, " ", " ");
|
||||
} else plugin_location = NULL;
|
||||
trim_string(plugin_name, " ", " ");
|
||||
|
||||
DEBUG(5, ("Trying to load sam plugin %s\n", plugin_name));
|
||||
dl_handle = sys_dlopen(plugin_name, RTLD_NOW | RTLD_GLOBAL );
|
||||
if (!dl_handle) {
|
||||
DEBUG(0, ("Failed to load sam plugin %s using sys_dlopen (%s)\n", plugin_name, sys_dlerror()));
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
plugin_init = sys_dlsym(dl_handle, "pdb_init");
|
||||
if (!plugin_init){
|
||||
DEBUG(0, ("Failed to find function 'pdb_init' using sys_dlsym in sam plugin %s (%s)\n", plugin_name, sys_dlerror()));
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
DEBUG(5, ("Starting sam plugin %s with location %s\n", plugin_name, plugin_location));
|
||||
return plugin_init(pdb_context, pdb_method, plugin_location);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NTSTATUS pdb_init_plugin(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, const char *location)
|
||||
{
|
||||
DEBUG(0, ("pdb_init_plugin: No libdl present - cannot use passdb loadable modules\n"));
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user