e17e10dcaafaf8da617d4cd08f98e26420a12b4c
[ira/wip.git] / source4 / lib / ldb / common / ldb.c
1 /*
2    ldb database library
3
4    Copyright (C) Andrew Tridgell  2004
5    Copyright (C) Simo Sorce  2005-2008
6
7      ** NOTE! The following LGPL license applies to the ldb
8      ** library. This does NOT imply that all of Samba is released
9      ** under the LGPL
10
11    This library is free software; you can redistribute it and/or
12    modify it under the terms of the GNU Lesser General Public
13    License as published by the Free Software Foundation; either
14    version 3 of the License, or (at your option) any later version.
15
16    This library is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19    Lesser General Public License for more details.
20
21    You should have received a copy of the GNU Lesser General Public
22    License along with this library; if not, see <http://www.gnu.org/licenses/>.
23 */
24
25 /*
26  *  Name: ldb
27  *
28  *  Component: ldb core API
29  *
30  *  Description: core API routines interfacing to ldb backends
31  *
32  *  Author: Andrew Tridgell
33  */
34
35 #include "ldb_private.h"
36
37 static int ldb_context_destructor(void *ptr)
38 {
39         struct ldb_context *ldb = talloc_get_type(ptr, struct ldb_context);
40
41         if (ldb->transaction_active) {
42                 ldb_debug(ldb, LDB_DEBUG_FATAL,
43                           "A transaction is still active in ldb context [%p]",
44                           ldb);
45         }
46
47         return 0;
48 }
49
50 /*
51   this is used to catch debug messages from events
52 */
53 static void ldb_tevent_debug(void *context, enum tevent_debug_level level,
54                              const char *fmt, va_list ap)  PRINTF_ATTRIBUTE(3,0);
55
56 static void ldb_tevent_debug(void *context, enum tevent_debug_level level,
57                              const char *fmt, va_list ap)
58 {
59         struct ldb_context = talloc_get_type_abort(context, struct ldb_context);
60         enum ldb_debug_level ldb_level = LDB_DEBUG_FATAL;
61         char *s = NULL;
62
63         switch (level) {
64         case TEVENT_DEBUG_FATAL:
65                 ldb_level = LDB_DEBUG_FATAL;
66                 break;
67         case TEVENT_DEBUG_ERROR:
68                 ldb_level = LDB_DEBUG_ERROR;
69                 break;
70         case TEVENT_DEBUG_WARNING:
71                 ldb_level = LDB_DEBUG_WARNING;
72                 break;
73         case TEVENT_DEBUG_TRACE:
74                 ldb_level = LDB_DEBUG_TRACE;
75                 break;
76         };
77
78         vasprintf(&s, fmt, ap);
79         if (!s) return;
80         ldb_debug(ldb, ldb_level, "tevent: %s", s);
81         free(s);
82 }
83
84 /*
85    initialise a ldb context
86    The mem_ctx is required
87    The event_ctx is required
88 */
89 struct ldb_context *ldb_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx)
90 {
91         struct ldb_context *ldb;
92         int ret;
93
94         ldb = talloc_zero(mem_ctx, struct ldb_context);
95         /* FIXME: Hack a new event context so that CMD line utilities work
96          * until we have them all converted */
97         if (ev_ctx == NULL) {
98                 ev_ctx = tevent_context_init(talloc_autofree_context());
99                 tevent_set_debug(ev_ctx, ldb_tevent_debug, ldb);
100         }
101
102         ret = ldb_setup_wellknown_attributes(ldb);
103         if (ret != 0) {
104                 talloc_free(ldb);
105                 return NULL;
106         }
107
108         ldb_set_utf8_default(ldb);
109         ldb_set_create_perms(ldb, 0666);
110         ldb_set_modules_dir(ldb, LDB_MODULESDIR);
111         ldb_set_event_context(ldb, ev_ctx);
112
113         /* TODO: get timeout from options if available there */
114         ldb->default_timeout = 300; /* set default to 5 minutes */
115
116         talloc_set_destructor((TALLOC_CTX *)ldb, ldb_context_destructor);
117
118         return ldb;
119 }
120
121 /*
122   try to autodetect a basedn if none specified. This fixes one of my
123   pet hates about ldapsearch, which is that you have to get a long,
124   complex basedn right to make any use of it.
125 */
126 void ldb_set_default_dns(struct ldb_context *ldb)
127 {
128         TALLOC_CTX *tmp_ctx;
129         int ret;
130         struct ldb_result *res;
131         struct ldb_dn *tmp_dn=NULL;
132         static const char *attrs[] = {
133                 "rootDomainNamingContext",
134                 "configurationNamingContext",
135                 "schemaNamingContext",
136                 "defaultNamingContext",
137                 NULL
138         };
139
140         tmp_ctx = talloc_new(ldb);
141         ret = ldb_search(ldb, tmp_ctx, &res, ldb_dn_new(tmp_ctx, ldb, NULL),
142                          LDB_SCOPE_BASE, attrs, "(objectClass=*)");
143         if (ret != LDB_SUCCESS) {
144                 talloc_free(tmp_ctx);
145                 return;
146         }
147
148         if (res->count != 1) {
149                 talloc_free(tmp_ctx);
150                 return;
151         }
152
153         if (!ldb_get_opaque(ldb, "rootDomainNamingContext")) {
154                 tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
155                                                  "rootDomainNamingContext");
156                 ldb_set_opaque(ldb, "rootDomainNamingContext", tmp_dn);
157         }
158
159         if (!ldb_get_opaque(ldb, "configurationNamingContext")) {
160                 tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
161                                                  "configurationNamingContext");
162                 ldb_set_opaque(ldb, "configurationNamingContext", tmp_dn);
163         }
164
165         if (!ldb_get_opaque(ldb, "schemaNamingContext")) {
166                 tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
167                                                  "schemaNamingContext");
168                 ldb_set_opaque(ldb, "schemaNamingContext", tmp_dn);
169         }
170
171         if (!ldb_get_opaque(ldb, "defaultNamingContext")) {
172                 tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
173                                                  "defaultNamingContext");
174                 ldb_set_opaque(ldb, "defaultNamingContext", tmp_dn);
175         }
176
177         talloc_free(tmp_ctx);
178 }
179
180 struct ldb_dn *ldb_get_root_basedn(struct ldb_context *ldb)
181 {
182         void *opaque = ldb_get_opaque(ldb, "rootDomainNamingContext");
183         return talloc_get_type(opaque, struct ldb_dn);
184 }
185
186 struct ldb_dn *ldb_get_config_basedn(struct ldb_context *ldb)
187 {
188         void *opaque = ldb_get_opaque(ldb, "configurationNamingContext");
189         return talloc_get_type(opaque, struct ldb_dn);
190 }
191
192 struct ldb_dn *ldb_get_schema_basedn(struct ldb_context *ldb)
193 {
194         void *opaque = ldb_get_opaque(ldb, "schemaNamingContext");
195         return talloc_get_type(opaque, struct ldb_dn);
196 }
197
198 struct ldb_dn *ldb_get_default_basedn(struct ldb_context *ldb)
199 {
200         void *opaque = ldb_get_opaque(ldb, "defaultNamingContext");
201         return talloc_get_type(opaque, struct ldb_dn);
202 }
203
204 /*
205    connect to a database. The URL can either be one of the following forms
206    ldb://path
207    ldapi://path
208
209    flags is made up of LDB_FLG_*
210
211    the options are passed uninterpreted to the backend, and are
212    backend specific
213 */
214 int ldb_connect(struct ldb_context *ldb, const char *url,
215                 unsigned int flags, const char *options[])
216 {
217         int ret;
218         const char *url2;
219         /* We seem to need to do this here, or else some utilities don't
220          * get ldb backends */
221
222         ldb->flags = flags;
223
224         url2 = talloc_strdup(ldb, url);
225         if (!url2) {
226                 ldb_oom(ldb);
227                 return LDB_ERR_OPERATIONS_ERROR;
228         }
229         ret = ldb_set_opaque(ldb, "ldb_url", talloc_strdup(ldb, url2));
230         if (ret != LDB_SUCCESS) {
231                 return ret;
232         }
233
234         ret = ldb_connect_backend(ldb, url, options, &ldb->modules);
235         if (ret != LDB_SUCCESS) {
236                 return ret;
237         }
238
239         if (ldb_load_modules(ldb, options) != LDB_SUCCESS) {
240                 ldb_debug(ldb, LDB_DEBUG_FATAL,
241                           "Unable to load modules for %s: %s\n",
242                           url, ldb_errstring(ldb));
243                 return LDB_ERR_OTHER;
244         }
245
246         /* set the default base dn */
247         ldb_set_default_dns(ldb);
248
249         return LDB_SUCCESS;
250 }
251
252 void ldb_set_errstring(struct ldb_context *ldb, const char *err_string)
253 {
254         if (ldb->err_string) {
255                 talloc_free(ldb->err_string);
256         }
257         ldb->err_string = talloc_strdup(ldb, err_string);
258 }
259
260 void ldb_asprintf_errstring(struct ldb_context *ldb, const char *format, ...)
261 {
262         va_list ap;
263         char *old_string = NULL;
264
265         if (ldb->err_string) {
266                 old_string = ldb->err_string;
267         }
268
269         va_start(ap, format);
270         ldb->err_string = talloc_vasprintf(ldb, format, ap);
271         va_end(ap);
272         talloc_free(old_string);
273 }
274
275 void ldb_reset_err_string(struct ldb_context *ldb)
276 {
277         if (ldb->err_string) {
278                 talloc_free(ldb->err_string);
279                 ldb->err_string = NULL;
280         }
281 }
282
283 #define FIRST_OP(ldb, op) do { \
284         module = ldb->modules;                                  \
285         while (module && module->ops->op == NULL) module = module->next; \
286         if (module == NULL) {                                           \
287                 ldb_asprintf_errstring(ldb, "unable to find module or backend to handle operation: " #op); \
288                 return LDB_ERR_OPERATIONS_ERROR;                        \
289         } \
290 } while (0)
291
292 /*
293   start a transaction
294 */
295 int ldb_transaction_start(struct ldb_context *ldb)
296 {
297         struct ldb_module *module;
298         int status;
299
300         ldb_debug(ldb, LDB_DEBUG_TRACE,
301                   "start ldb transaction (nesting: %d)",
302                   ldb->transaction_active);
303
304         /* explicit transaction active, count nested requests */
305         if (ldb->transaction_active) {
306                 ldb->transaction_active++;
307                 return LDB_SUCCESS;
308         }
309
310         /* start a new transaction */
311         ldb->transaction_active++;
312
313         FIRST_OP(ldb, start_transaction);
314
315         ldb_reset_err_string(ldb);
316
317         status = module->ops->start_transaction(module);
318         if (status != LDB_SUCCESS) {
319                 if (ldb->err_string == NULL) {
320                         /* no error string was setup by the backend */
321                         ldb_asprintf_errstring(ldb,
322                                 "ldb transaction start: %s (%d)",
323                                 ldb_strerror(status),
324                                 status);
325                 }
326         }
327         return status;
328 }
329
330 /*
331   commit a transaction
332 */
333 int ldb_transaction_commit(struct ldb_context *ldb)
334 {
335         struct ldb_module *module;
336         int status;
337
338         ldb->transaction_active--;
339
340         ldb_debug(ldb, LDB_DEBUG_TRACE,
341                   "commit ldb transaction (nesting: %d)",
342                   ldb->transaction_active);
343
344         /* commit only when all nested transactions are complete */
345         if (ldb->transaction_active > 0) {
346                 return LDB_SUCCESS;
347         }
348
349         if (ldb->transaction_active < 0) {
350                 ldb_debug(ldb, LDB_DEBUG_FATAL,
351                           "commit called but no ldb transactions are active!");
352                 ldb->transaction_active = 0;
353                 return LDB_ERR_OPERATIONS_ERROR;
354         }
355
356         FIRST_OP(ldb, end_transaction);
357
358         ldb_reset_err_string(ldb);
359
360         status = module->ops->end_transaction(module);
361         if (status != LDB_SUCCESS) {
362                 if (ldb->err_string == NULL) {
363                         /* no error string was setup by the backend */
364                         ldb_asprintf_errstring(ldb,
365                                 "ldb transaction commit: %s (%d)",
366                                 ldb_strerror(status),
367                                 status);
368                 }
369         }
370         return status;
371 }
372
373 /*
374   cancel a transaction
375 */
376 int ldb_transaction_cancel(struct ldb_context *ldb)
377 {
378         struct ldb_module *module;
379         int status;
380
381         ldb->transaction_active--;
382
383         ldb_debug(ldb, LDB_DEBUG_TRACE,
384                   "cancel ldb transaction (nesting: %d)",
385                   ldb->transaction_active);
386
387         /* really cancel only if all nested transactions are complete */
388         if (ldb->transaction_active > 0) {
389                 return LDB_SUCCESS;
390         }
391
392         if (ldb->transaction_active < 0) {
393                 ldb_debug(ldb, LDB_DEBUG_FATAL,
394                           "commit called but no ldb transactions are active!");
395                 ldb->transaction_active = 0;
396                 return LDB_ERR_OPERATIONS_ERROR;
397         }
398
399         FIRST_OP(ldb, del_transaction);
400
401         status = module->ops->del_transaction(module);
402         if (status != LDB_SUCCESS) {
403                 if (ldb->err_string == NULL) {
404                         /* no error string was setup by the backend */
405                         ldb_asprintf_errstring(ldb,
406                                 "ldb transaction cancel: %s (%d)",
407                                 ldb_strerror(status),
408                                 status);
409                 }
410         }
411         return status;
412 }
413
414 /* autostarts a transacion if none active */
415 static int ldb_autotransaction_request(struct ldb_context *ldb,
416                                        struct ldb_request *req)
417 {
418         int ret;
419
420         ret = ldb_transaction_start(ldb);
421         if (ret != LDB_SUCCESS) {
422                 return ret;
423         }
424
425         ret = ldb_request(ldb, req);
426         if (ret == LDB_SUCCESS) {
427                 ret = ldb_wait(req->handle, LDB_WAIT_ALL);
428         }
429
430         if (ret == LDB_SUCCESS) {
431                 return ldb_transaction_commit(ldb);
432         }
433         ldb_transaction_cancel(ldb);
434
435         if (ldb->err_string == NULL) {
436                 /* no error string was setup by the backend */
437                 ldb_asprintf_errstring(ldb, "%s (%d)", ldb_strerror(ret), ret);
438         }
439
440         return ret;
441 }
442
443 int ldb_wait(struct ldb_handle *handle, enum ldb_wait_type type)
444 {
445         struct tevent_context *ev;
446         int ret;
447
448         if (!handle) {
449                 return LDB_ERR_UNAVAILABLE;
450         }
451
452         if (handle->state == LDB_ASYNC_DONE) {
453                 return handle->status;
454         }
455
456         ev = ldb_get_event_context(handle->ldb);
457         if (NULL == ev) {
458                 return LDB_ERR_OPERATIONS_ERROR;
459         }
460
461         switch (type) {
462         case LDB_WAIT_NONE:
463                 ret = tevent_loop_once(ev);
464                 if (ret != 0) {
465                         return LDB_ERR_OPERATIONS_ERROR;
466                 }
467                 if (handle->state == LDB_ASYNC_DONE ||
468                     handle->status != LDB_SUCCESS) {
469                         return handle->status;
470                 }
471                 break;
472
473         case LDB_WAIT_ALL:
474                 while (handle->state != LDB_ASYNC_DONE) {
475                         ret = tevent_loop_once(ev);
476                         if (ret != 0) {
477                                 return LDB_ERR_OPERATIONS_ERROR;
478                         }
479                         if (handle->status != LDB_SUCCESS) {
480                                 return handle->status;
481                         }
482                 }
483                 return handle->status;
484         }
485
486         return LDB_SUCCESS;
487 }
488
489 /* set the specified timeout or, if timeout is 0 set the default timeout */
490 int ldb_set_timeout(struct ldb_context *ldb,
491                     struct ldb_request *req,
492                     int timeout)
493 {
494         if (req == NULL) return LDB_ERR_OPERATIONS_ERROR;
495
496         if (timeout != 0) {
497                 req->timeout = timeout;
498         } else {
499                 req->timeout = ldb->default_timeout;
500         }
501         req->starttime = time(NULL);
502
503         return LDB_SUCCESS;
504 }
505
506 /* calculates the new timeout based on the previous starttime and timeout */
507 int ldb_set_timeout_from_prev_req(struct ldb_context *ldb,
508                                   struct ldb_request *oldreq,
509                                   struct ldb_request *newreq)
510 {
511         if (newreq == NULL) return LDB_ERR_OPERATIONS_ERROR;
512
513         if (oldreq == NULL) {
514                 return ldb_set_timeout(ldb, newreq, 0);
515         }
516
517         newreq->starttime = oldreq->starttime;
518         newreq->timeout = oldreq->timeout;
519
520         return LDB_SUCCESS;
521 }
522
523
524 /*
525    set the permissions for new files to be passed to open() in
526    backends that use local files
527  */
528 void ldb_set_create_perms(struct ldb_context *ldb, unsigned int perms)
529 {
530         ldb->create_perms = perms;
531 }
532
533 unsigned int ldb_get_create_perms(struct ldb_context *ldb)
534 {
535         return ldb->create_perms;
536 }
537
538 void ldb_set_event_context(struct ldb_context *ldb, struct tevent_context *ev)
539 {
540         ldb->ev_ctx = ev;
541 }
542
543 struct tevent_context * ldb_get_event_context(struct ldb_context *ldb)
544 {
545         return ldb->ev_ctx;
546 }
547
548 void ldb_request_set_state(struct ldb_request *req, int state)
549 {
550         req->handle->state = state;
551 }
552
553 int ldb_request_get_status(struct ldb_request *req)
554 {
555         return req->handle->status;
556 }
557
558 /*
559   start an ldb request
560   NOTE: the request must be a talloc context.
561   returns LDB_ERR_* on errors.
562 */
563 int ldb_request(struct ldb_context *ldb, struct ldb_request *req)
564 {
565         struct ldb_module *module;
566         int ret;
567
568         if (req->callback == NULL) {
569                 ldb_set_errstring(ldb, "Requests MUST define callbacks");
570                 return LDB_ERR_UNWILLING_TO_PERFORM;
571         }
572
573         ldb_reset_err_string(ldb);
574
575         /* call the first module in the chain */
576         switch (req->operation) {
577         case LDB_SEARCH:
578                 FIRST_OP(ldb, search);
579                 ret = module->ops->search(module, req);
580                 break;
581         case LDB_ADD:
582                 FIRST_OP(ldb, add);
583                 ret = module->ops->add(module, req);
584                 break;
585         case LDB_MODIFY:
586                 FIRST_OP(ldb, modify);
587                 ret = module->ops->modify(module, req);
588                 break;
589         case LDB_DELETE:
590                 FIRST_OP(ldb, del);
591                 ret = module->ops->del(module, req);
592                 break;
593         case LDB_RENAME:
594                 FIRST_OP(ldb, rename);
595                 ret = module->ops->rename(module, req);
596                 break;
597         case LDB_EXTENDED:
598                 FIRST_OP(ldb, extended);
599                 ret = module->ops->extended(module, req);
600                 break;
601         default:
602                 FIRST_OP(ldb, request);
603                 ret = module->ops->request(module, req);
604                 break;
605         }
606
607         return ret;
608 }
609
610 int ldb_request_done(struct ldb_request *req, int status)
611 {
612         req->handle->state = LDB_ASYNC_DONE;
613         req->handle->status = status;
614         return status;
615 }
616
617 /*
618   search the database given a LDAP-like search expression
619
620   returns an LDB error code
621
622   Use talloc_free to free the ldb_message returned in 'res', if successful
623
624 */
625 int ldb_search_default_callback(struct ldb_request *req,
626                                 struct ldb_reply *ares)
627 {
628         struct ldb_result *res;
629         int n;
630
631         res = talloc_get_type(req->context, struct ldb_result);
632
633         if (!ares) {
634                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
635         }
636         if (ares->error != LDB_SUCCESS) {
637                 return ldb_request_done(req, ares->error);
638         }
639
640         switch (ares->type) {
641         case LDB_REPLY_ENTRY:
642                 res->msgs = talloc_realloc(res, res->msgs,
643                                         struct ldb_message *, res->count + 2);
644                 if (! res->msgs) {
645                         return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
646                 }
647
648                 res->msgs[res->count + 1] = NULL;
649
650                 res->msgs[res->count] = talloc_move(res->msgs, &ares->message);
651                 res->count++;
652                 break;
653
654         case LDB_REPLY_REFERRAL:
655                 if (res->refs) {
656                         for (n = 0; res->refs[n]; n++) /*noop*/ ;
657                 } else {
658                         n = 0;
659                 }
660
661                 res->refs = talloc_realloc(res, res->refs, char *, n + 2);
662                 if (! res->refs) {
663                         return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
664                 }
665
666                 res->refs[n] = talloc_move(res->refs, &ares->referral);
667                 res->refs[n + 1] = NULL;
668                 break;
669
670         case LDB_REPLY_DONE:
671                 /* TODO: we should really support controls on entries
672                  * and referrals too! */
673                 res->controls = talloc_move(res, &ares->controls);
674
675                 /* this is the last message, and means the request is done */
676                 /* we have to signal and eventual ldb_wait() waiting that the
677                  * async request operation was completed */
678                 return ldb_request_done(req, LDB_SUCCESS);
679         }
680
681         talloc_free(ares);
682         return LDB_SUCCESS;
683 }
684
685 int ldb_op_default_callback(struct ldb_request *req, struct ldb_reply *ares)
686 {
687         int ret;
688
689         if (!ares) {
690                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
691         }
692
693         if (ares->error != LDB_SUCCESS) {
694                 ret = ares->error;
695                 talloc_free(ares);
696                 return ldb_request_done(req, ret);
697         }
698
699         if (ares->type != LDB_REPLY_DONE) {
700                 talloc_free(ares);
701                 ldb_set_errstring(req->handle->ldb, "Invalid reply type!");
702                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
703         }
704
705         talloc_free(ares);
706         return ldb_request_done(req, LDB_SUCCESS);
707 }
708
709 int ldb_build_search_req_ex(struct ldb_request **ret_req,
710                         struct ldb_context *ldb,
711                         void *mem_ctx,
712                         struct ldb_dn *base,
713                         enum ldb_scope scope,
714                         struct ldb_parse_tree *tree,
715                         const char * const *attrs,
716                         struct ldb_control **controls,
717                         void *context,
718                         ldb_request_callback_t callback,
719                         struct ldb_request *parent)
720 {
721         struct ldb_request *req;
722
723         *ret_req = NULL;
724
725         req = talloc(mem_ctx, struct ldb_request);
726         if (req == NULL) {
727                 ldb_oom(ldb);
728                 return LDB_ERR_OPERATIONS_ERROR;
729         }
730
731         req->operation = LDB_SEARCH;
732         if (base == NULL) {
733                 req->op.search.base = ldb_dn_new(req, ldb, NULL);
734         } else {
735                 req->op.search.base = base;
736         }
737         req->op.search.scope = scope;
738
739         req->op.search.tree = tree;
740         if (req->op.search.tree == NULL) {
741                 ldb_set_errstring(ldb, "'tree' can't be NULL");
742                 talloc_free(req);
743                 return LDB_ERR_OPERATIONS_ERROR;
744         }
745
746         req->op.search.attrs = attrs;
747         req->controls = controls;
748         req->context = context;
749         req->callback = callback;
750
751         ldb_set_timeout_from_prev_req(ldb, parent, req);
752
753         req->handle = ldb_handle_new(req, ldb);
754         if (req->handle == NULL) {
755                 ldb_oom(ldb);
756                 return LDB_ERR_OPERATIONS_ERROR;
757         }
758
759         *ret_req = req;
760         return LDB_SUCCESS;
761 }
762
763 int ldb_build_search_req(struct ldb_request **ret_req,
764                         struct ldb_context *ldb,
765                         void *mem_ctx,
766                         struct ldb_dn *base,
767                         enum ldb_scope scope,
768                         const char *expression,
769                         const char * const *attrs,
770                         struct ldb_control **controls,
771                         void *context,
772                         ldb_request_callback_t callback,
773                         struct ldb_request *parent)
774 {
775         struct ldb_parse_tree *tree;
776         int ret;
777
778         tree = ldb_parse_tree(mem_ctx, expression);
779         if (tree == NULL) {
780                 ldb_set_errstring(ldb, "Unable to parse search expression");
781                 return LDB_ERR_OPERATIONS_ERROR;
782         }
783
784         ret = ldb_build_search_req_ex(ret_req, ldb, mem_ctx, base,
785                                       scope, tree, attrs, controls,
786                                       context, callback, parent);
787         if (ret == LDB_SUCCESS) {
788                 talloc_steal(*ret_req, tree);
789         }
790         return ret;
791 }
792
793 int ldb_build_add_req(struct ldb_request **ret_req,
794                         struct ldb_context *ldb,
795                         void *mem_ctx,
796                         const struct ldb_message *message,
797                         struct ldb_control **controls,
798                         void *context,
799                         ldb_request_callback_t callback,
800                         struct ldb_request *parent)
801 {
802         struct ldb_request *req;
803
804         *ret_req = NULL;
805
806         req = talloc(mem_ctx, struct ldb_request);
807         if (req == NULL) {
808                 ldb_set_errstring(ldb, "Out of Memory");
809                 return LDB_ERR_OPERATIONS_ERROR;
810         }
811
812         req->operation = LDB_ADD;
813         req->op.add.message = message;
814         req->controls = controls;
815         req->context = context;
816         req->callback = callback;
817
818         ldb_set_timeout_from_prev_req(ldb, parent, req);
819
820         req->handle = ldb_handle_new(req, ldb);
821         if (req->handle == NULL) {
822                 ldb_oom(ldb);
823                 return LDB_ERR_OPERATIONS_ERROR;
824         }
825
826         *ret_req = req;
827
828         return LDB_SUCCESS;
829 }
830
831 int ldb_build_mod_req(struct ldb_request **ret_req,
832                         struct ldb_context *ldb,
833                         void *mem_ctx,
834                         const struct ldb_message *message,
835                         struct ldb_control **controls,
836                         void *context,
837                         ldb_request_callback_t callback,
838                         struct ldb_request *parent)
839 {
840         struct ldb_request *req;
841
842         *ret_req = NULL;
843
844         req = talloc(mem_ctx, struct ldb_request);
845         if (req == NULL) {
846                 ldb_set_errstring(ldb, "Out of Memory");
847                 return LDB_ERR_OPERATIONS_ERROR;
848         }
849
850         req->operation = LDB_MODIFY;
851         req->op.mod.message = message;
852         req->controls = controls;
853         req->context = context;
854         req->callback = callback;
855
856         ldb_set_timeout_from_prev_req(ldb, parent, req);
857
858         req->handle = ldb_handle_new(req, ldb);
859         if (req->handle == NULL) {
860                 ldb_oom(ldb);
861                 return LDB_ERR_OPERATIONS_ERROR;
862         }
863
864         *ret_req = req;
865
866         return LDB_SUCCESS;
867 }
868
869 int ldb_build_del_req(struct ldb_request **ret_req,
870                         struct ldb_context *ldb,
871                         void *mem_ctx,
872                         struct ldb_dn *dn,
873                         struct ldb_control **controls,
874                         void *context,
875                         ldb_request_callback_t callback,
876                         struct ldb_request *parent)
877 {
878         struct ldb_request *req;
879
880         *ret_req = NULL;
881
882         req = talloc(mem_ctx, struct ldb_request);
883         if (req == NULL) {
884                 ldb_set_errstring(ldb, "Out of Memory");
885                 return LDB_ERR_OPERATIONS_ERROR;
886         }
887
888         req->operation = LDB_DELETE;
889         req->op.del.dn = dn;
890         req->controls = controls;
891         req->context = context;
892         req->callback = callback;
893
894         ldb_set_timeout_from_prev_req(ldb, parent, req);
895
896         req->handle = ldb_handle_new(req, ldb);
897         if (req->handle == NULL) {
898                 ldb_oom(ldb);
899                 return LDB_ERR_OPERATIONS_ERROR;
900         }
901
902         *ret_req = req;
903
904         return LDB_SUCCESS;
905 }
906
907 int ldb_build_rename_req(struct ldb_request **ret_req,
908                         struct ldb_context *ldb,
909                         void *mem_ctx,
910                         struct ldb_dn *olddn,
911                         struct ldb_dn *newdn,
912                         struct ldb_control **controls,
913                         void *context,
914                         ldb_request_callback_t callback,
915                         struct ldb_request *parent)
916 {
917         struct ldb_request *req;
918
919         *ret_req = NULL;
920
921         req = talloc(mem_ctx, struct ldb_request);
922         if (req == NULL) {
923                 ldb_set_errstring(ldb, "Out of Memory");
924                 return LDB_ERR_OPERATIONS_ERROR;
925         }
926
927         req->operation = LDB_RENAME;
928         req->op.rename.olddn = olddn;
929         req->op.rename.newdn = newdn;
930         req->controls = controls;
931         req->context = context;
932         req->callback = callback;
933
934         ldb_set_timeout_from_prev_req(ldb, parent, req);
935
936         req->handle = ldb_handle_new(req, ldb);
937         if (req->handle == NULL) {
938                 ldb_oom(ldb);
939                 return LDB_ERR_OPERATIONS_ERROR;
940         }
941
942         *ret_req = req;
943
944         return LDB_SUCCESS;
945 }
946
947 int ldb_extended_default_callback(struct ldb_request *req,
948                                   struct ldb_reply *ares)
949 {
950         struct ldb_result *res;
951
952         res = talloc_get_type(req->context, struct ldb_result);
953
954         if (!ares) {
955                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
956         }
957         if (ares->error != LDB_SUCCESS) {
958                 return ldb_request_done(req, ares->error);
959         }
960
961         if (ares->type == LDB_REPLY_DONE) {
962
963                 /* TODO: we should really support controls on entries and referrals too! */
964                 res->extended = talloc_move(res, &ares->response);
965                 res->controls = talloc_move(res, &ares->controls);
966
967                 talloc_free(ares);
968                 return ldb_request_done(req, LDB_SUCCESS);
969         }
970
971         talloc_free(ares);
972         ldb_set_errstring(req->handle->ldb, "Invalid reply type!");
973         return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
974 }
975
976 int ldb_build_extended_req(struct ldb_request **ret_req,
977                            struct ldb_context *ldb,
978                            void *mem_ctx,
979                            const char *oid,
980                            void *data,
981                            struct ldb_control **controls,
982                            void *context,
983                            ldb_request_callback_t callback,
984                            struct ldb_request *parent)
985 {
986         struct ldb_request *req;
987
988         *ret_req = NULL;
989
990         req = talloc(mem_ctx, struct ldb_request);
991         if (req == NULL) {
992                 ldb_set_errstring(ldb, "Out of Memory");
993                 return LDB_ERR_OPERATIONS_ERROR;
994         }
995
996         req->operation = LDB_EXTENDED;
997         req->op.extended.oid = oid;
998         req->op.extended.data = data;
999         req->controls = controls;
1000         req->context = context;
1001         req->callback = callback;
1002
1003         ldb_set_timeout_from_prev_req(ldb, parent, req);
1004
1005         req->handle = ldb_handle_new(req, ldb);
1006         if (req->handle == NULL) {
1007                 ldb_oom(ldb);
1008                 return LDB_ERR_OPERATIONS_ERROR;
1009         }
1010
1011         *ret_req = req;
1012
1013         return LDB_SUCCESS;
1014 }
1015
1016 int ldb_extended(struct ldb_context *ldb,
1017                  const char *oid,
1018                  void *data,
1019                  struct ldb_result **_res)
1020 {
1021         struct ldb_request *req;
1022         int ret;
1023         struct ldb_result *res;
1024
1025         *_res = NULL;
1026
1027         res = talloc_zero(ldb, struct ldb_result);
1028         if (!res) {
1029                 return LDB_ERR_OPERATIONS_ERROR;
1030         }
1031
1032         ret = ldb_build_extended_req(&req, ldb, ldb,
1033                                      oid, data, NULL,
1034                                      res, ldb_extended_default_callback,
1035                                      NULL);
1036         if (ret != LDB_SUCCESS) goto done;
1037
1038         ldb_set_timeout(ldb, req, 0); /* use default timeout */
1039
1040         ret = ldb_request(ldb, req);
1041
1042         if (ret == LDB_SUCCESS) {
1043                 ret = ldb_wait(req->handle, LDB_WAIT_ALL);
1044         }
1045
1046         talloc_free(req);
1047
1048 done:
1049         if (ret != LDB_SUCCESS) {
1050                 talloc_free(res);
1051         }
1052
1053         *_res = res;
1054         return ret;
1055 }
1056
1057 /*
1058   note that ldb_search() will automatically replace a NULL 'base' value
1059   with the defaultNamingContext from the rootDSE if available.
1060 */
1061 int ldb_search(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
1062                 struct ldb_result **result, struct ldb_dn *base,
1063                 enum ldb_scope scope, const char * const *attrs,
1064                 const char *exp_fmt, ...)
1065 {
1066         struct ldb_request *req;
1067         struct ldb_result *res;
1068         char *expression;
1069         va_list ap;
1070         int ret;
1071
1072         expression = NULL;
1073         *result = NULL;
1074         req = NULL;
1075
1076         res = talloc_zero(mem_ctx, struct ldb_result);
1077         if (!res) {
1078                 return LDB_ERR_OPERATIONS_ERROR;
1079         }
1080
1081         if (exp_fmt) {
1082                 va_start(ap, exp_fmt);
1083                 expression = talloc_vasprintf(mem_ctx, exp_fmt, ap);
1084                 va_end(ap);
1085
1086                 if (!expression) {
1087                         talloc_free(res);
1088                         return LDB_ERR_OPERATIONS_ERROR;
1089                 }
1090         }
1091
1092         ret = ldb_build_search_req(&req, ldb, mem_ctx,
1093                                         base?base:ldb_get_default_basedn(ldb),
1094                                         scope,
1095                                         expression,
1096                                         attrs,
1097                                         NULL,
1098                                         res,
1099                                         ldb_search_default_callback,
1100                                         NULL);
1101
1102         if (ret != LDB_SUCCESS) goto done;
1103
1104         ret = ldb_request(ldb, req);
1105
1106         if (ret == LDB_SUCCESS) {
1107                 ret = ldb_wait(req->handle, LDB_WAIT_ALL);
1108         }
1109
1110 done:
1111         if (ret != LDB_SUCCESS) {
1112                 talloc_free(res);
1113                 res = NULL;
1114         }
1115
1116         talloc_free(expression);
1117         talloc_free(req);
1118
1119         *result = res;
1120         return ret;
1121 }
1122
1123 /*
1124   add a record to the database. Will fail if a record with the given class
1125   and key already exists
1126 */
1127 int ldb_add(struct ldb_context *ldb,
1128             const struct ldb_message *message)
1129 {
1130         struct ldb_request *req;
1131         int ret;
1132
1133         ret = ldb_msg_sanity_check(ldb, message);
1134         if (ret != LDB_SUCCESS) {
1135                 return ret;
1136         }
1137
1138         ret = ldb_build_add_req(&req, ldb, ldb,
1139                                         message,
1140                                         NULL,
1141                                         NULL,
1142                                         ldb_op_default_callback,
1143                                         NULL);
1144
1145         if (ret != LDB_SUCCESS) return ret;
1146
1147         /* do request and autostart a transaction */
1148         ret = ldb_autotransaction_request(ldb, req);
1149
1150         talloc_free(req);
1151         return ret;
1152 }
1153
1154 /*
1155   modify the specified attributes of a record
1156 */
1157 int ldb_modify(struct ldb_context *ldb,
1158                const struct ldb_message *message)
1159 {
1160         struct ldb_request *req;
1161         int ret;
1162
1163         ret = ldb_msg_sanity_check(ldb, message);
1164         if (ret != LDB_SUCCESS) {
1165                 return ret;
1166         }
1167
1168         ret = ldb_build_mod_req(&req, ldb, ldb,
1169                                         message,
1170                                         NULL,
1171                                         NULL,
1172                                         ldb_op_default_callback,
1173                                         NULL);
1174
1175         if (ret != LDB_SUCCESS) return ret;
1176
1177         /* do request and autostart a transaction */
1178         ret = ldb_autotransaction_request(ldb, req);
1179
1180         talloc_free(req);
1181         return ret;
1182 }
1183
1184
1185 /*
1186   delete a record from the database
1187 */
1188 int ldb_delete(struct ldb_context *ldb, struct ldb_dn *dn)
1189 {
1190         struct ldb_request *req;
1191         int ret;
1192
1193         ret = ldb_build_del_req(&req, ldb, ldb,
1194                                         dn,
1195                                         NULL,
1196                                         NULL,
1197                                         ldb_op_default_callback,
1198                                         NULL);
1199
1200         if (ret != LDB_SUCCESS) return ret;
1201
1202         /* do request and autostart a transaction */
1203         ret = ldb_autotransaction_request(ldb, req);
1204
1205         talloc_free(req);
1206         return ret;
1207 }
1208
1209 /*
1210   rename a record in the database
1211 */
1212 int ldb_rename(struct ldb_context *ldb,
1213                 struct ldb_dn *olddn, struct ldb_dn *newdn)
1214 {
1215         struct ldb_request *req;
1216         int ret;
1217
1218         ret = ldb_build_rename_req(&req, ldb, ldb,
1219                                         olddn,
1220                                         newdn,
1221                                         NULL,
1222                                         NULL,
1223                                         ldb_op_default_callback,
1224                                         NULL);
1225
1226         if (ret != LDB_SUCCESS) return ret;
1227
1228         /* do request and autostart a transaction */
1229         ret = ldb_autotransaction_request(ldb, req);
1230
1231         talloc_free(req);
1232         return ret;
1233 }
1234
1235
1236 /*
1237   return the global sequence number
1238 */
1239 int ldb_sequence_number(struct ldb_context *ldb,
1240                         enum ldb_sequence_type type, uint64_t *seq_num)
1241 {
1242         struct ldb_seqnum_request *seq;
1243         struct ldb_seqnum_result *seqr;
1244         struct ldb_result *res;
1245         TALLOC_CTX *tmp_ctx;
1246         int ret;
1247
1248         *seq_num = 0;
1249
1250         tmp_ctx = talloc_zero(ldb, struct ldb_request);
1251         if (tmp_ctx == NULL) {
1252                 ldb_set_errstring(ldb, "Out of Memory");
1253                 return LDB_ERR_OPERATIONS_ERROR;
1254         }
1255         seq = talloc_zero(tmp_ctx, struct ldb_seqnum_request);
1256         if (seq == NULL) {
1257                 ldb_set_errstring(ldb, "Out of Memory");
1258                 ret = LDB_ERR_OPERATIONS_ERROR;
1259                 goto done;
1260         }
1261         seq->type = type;
1262
1263         ret = ldb_extended(ldb, LDB_EXTENDED_SEQUENCE_NUMBER, seq, &res);
1264         if (ret != LDB_SUCCESS) {
1265                 goto done;
1266         }
1267         talloc_steal(tmp_ctx, res);
1268
1269         if (strcmp(LDB_EXTENDED_SEQUENCE_NUMBER, res->extended->oid) != 0) {
1270                 ldb_set_errstring(ldb, "Invalid OID in reply");
1271                 ret = LDB_ERR_OPERATIONS_ERROR;
1272                 goto done;
1273         }
1274         seqr = talloc_get_type(res->extended->data,
1275                                 struct ldb_seqnum_result);
1276         *seq_num = seqr->seq_num;
1277
1278 done:
1279         talloc_free(tmp_ctx);
1280         return ret;
1281 }
1282
1283 /*
1284   return extended error information
1285 */
1286 const char *ldb_errstring(struct ldb_context *ldb)
1287 {
1288         if (ldb->err_string) {
1289                 return ldb->err_string;
1290         }
1291
1292         return NULL;
1293 }
1294
1295 /*
1296   return a string explaining what a ldb error constant meancs
1297 */
1298 const char *ldb_strerror(int ldb_err)
1299 {
1300         switch (ldb_err) {
1301         case LDB_SUCCESS:
1302                 return "Success";
1303         case LDB_ERR_OPERATIONS_ERROR:
1304                 return "Operations error";
1305         case LDB_ERR_PROTOCOL_ERROR:
1306                 return "Protocol error";
1307         case LDB_ERR_TIME_LIMIT_EXCEEDED:
1308                 return "Time limit exceeded";
1309         case LDB_ERR_SIZE_LIMIT_EXCEEDED:
1310                 return "Size limit exceeded";
1311         case LDB_ERR_COMPARE_FALSE:
1312                 return "Compare false";
1313         case LDB_ERR_COMPARE_TRUE:
1314                 return "Compare true";
1315         case LDB_ERR_AUTH_METHOD_NOT_SUPPORTED:
1316                 return "Auth method not supported";
1317         case LDB_ERR_STRONG_AUTH_REQUIRED:
1318                 return "Strong auth required";
1319 /* 9 RESERVED */
1320         case LDB_ERR_REFERRAL:
1321                 return "Referral error";
1322         case LDB_ERR_ADMIN_LIMIT_EXCEEDED:
1323                 return "Admin limit exceeded";
1324         case LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION:
1325                 return "Unsupported critical extension";
1326         case LDB_ERR_CONFIDENTIALITY_REQUIRED:
1327                 return "Confidentiality required";
1328         case LDB_ERR_SASL_BIND_IN_PROGRESS:
1329                 return "SASL bind in progress";
1330         case LDB_ERR_NO_SUCH_ATTRIBUTE:
1331                 return "No such attribute";
1332         case LDB_ERR_UNDEFINED_ATTRIBUTE_TYPE:
1333                 return "Undefined attribute type";
1334         case LDB_ERR_INAPPROPRIATE_MATCHING:
1335                 return "Inappropriate matching";
1336         case LDB_ERR_CONSTRAINT_VIOLATION:
1337                 return "Constraint violation";
1338         case LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS:
1339                 return "Attribute or value exists";
1340         case LDB_ERR_INVALID_ATTRIBUTE_SYNTAX:
1341                 return "Invalid attribute syntax";
1342 /* 22-31 unused */
1343         case LDB_ERR_NO_SUCH_OBJECT:
1344                 return "No such object";
1345         case LDB_ERR_ALIAS_PROBLEM:
1346                 return "Alias problem";
1347         case LDB_ERR_INVALID_DN_SYNTAX:
1348                 return "Invalid DN syntax";
1349 /* 35 RESERVED */
1350         case LDB_ERR_ALIAS_DEREFERENCING_PROBLEM:
1351                 return "Alias dereferencing problem";
1352 /* 37-47 unused */
1353         case LDB_ERR_INAPPROPRIATE_AUTHENTICATION:
1354                 return "Inappropriate authentication";
1355         case LDB_ERR_INVALID_CREDENTIALS:
1356                 return "Invalid credentials";
1357         case LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS:
1358                 return "insufficient access rights";
1359         case LDB_ERR_BUSY:
1360                 return "Busy";
1361         case LDB_ERR_UNAVAILABLE:
1362                 return "Unavailable";
1363         case LDB_ERR_UNWILLING_TO_PERFORM:
1364                 return "Unwilling to perform";
1365         case LDB_ERR_LOOP_DETECT:
1366                 return "Loop detect";
1367 /* 55-63 unused */
1368         case LDB_ERR_NAMING_VIOLATION:
1369                 return "Naming violation";
1370         case LDB_ERR_OBJECT_CLASS_VIOLATION:
1371                 return "Object class violation";
1372         case LDB_ERR_NOT_ALLOWED_ON_NON_LEAF:
1373                 return "Not allowed on non-leaf";
1374         case LDB_ERR_NOT_ALLOWED_ON_RDN:
1375                 return "Not allowed on RDN";
1376         case LDB_ERR_ENTRY_ALREADY_EXISTS:
1377                 return "Entry already exists";
1378         case LDB_ERR_OBJECT_CLASS_MODS_PROHIBITED:
1379                 return "Object class mods prohibited";
1380 /* 70 RESERVED FOR CLDAP */
1381         case LDB_ERR_AFFECTS_MULTIPLE_DSAS:
1382                 return "Affects multiple DSAs";
1383 /* 72-79 unused */
1384         case LDB_ERR_OTHER:
1385                 return "Other";
1386         }
1387
1388         return "Unknown error";
1389 }
1390
1391 /*
1392   set backend specific opaque parameters
1393 */
1394 int ldb_set_opaque(struct ldb_context *ldb, const char *name, void *value)
1395 {
1396         struct ldb_opaque *o;
1397
1398         /* allow updating an existing value */
1399         for (o=ldb->opaque;o;o=o->next) {
1400                 if (strcmp(o->name, name) == 0) {
1401                         o->value = value;
1402                         return LDB_SUCCESS;
1403                 }
1404         }
1405
1406         o = talloc(ldb, struct ldb_opaque);
1407         if (o == NULL) {
1408                 ldb_oom(ldb);
1409                 return LDB_ERR_OTHER;
1410         }
1411         o->next = ldb->opaque;
1412         o->name = name;
1413         o->value = value;
1414         ldb->opaque = o;
1415         return LDB_SUCCESS;
1416 }
1417
1418 /*
1419   get a previously set opaque value
1420 */
1421 void *ldb_get_opaque(struct ldb_context *ldb, const char *name)
1422 {
1423         struct ldb_opaque *o;
1424         for (o=ldb->opaque;o;o=o->next) {
1425                 if (strcmp(o->name, name) == 0) {
1426                         return o->value;
1427                 }
1428         }
1429         return NULL;
1430 }