summaryrefslogtreecommitdiff
path: root/source4/ldap_server/ldap_backend.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2004-10-08 12:26:14 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:59:40 -0500
commit7a4478845f903fd7380d0d28c7187e7151fe3c3b (patch)
tree33445c5b1a1fb3a72ab89bf1fe054d6d6a20638a /source4/ldap_server/ldap_backend.c
parent2a1ee36e7f5b4b7ce654887011d9305f017ce08b (diff)
downloadsamba-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/ldap_backend.c')
-rw-r--r--source4/ldap_server/ldap_backend.c279
1 files changed, 279 insertions, 0 deletions
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);
+ }
+}