diff options
-rw-r--r-- | Makefile.am | 9 | ||||
-rw-r--r-- | Makefile.in | 46 | ||||
-rw-r--r-- | ldap/servers/plugins/Makefile | 6 | ||||
-rw-r--r-- | ldap/servers/plugins/dna/Makefile | 115 | ||||
-rwxr-xr-x | ldap/servers/plugins/dna/addentries.sh | 2 | ||||
-rwxr-xr-x | ldap/servers/plugins/dna/config.sh | 5 | ||||
-rw-r--r-- | ldap/servers/plugins/dna/del_test_entries.dns | 6 | ||||
-rwxr-xr-x | ldap/servers/plugins/dna/delentries.sh | 2 | ||||
-rw-r--r-- | ldap/servers/plugins/dna/dna.c | 1176 | ||||
-rw-r--r-- | ldap/servers/plugins/dna/dna.ldif | 54 | ||||
-rwxr-xr-x | ldap/servers/plugins/dna/editentries.sh | 2 | ||||
-rwxr-xr-x | ldap/servers/plugins/dna/oneentry.sh | 2 | ||||
-rw-r--r-- | ldap/servers/plugins/dna/posix.ldif | 67 | ||||
-rw-r--r-- | ldap/servers/plugins/dna/posix_one.ldif | 10 | ||||
-rw-r--r-- | ldap/servers/plugins/dna/posix_test.ldif | 58 | ||||
-rwxr-xr-x | ldap/servers/plugins/dna/seeconfig.sh | 2 | ||||
-rwxr-xr-x | ldap/servers/plugins/dna/seeentries.sh | 2 | ||||
-rw-r--r-- | ldap/servers/plugins/dna/subtest.ldif | 60 |
18 files changed, 1617 insertions, 7 deletions
diff --git a/Makefile.am b/Makefile.am index cb81c188..83586b25 100644 --- a/Makefile.am +++ b/Makefile.am @@ -78,7 +78,7 @@ serverplugin_LTLIBRARIES = libacl-plugin.la libattr-unique-plugin.la libchaining libpassthru-plugin.la libpresence-plugin.la libpwdstorage-plugin.la \ libreferint-plugin.la libreplication-plugin.la libretrocl-plugin.la \ libroles-plugin.la libstatechange-plugin.la libsyntax-plugin.la \ - libviews-plugin.la + libviews-plugin.la libdna-plugin.la nodist_property_DATA = ns-slapd.properties @@ -735,6 +735,13 @@ libviews_plugin_la_SOURCES = ldap/servers/plugins/views/views.c libviews_plugin_la_CPPFLAGS = $(PLUGIN_CPPFLAGS) +#------------------------ +# libdna-plugin +#------------------------ +libdna_plugin_la_SOURCES = ldap/servers/plugins/dna/dna.c + +libdna_plugin_la_CPPFLAGS = $(PLUGIN_CPPFLAGS) + #//////////////////////////////////////////////////////////////// # diff --git a/Makefile.in b/Makefile.in index 86d15b8a..757d5e86 100644 --- a/Makefile.in +++ b/Makefile.in @@ -233,6 +233,10 @@ libdistrib_plugin_la_LIBADD = am_libdistrib_plugin_la_OBJECTS = \ ldap/servers/plugins/distrib/libdistrib_plugin_la-distrib.lo libdistrib_plugin_la_OBJECTS = $(am_libdistrib_plugin_la_OBJECTS) +libdna_plugin_la_LIBADD = +am_libdna_plugin_la_OBJECTS = \ + ldap/servers/plugins/dna/libdna_plugin_la-dna.lo +libdna_plugin_la_OBJECTS = $(am_libdna_plugin_la_OBJECTS) libds_admin_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libds_admin_la_OBJECTS = \ @@ -697,7 +701,8 @@ SOURCES = $(libavl_a_SOURCES) $(libldaputil_a_SOURCES) \ $(libchainingdb_plugin_la_SOURCES) \ $(libcollation_plugin_la_SOURCES) $(libcos_plugin_la_SOURCES) \ $(libdes_plugin_la_SOURCES) $(libdistrib_plugin_la_SOURCES) \ - $(libds_admin_la_SOURCES) $(libhttp_client_plugin_la_SOURCES) \ + $(libdna_plugin_la_SOURCES) $(libds_admin_la_SOURCES) \ + $(libhttp_client_plugin_la_SOURCES) \ $(libns_dshttpd_la_SOURCES) \ $(libpam_passthru_plugin_la_SOURCES) \ $(libpassthru_plugin_la_SOURCES) \ @@ -721,7 +726,8 @@ DIST_SOURCES = $(libavl_a_SOURCES) $(libldaputil_a_SOURCES) \ $(libchainingdb_plugin_la_SOURCES) \ $(libcollation_plugin_la_SOURCES) $(libcos_plugin_la_SOURCES) \ $(libdes_plugin_la_SOURCES) $(libdistrib_plugin_la_SOURCES) \ - $(libds_admin_la_SOURCES) $(libhttp_client_plugin_la_SOURCES) \ + $(libdna_plugin_la_SOURCES) $(libds_admin_la_SOURCES) \ + $(libhttp_client_plugin_la_SOURCES) \ $(libns_dshttpd_la_SOURCES) \ $(libpam_passthru_plugin_la_SOURCES) \ $(libpassthru_plugin_la_SOURCES) \ @@ -960,7 +966,7 @@ serverplugin_LTLIBRARIES = libacl-plugin.la libattr-unique-plugin.la libchaining libpassthru-plugin.la libpresence-plugin.la libpwdstorage-plugin.la \ libreferint-plugin.la libreplication-plugin.la libretrocl-plugin.la \ libroles-plugin.la libstatechange-plugin.la libsyntax-plugin.la \ - libviews-plugin.la + libviews-plugin.la libdna-plugin.la nodist_property_DATA = ns-slapd.properties noinst_LIBRARIES = libavl.a libldaputil.a @@ -1599,6 +1605,12 @@ libsyntax_plugin_la_CPPFLAGS = $(PLUGIN_CPPFLAGS) libviews_plugin_la_SOURCES = ldap/servers/plugins/views/views.c libviews_plugin_la_CPPFLAGS = $(PLUGIN_CPPFLAGS) +#------------------------ +# libdna-plugin +#------------------------ +libdna_plugin_la_SOURCES = ldap/servers/plugins/dna/dna.c +libdna_plugin_la_CPPFLAGS = $(PLUGIN_CPPFLAGS) + #//////////////////////////////////////////////////////////////// # # Programs @@ -2324,6 +2336,17 @@ ldap/servers/plugins/distrib/libdistrib_plugin_la-distrib.lo: \ ldap/servers/plugins/distrib/$(DEPDIR)/$(am__dirstamp) libdistrib-plugin.la: $(libdistrib_plugin_la_OBJECTS) $(libdistrib_plugin_la_DEPENDENCIES) $(LINK) -rpath $(serverplugindir) $(libdistrib_plugin_la_LDFLAGS) $(libdistrib_plugin_la_OBJECTS) $(libdistrib_plugin_la_LIBADD) $(LIBS) +ldap/servers/plugins/dna/$(am__dirstamp): + @$(mkdir_p) ldap/servers/plugins/dna + @: > ldap/servers/plugins/dna/$(am__dirstamp) +ldap/servers/plugins/dna/$(DEPDIR)/$(am__dirstamp): + @$(mkdir_p) ldap/servers/plugins/dna/$(DEPDIR) + @: > ldap/servers/plugins/dna/$(DEPDIR)/$(am__dirstamp) +ldap/servers/plugins/dna/libdna_plugin_la-dna.lo: \ + ldap/servers/plugins/dna/$(am__dirstamp) \ + ldap/servers/plugins/dna/$(DEPDIR)/$(am__dirstamp) +libdna-plugin.la: $(libdna_plugin_la_OBJECTS) $(libdna_plugin_la_DEPENDENCIES) + $(LINK) -rpath $(serverplugindir) $(libdna_plugin_la_LDFLAGS) $(libdna_plugin_la_OBJECTS) $(libdna_plugin_la_LIBADD) $(LIBS) ldap/admin/lib/$(am__dirstamp): @$(mkdir_p) ldap/admin/lib @: > ldap/admin/lib/$(am__dirstamp) @@ -3728,6 +3751,8 @@ mostlyclean-compile: -rm -f ldap/servers/plugins/cos/libcos_plugin_la-cos_cache.lo -rm -f ldap/servers/plugins/distrib/libdistrib_plugin_la-distrib.$(OBJEXT) -rm -f ldap/servers/plugins/distrib/libdistrib_plugin_la-distrib.lo + -rm -f ldap/servers/plugins/dna/libdna_plugin_la-dna.$(OBJEXT) + -rm -f ldap/servers/plugins/dna/libdna_plugin_la-dna.lo -rm -f ldap/servers/plugins/http/libhttp_client_plugin_la-http_client.$(OBJEXT) -rm -f ldap/servers/plugins/http/libhttp_client_plugin_la-http_client.lo -rm -f ldap/servers/plugins/http/libhttp_client_plugin_la-http_impl.$(OBJEXT) @@ -4482,6 +4507,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@ldap/servers/plugins/cos/$(DEPDIR)/libcos_plugin_la-cos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ldap/servers/plugins/cos/$(DEPDIR)/libcos_plugin_la-cos_cache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ldap/servers/plugins/distrib/$(DEPDIR)/libdistrib_plugin_la-distrib.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ldap/servers/plugins/dna/$(DEPDIR)/libdna_plugin_la-dna.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ldap/servers/plugins/http/$(DEPDIR)/libhttp_client_plugin_la-http_client.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ldap/servers/plugins/http/$(DEPDIR)/libhttp_client_plugin_la-http_impl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ldap/servers/plugins/pam_passthru/$(DEPDIR)/libpam_passthru_plugin_la-pam_ptconfig.Plo@am__quote@ @@ -5755,6 +5781,13 @@ ldap/servers/plugins/distrib/libdistrib_plugin_la-distrib.lo: ldap/servers/plugi @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdistrib_plugin_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ldap/servers/plugins/distrib/libdistrib_plugin_la-distrib.lo `test -f 'ldap/servers/plugins/distrib/distrib.c' || echo '$(srcdir)/'`ldap/servers/plugins/distrib/distrib.c +ldap/servers/plugins/dna/libdna_plugin_la-dna.lo: ldap/servers/plugins/dna/dna.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdna_plugin_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ldap/servers/plugins/dna/libdna_plugin_la-dna.lo -MD -MP -MF "ldap/servers/plugins/dna/$(DEPDIR)/libdna_plugin_la-dna.Tpo" -c -o ldap/servers/plugins/dna/libdna_plugin_la-dna.lo `test -f 'ldap/servers/plugins/dna/dna.c' || echo '$(srcdir)/'`ldap/servers/plugins/dna/dna.c; \ +@am__fastdepCC_TRUE@ then mv -f "ldap/servers/plugins/dna/$(DEPDIR)/libdna_plugin_la-dna.Tpo" "ldap/servers/plugins/dna/$(DEPDIR)/libdna_plugin_la-dna.Plo"; else rm -f "ldap/servers/plugins/dna/$(DEPDIR)/libdna_plugin_la-dna.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ldap/servers/plugins/dna/dna.c' object='ldap/servers/plugins/dna/libdna_plugin_la-dna.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libdna_plugin_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ldap/servers/plugins/dna/libdna_plugin_la-dna.lo `test -f 'ldap/servers/plugins/dna/dna.c' || echo '$(srcdir)/'`ldap/servers/plugins/dna/dna.c + ldap/admin/lib/libds_admin_la-dsalib_conf.lo: ldap/admin/lib/dsalib_conf.c @am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libds_admin_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ldap/admin/lib/libds_admin_la-dsalib_conf.lo -MD -MP -MF "ldap/admin/lib/$(DEPDIR)/libds_admin_la-dsalib_conf.Tpo" -c -o ldap/admin/lib/libds_admin_la-dsalib_conf.lo `test -f 'ldap/admin/lib/dsalib_conf.c' || echo '$(srcdir)/'`ldap/admin/lib/dsalib_conf.c; \ @am__fastdepCC_TRUE@ then mv -f "ldap/admin/lib/$(DEPDIR)/libds_admin_la-dsalib_conf.Tpo" "ldap/admin/lib/$(DEPDIR)/libds_admin_la-dsalib_conf.Plo"; else rm -f "ldap/admin/lib/$(DEPDIR)/libds_admin_la-dsalib_conf.Tpo"; exit 1; fi @@ -8514,6 +8547,7 @@ clean-libtool: -rm -rf ldap/servers/plugins/collation/.libs ldap/servers/plugins/collation/_libs -rm -rf ldap/servers/plugins/cos/.libs ldap/servers/plugins/cos/_libs -rm -rf ldap/servers/plugins/distrib/.libs ldap/servers/plugins/distrib/_libs + -rm -rf ldap/servers/plugins/dna/.libs ldap/servers/plugins/dna/_libs -rm -rf ldap/servers/plugins/http/.libs ldap/servers/plugins/http/_libs -rm -rf ldap/servers/plugins/pam_passthru/.libs ldap/servers/plugins/pam_passthru/_libs -rm -rf ldap/servers/plugins/passthru/.libs ldap/servers/plugins/passthru/_libs @@ -8831,6 +8865,8 @@ distclean-generic: -rm -f ldap/servers/plugins/cos/$(am__dirstamp) -rm -f ldap/servers/plugins/distrib/$(DEPDIR)/$(am__dirstamp) -rm -f ldap/servers/plugins/distrib/$(am__dirstamp) + -rm -f ldap/servers/plugins/dna/$(DEPDIR)/$(am__dirstamp) + -rm -f ldap/servers/plugins/dna/$(am__dirstamp) -rm -f ldap/servers/plugins/http/$(DEPDIR)/$(am__dirstamp) -rm -f ldap/servers/plugins/http/$(am__dirstamp) -rm -f ldap/servers/plugins/pam_passthru/$(DEPDIR)/$(am__dirstamp) @@ -8899,7 +8935,7 @@ clean-am: clean-binPROGRAMS clean-generic clean-libtool \ distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf ldap/admin/lib/$(DEPDIR) ldap/admin/src/$(DEPDIR) ldap/libraries/libavl/$(DEPDIR) ldap/servers/plugins/acl/$(DEPDIR) ldap/servers/plugins/chainingdb/$(DEPDIR) ldap/servers/plugins/collation/$(DEPDIR) ldap/servers/plugins/cos/$(DEPDIR) ldap/servers/plugins/distrib/$(DEPDIR) ldap/servers/plugins/http/$(DEPDIR) ldap/servers/plugins/pam_passthru/$(DEPDIR) ldap/servers/plugins/passthru/$(DEPDIR) ldap/servers/plugins/presence/$(DEPDIR) ldap/servers/plugins/pwdstorage/$(DEPDIR) ldap/servers/plugins/referint/$(DEPDIR) ldap/servers/plugins/replication/$(DEPDIR) ldap/servers/plugins/retrocl/$(DEPDIR) ldap/servers/plugins/rever/$(DEPDIR) ldap/servers/plugins/roles/$(DEPDIR) ldap/servers/plugins/shared/$(DEPDIR) ldap/servers/plugins/statechange/$(DEPDIR) ldap/servers/plugins/syntaxes/$(DEPDIR) ldap/servers/plugins/uiduniq/$(DEPDIR) ldap/servers/plugins/views/$(DEPDIR) ldap/servers/slapd/$(DEPDIR) ldap/servers/slapd/back-ldbm/$(DEPDIR) ldap/servers/slapd/tools/$(DEPDIR) ldap/servers/slapd/tools/ldclt/$(DEPDIR) ldap/servers/slapd/tools/rsearch/$(DEPDIR) ldap/servers/snmp/$(DEPDIR) ldap/systools/$(DEPDIR) lib/base/$(DEPDIR) lib/ldaputil/$(DEPDIR) lib/libaccess/$(DEPDIR) lib/libadmin/$(DEPDIR) lib/libsi18n/$(DEPDIR) + -rm -rf ldap/admin/lib/$(DEPDIR) ldap/admin/src/$(DEPDIR) ldap/libraries/libavl/$(DEPDIR) ldap/servers/plugins/acl/$(DEPDIR) ldap/servers/plugins/chainingdb/$(DEPDIR) ldap/servers/plugins/collation/$(DEPDIR) ldap/servers/plugins/cos/$(DEPDIR) ldap/servers/plugins/distrib/$(DEPDIR) ldap/servers/plugins/dna/$(DEPDIR) ldap/servers/plugins/http/$(DEPDIR) ldap/servers/plugins/pam_passthru/$(DEPDIR) ldap/servers/plugins/passthru/$(DEPDIR) ldap/servers/plugins/presence/$(DEPDIR) ldap/servers/plugins/pwdstorage/$(DEPDIR) ldap/servers/plugins/referint/$(DEPDIR) ldap/servers/plugins/replication/$(DEPDIR) ldap/servers/plugins/retrocl/$(DEPDIR) ldap/servers/plugins/rever/$(DEPDIR) ldap/servers/plugins/roles/$(DEPDIR) ldap/servers/plugins/shared/$(DEPDIR) ldap/servers/plugins/statechange/$(DEPDIR) ldap/servers/plugins/syntaxes/$(DEPDIR) ldap/servers/plugins/uiduniq/$(DEPDIR) ldap/servers/plugins/views/$(DEPDIR) ldap/servers/slapd/$(DEPDIR) ldap/servers/slapd/back-ldbm/$(DEPDIR) ldap/servers/slapd/tools/$(DEPDIR) ldap/servers/slapd/tools/ldclt/$(DEPDIR) ldap/servers/slapd/tools/rsearch/$(DEPDIR) ldap/servers/snmp/$(DEPDIR) ldap/systools/$(DEPDIR) lib/base/$(DEPDIR) lib/ldaputil/$(DEPDIR) lib/libaccess/$(DEPDIR) lib/libadmin/$(DEPDIR) lib/libsi18n/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags @@ -8931,7 +8967,7 @@ installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache - -rm -rf ldap/admin/lib/$(DEPDIR) ldap/admin/src/$(DEPDIR) ldap/libraries/libavl/$(DEPDIR) ldap/servers/plugins/acl/$(DEPDIR) ldap/servers/plugins/chainingdb/$(DEPDIR) ldap/servers/plugins/collation/$(DEPDIR) ldap/servers/plugins/cos/$(DEPDIR) ldap/servers/plugins/distrib/$(DEPDIR) ldap/servers/plugins/http/$(DEPDIR) ldap/servers/plugins/pam_passthru/$(DEPDIR) ldap/servers/plugins/passthru/$(DEPDIR) ldap/servers/plugins/presence/$(DEPDIR) ldap/servers/plugins/pwdstorage/$(DEPDIR) ldap/servers/plugins/referint/$(DEPDIR) ldap/servers/plugins/replication/$(DEPDIR) ldap/servers/plugins/retrocl/$(DEPDIR) ldap/servers/plugins/rever/$(DEPDIR) ldap/servers/plugins/roles/$(DEPDIR) ldap/servers/plugins/shared/$(DEPDIR) ldap/servers/plugins/statechange/$(DEPDIR) ldap/servers/plugins/syntaxes/$(DEPDIR) ldap/servers/plugins/uiduniq/$(DEPDIR) ldap/servers/plugins/views/$(DEPDIR) ldap/servers/slapd/$(DEPDIR) ldap/servers/slapd/back-ldbm/$(DEPDIR) ldap/servers/slapd/tools/$(DEPDIR) ldap/servers/slapd/tools/ldclt/$(DEPDIR) ldap/servers/slapd/tools/rsearch/$(DEPDIR) ldap/servers/snmp/$(DEPDIR) ldap/systools/$(DEPDIR) lib/base/$(DEPDIR) lib/ldaputil/$(DEPDIR) lib/libaccess/$(DEPDIR) lib/libadmin/$(DEPDIR) lib/libsi18n/$(DEPDIR) + -rm -rf ldap/admin/lib/$(DEPDIR) ldap/admin/src/$(DEPDIR) ldap/libraries/libavl/$(DEPDIR) ldap/servers/plugins/acl/$(DEPDIR) ldap/servers/plugins/chainingdb/$(DEPDIR) ldap/servers/plugins/collation/$(DEPDIR) ldap/servers/plugins/cos/$(DEPDIR) ldap/servers/plugins/distrib/$(DEPDIR) ldap/servers/plugins/dna/$(DEPDIR) ldap/servers/plugins/http/$(DEPDIR) ldap/servers/plugins/pam_passthru/$(DEPDIR) ldap/servers/plugins/passthru/$(DEPDIR) ldap/servers/plugins/presence/$(DEPDIR) ldap/servers/plugins/pwdstorage/$(DEPDIR) ldap/servers/plugins/referint/$(DEPDIR) ldap/servers/plugins/replication/$(DEPDIR) ldap/servers/plugins/retrocl/$(DEPDIR) ldap/servers/plugins/rever/$(DEPDIR) ldap/servers/plugins/roles/$(DEPDIR) ldap/servers/plugins/shared/$(DEPDIR) ldap/servers/plugins/statechange/$(DEPDIR) ldap/servers/plugins/syntaxes/$(DEPDIR) ldap/servers/plugins/uiduniq/$(DEPDIR) ldap/servers/plugins/views/$(DEPDIR) ldap/servers/slapd/$(DEPDIR) ldap/servers/slapd/back-ldbm/$(DEPDIR) ldap/servers/slapd/tools/$(DEPDIR) ldap/servers/slapd/tools/ldclt/$(DEPDIR) ldap/servers/slapd/tools/rsearch/$(DEPDIR) ldap/servers/snmp/$(DEPDIR) ldap/systools/$(DEPDIR) lib/base/$(DEPDIR) lib/ldaputil/$(DEPDIR) lib/libaccess/$(DEPDIR) lib/libadmin/$(DEPDIR) lib/libsi18n/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic diff --git a/ldap/servers/plugins/Makefile b/ldap/servers/plugins/Makefile index f8d6c297..ea32bc88 100644 --- a/ldap/servers/plugins/Makefile +++ b/ldap/servers/plugins/Makefile @@ -50,7 +50,7 @@ NOSTDSTRIP=true # don't let nsconfig.mk define target strip include $(BUILD_ROOT)/nsconfig.mk include $(LDAP_SRC)/nsldap.mk -PLUGINS = _referint _collation _syntaxes _passthru _utils _uiduniq _roles _acl _replication _cos _pwdstorage _rever _chainingdb _distrib _retrocl _statechange _http _views +PLUGINS = _referint _collation _syntaxes _passthru _utils _uiduniq _roles _acl _replication _cos _pwdstorage _rever _chainingdb _distrib _retrocl _statechange _http _views _dna ifneq ($(ARCH), WINNT) ifneq ($(BRAND), redhat) PLUGINS += _pam_passthru @@ -121,6 +121,9 @@ _presence: _views: cd views; $(MAKE) $(MFLAGS) all +_dna: + cd dna; $(MAKE) $(MFLAGS) all + clean: cd rever; $(MAKE) $(MFLAGS) clean cd referint; $(MAKE) $(MFLAGS) clean @@ -144,5 +147,6 @@ endif cd http; $(MAKE) $(MFLAGS) clean cd views; $(MAKE) $(MFLAGS) clean #cd presence; $(MAKE) $(MFLAGS) clean + cd dna; $(MAKE) $(MFLAGS) clean veryclean: clean diff --git a/ldap/servers/plugins/dna/Makefile b/ldap/servers/plugins/dna/Makefile new file mode 100644 index 00000000..bacc3f0f --- /dev/null +++ b/ldap/servers/plugins/dna/Makefile @@ -0,0 +1,115 @@ +# +# BEGIN COPYRIGHT BLOCK +# 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; version 2 of the License. +# +# 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., 59 Temple +# Place, Suite 330, Boston, MA 02111-1307 USA. +# +# In addition, as a special exception, Red Hat, Inc. gives You the additional +# right to link the code of this Program with code not covered under the GNU +# General Public License ("Non-GPL Code") and to distribute linked combinations +# including the two, subject to the limitations in this paragraph. Non-GPL Code +# permitted under this exception must only link to the code of this Program +# through those well defined interfaces identified in the file named EXCEPTION +# found in the source code files (the "Approved Interfaces"). The files of +# Non-GPL Code may instantiate templates or use macros or inline functions from +# the Approved Interfaces without causing the resulting work to be covered by +# the GNU General Public License. Only Red Hat, Inc. may make changes or +# additions to the list of Approved Interfaces. You must obey the GNU General +# Public License in all respects for all of the Program code and other code used +# in conjunction with the Program except the Non-GPL Code covered by this +# exception. If you modify this file, you may extend this exception to your +# version of the file, but you are not obligated to do so. If you do not wish to +# provide this exception without modification, you must delete this exception +# statement from your version and license this file solely under the GPL without +# exception. +# +# +# Copyright (C) 2007 Red Hat, Inc. +# All rights reserved. +# END COPYRIGHT BLOCK +# +LDAP_SRC = ../../.. +BUILD_ROOT = ../../../.. + +NOSTDCLEAN=true # don't let nsconfig.mk define target clean +NOSTDSTRIP=true # don't let nsconfig.mk define target strip + +OBJDEST = $(OBJDIR)/lib/libdna +LIBDIR = $(LDAP_PLUGIN_RELDIR) + +include $(BUILD_ROOT)/nsdefs.mk +include $(BUILD_ROOT)/nsconfig.mk +include $(LDAP_SRC)/nsldap.mk + +ifeq ($(ARCH), WINNT) +DEF_FILE:=./dna.def +endif + +DNA_OBJS = dna.o +OBJS = $(addprefix $(OBJDEST)/, $(DNA_OBJS)) + +DNA_DLL = libdna-plugin + +INCLUDES += -I../http -I../../slapd -I../../../include +CFLAGS+=$(SLCFLAGS) -DSLAPD_LOGGING + +ifeq ($(ARCH), WINNT) +EXTRA_LIBS_DEP += $(LIBSLAPD) $(NSPR_DEP) $(LDAPSDK_DEP) +EXTRA_LIBS_DEP += $(LDAP_COMMON_LIBS_DEP) +EXTRA_LIBS += $(NSPRLINK) $(LIBSLAPD) $(LDAP_SDK_LIBLDAP_DLL) +EXTRA_LIBS += $(LDAP_COMMON_LIBS) +DNA_DLL_OBJ = $(addprefix $(OBJDEST)/, dllmain.o) +endif + +ifeq ($(ARCH), AIX) +EXTRA_LIBS_DEP += $(LIBSLAPD) $(NSPR_DEP) $(LDAPSDK_DEP) +EXTRA_LIBS_DEP += $(LDAP_COMMON_LIBS_DEP) +EXTRA_LIBS += $(LIBSLAPDLINK) $(NSPRLINK) $(LDAP_SDK_LIBLDAP_DLL) +EXTRA_LIBS += $(LDAP_COMMON_LIBS) +LD=ld +endif + +ifeq ($(ARCH), HPUX) +EXTRA_LIBS_DEP += $(LIBSLAPD_DEP) $(LDAPSDK_DEP) $(NSPR_DEP) $(SECURITY_DEP) +EXTRA_LIBS_DEP += $(LDAP_COMMON_LIBS_DEP) +EXTRA_LIBS += $(LDAPLINK) $(SECURITYLINK) $(NSPRLINK) $(ICULINK) +EXTRA_LIBS += $(LDAP_COMMON_LIBS) +endif + +DNA= $(addprefix $(LIBDIR)/, $(DNA_DLL).$(DLL_SUFFIX)) + +clientSDK: + +all: $(OBJDEST) $(LIBDIR) $(DNA) + +ifeq ($(ARCH), WINNT) +$(DNA): $(OBJS) $(DNA_DLL_OBJ) $(DEF_FILE) + $(LINK_DLL) $(DNA_DLL_OBJ) $(EXTRA_LIBS) /DEF:$(DEF_FILE) +else +$(DNA): $(OBJS) $(DNA_DLL_OBJ) + $(LINK_DLL) $(DNA_DLL_OBJ) $(EXTRA_LIBS) +endif + + +veryclean: clean + +clean: + $(RM) $(OBJS) +ifeq ($(ARCH), WINNT) + $(RM) $(DNA_DLL_OBJ) +endif + $(RM) $(DNA) + +$(OBJDEST): + $(MKDIR) $(OBJDEST) + +$(LIBDIR): + $(MKDIR) $(LIBDIR) diff --git a/ldap/servers/plugins/dna/addentries.sh b/ldap/servers/plugins/dna/addentries.sh new file mode 100755 index 00000000..97f42b76 --- /dev/null +++ b/ldap/servers/plugins/dna/addentries.sh @@ -0,0 +1,2 @@ +#!/bin/sh +ldapadd -x -D "cn=Directory Manager" -w secret123 -h localhost -p 3389 -f posix_test.ldif -c diff --git a/ldap/servers/plugins/dna/config.sh b/ldap/servers/plugins/dna/config.sh new file mode 100755 index 00000000..ed9a0f2c --- /dev/null +++ b/ldap/servers/plugins/dna/config.sh @@ -0,0 +1,5 @@ +#!/bin/sh +ldapadd -x -D "cn=Directory Manager" -w secret123 -h localhost -p 3389 -f dna.ldif -c +ldapadd -x -D "cn=Directory Manager" -w secret123 -h localhost -p 3389 -f posix.ldif -c +ldapadd -x -D "cn=Directory Manager" -w secret123 -h localhost -p 3389 -f subtest.ldif -c + diff --git a/ldap/servers/plugins/dna/del_test_entries.dns b/ldap/servers/plugins/dna/del_test_entries.dns new file mode 100644 index 00000000..db3325e1 --- /dev/null +++ b/ldap/servers/plugins/dna/del_test_entries.dns @@ -0,0 +1,6 @@ +uid=add_has_magic_number, dc=example, dc=com +uid=add_second_has_magic_number, dc=example, dc=com +uid=no_uid_number, dc=example, dc=com +uid=add_has_uid_number_550, dc=example, dc=com +uid=add_is_sub, ou=sub, dc=example, dc=com +ou=sub, dc=example, dc=com diff --git a/ldap/servers/plugins/dna/delentries.sh b/ldap/servers/plugins/dna/delentries.sh new file mode 100755 index 00000000..f58f7af1 --- /dev/null +++ b/ldap/servers/plugins/dna/delentries.sh @@ -0,0 +1,2 @@ +#!/bin/sh +ldapdelete -x -D "cn=Directory Manager" -w secret123 -h localhost -p 3389 -f del_test_entries.dns -c diff --git a/ldap/servers/plugins/dna/dna.c b/ldap/servers/plugins/dna/dna.c new file mode 100644 index 00000000..6187c83a --- /dev/null +++ b/ldap/servers/plugins/dna/dna.c @@ -0,0 +1,1176 @@ +/** BEGIN COPYRIGHT BLOCK + * 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; version 2 of the License. + * + * 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., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA. + * + * In addition, as a special exception, Red Hat, Inc. gives You the additional + * right to link the code of this Program with code not covered under the GNU + * General Public License ("Non-GPL Code") and to distribute linked combinations + * including the two, subject to the limitations in this paragraph. Non-GPL Code + * permitted under this exception must only link to the code of this Program + * through those well defined interfaces identified in the file named EXCEPTION + * found in the source code files (the "Approved Interfaces"). The files of + * Non-GPL Code may instantiate templates or use macros or inline functions from + * the Approved Interfaces without causing the resulting work to be covered by + * the GNU General Public License. Only Red Hat, Inc. may make changes or + * additions to the list of Approved Interfaces. You must obey the GNU General + * Public License in all respects for all of the Program code and other code used + * in conjunction with the Program except the Non-GPL Code covered by this + * exception. If you modify this file, you may extend this exception to your + * version of the file, but you are not obligated to do so. If you do not wish to + * provide this exception without modification, you must delete this exception + * statement from your version and license this file solely under the GPL without + * exception. + * + * + * Copyright (C) 2007 Red Hat, Inc. + * All rights reserved. + * END COPYRIGHT BLOCK **/ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +/** + * Distributed Numeric Assignment plug-in + */ +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include "portable.h" +#include "nspr.h" +#include "slapi-private.h" +#include "dirlite_strings.h" +#include "dirver.h" +#include "prclist.h" +#include "ldif.h" + +/* get file mode flags for unix */ +#ifndef _WIN32 +#include <sys/stat.h> +#endif + +#define DNA_PLUGIN_SUBSYSTEM "dna-plugin" +#define DNA_PLUGIN_VERSION 0x00010000 + +#define DNA_DN "cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config" /* temporary */ + +#define DNA_SUCCESS 0 +#define DNA_FAILURE -1 + +/** + * DNA config types + */ +#define DNA_TYPE "dnaType" +#define DNA_PREFIX "dnaPrefix" +#define DNA_NEXTVAL "dnaNextValue" +#define DNA_INTERVAL "dnaInterval" +#define DNA_GENERATE "dnaMagicRegen" +#define DNA_FILTER "dnaFilter" +#define DNA_SCOPE "dnaScope" + +#define FEATURE_DESC "Distributed Numeric Assignment" +#define PLUGIN_DESC "Distributed Numeric Assignment plugin" + +static Slapi_PluginDesc pdesc = { FEATURE_DESC, + PLUGIN_MAGIC_VENDOR_STR, + PRODUCTTEXT, + PLUGIN_DESC }; + + +/** + * linked list of config entries + */ + +struct _defs { + PRCList list; + char *dn; + char *type; + char *prefix; + unsigned long nextval; + unsigned long interval; + struct slapi_filter *filter; + char *generate; + char *scope; +} dna_anchor; +typedef struct _defs configEntry; +static PRCList *config; +static PRRWLock *g_dna_cache_lock; + +static void *_PluginID = NULL; +static char *_PluginDN = NULL; + + +/* + * new value lock + */ +static Slapi_Mutex *g_new_value_lock; + +/** + * + * DNA plug-in management functions + * + */ +int dna_init(Slapi_PBlock *pb); +static int dna_start(Slapi_PBlock *pb); +static int dna_close(Slapi_PBlock *pb); +static int dna_postop_init(Slapi_PBlock *pb); + +/** + * + * Local operation functions + * + */ +static int loadPluginConfig(); +static int parseConfigEntry(Slapi_Entry *e); +static void deleteConfig(); +static void freeConfigEntry(configEntry **entry); + +/** + * + * helpers + * + */ +static char *dna_get_dn(Slapi_PBlock *pb); +static int dna_dn_is_config(char *dn); +static int dna_get_next_value(configEntry *config_entry, char **next_value_ret); + +/** + * + * the ops (where the real work is done) + * + */ +static int dna_config_check_post_op(Slapi_PBlock *pb); +static int dna_pre_op( Slapi_PBlock *pb, int modtype ); +static int dna_mod_pre_op( Slapi_PBlock *pb ); +static int dna_add_pre_op( Slapi_PBlock *pb ); + +/** + * debug functions - global, for the debugger + */ +void dnaDumpConfig(); +void dnaDumpConfigEntry(configEntry *); + +/** + * set the debug level + */ +#ifdef _WIN32 +int *module_ldap_debug = 0; + +void plugin_init_debug_level(int *level_ptr) +{ + module_ldap_debug = level_ptr; +} +#endif + +/** + * + * Deal with cache locking + * + */ +void dna_read_lock() +{ + PR_RWLock_Rlock(g_dna_cache_lock); +} + +void dna_write_lock() +{ + PR_RWLock_Wlock(g_dna_cache_lock); +} + +void dna_unlock() +{ + PR_RWLock_Unlock(g_dna_cache_lock); +} + +/** + * + * Get the dna plug-in version + * + */ +int dna_version() +{ + return DNA_PLUGIN_VERSION; +} + +/** + * Plugin identity mgmt + */ +void setPluginID(void * pluginID) +{ + _PluginID=pluginID; +} + +void * getPluginID() +{ + return _PluginID; +} + +void setPluginDN(char *pluginDN) +{ + _PluginDN = pluginDN; +} + +char * getPluginDN() +{ + return _PluginDN; +} + +/* + dna_init + ------------- + adds our callbacks to the list +*/ +int dna_init( Slapi_PBlock *pb ) +{ + int status = DNA_SUCCESS; + char * plugin_identity=NULL; + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_init\n"); + + /** + * Store the plugin identity for later use. + * Used for internal operations + */ + + slapi_pblock_get (pb, SLAPI_PLUGIN_IDENTITY, &plugin_identity); + PR_ASSERT (plugin_identity); + setPluginID(plugin_identity); + + if ( slapi_pblock_set( pb, SLAPI_PLUGIN_VERSION, + SLAPI_PLUGIN_VERSION_01 ) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_START_FN, + (void *) dna_start ) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_CLOSE_FN, + (void *) dna_close ) != 0 || + slapi_pblock_set( pb, SLAPI_PLUGIN_DESCRIPTION, + (void *)&pdesc ) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_PRE_MODIFY_FN, + (void *) dna_mod_pre_op ) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_PRE_ADD_FN, + (void *) dna_add_pre_op ) != 0 || + /* the config change checking post op */ + slapi_register_plugin( + "postoperation", /* op type */ + 1, /* Enabled */ + "dna_init", /* this function desc */ + dna_postop_init, /* init func for post op */ + PLUGIN_DESC, /* plugin desc */ + NULL, /* ? */ + plugin_identity /* access control */ + ) + ) + { + slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "dna_init: failed to register plugin\n" ); + status = DNA_FAILURE; + } + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_init\n"); + return status; +} + + +static int dna_postop_init(Slapi_PBlock *pb) +{ + int status = DNA_SUCCESS; + + if ( slapi_pblock_set( pb, SLAPI_PLUGIN_VERSION, + SLAPI_PLUGIN_VERSION_01 ) != 0 || + slapi_pblock_set( pb, SLAPI_PLUGIN_DESCRIPTION, + (void *)&pdesc ) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_POST_ADD_FN, + (void *) dna_config_check_post_op ) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_POST_MODRDN_FN, + (void *) dna_config_check_post_op ) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_POST_DELETE_FN, + (void *) dna_config_check_post_op ) != 0 || + slapi_pblock_set(pb, SLAPI_PLUGIN_POST_MODIFY_FN, + (void *) dna_config_check_post_op ) != 0 + ) + { + slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "dna_postop_init: failed to register plugin\n" ); + status = DNA_FAILURE; + } + + return status; +} + +/* + dna_start + -------------- + Kicks off the config cache. + It is called after dna_init. +*/ +static int dna_start( Slapi_PBlock *pb ) +{ + char * plugindn = NULL; + char * httpRootDir = NULL; + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_start\n"); + + config = &dna_anchor.list; + g_dna_cache_lock = PR_NewRWLock(PR_RWLOCK_RANK_NONE, "dna"); + g_new_value_lock = slapi_new_mutex(); + + if(!g_dna_cache_lock || !g_new_value_lock) + { + slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "dna_start: lock creation failed\n" ); + + return DNA_FAILURE; + } + + /** + * Get the plug-in target dn from the system + * and store it for future use. This should avoid + * hardcoding of DN's in the code. + */ + slapi_pblock_get(pb, SLAPI_TARGET_DN, &plugindn); + if (plugindn == NULL || strlen(plugindn) == 0) + { + slapi_log_error( SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM , + "dna_start: had to use hard coded config dn\n"); + plugindn = DNA_DN; + } + else + { + slapi_log_error( SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM , + "dna_start: config at %s\n", plugindn); + + } + + setPluginDN(plugindn); + + /** + * Load the config for our plug-in + */ + PR_INIT_CLIST(config); + if (loadPluginConfig() != DNA_SUCCESS) + { + slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "dna_start: unable to load plug-in configuration\n" ); + return DNA_FAILURE; + } + + slapi_log_error( SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM , "dna: ready for service\n"); + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_start\n"); + + return DNA_SUCCESS; +} + +/* + dna_close + -------------- + closes down the cache +*/ +static int dna_close( Slapi_PBlock *pb ) +{ + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_close\n"); + + deleteConfig(); + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_close\n"); + + return DNA_SUCCESS; +} + +/* + * config looks like this + * - cn=myplugin + * --- ou=posix + * ------ cn=accounts + * ------ cn=groups + * --- cn=samba + * --- cn=etc + * ------ cn=etc etc + */ +static int loadPluginConfig() +{ + int status = DNA_SUCCESS; + int result; + int i; + Slapi_PBlock *search_pb; + Slapi_Entry **entries = NULL; + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> loadPluginConfig\n"); + + dna_write_lock(); + deleteConfig(); + + search_pb = slapi_pblock_new(); + + slapi_search_internal_set_pb(search_pb, DNA_DN, LDAP_SCOPE_SUBTREE, + "objectclass=*", NULL, 0, NULL, NULL, getPluginID(), 0); + slapi_search_internal_pb(search_pb); + slapi_pblock_get(search_pb, SLAPI_PLUGIN_INTOP_RESULT, &result); + + if (status != DNA_SUCCESS) + { + status = DNA_SUCCESS; + goto cleanup; + } + + slapi_pblock_get(search_pb, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, &entries); + if (NULL == entries || entries[0] == NULL) + { + status = DNA_SUCCESS; + goto cleanup; + } + + for (i = 0; (entries[i] != NULL); i++) + { + status = parseConfigEntry(entries[i]); + } + +cleanup: + slapi_free_search_results_internal(search_pb); + slapi_pblock_destroy(search_pb); + dna_unlock(); + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- loadPluginConfig\n"); + + return status; +} + +static int parseConfigEntry(Slapi_Entry *e) +{ + char *key = NULL; + char *value = NULL; + configEntry *entry = NULL; + configEntry *config_entry = NULL; + Slapi_Attr *attr = NULL; + PRCList *list = NULL; + int entry_added = 0; + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> parseConfigEntry\n"); + + entry = (configEntry*) slapi_ch_calloc(1, sizeof(configEntry)); + if(0 == entry) + goto bail; + + value = slapi_entry_get_ndn(e); + if(value) { + entry->dn = strdup(value); + } + + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dn [%s] \n",entry->dn,0,0); + + value = slapi_entry_attr_get_charptr(e, DNA_TYPE); + if(value) { + entry->type = value; + } + else + goto bail; + + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaType [%s] \n",entry->type,0,0); + + value = slapi_entry_attr_get_charptr(e, DNA_NEXTVAL); + if (value) { + entry->nextval = strtoul(value,0,0); + slapi_ch_free_string(&value); + value = 0; + } + else + goto bail; + + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaNextValue [%d] \n",entry->nextval,0,0); + + value = slapi_entry_attr_get_charptr(e, DNA_PREFIX); + if (value) { + entry->prefix = value; + } + + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaPrefix [%s] \n",entry->prefix,0,0); + + value = slapi_entry_attr_get_charptr(e, DNA_INTERVAL); + if (value) { + entry->interval = strtoul(value,0,0); + slapi_ch_free_string(&value); + value = 0; + } + else + goto bail; + + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaInterval [%s] \n",value,0,0); + + value = slapi_entry_attr_get_charptr(e, DNA_GENERATE); + if (value) { + entry->generate = value; + } + + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaMagicRegen [%s] \n",entry->generate,0,0); + + value = slapi_entry_attr_get_charptr(e, DNA_FILTER); + if (value) { + entry->filter = slapi_str2filter(value); + } + else + goto bail; + + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaFilter [%s] \n",value,0,0); + + slapi_ch_free_string(&value); + value = 0; + + value = slapi_entry_attr_get_charptr(e, DNA_SCOPE); + if (value) { + char *canonical_dn = slapi_dn_normalize(value); + entry->scope = canonical_dn; + } + + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "----------> dnaScope [%s] \n",entry->scope,0,0); + + + /** + * Finally add the entry to the list + * we group by type then by filter + * and finally sort by dn length with longer dn's + * first - this allows the scope checking + * code to be simple and quick and + * cunningly linear + */ + if(!PR_CLIST_IS_EMPTY(config)) + { + list = PR_LIST_HEAD(config); + while(list != config) + { + config_entry = (configEntry*)list; + + if(slapi_attr_type_cmp(config_entry->type, entry->type,1)) + goto next; + + if(slapi_filter_compare(config_entry->filter, entry->filter)) + goto next; + + if(slapi_dn_issuffix(entry->scope,config_entry->scope)) + { + PR_INSERT_BEFORE(&(entry->list), list); + slapi_log_error( SLAPI_LOG_CONFIG, + DNA_PLUGIN_SUBSYSTEM , + "store [%s] before [%s] \n",entry->scope,config_entry->scope,0); + entry_added = 1; + break; + } + +next: + list = PR_NEXT_LINK (list); + + if(config == list) + { + /* add to tail */ + PR_INSERT_BEFORE(&(entry->list), list); + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "store [%s] at tail\n",entry->scope,0,0); + entry_added = 1; + break; + } + } + } + else + { + /* first entry */ + PR_INSERT_LINK(&(entry->list), config); + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , "store [%s] at head \n",entry->scope,0,0); + entry_added = 1; + } + +bail: + if(0 == entry_added) + { + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , + "config entry [%s] skipped\n",entry->dn,0,0); + freeConfigEntry(&entry); + } + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- parseConfigEntry\n"); + + return DNA_SUCCESS; +} + +static void freeConfigEntry(configEntry **entry) +{ + configEntry *e = *entry; + + if(e->dn) + { + slapi_log_error( SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM , + "freeing config entry [%s]\n",e->dn,0,0); + slapi_ch_free_string(&e->dn); + } + + if(e->type) + slapi_ch_free_string(&e->type); + + if(e->prefix) + slapi_ch_free_string(&e->prefix); + + if(e->filter) + slapi_filter_free(e->filter,1); + + if(e->generate) + slapi_ch_free_string(&e->generate); + + if(e->scope) + slapi_ch_free_string(&e->scope); + + slapi_ch_free((void**)entry); +} + +static void deleteConfigEntry(PRCList *entry) +{ + PR_REMOVE_LINK(entry); + freeConfigEntry((configEntry**)&entry); +} + +static void deleteConfig() +{ + PRCList *list; + + while(!PR_CLIST_IS_EMPTY(config)) + { + list = PR_LIST_HEAD(config); + deleteConfigEntry(list); + } + + return; +} + + +/**************************************************** + Helpers +****************************************************/ + +static char *dna_get_dn(Slapi_PBlock *pb) +{ + char *dn = 0; + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_get_dn\n"); + + if(slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn )) + { + slapi_log_error( SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, "dna_get_dn: failed to get dn of changed entry"); + goto bail; + } + +/* slapi_dn_normalize( dn ); +*/ +bail: + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_get_dn\n"); + + return dn; +} + +/* config check + matching config dn or a descendent reloads config +*/ +static int dna_dn_is_config(char *dn) +{ + int ret = 0; + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_is_config\n"); + + if(slapi_dn_issuffix(dn, getPluginDN())) + { + ret=1; + } + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_is_config\n"); + + return ret; +} + + +/**************************************************** + Functions that actually do things other + than config and startup +****************************************************/ + + +/* + * Perform ldap operationally atomic increment + * Return the next value to be assigned + * Method: + * 1. retrieve entry + * 2. remove current value, add new value in one operation + * 3. if failed, and less than 3 times, goto 1 + */ +static int dna_get_next_value(configEntry *config_entry, char **next_value_ret) +{ + int ret = LDAP_SUCCESS; + Slapi_DN *dn = 0; + char *attrlist[3]; + Slapi_Entry *e = 0; + int attempts = 0; + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_get_next_value\n"); + + /* get pre-requisites to search */ + dn = slapi_sdn_new_dn_byref(config_entry->dn); + attrlist[0] = DNA_NEXTVAL; + attrlist[1] = DNA_INTERVAL; + attrlist[2] = 0; + + + /* the operation is constructed such that race conditions + * to increment the value are detected and avoided - one wins, + * one loses - however, there is no need for the server to compete + * with itself so we lock here + */ + + slapi_lock_mutex(g_new_value_lock); + + while(attempts < 3 && LDAP_SUCCESS == ret) + { + attempts++; + + /* do update */ + if(e) + { + slapi_entry_free(e); + e = 0; + } + + ret = slapi_search_internal_get_entry( dn, attrlist, &e,getPluginID()); + if(LDAP_SUCCESS == ret) + { + char *old_value; + + old_value = slapi_entry_attr_get_charptr(e, DNA_NEXTVAL); + if(old_value) + { + LDAPMod mod_add; + LDAPMod mod_delete; + LDAPMod *mods[3]; + Slapi_PBlock *pb = slapi_pblock_new(); + char *delete_val[2]; + char *add_val[2]; + char new_value[16]; + char *interval = 0; + + mods[0] = &mod_delete; + mods[1] = &mod_add; + mods[2] = 0; + + if(0 == pb) + goto bail; + + interval = slapi_entry_attr_get_charptr(e, DNA_INTERVAL); + if(0 == interval) + { + slapi_pblock_destroy(pb); + slapi_ch_free_string(&old_value); + goto bail; + } + + /* perform increment */ + + sprintf(new_value, "%lu", + strtoul(interval,0,0) + + strtoul(old_value,0,0)); + + delete_val[0] = old_value; + delete_val[1] = 0; + + mod_delete.mod_op = LDAP_MOD_DELETE; + mod_delete.mod_type = DNA_NEXTVAL; + mod_delete.mod_values = delete_val; + + add_val[0] = new_value; + add_val[1] = 0; + + mod_add.mod_op = LDAP_MOD_ADD; + mod_add.mod_type = DNA_NEXTVAL; + mod_add.mod_values = add_val; + + + mods[0] = &mod_delete; + mods[1] = &mod_add; + mods[2] = 0; + + slapi_modify_internal_set_pb( + pb, config_entry->dn, + mods, 0, 0, + getPluginID(), 0); + + slapi_modify_internal_pb(pb); + + slapi_pblock_get(pb, + SLAPI_PLUGIN_INTOP_RESULT, + &ret); + + slapi_pblock_destroy(pb); + slapi_ch_free_string(&interval); + + if(LDAP_SUCCESS == ret) + { + *next_value_ret = old_value; + break; + } + else + { + slapi_ch_free_string(&old_value); + if(LDAP_NO_SUCH_ATTRIBUTE != ret) + { + /* not the result of a race + to change the value + */ + break; + } + else + /* we lost the race to mod + try again + */ + ret = LDAP_SUCCESS; + } + } + else + break; + } + else + break; + } + +bail: + + slapi_unlock_mutex(g_new_value_lock); + + if(dn) + slapi_sdn_free(&dn); + + if(e) + slapi_entry_free(e); + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_get_next_value\n"); + + return ret; +} + +/* for mods and adds: + where dn's are supplied, the closest in scope + is used as long as the type and filter + are identical - otherwise all matches count +*/ + +static int dna_pre_op(Slapi_PBlock *pb, int modtype) +{ + char *dn = 0; + PRCList *list = 0; + configEntry *config_entry = 0; + struct slapi_entry *e = 0; + char *last_type = 0; + char *value = 0; + int generate = 0; + Slapi_Mods *smods = 0; + Slapi_Mod *smod = 0; + LDAPMod **mods; + int free_entry = 0; + int ret = 0; + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_pre_op\n"); + + if(0 == (dn = dna_get_dn(pb))) + goto bail; + + if(dna_dn_is_config(dn)) + goto bail; + + if(LDAP_CHANGETYPE_ADD == modtype) + { + slapi_pblock_get( pb, SLAPI_ADD_ENTRY, &e); + } + else + { + /* xxxPAR: Ideally SLAPI_MODIFY_EXISTING_ENTRY should be + * available but it turns out that is only true if you are + * a dbm backend pre-op plugin - lucky dbm backend pre-op + * plugins. + * I think that is wrong since the entry is useful for filter + * tests and schema checks and this plugin shouldn't be limited + * to a single backend type, but I don't want that fight right + * now so we go get the entry here + * + slapi_pblock_get( pb, SLAPI_MODIFY_EXISTING_ENTRY, &e); + */ + Slapi_DN *tmp_dn = slapi_sdn_new_dn_byref(dn); + if(tmp_dn) + { + slapi_search_internal_get_entry( + tmp_dn, 0, &e,getPluginID()); + slapi_sdn_free(&tmp_dn); + free_entry = 1; + } + + /* grab the mods - we'll put them back later with + * our modifications appended + */ + slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &mods); + smods = slapi_mods_new(); + slapi_mods_init_passin(smods, mods); + } + + if(0 == e) + goto bailmod; + + dna_read_lock(); + + if(!PR_CLIST_IS_EMPTY(config)) + { + list = PR_LIST_HEAD(config); + + while(list != config && LDAP_SUCCESS == ret) + { + config_entry = (configEntry*)list; + + /* did we already service this type? */ + if(last_type) + { + if(!slapi_attr_type_cmp(config_entry->type, last_type,1)) + goto next; + } + + /* is the entry in scope? */ + if(config_entry->scope) + { + if(!slapi_dn_issuffix(dn, config_entry->scope)) + goto next; + } + + /* does the entry match the filter? */ + if(config_entry->filter) + { + if(LDAP_SUCCESS != slapi_vattr_filter_test(pb, + e, + config_entry->filter,0)) + goto next; + } + + + if(LDAP_CHANGETYPE_ADD == modtype) + { + /* does attribute contain the magic value + or is the type not there? + */ + value = slapi_entry_attr_get_charptr( + e, config_entry->type); + if((value && + !slapi_utf8casecmp( + config_entry->generate, + value)) || + 0 == value) + { + generate = 1; + } + } + else + { + /* check mods for magic value */ + Slapi_Mod *next_mod = slapi_mod_new(); + smod = slapi_mods_get_first_smod( + smods, + next_mod); + while(smod) + { + char *type = (char *) + slapi_mod_get_type(smod); + + if(slapi_attr_types_equivalent( + type, + config_entry->type)) + { + struct berval *bv = + slapi_mod_get_first_value( + smod); + int len = strlen( + config_entry-> + generate); + + + if(len == bv->bv_len) + { + if(!slapi_utf8ncasecmp( + bv->bv_val, + config_entry-> + generate, + len)) + + generate = 1; + break; + } + } + + slapi_mod_done(next_mod); + smod = slapi_mods_get_next_smod( + smods, + next_mod); + } + + slapi_mod_free(&next_mod); + } + + if(generate) + { + char *new_value; + int len; + + /* create the value to add */ + if(ret = dna_get_next_value(config_entry,&value)) + break; + + len = strlen(value) + 1; + if(config_entry->prefix) + { + len += strlen(config_entry->prefix); + } + + new_value = slapi_ch_malloc(len); + + if(config_entry->prefix) + { + strcpy(new_value, + config_entry->prefix); + strcat(new_value, value); + } + else + strcpy(new_value, value); + + /* do the mod */ + if(LDAP_CHANGETYPE_ADD == modtype) + { + /* add - add to entry */ + slapi_entry_attr_set_charptr( + e, + config_entry->type, + new_value); + } + else + { + /* mod - add to mods */ + slapi_mods_add_string( + smods, + LDAP_MOD_REPLACE, + config_entry->type, + new_value); + } + + /* free up */ + slapi_ch_free_string(&value); + slapi_ch_free_string(&new_value); + + /* make sure we don't generate for this + * type again + */ + if(LDAP_SUCCESS == ret) + { + last_type = config_entry->type; + } + + generate = 0; + } +next: + list = PR_NEXT_LINK (list); + } + } + + dna_unlock(); + +bailmod: + if(LDAP_CHANGETYPE_MODIFY == modtype) + { + /* these are the mods you made, really, + * I didn't change them, honest, just had a quick look + */ + mods = slapi_mods_get_ldapmods_passout(smods); + slapi_pblock_set( pb, SLAPI_MODIFY_MODS, mods); + slapi_mods_free(&smods); + } + +bail: + + if(free_entry && e) + slapi_entry_free(e); + + if(ret) + slapi_log_error( SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM , "dna_pre_op: operation failure [%d]\n", ret); + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_pre_op\n"); + + return ret; +} + + +static int dna_add_pre_op( Slapi_PBlock *pb ) +{ + return dna_pre_op(pb, LDAP_CHANGETYPE_ADD); +} + +static int dna_mod_pre_op( Slapi_PBlock *pb ) +{ + return dna_pre_op(pb, LDAP_CHANGETYPE_MODIFY); +} + +static int dna_config_check_post_op(Slapi_PBlock *pb) +{ + char *dn; + + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "--> dna_config_check_post_op\n"); + + if(dn = dna_get_dn(pb)) + { + if(dna_dn_is_config(dn)) + loadPluginConfig(); + } + +bail: + slapi_log_error( SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM , "<-- dna_config_check_post_op\n"); + + return 0; +} + +/**************************************************** + End of + Functions that actually do things other + than config and startup +****************************************************/ + +/** + * debug functions to print config + */ +void dnaDumpConfig() +{ + PRCList *list; + + dna_read_lock(); + + if(!PR_CLIST_IS_EMPTY(config)) + { + list = PR_LIST_HEAD(config); + while(list != config) + { + dnaDumpConfigEntry((configEntry*)list); + list = PR_NEXT_LINK (list); + } + } + + dna_unlock(); +} + + +void dnaDumpConfigEntry(configEntry *entry) +{ + printf("<- type --------------> %s\n", entry->type); + printf("<---- prefix ---------> %s\n", entry->prefix); + printf("<---- next value -----> %lu\n", entry->nextval); + printf("<---- interval -------> %lu\n", entry->interval); + printf("<---- filter ---------> %s\n", entry->filter); + printf("<---- generate flag --> %s\n", entry->generate); +} + + diff --git a/ldap/servers/plugins/dna/dna.ldif b/ldap/servers/plugins/dna/dna.ldif new file mode 100644 index 00000000..825e9c52 --- /dev/null +++ b/ldap/servers/plugins/dna/dna.ldif @@ -0,0 +1,54 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# 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; version 2 of the License. +# +# 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., 59 Temple +# Place, Suite 330, Boston, MA 02111-1307 USA. +# +# In addition, as a special exception, Red Hat, Inc. gives You the additional +# right to link the code of this Program with code not covered under the GNU +# General Public License ("Non-GPL Code") and to distribute linked combinations +# including the two, subject to the limitations in this paragraph. Non-GPL Code +# permitted under this exception must only link to the code of this Program +# through those well defined interfaces identified in the file named EXCEPTION +# found in the source code files (the "Approved Interfaces"). The files of +# Non-GPL Code may instantiate templates or use macros or inline functions from +# the Approved Interfaces without causing the resulting work to be covered by +# the GNU General Public License. Only Red Hat, Inc. may make changes or +# additions to the list of Approved Interfaces. You must obey the GNU General +# Public License in all respects for all of the Program code and other code used +# in conjunction with the Program except the Non-GPL Code covered by this +# exception. If you modify this file, you may extend this exception to your +# version of the file, but you are not obligated to do so. If you do not wish to +# provide this exception without modification, you must delete this exception +# statement from your version and license this file solely under the GPL without +# exception. +# +# +# Copyright (C) 2007 Red Hat, Inc. +# All rights reserved. +# --- END COPYRIGHT BLOCK --- + +# plugin configuration entry +dn: cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config +objectclass: top +objectclass: nsSlapdPlugin +objectclass: extensibleObject +objectclass: nsContainer +cn: Distributed Numeric Assignment Plugin +nsslapd-plugininitfunc: dna_init +nsslapd-plugintype: preoperation +nsslapd-pluginenabled: on +nsslapd-plugindescription: Distributed Numeric Assignment plugin +nsslapd-pluginvendor: Fedora Project +nsslapd-pluginVersion: 1.1 +nsslapd-pluginId: distributed-numeric-assignment +nsslapd-pluginPath: /home/prowley/srv/lib/fedora-ds/plugins/libdna-plugin.so + + diff --git a/ldap/servers/plugins/dna/editentries.sh b/ldap/servers/plugins/dna/editentries.sh new file mode 100755 index 00000000..6e11892f --- /dev/null +++ b/ldap/servers/plugins/dna/editentries.sh @@ -0,0 +1,2 @@ +#!/bin/sh +ldapvi -D "cn=Directory Manager" -w secret123 -h localhost:3389 -b "dc=example, dc=com" "(objectclass=posixaccount)" diff --git a/ldap/servers/plugins/dna/oneentry.sh b/ldap/servers/plugins/dna/oneentry.sh new file mode 100755 index 00000000..a2150c4b --- /dev/null +++ b/ldap/servers/plugins/dna/oneentry.sh @@ -0,0 +1,2 @@ +#!/bin/sh +ldapadd -x -D "cn=Directory Manager" -w secret123 -h localhost -p 3389 -f posix_one.ldif -c diff --git a/ldap/servers/plugins/dna/posix.ldif b/ldap/servers/plugins/dna/posix.ldif new file mode 100644 index 00000000..2847b020 --- /dev/null +++ b/ldap/servers/plugins/dna/posix.ldif @@ -0,0 +1,67 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# 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; version 2 of the License. +# +# 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., 59 Temple +# Place, Suite 330, Boston, MA 02111-1307 USA. +# +# In addition, as a special exception, Red Hat, Inc. gives You the additional +# right to link the code of this Program with code not covered under the GNU +# General Public License ("Non-GPL Code") and to distribute linked combinations +# including the two, subject to the limitations in this paragraph. Non-GPL Code +# permitted under this exception must only link to the code of this Program +# through those well defined interfaces identified in the file named EXCEPTION +# found in the source code files (the "Approved Interfaces"). The files of +# Non-GPL Code may instantiate templates or use macros or inline functions from +# the Approved Interfaces without causing the resulting work to be covered by +# the GNU General Public License. Only Red Hat, Inc. may make changes or +# additions to the list of Approved Interfaces. You must obey the GNU General +# Public License in all respects for all of the Program code and other code used +# in conjunction with the Program except the Non-GPL Code covered by this +# exception. If you modify this file, you may extend this exception to your +# version of the file, but you are not obligated to do so. If you do not wish to +# provide this exception without modification, you must delete this exception +# statement from your version and license this file solely under the GPL without +# exception. +# +# +# Copyright (C) 2007 Red Hat, Inc. +# All rights reserved. +# --- END COPYRIGHT BLOCK --- + +# add plugin configuration for posix users + +dn: cn=Posix,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config +objectclass: top +objectclass: nsContainer +objectclass: extensibleObject +cn: Posix + +dn: cn=Accounts,cn=Posix,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config +objectclass: top +objectclass: extensibleObject +cn: Accounts +dnaType: uidNumber +dnaNextValue: 500 +dnaInterval: 4 +dnaMagicRegen: 499 +dnaFilter: (objectclass=posixAccount) + +# add plugin configuration for posix groups + +dn: cn=Groups,cn=Posix,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config +objectclass: top +objectclass: extensibleObject +cn: Groups +dnaType: gidNumber +dnaNextValue: 500 +dnaInterval: 4 +dnaMagicRegen: 499 +dnaFilter: (objectclass=posixGroup) + diff --git a/ldap/servers/plugins/dna/posix_one.ldif b/ldap/servers/plugins/dna/posix_one.ldif new file mode 100644 index 00000000..d89b5e41 --- /dev/null +++ b/ldap/servers/plugins/dna/posix_one.ldif @@ -0,0 +1,10 @@ +dn: uid=add_has_magic_number, dc=example, dc=com +objectclass: top +objectclass: organizationalperson +objectclass: posixaccount +cn: 1 +sn: test +uid: add_has_uid_number +uidNumber: 499 +gidNumber: 550 +homeDirectory: / diff --git a/ldap/servers/plugins/dna/posix_test.ldif b/ldap/servers/plugins/dna/posix_test.ldif new file mode 100644 index 00000000..29a415aa --- /dev/null +++ b/ldap/servers/plugins/dna/posix_test.ldif @@ -0,0 +1,58 @@ +dn: uid=add_has_magic_number, dc=example, dc=com +objectclass: top +objectclass: organizationalperson +objectclass: posixaccount +cn: 1 +sn: test +uid: add_has_uid_number +uidNumber: 499 +gidNumber: 550 +homeDirectory: / + +dn: uid=add_second_has_magic_number, dc=example, dc=com +objectclass: top +objectclass: organizationalperson +objectclass: posixaccount +cn: 2 +sn: test +uid: add_second_has_magic_number +uidNumber: 499 +gidNumber: 550 +homeDirectory: / + +dn: uid=no_uid_number, dc=example, dc=com +objectclass: top +objectclass: organizationalperson +objectclass: posixaccount +cn: 3 +sn: test +uid: no_uid_number +gidNumber: 550 +homeDirectory: / + +dn: uid=add_has_uid_number_550, dc=example, dc=com +objectclass: top +objectclass: organizationalperson +objectclass: posixaccount +cn: 4 +sn: test +uid: add_has_uid_number +uidNumber: 550 +gidNumber: 550 +homeDirectory: / + +dn: ou=sub, dc=example, dc=com +objectclass: top +objectclass: organizationalunit +ou: sub + +dn: uid=add_is_sub, ou=sub, dc=example, dc=com +objectclass: top +objectclass: organizationalperson +objectclass: posixaccount +cn: 4 +sn: test +uidNumber: 499 +gidNumber: 550 +homeDirectory: / + diff --git a/ldap/servers/plugins/dna/seeconfig.sh b/ldap/servers/plugins/dna/seeconfig.sh new file mode 100755 index 00000000..937ebcf2 --- /dev/null +++ b/ldap/servers/plugins/dna/seeconfig.sh @@ -0,0 +1,2 @@ +#!/bin/sh +ldapsearch -x -D "cn=Directory Manager" -w secret123 -h localhost -p 3389 -b "cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config" "(objectclass=*)" diff --git a/ldap/servers/plugins/dna/seeentries.sh b/ldap/servers/plugins/dna/seeentries.sh new file mode 100755 index 00000000..3b955fd4 --- /dev/null +++ b/ldap/servers/plugins/dna/seeentries.sh @@ -0,0 +1,2 @@ +#!/bin/sh +ldapsearch -x -D "cn=Directory Manager" -w secret123 -h localhost -p 3389 -b "dc=example, dc=com" "(objectclass=posixaccount)" diff --git a/ldap/servers/plugins/dna/subtest.ldif b/ldap/servers/plugins/dna/subtest.ldif new file mode 100644 index 00000000..e8894d41 --- /dev/null +++ b/ldap/servers/plugins/dna/subtest.ldif @@ -0,0 +1,60 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# 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; version 2 of the License. +# +# 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., 59 Temple +# Place, Suite 330, Boston, MA 02111-1307 USA. +# +# In addition, as a special exception, Red Hat, Inc. gives You the additional +# right to link the code of this Program with code not covered under the GNU +# General Public License ("Non-GPL Code") and to distribute linked combinations +# including the two, subject to the limitations in this paragraph. Non-GPL Code +# permitted under this exception must only link to the code of this Program +# through those well defined interfaces identified in the file named EXCEPTION +# found in the source code files (the "Approved Interfaces"). The files of +# Non-GPL Code may instantiate templates or use macros or inline functions from +# the Approved Interfaces without causing the resulting work to be covered by +# the GNU General Public License. Only Red Hat, Inc. may make changes or +# additions to the list of Approved Interfaces. You must obey the GNU General +# Public License in all respects for all of the Program code and other code used +# in conjunction with the Program except the Non-GPL Code covered by this +# exception. If you modify this file, you may extend this exception to your +# version of the file, but you are not obligated to do so. If you do not wish to +# provide this exception without modification, you must delete this exception +# statement from your version and license this file solely under the GPL without +# exception. +# +# +# Copyright (C) 2007 Red Hat, Inc. +# All rights reserved. +# --- END COPYRIGHT BLOCK --- + +# add Samba SIDs + +dn: cn=Example top level,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config +objectclass: top +objectclass: extensibleObject +dnaType: title +dnaPrefix: example- +dnaNextValue: 600 +dnaInterval: 4 +dnaMagicRegen: assign +dnaFilter: (objectclass=organizationalperson) +dnaScope: dc=example, dc=com + +dn: cn=Example sub level,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config +objectclass: top +objectclass: extensibleObject +dnaType: title +dnaPrefix: sub-example- +dnaNextValue: 600 +dnaInterval: 4 +dnaMagicRegen: assign +dnaFilter: (objectclass=organizationalperson) +dnaScope: ou=sub, dc=example, dc=com |