r2527: - add a dummy for a simple ldb backend
authorStefan Metzmacher <metze@samba.org>
Wed, 22 Sep 2004 14:16:42 +0000 (14:16 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:59:02 +0000 (12:59 -0500)
- handle the complete rootDSE search (maybe this will be also a partition module)

metze

source/ldap_server/config.mk
source/ldap_server/ldap_rootdse.c
source/ldap_server/ldap_server.c
source/ldap_server/ldap_simple_ldb.c [new file with mode: 0644]

index f99e6f54ef7791c83b376175c8ac6f322fb62acf..6204b3d361a2854a131bebafa6a8fa4ab1665958 100644 (file)
@@ -5,8 +5,9 @@
 [SUBSYSTEM::LDAP]
 INIT_OBJ_FILES = \
                ldap_server/ldap_server.o \
-               ldap_server/ldap_rootdse.o
+               ldap_server/ldap_rootdse.o \
+               ldap_server/ldap_simple_ldb.o
 REQUIRED_SUBSYSTEMS = \
-               LIBCLI_LDAP
+               LIBCLI_LDAP LIBLDB
 # End SUBSYSTEM SMB
 #######################
index 75e641648b17d15b53a9d620124e6e911a77bca3..b1d889e830de1a50021142eba9771cb3c3554f3a 100644 (file)
@@ -32,12 +32,18 @@ void ldapsrv_RootDSE_Search(struct ldapsrv_call *call,
 {
        struct ldap_SearchResEntry *ent;
        struct ldap_Result *done;
+       int code = 0;
        struct ldapsrv_reply *ent_r, *done_r;
        int num_attrs = 3;
        struct ldap_attribute *attrs;
 
        DEBUG(10, ("Root DSE: %s\n", r->filter));
 
+       if (r->scope != LDAP_SEARCH_SCOPE_BASE) {
+               code = 32; /* nosuchobject */
+               goto no_base_scope;
+       }
+
        attrs = talloc_array_p(call, struct ldap_attribute, num_attrs); 
        if (!attrs) {
                ldapsrv_terminate_connection(call->conn, "no memory");
@@ -233,6 +239,8 @@ void ldapsrv_RootDSE_Search(struct ldapsrv_call *call,
 
        ldapsrv_queue_reply(call, ent_r);
 
+no_base_scope:
+
        done_r = ldapsrv_init_reply(call, LDAP_TAG_SearchResultDone);
        if (!done_r) {
                ldapsrv_terminate_connection(call->conn, "ldapsrv_init_reply() failed");
@@ -240,7 +248,7 @@ void ldapsrv_RootDSE_Search(struct ldapsrv_call *call,
        }
 
        done = &done_r->msg.r.SearchResultDone;
-       done->resultcode = 0;
+       done->resultcode = code;
        done->dn = NULL;
        done->errormessage = NULL;
        done->referral = NULL;
index 1db6c4f8fbc0479da534a48c6c20e0f3b85725a3..31376a7db2285c67f9aa81b4fc3763ba459bf4fa 100644 (file)
@@ -198,10 +198,9 @@ void ldapsrv_queue_reply(struct ldapsrv_call *call, struct ldapsrv_reply *reply)
 
 struct ldapsrv_partition *ldapsrv_get_partition(struct ldapsrv_connection *conn, const char *dn)
 {
-       static const struct ldapsrv_partition_ops null_ops;
-       static struct ldapsrv_partition null_part = {
-               .ops = &null_ops
-       };
+       static struct ldapsrv_partition null_part;
+
+       null_part.ops = ldapsrv_get_sldb_partition_ops();
 
        return &null_part;
 }
@@ -270,11 +269,10 @@ static void ldapsrv_SearchRequest(struct ldapsrv_call *call)
        DEBUGADD(10, (" basedn: %s", req->basedn));
        DEBUGADD(10, (" filter: %s\n", req->filter));
 
-       if ((strcasecmp("", req->basedn) == 0) &&
-           (req->scope == LDAP_SEARCH_SCOPE_BASE)) {
+       if (strcasecmp("", req->basedn) == 0) {
                ldapsrv_RootDSE_Search(call, req);
                return;
-       } 
+       }
 
        part = ldapsrv_get_partition(call->conn, req->basedn);
 
diff --git a/source/ldap_server/ldap_simple_ldb.c b/source/ldap_server/ldap_simple_ldb.c
new file mode 100644 (file)
index 0000000..e7114c5
--- /dev/null
@@ -0,0 +1,55 @@
+/* 
+   Unix SMB/CIFS implementation.
+   LDAP server SIMPLE LDB implementation
+   Copyright (C) Stefan Metzmacher 2004
+   
+   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"
+
+static NTSTATUS sldb_Search(struct ldapsrv_partition *partition, struct ldapsrv_call *call,
+                                    struct ldap_SearchRequest *r)
+{
+       struct ldap_Result *done;
+       struct ldapsrv_reply *done_r;
+
+       DEBUG(0, ("sldb_Search: %s\n", r->filter));
+
+       done_r = ldapsrv_init_reply(call, LDAP_TAG_SearchResultDone);
+       if (!done_r) {
+               ldapsrv_terminate_connection(call->conn, "ldapsrv_init_reply() failed");
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       done = &done_r->msg.r.SearchResultDone;
+       done->resultcode = 32;
+       done->dn = NULL;
+       done->errormessage = NULL;
+       done->referral = NULL;
+
+       ldapsrv_queue_reply(call, done_r);
+
+       return NT_STATUS_OK;
+}
+
+static const struct ldapsrv_partition_ops sldb_ops = {
+       .Search         = sldb_Search
+};
+
+const struct ldapsrv_partition_ops *ldapsrv_get_sldb_partition_ops(void)
+{
+       return &sldb_ops;
+}