diff options
author | Stefan Metzmacher <metze@samba.org> | 2004-10-08 12:26:14 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:59:40 -0500 |
commit | 7a4478845f903fd7380d0d28c7187e7151fe3c3b (patch) | |
tree | 33445c5b1a1fb3a72ab89bf1fe054d6d6a20638a /source4/ldap_server | |
parent | 2a1ee36e7f5b4b7ce654887011d9305f017ce08b (diff) | |
download | samba-7a4478845f903fd7380d0d28c7187e7151fe3c3b.tar.gz samba-7a4478845f903fd7380d0d28c7187e7151fe3c3b.tar.bz2 samba-7a4478845f903fd7380d0d28c7187e7151fe3c3b.zip |
r2863: move the logical ldapsrv functions to a seperate file
metze
(This used to be commit 5173c4d4fe78b2ca539e0b650745b63475d48e1d)
Diffstat (limited to 'source4/ldap_server')
-rw-r--r-- | source4/ldap_server/config.mk | 1 | ||||
-rw-r--r-- | source4/ldap_server/ldap_backend.c | 279 | ||||
-rw-r--r-- | source4/ldap_server/ldap_server.c | 257 |
3 files changed, 280 insertions, 257 deletions
diff --git a/source4/ldap_server/config.mk b/source4/ldap_server/config.mk index 019964b5e9..3631679bfa 100644 --- a/source4/ldap_server/config.mk +++ b/source4/ldap_server/config.mk @@ -5,6 +5,7 @@ [SUBSYSTEM::LDAP] INIT_OBJ_FILES = \ ldap_server/ldap_server.o \ + ldap_server/ldap_backend.o \ ldap_server/ldap_rootdse.o \ ldap_server/ldap_parse.o \ ldap_server/ldap_simple_ldb.o diff --git a/source4/ldap_server/ldap_backend.c b/source4/ldap_server/ldap_backend.c new file mode 100644 index 0000000000..7f733390c1 --- /dev/null +++ b/source4/ldap_server/ldap_backend.c @@ -0,0 +1,279 @@ +/* + Unix SMB/CIFS implementation. + LDAP server + 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" + + +struct ldapsrv_reply *ldapsrv_init_reply(struct ldapsrv_call *call, enum ldap_request_tag type) +{ + struct ldapsrv_reply *reply; + + reply = talloc_p(call, struct ldapsrv_reply); + if (!reply) { + return NULL; + } + + reply->prev = reply->next = NULL; + reply->state = LDAPSRV_REPLY_STATE_NEW; + reply->msg.messageid = call->request.messageid; + reply->msg.type = type; + reply->msg.mem_ctx = reply; + + return reply; +} + +NTSTATUS ldapsrv_queue_reply(struct ldapsrv_call *call, struct ldapsrv_reply *reply) +{ + DLIST_ADD_END(call->replies, reply, struct ldapsrv_reply *); + return NT_STATUS_OK; +} + +struct ldapsrv_partition *ldapsrv_get_partition(struct ldapsrv_connection *conn, const char *dn) +{ + if (strcasecmp("", dn) == 0) { + return conn->service->rootDSE; + } + + return conn->service->default_partition; +} + +NTSTATUS ldapsrv_unwilling(struct ldapsrv_call *call, int error) +{ + struct ldapsrv_reply *reply; + struct ldap_ExtendedResponse *r; + + DEBUG(10,("Unwilling type[%d] id[%d]\n", call->request.type, call->request.messageid)); + + reply = ldapsrv_init_reply(call, LDAP_TAG_ExtendedResponse); + if (!reply) { + return NT_STATUS_NO_MEMORY; + } + + r = &reply->msg.r.ExtendedResponse; + r->response.resultcode = error; + r->response.dn = NULL; + r->response.errormessage = NULL; + r->response.referral = NULL; + r->name = NULL; + r->value.data = NULL; + r->value.length = 0; + + return ldapsrv_queue_reply(call, reply); +} + +static NTSTATUS ldapsrv_BindRequest(struct ldapsrv_call *call) +{ + struct ldap_BindRequest *req = &call->request.r.BindRequest; + struct ldapsrv_reply *reply; + struct ldap_BindResponse *resp; + + DEBUG(10, ("BindRequest dn: %s\n",req->dn)); + + reply = ldapsrv_init_reply(call, LDAP_TAG_BindResponse); + if (!reply) { + return NT_STATUS_NO_MEMORY; + } + + resp = &reply->msg.r.BindResponse; + resp->response.resultcode = 0; + resp->response.dn = NULL; + resp->response.errormessage = NULL; + resp->response.referral = NULL; + resp->SASL.secblob = data_blob(NULL, 0); + + return ldapsrv_queue_reply(call, reply); +} + +static NTSTATUS ldapsrv_UnbindRequest(struct ldapsrv_call *call) +{ +/* struct ldap_UnbindRequest *req = &call->request->r.UnbindRequest;*/ + DEBUG(10, ("UnbindRequest\n")); + return NT_STATUS_OK; +} + +static NTSTATUS ldapsrv_SearchRequest(struct ldapsrv_call *call) +{ + struct ldap_SearchRequest *req = &call->request.r.SearchRequest; + struct ldapsrv_partition *part; + + DEBUG(10, ("SearchRequest")); + DEBUGADD(10, (" basedn: %s", req->basedn)); + DEBUGADD(10, (" filter: %s\n", req->filter)); + + part = ldapsrv_get_partition(call->conn, req->basedn); + + if (!part->ops->Search) { + struct ldap_Result *done; + struct ldapsrv_reply *done_r; + + done_r = ldapsrv_init_reply(call, LDAP_TAG_SearchResultDone); + if (!done_r) { + return NT_STATUS_NO_MEMORY; + } + + done = &done_r->msg.r.SearchResultDone; + done->resultcode = 53; + done->dn = NULL; + done->errormessage = NULL; + done->referral = NULL; + + return ldapsrv_queue_reply(call, done_r); + } + + return part->ops->Search(part, call, req); +} + +static NTSTATUS ldapsrv_ModifyRequest(struct ldapsrv_call *call) +{ + struct ldap_ModifyRequest *req = &call->request.r.ModifyRequest; + struct ldapsrv_partition *part; + + DEBUG(10, ("ModifyRequest")); + DEBUGADD(10, (" dn: %s", req->dn)); + + part = ldapsrv_get_partition(call->conn, req->dn); + + if (!part->ops->Modify) { + return ldapsrv_unwilling(call, 53); + } + + return part->ops->Modify(part, call, req); +} + +static NTSTATUS ldapsrv_AddRequest(struct ldapsrv_call *call) +{ + struct ldap_AddRequest *req = &call->request.r.AddRequest; + struct ldapsrv_partition *part; + + DEBUG(10, ("AddRequest")); + DEBUGADD(10, (" dn: %s", req->dn)); + + part = ldapsrv_get_partition(call->conn, req->dn); + + if (!part->ops->Add) { + return ldapsrv_unwilling(call, 53); + } + + return part->ops->Add(part, call, req); +} + +static NTSTATUS ldapsrv_DelRequest(struct ldapsrv_call *call) +{ + struct ldap_DelRequest *req = &call->request.r.DelRequest; + struct ldapsrv_partition *part; + + DEBUG(10, ("DelRequest")); + DEBUGADD(10, (" dn: %s", req->dn)); + + part = ldapsrv_get_partition(call->conn, req->dn); + + if (!part->ops->Del) { + return ldapsrv_unwilling(call, 53); + } + + return part->ops->Del(part, call, req); +} + +static NTSTATUS ldapsrv_ModifyDNRequest(struct ldapsrv_call *call) +{ + struct ldap_ModifyDNRequest *req = &call->request.r.ModifyDNRequest; + struct ldapsrv_partition *part; + + DEBUG(10, ("ModifyDNRequrest")); + DEBUGADD(10, (" dn: %s", req->dn)); + DEBUGADD(10, (" newrdn: %s", req->newrdn)); + + part = ldapsrv_get_partition(call->conn, req->dn); + + if (!part->ops->ModifyDN) { + return ldapsrv_unwilling(call, 53); + } + + return part->ops->ModifyDN(part, call, req); +} + +static NTSTATUS ldapsrv_CompareRequest(struct ldapsrv_call *call) +{ + struct ldap_CompareRequest *req = &call->request.r.CompareRequest; + struct ldapsrv_partition *part; + + DEBUG(10, ("CompareRequest")); + DEBUGADD(10, (" dn: %s", req->dn)); + + part = ldapsrv_get_partition(call->conn, req->dn); + + if (!part->ops->Compare) { + return ldapsrv_unwilling(call, 53); + } + + return part->ops->Compare(part, call, req); +} + +static NTSTATUS ldapsrv_AbandonRequest(struct ldapsrv_call *call) +{ +/* struct ldap_AbandonRequest *req = &call->request.r.AbandonRequest;*/ + DEBUG(10, ("AbandonRequest\n")); + return NT_STATUS_OK; +} + +static NTSTATUS ldapsrv_ExtendedRequest(struct ldapsrv_call *call) +{ +/* struct ldap_ExtendedRequest *req = &call->request.r.ExtendedRequest;*/ + struct ldapsrv_reply *reply; + + DEBUG(10, ("Extended\n")); + + reply = ldapsrv_init_reply(call, LDAP_TAG_ExtendedResponse); + if (!reply) { + return NT_STATUS_NO_MEMORY; + } + + ZERO_STRUCT(reply->msg.r); + + return ldapsrv_queue_reply(call, reply); +} + +NTSTATUS ldapsrv_do_call(struct ldapsrv_call *call) +{ + switch(call->request.type) { + case LDAP_TAG_BindRequest: + return ldapsrv_BindRequest(call); + case LDAP_TAG_UnbindRequest: + return ldapsrv_UnbindRequest(call); + case LDAP_TAG_SearchRequest: + return ldapsrv_SearchRequest(call); + case LDAP_TAG_ModifyRequest: + return ldapsrv_ModifyRequest(call); + case LDAP_TAG_AddRequest: + return ldapsrv_AddRequest(call); + case LDAP_TAG_DelRequest: + return ldapsrv_DelRequest(call); + case LDAP_TAG_ModifyDNRequest: + return ldapsrv_ModifyDNRequest(call); + case LDAP_TAG_CompareRequest: + return ldapsrv_CompareRequest(call); + case LDAP_TAG_AbandonRequest: + return ldapsrv_AbandonRequest(call); + case LDAP_TAG_ExtendedRequest: + return ldapsrv_ExtendedRequest(call); + default: + return ldapsrv_unwilling(call, 2); + } +} diff --git a/source4/ldap_server/ldap_server.c b/source4/ldap_server/ldap_server.c index 34a4fc59e1..2ce6b03762 100644 --- a/source4/ldap_server/ldap_server.c +++ b/source4/ldap_server/ldap_server.c @@ -380,263 +380,6 @@ static BOOL ldap_append_to_buf(struct ldap_message *msg, struct rw_buffer *buf) return res; } -struct ldapsrv_reply *ldapsrv_init_reply(struct ldapsrv_call *call, enum ldap_request_tag type) -{ - struct ldapsrv_reply *reply; - - reply = talloc_p(call, struct ldapsrv_reply); - if (!reply) { - return NULL; - } - - reply->prev = reply->next = NULL; - reply->state = LDAPSRV_REPLY_STATE_NEW; - reply->msg.messageid = call->request.messageid; - reply->msg.type = type; - reply->msg.mem_ctx = reply; - - return reply; -} - -NTSTATUS ldapsrv_queue_reply(struct ldapsrv_call *call, struct ldapsrv_reply *reply) -{ - DLIST_ADD_END(call->replies, reply, struct ldapsrv_reply *); - return NT_STATUS_OK; -} - -struct ldapsrv_partition *ldapsrv_get_partition(struct ldapsrv_connection *conn, const char *dn) -{ - if (strcasecmp("", dn) == 0) { - return conn->service->rootDSE; - } - - return conn->service->default_partition; -} - -NTSTATUS ldapsrv_unwilling(struct ldapsrv_call *call, int error) -{ - struct ldapsrv_reply *reply; - struct ldap_ExtendedResponse *r; - - DEBUG(10,("Unwilling type[%d] id[%d]\n", call->request.type, call->request.messageid)); - - reply = ldapsrv_init_reply(call, LDAP_TAG_ExtendedResponse); - if (!reply) { - return NT_STATUS_NO_MEMORY; - } - - r = &reply->msg.r.ExtendedResponse; - r->response.resultcode = error; - r->response.dn = NULL; - r->response.errormessage = NULL; - r->response.referral = NULL; - r->name = NULL; - r->value.data = NULL; - r->value.length = 0; - - return ldapsrv_queue_reply(call, reply); -} - -static NTSTATUS ldapsrv_BindRequest(struct ldapsrv_call *call) -{ - struct ldap_BindRequest *req = &call->request.r.BindRequest; - struct ldapsrv_reply *reply; - struct ldap_BindResponse *resp; - - DEBUG(10, ("BindRequest dn: %s\n",req->dn)); - - reply = ldapsrv_init_reply(call, LDAP_TAG_BindResponse); - if (!reply) { - return NT_STATUS_NO_MEMORY; - } - - resp = &reply->msg.r.BindResponse; - resp->response.resultcode = 0; - resp->response.dn = NULL; - resp->response.errormessage = NULL; - resp->response.referral = NULL; - resp->SASL.secblob = data_blob(NULL, 0); - - return ldapsrv_queue_reply(call, reply); -} - -static NTSTATUS ldapsrv_UnbindRequest(struct ldapsrv_call *call) -{ -/* struct ldap_UnbindRequest *req = &call->request->r.UnbindRequest;*/ - DEBUG(10, ("UnbindRequest\n")); - return NT_STATUS_OK; -} - -static NTSTATUS ldapsrv_SearchRequest(struct ldapsrv_call *call) -{ - struct ldap_SearchRequest *req = &call->request.r.SearchRequest; - struct ldapsrv_partition *part; - - DEBUG(10, ("SearchRequest")); - DEBUGADD(10, (" basedn: %s", req->basedn)); - DEBUGADD(10, (" filter: %s\n", req->filter)); - - part = ldapsrv_get_partition(call->conn, req->basedn); - - if (!part->ops->Search) { - struct ldap_Result *done; - struct ldapsrv_reply *done_r; - - done_r = ldapsrv_init_reply(call, LDAP_TAG_SearchResultDone); - if (!done_r) { - return NT_STATUS_NO_MEMORY; - } - - done = &done_r->msg.r.SearchResultDone; - done->resultcode = 53; - done->dn = NULL; - done->errormessage = NULL; - done->referral = NULL; - - return ldapsrv_queue_reply(call, done_r); - } - - return part->ops->Search(part, call, req); -} - -static NTSTATUS ldapsrv_ModifyRequest(struct ldapsrv_call *call) -{ - struct ldap_ModifyRequest *req = &call->request.r.ModifyRequest; - struct ldapsrv_partition *part; - - DEBUG(10, ("ModifyRequest")); - DEBUGADD(10, (" dn: %s", req->dn)); - - part = ldapsrv_get_partition(call->conn, req->dn); - - if (!part->ops->Modify) { - return ldapsrv_unwilling(call, 53); - } - - return part->ops->Modify(part, call, req); -} - -static NTSTATUS ldapsrv_AddRequest(struct ldapsrv_call *call) -{ - struct ldap_AddRequest *req = &call->request.r.AddRequest; - struct ldapsrv_partition *part; - - DEBUG(10, ("AddRequest")); - DEBUGADD(10, (" dn: %s", req->dn)); - - part = ldapsrv_get_partition(call->conn, req->dn); - - if (!part->ops->Add) { - return ldapsrv_unwilling(call, 53); - } - - return part->ops->Add(part, call, req); -} - -static NTSTATUS ldapsrv_DelRequest(struct ldapsrv_call *call) -{ - struct ldap_DelRequest *req = &call->request.r.DelRequest; - struct ldapsrv_partition *part; - - DEBUG(10, ("DelRequest")); - DEBUGADD(10, (" dn: %s", req->dn)); - - part = ldapsrv_get_partition(call->conn, req->dn); - - if (!part->ops->Del) { - return ldapsrv_unwilling(call, 53); - } - - return part->ops->Del(part, call, req); -} - -static NTSTATUS ldapsrv_ModifyDNRequest(struct ldapsrv_call *call) -{ - struct ldap_ModifyDNRequest *req = &call->request.r.ModifyDNRequest; - struct ldapsrv_partition *part; - - DEBUG(10, ("ModifyDNRequrest")); - DEBUGADD(10, (" dn: %s", req->dn)); - DEBUGADD(10, (" newrdn: %s", req->newrdn)); - - part = ldapsrv_get_partition(call->conn, req->dn); - - if (!part->ops->ModifyDN) { - return ldapsrv_unwilling(call, 53); - } - - return part->ops->ModifyDN(part, call, req); -} - -static NTSTATUS ldapsrv_CompareRequest(struct ldapsrv_call *call) -{ - struct ldap_CompareRequest *req = &call->request.r.CompareRequest; - struct ldapsrv_partition *part; - - DEBUG(10, ("CompareRequest")); - DEBUGADD(10, (" dn: %s", req->dn)); - - part = ldapsrv_get_partition(call->conn, req->dn); - - if (!part->ops->Compare) { - return ldapsrv_unwilling(call, 53); - } - - return part->ops->Compare(part, call, req); -} - -static NTSTATUS ldapsrv_AbandonRequest(struct ldapsrv_call *call) -{ -/* struct ldap_AbandonRequest *req = &call->request.r.AbandonRequest;*/ - DEBUG(10, ("AbandonRequest\n")); - return NT_STATUS_OK; -} - -static NTSTATUS ldapsrv_ExtendedRequest(struct ldapsrv_call *call) -{ -/* struct ldap_ExtendedRequest *req = &call->request.r.ExtendedRequest;*/ - struct ldapsrv_reply *reply; - - DEBUG(10, ("Extended\n")); - - reply = ldapsrv_init_reply(call, LDAP_TAG_ExtendedResponse); - if (!reply) { - return NT_STATUS_NO_MEMORY; - } - - ZERO_STRUCT(reply->msg.r); - - return ldapsrv_queue_reply(call, reply); -} - -static NTSTATUS ldapsrv_do_call(struct ldapsrv_call *call) -{ - switch(call->request.type) { - case LDAP_TAG_BindRequest: - return ldapsrv_BindRequest(call); - case LDAP_TAG_UnbindRequest: - return ldapsrv_UnbindRequest(call); - case LDAP_TAG_SearchRequest: - return ldapsrv_SearchRequest(call); - case LDAP_TAG_ModifyRequest: - return ldapsrv_ModifyRequest(call); - case LDAP_TAG_AddRequest: - return ldapsrv_AddRequest(call); - case LDAP_TAG_DelRequest: - return ldapsrv_DelRequest(call); - case LDAP_TAG_ModifyDNRequest: - return ldapsrv_ModifyDNRequest(call); - case LDAP_TAG_CompareRequest: - return ldapsrv_CompareRequest(call); - case LDAP_TAG_AbandonRequest: - return ldapsrv_AbandonRequest(call); - case LDAP_TAG_ExtendedRequest: - return ldapsrv_ExtendedRequest(call); - default: - return ldapsrv_unwilling(call, 2); - } -} - static NTSTATUS ldapsrv_do_responses(struct ldapsrv_connection *conn) { struct ldapsrv_call *call, *next_call = NULL; |