diff options
-rw-r--r-- | source4/ldap_server/config.mk | 5 | ||||
-rw-r--r-- | source4/ldap_server/ldap_rootdse.c | 10 | ||||
-rw-r--r-- | source4/ldap_server/ldap_server.c | 12 | ||||
-rw-r--r-- | source4/ldap_server/ldap_simple_ldb.c | 55 |
4 files changed, 72 insertions, 10 deletions
diff --git a/source4/ldap_server/config.mk b/source4/ldap_server/config.mk index f99e6f54ef..6204b3d361 100644 --- a/source4/ldap_server/config.mk +++ b/source4/ldap_server/config.mk @@ -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 ####################### diff --git a/source4/ldap_server/ldap_rootdse.c b/source4/ldap_server/ldap_rootdse.c index 75e641648b..b1d889e830 100644 --- a/source4/ldap_server/ldap_rootdse.c +++ b/source4/ldap_server/ldap_rootdse.c @@ -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; diff --git a/source4/ldap_server/ldap_server.c b/source4/ldap_server/ldap_server.c index 1db6c4f8fb..31376a7db2 100644 --- a/source4/ldap_server/ldap_server.c +++ b/source4/ldap_server/ldap_server.c @@ -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/source4/ldap_server/ldap_simple_ldb.c b/source4/ldap_server/ldap_simple_ldb.c new file mode 100644 index 0000000000..e7114c5a1c --- /dev/null +++ b/source4/ldap_server/ldap_simple_ldb.c @@ -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; +} |