s4-dsdb: use ldb_msg_canonicalize_ex() in source4/lib/ldb/common/ldb.c
[kamenim/samba.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 #define TEVENT_DEPRECATED 1
36 #include "ldb_private.h"
37
38 static int ldb_context_destructor(void *ptr)
39 {
40         struct ldb_context *ldb = talloc_get_type(ptr, struct ldb_context);
41
42         if (ldb->transaction_active) {
43                 ldb_debug(ldb, LDB_DEBUG_FATAL,
44                           "A transaction is still active in ldb context [%p] on %s",
45                           ldb, (const char *)ldb_get_opaque(ldb, "ldb_url"));
46         }
47
48         return 0;
49 }
50
51 /*
52   this is used to catch debug messages from events
53 */
54 static void ldb_tevent_debug(void *context, enum tevent_debug_level level,
55                              const char *fmt, va_list ap)  PRINTF_ATTRIBUTE(3,0);
56
57 static void ldb_tevent_debug(void *context, enum tevent_debug_level level,
58                              const char *fmt, va_list ap)
59 {
60         struct ldb_context *ldb = talloc_get_type(context, struct ldb_context);
61         enum ldb_debug_level ldb_level = LDB_DEBUG_FATAL;
62         char *s = NULL;
63
64         switch (level) {
65         case TEVENT_DEBUG_FATAL:
66                 ldb_level = LDB_DEBUG_FATAL;
67                 break;
68         case TEVENT_DEBUG_ERROR:
69                 ldb_level = LDB_DEBUG_ERROR;
70                 break;
71         case TEVENT_DEBUG_WARNING:
72                 ldb_level = LDB_DEBUG_WARNING;
73                 break;
74         case TEVENT_DEBUG_TRACE:
75                 ldb_level = LDB_DEBUG_TRACE;
76                 break;
77         };
78
79         vasprintf(&s, fmt, ap);
80         if (!s) return;
81         ldb_debug(ldb, ldb_level, "tevent: %s", s);
82         free(s);
83 }
84
85 /*
86    initialise a ldb context
87    The mem_ctx is required
88    The event_ctx is required
89 */
90 struct ldb_context *ldb_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx)
91 {
92         struct ldb_context *ldb;
93         int ret;
94
95         ldb = talloc_zero(mem_ctx, struct ldb_context);
96         /* FIXME: Hack a new event context so that CMD line utilities work
97          * until we have them all converted */
98         if (ev_ctx == NULL) {
99                 ev_ctx = tevent_context_init(talloc_autofree_context());
100                 tevent_set_debug(ev_ctx, ldb_tevent_debug, ldb);
101                 tevent_loop_allow_nesting(ev_ctx);
102         }
103
104         ret = ldb_setup_wellknown_attributes(ldb);
105         if (ret != LDB_SUCCESS) {
106                 talloc_free(ldb);
107                 return NULL;
108         }
109
110         ldb_set_utf8_default(ldb);
111         ldb_set_create_perms(ldb, 0666);
112         ldb_set_modules_dir(ldb, LDB_MODULESDIR);
113         ldb_set_event_context(ldb, ev_ctx);
114
115         /* TODO: get timeout from options if available there */
116         ldb->default_timeout = 300; /* set default to 5 minutes */
117
118         talloc_set_destructor((TALLOC_CTX *)ldb, ldb_context_destructor);
119
120         return ldb;
121 }
122
123 /*
124   try to autodetect a basedn if none specified. This fixes one of my
125   pet hates about ldapsearch, which is that you have to get a long,
126   complex basedn right to make any use of it.
127 */
128 void ldb_set_default_dns(struct ldb_context *ldb)
129 {
130         TALLOC_CTX *tmp_ctx;
131         int ret;
132         struct ldb_result *res;
133         struct ldb_dn *tmp_dn=NULL;
134         static const char *attrs[] = {
135                 "rootDomainNamingContext",
136                 "configurationNamingContext",
137                 "schemaNamingContext",
138                 "defaultNamingContext",
139                 NULL
140         };
141
142         tmp_ctx = talloc_new(ldb);
143         ret = ldb_search(ldb, tmp_ctx, &res, ldb_dn_new(tmp_ctx, ldb, NULL),
144                          LDB_SCOPE_BASE, attrs, "(objectClass=*)");
145         if (ret != LDB_SUCCESS) {
146                 talloc_free(tmp_ctx);
147                 return;
148         }
149
150         if (res->count != 1) {
151                 talloc_free(tmp_ctx);
152                 return;
153         }
154
155         if (!ldb_get_opaque(ldb, "rootDomainNamingContext")) {
156                 tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
157                                                  "rootDomainNamingContext");
158                 ldb_set_opaque(ldb, "rootDomainNamingContext", tmp_dn);
159         }
160
161         if (!ldb_get_opaque(ldb, "configurationNamingContext")) {
162                 tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
163                                                  "configurationNamingContext");
164                 ldb_set_opaque(ldb, "configurationNamingContext", tmp_dn);
165         }
166
167         if (!ldb_get_opaque(ldb, "schemaNamingContext")) {
168                 tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
169                                                  "schemaNamingContext");
170                 ldb_set_opaque(ldb, "schemaNamingContext", tmp_dn);
171         }
172
173         if (!ldb_get_opaque(ldb, "defaultNamingContext")) {
174                 tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
175                                                  "defaultNamingContext");
176                 ldb_set_opaque(ldb, "defaultNamingContext", tmp_dn);
177         }
178
179         talloc_free(tmp_ctx);
180 }
181
182 struct ldb_dn *ldb_get_root_basedn(struct ldb_context *ldb)
183 {
184         void *opaque = ldb_get_opaque(ldb, "rootDomainNamingContext");
185         return talloc_get_type(opaque, struct ldb_dn);
186 }
187
188 struct ldb_dn *ldb_get_config_basedn(struct ldb_context *ldb)
189 {
190         void *opaque = ldb_get_opaque(ldb, "configurationNamingContext");
191         return talloc_get_type(opaque, struct ldb_dn);
192 }
193
194 struct ldb_dn *ldb_get_schema_basedn(struct ldb_context *ldb)
195 {
196         void *opaque = ldb_get_opaque(ldb, "schemaNamingContext");
197         return talloc_get_type(opaque, struct ldb_dn);
198 }
199
200 struct ldb_dn *ldb_get_default_basedn(struct ldb_context *ldb)
201 {
202         void *opaque = ldb_get_opaque(ldb, "defaultNamingContext");
203         return talloc_get_type(opaque, struct ldb_dn);
204 }
205
206 /*
207    connect to a database. The URL can either be one of the following forms
208    ldb://path
209    ldapi://path
210
211    flags is made up of LDB_FLG_*
212
213    the options are passed uninterpreted to the backend, and are
214    backend specific
215 */
216 int ldb_connect(struct ldb_context *ldb, const char *url,
217                 unsigned int flags, const char *options[])
218 {
219         int ret;
220         char *url2;
221         /* We seem to need to do this here, or else some utilities don't
222          * get ldb backends */
223
224         ldb->flags = flags;
225
226         url2 = talloc_strdup(ldb, url);
227         if (!url2) {
228                 ldb_oom(ldb);
229                 return LDB_ERR_OPERATIONS_ERROR;
230         }
231         ret = ldb_set_opaque(ldb, "ldb_url", url2);
232         if (ret != LDB_SUCCESS) {
233                 return ret;
234         }
235
236         ret = ldb_connect_backend(ldb, url, options, &ldb->modules);
237         if (ret != LDB_SUCCESS) {
238                 return ret;
239         }
240
241         if (ldb_load_modules(ldb, options) != LDB_SUCCESS) {
242                 ldb_debug(ldb, LDB_DEBUG_FATAL,
243                           "Unable to load modules for %s: %s",
244                           url, ldb_errstring(ldb));
245                 return LDB_ERR_OTHER;
246         }
247
248         /* set the default base dn */
249         ldb_set_default_dns(ldb);
250
251         return LDB_SUCCESS;
252 }
253
254 void ldb_set_errstring(struct ldb_context *ldb, const char *err_string)
255 {
256         if (ldb->err_string) {
257                 talloc_free(ldb->err_string);
258         }
259         ldb->err_string = talloc_strdup(ldb, err_string);
260         if (ldb->flags & LDB_FLG_ENABLE_TRACING) {
261                 ldb_debug(ldb, LDB_DEBUG_TRACE, "ldb_set_errstring: %s", ldb->err_string);
262         }
263 }
264
265 void ldb_asprintf_errstring(struct ldb_context *ldb, const char *format, ...)
266 {
267         va_list ap;
268         char *old_string = NULL;
269
270         if (ldb->err_string) {
271                 old_string = ldb->err_string;
272         }
273
274         va_start(ap, format);
275         ldb->err_string = talloc_vasprintf(ldb, format, ap);
276         va_end(ap);
277         talloc_free(old_string);
278 }
279
280 void ldb_reset_err_string(struct ldb_context *ldb)
281 {
282         if (ldb->err_string) {
283                 talloc_free(ldb->err_string);
284                 ldb->err_string = NULL;
285         }
286 }
287
288
289
290 /*
291   set an ldb error based on file:line
292 */
293 int ldb_error_at(struct ldb_context *ldb, int ecode,
294                  const char *reason, const char *file, int line)
295 {
296         if (reason == NULL) {
297                 reason = ldb_strerror(ecode);
298         }
299         ldb_asprintf_errstring(ldb, "%s at %s:%d", reason, file, line);
300         return ecode;
301 }
302
303
304 #define FIRST_OP_NOERR(ldb, op) do { \
305         module = ldb->modules;                                  \
306         while (module && module->ops->op == NULL) module = module->next; \
307         if ((ldb->flags & LDB_FLG_ENABLE_TRACING) && module) { \
308                 ldb_debug(ldb, LDB_DEBUG_TRACE, "ldb_trace_request: (%s)->" #op, \
309                           module->ops->name);                           \
310         }                                                               \
311 } while (0)
312
313 #define FIRST_OP(ldb, op) do { \
314         FIRST_OP_NOERR(ldb, op); \
315         if (module == NULL) {                                   \
316                 ldb_asprintf_errstring(ldb, "unable to find module or backend to handle operation: " #op); \
317                 return LDB_ERR_OPERATIONS_ERROR;                        \
318         } \
319 } while (0)
320
321
322 /*
323   start a transaction
324 */
325 int ldb_transaction_start(struct ldb_context *ldb)
326 {
327         struct ldb_module *module;
328         int status;
329
330         ldb_debug(ldb, LDB_DEBUG_TRACE,
331                   "start ldb transaction (nesting: %d)",
332                   ldb->transaction_active);
333
334         /* explicit transaction active, count nested requests */
335         if (ldb->transaction_active) {
336                 ldb->transaction_active++;
337                 return LDB_SUCCESS;
338         }
339
340         /* start a new transaction */
341         ldb->transaction_active++;
342         ldb->prepare_commit_done = false;
343
344         FIRST_OP(ldb, start_transaction);
345
346         ldb_reset_err_string(ldb);
347
348         status = module->ops->start_transaction(module);
349         if (status != LDB_SUCCESS) {
350                 if (ldb->err_string == NULL) {
351                         /* no error string was setup by the backend */
352                         ldb_asprintf_errstring(ldb,
353                                 "ldb transaction start: %s (%d)",
354                                 ldb_strerror(status),
355                                 status);
356                 }
357         }
358         if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) { 
359                 ldb_debug(module->ldb, LDB_DEBUG_TRACE, "start ldb transaction error: %s", 
360                           ldb_errstring(module->ldb));                          
361         }
362         return status;
363 }
364
365 /*
366   prepare for transaction commit (first phase of two phase commit)
367 */
368 int ldb_transaction_prepare_commit(struct ldb_context *ldb)
369 {
370         struct ldb_module *module;
371         int status;
372
373         if (ldb->prepare_commit_done) {
374                 return LDB_SUCCESS;
375         }
376
377         /* commit only when all nested transactions are complete */
378         if (ldb->transaction_active > 1) {
379                 return LDB_SUCCESS;
380         }
381
382         ldb->prepare_commit_done = true;
383
384         if (ldb->transaction_active < 0) {
385                 ldb_debug(ldb, LDB_DEBUG_FATAL,
386                           "prepare commit called but no ldb transactions are active!");
387                 ldb->transaction_active = 0;
388                 return LDB_ERR_OPERATIONS_ERROR;
389         }
390
391         /* call prepare transaction if available */
392         FIRST_OP_NOERR(ldb, prepare_commit);
393         if (module == NULL) {
394                 return LDB_SUCCESS;
395         }
396
397         status = module->ops->prepare_commit(module);
398         if (status != LDB_SUCCESS) {
399                 /* if a module fails the prepare then we need
400                    to call the end transaction for everyone */
401                 FIRST_OP(ldb, del_transaction);
402                 module->ops->del_transaction(module);
403                 if (ldb->err_string == NULL) {
404                         /* no error string was setup by the backend */
405                         ldb_asprintf_errstring(ldb,
406                                                "ldb transaction prepare commit: %s (%d)",
407                                                ldb_strerror(status),
408                                                status);
409                 }
410                 if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) { 
411                         ldb_debug(module->ldb, LDB_DEBUG_TRACE, "prepare commit transaction error: %s", 
412                                   ldb_errstring(module->ldb));                          
413                 }
414         }
415
416         return status;
417 }
418
419
420 /*
421   commit a transaction
422 */
423 int ldb_transaction_commit(struct ldb_context *ldb)
424 {
425         struct ldb_module *module;
426         int status;
427
428         status = ldb_transaction_prepare_commit(ldb);
429         if (status != LDB_SUCCESS) {
430                 return status;
431         }
432
433         ldb->transaction_active--;
434
435         ldb_debug(ldb, LDB_DEBUG_TRACE,
436                   "commit ldb transaction (nesting: %d)",
437                   ldb->transaction_active);
438
439         /* commit only when all nested transactions are complete */
440         if (ldb->transaction_active > 0) {
441                 return LDB_SUCCESS;
442         }
443
444         if (ldb->transaction_active < 0) {
445                 ldb_debug(ldb, LDB_DEBUG_FATAL,
446                           "commit called but no ldb transactions are active!");
447                 ldb->transaction_active = 0;
448                 return LDB_ERR_OPERATIONS_ERROR;
449         }
450
451         ldb_reset_err_string(ldb);
452
453         FIRST_OP(ldb, end_transaction);
454         status = module->ops->end_transaction(module);
455         if (status != LDB_SUCCESS) {
456                 if (ldb->err_string == NULL) {
457                         /* no error string was setup by the backend */
458                         ldb_asprintf_errstring(ldb,
459                                 "ldb transaction commit: %s (%d)",
460                                 ldb_strerror(status),
461                                 status);
462                 }
463                 if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) { 
464                         ldb_debug(module->ldb, LDB_DEBUG_TRACE, "commit ldb transaction error: %s", 
465                                   ldb_errstring(module->ldb));                          
466                 }
467                 /* cancel the transaction */
468                 FIRST_OP(ldb, del_transaction);
469                 module->ops->del_transaction(module);
470         }
471         return status;
472 }
473
474
475 /*
476   cancel a transaction
477 */
478 int ldb_transaction_cancel(struct ldb_context *ldb)
479 {
480         struct ldb_module *module;
481         int status;
482
483         ldb->transaction_active--;
484
485         ldb_debug(ldb, LDB_DEBUG_TRACE,
486                   "cancel ldb transaction (nesting: %d)",
487                   ldb->transaction_active);
488
489         /* really cancel only if all nested transactions are complete */
490         if (ldb->transaction_active > 0) {
491                 return LDB_SUCCESS;
492         }
493
494         if (ldb->transaction_active < 0) {
495                 ldb_debug(ldb, LDB_DEBUG_FATAL,
496                           "cancel called but no ldb transactions are active!");
497                 ldb->transaction_active = 0;
498                 return LDB_ERR_OPERATIONS_ERROR;
499         }
500
501         FIRST_OP(ldb, del_transaction);
502
503         status = module->ops->del_transaction(module);
504         if (status != LDB_SUCCESS) {
505                 if (ldb->err_string == NULL) {
506                         /* no error string was setup by the backend */
507                         ldb_asprintf_errstring(ldb,
508                                 "ldb transaction cancel: %s (%d)",
509                                 ldb_strerror(status),
510                                 status);
511                 }
512                 if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) { 
513                         ldb_debug(module->ldb, LDB_DEBUG_TRACE, "cancel ldb transaction error: %s", 
514                                   ldb_errstring(module->ldb));                          
515                 }
516         }
517         return status;
518 }
519
520 /*
521   cancel a transaction with no error if no transaction is pending
522   used when we fork() to clear any parent transactions
523 */
524 int ldb_transaction_cancel_noerr(struct ldb_context *ldb)
525 {
526         if (ldb->transaction_active > 0) {
527                 return ldb_transaction_cancel(ldb);
528         }
529         return LDB_SUCCESS;
530 }
531
532
533 /* autostarts a transacion if none active */
534 static int ldb_autotransaction_request(struct ldb_context *ldb,
535                                        struct ldb_request *req)
536 {
537         int ret;
538
539         ret = ldb_transaction_start(ldb);
540         if (ret != LDB_SUCCESS) {
541                 return ret;
542         }
543
544         ret = ldb_request(ldb, req);
545         if (ret == LDB_SUCCESS) {
546                 ret = ldb_wait(req->handle, LDB_WAIT_ALL);
547         }
548
549         if (ret == LDB_SUCCESS) {
550                 return ldb_transaction_commit(ldb);
551         }
552         ldb_transaction_cancel(ldb);
553
554         if (ldb->err_string == NULL) {
555                 /* no error string was setup by the backend */
556                 ldb_asprintf_errstring(ldb, "%s (%d)", ldb_strerror(ret), ret);
557         }
558
559         return ret;
560 }
561
562 int ldb_wait(struct ldb_handle *handle, enum ldb_wait_type type)
563 {
564         struct tevent_context *ev;
565         int ret;
566
567         if (!handle) {
568                 return LDB_ERR_UNAVAILABLE;
569         }
570
571         if (handle->state == LDB_ASYNC_DONE) {
572                 return handle->status;
573         }
574
575         ev = ldb_get_event_context(handle->ldb);
576         if (NULL == ev) {
577                 return LDB_ERR_OPERATIONS_ERROR;
578         }
579
580         switch (type) {
581         case LDB_WAIT_NONE:
582                 ret = tevent_loop_once(ev);
583                 if (ret != 0) {
584                         return LDB_ERR_OPERATIONS_ERROR;
585                 }
586                 if (handle->state == LDB_ASYNC_DONE ||
587                     handle->status != LDB_SUCCESS) {
588                         return handle->status;
589                 }
590                 break;
591
592         case LDB_WAIT_ALL:
593                 while (handle->state != LDB_ASYNC_DONE) {
594                         ret = tevent_loop_once(ev);
595                         if (ret != 0) {
596                                 return LDB_ERR_OPERATIONS_ERROR;
597                         }
598                         if (handle->status != LDB_SUCCESS) {
599                                 return handle->status;
600                         }
601                 }
602                 return handle->status;
603         }
604
605         return LDB_SUCCESS;
606 }
607
608 /* set the specified timeout or, if timeout is 0 set the default timeout */
609 int ldb_set_timeout(struct ldb_context *ldb,
610                     struct ldb_request *req,
611                     int timeout)
612 {
613         if (req == NULL) return LDB_ERR_OPERATIONS_ERROR;
614
615         if (timeout != 0) {
616                 req->timeout = timeout;
617         } else {
618                 req->timeout = ldb->default_timeout;
619         }
620         req->starttime = time(NULL);
621
622         return LDB_SUCCESS;
623 }
624
625 /* calculates the new timeout based on the previous starttime and timeout */
626 int ldb_set_timeout_from_prev_req(struct ldb_context *ldb,
627                                   struct ldb_request *oldreq,
628                                   struct ldb_request *newreq)
629 {
630         if (newreq == NULL) return LDB_ERR_OPERATIONS_ERROR;
631
632         if (oldreq == NULL) {
633                 return ldb_set_timeout(ldb, newreq, 0);
634         }
635
636         newreq->starttime = oldreq->starttime;
637         newreq->timeout = oldreq->timeout;
638
639         return LDB_SUCCESS;
640 }
641
642
643 /*
644    set the permissions for new files to be passed to open() in
645    backends that use local files
646  */
647 void ldb_set_create_perms(struct ldb_context *ldb, unsigned int perms)
648 {
649         ldb->create_perms = perms;
650 }
651
652 unsigned int ldb_get_create_perms(struct ldb_context *ldb)
653 {
654         return ldb->create_perms;
655 }
656
657 void ldb_set_event_context(struct ldb_context *ldb, struct tevent_context *ev)
658 {
659         ldb->ev_ctx = ev;
660 }
661
662 struct tevent_context * ldb_get_event_context(struct ldb_context *ldb)
663 {
664         return ldb->ev_ctx;
665 }
666
667 void ldb_request_set_state(struct ldb_request *req, int state)
668 {
669         req->handle->state = state;
670 }
671
672 int ldb_request_get_status(struct ldb_request *req)
673 {
674         return req->handle->status;
675 }
676
677
678 /*
679   trace a ldb request
680 */
681 static void ldb_trace_request(struct ldb_context *ldb, struct ldb_request *req)
682 {
683         TALLOC_CTX *tmp_ctx = talloc_new(req);
684         unsigned int i;
685
686         switch (req->operation) {
687         case LDB_SEARCH:
688                 ldb_debug_add(ldb, "ldb_trace_request: SEARCH\n");
689                 ldb_debug_add(ldb, " dn: %s\n",
690                               ldb_dn_is_null(req->op.search.base)?"<rootDSE>":
691                               ldb_dn_get_linearized(req->op.search.base));
692                 ldb_debug_add(ldb, " scope: %s\n", 
693                           req->op.search.scope==LDB_SCOPE_BASE?"base":
694                           req->op.search.scope==LDB_SCOPE_ONELEVEL?"one":
695                           req->op.search.scope==LDB_SCOPE_SUBTREE?"sub":"UNKNOWN");
696                 ldb_debug_add(ldb, " expr: %s\n", 
697                           ldb_filter_from_tree(tmp_ctx, req->op.search.tree));
698                 if (req->op.search.attrs == NULL) {
699                         ldb_debug_add(ldb, " attr: <ALL>\n");
700                 } else {
701                         for (i=0; req->op.search.attrs[i]; i++) {
702                                 ldb_debug_add(ldb, " attr: %s\n", req->op.search.attrs[i]);
703                         }
704                 }
705                 break;
706         case LDB_DELETE:
707                 ldb_debug_add(ldb, "ldb_trace_request: DELETE\n");
708                 ldb_debug_add(ldb, " dn: %s\n", 
709                               ldb_dn_get_linearized(req->op.del.dn));
710                 break;
711         case LDB_RENAME:
712                 ldb_debug_add(ldb, "ldb_trace_request: RENAME\n");
713                 ldb_debug_add(ldb, " olddn: %s\n", 
714                               ldb_dn_get_linearized(req->op.rename.olddn));
715                 ldb_debug_add(ldb, " newdn: %s\n", 
716                               ldb_dn_get_linearized(req->op.rename.newdn));
717                 break;
718         case LDB_EXTENDED:
719                 ldb_debug_add(ldb, "ldb_trace_request: EXTENDED\n");
720                 ldb_debug_add(ldb, " oid: %s\n", req->op.extended.oid);
721                 ldb_debug_add(ldb, " data: %s\n", req->op.extended.data?"yes":"no");
722                 break;
723         case LDB_ADD:
724                 ldb_debug_add(ldb, "ldb_trace_request: ADD\n");
725                 ldb_debug_add(req->handle->ldb, "%s\n", 
726                               ldb_ldif_message_string(req->handle->ldb, tmp_ctx, 
727                                                       LDB_CHANGETYPE_ADD, 
728                                                       req->op.add.message));
729                 break;
730         case LDB_MODIFY:
731                 ldb_debug_add(ldb, "ldb_trace_request: MODIFY\n");
732                 ldb_debug_add(req->handle->ldb, "%s\n", 
733                               ldb_ldif_message_string(req->handle->ldb, tmp_ctx, 
734                                                       LDB_CHANGETYPE_ADD, 
735                                                       req->op.mod.message));
736                 break;
737         case LDB_REQ_REGISTER_CONTROL:
738                 ldb_debug_add(ldb, "ldb_trace_request: REGISTER_CONTROL\n");
739                 ldb_debug_add(req->handle->ldb, "%s\n", 
740                               req->op.reg_control.oid);
741                 break;
742         case LDB_REQ_REGISTER_PARTITION:
743                 ldb_debug_add(ldb, "ldb_trace_request: REGISTER_PARTITION\n");
744                 ldb_debug_add(req->handle->ldb, "%s\n", 
745                               ldb_dn_get_linearized(req->op.reg_partition.dn));
746                 break;
747         default:
748                 ldb_debug_add(ldb, "ldb_trace_request: UNKNOWN(%u)\n", 
749                               req->operation);
750                 break;
751         }
752
753         if (req->controls == NULL) {
754                 ldb_debug_add(ldb, " control: <NONE>\n");
755         } else {
756                 for (i=0; req->controls && req->controls[i]; i++) {
757                         ldb_debug_add(ldb, " control: %s  crit:%u  data:%s\n", 
758                                       req->controls[i]->oid, 
759                                       req->controls[i]->critical, 
760                                       req->controls[i]->data?"yes":"no");
761                 }
762         }
763         
764         ldb_debug_end(ldb, LDB_DEBUG_TRACE);
765
766         talloc_free(tmp_ctx);
767 }
768
769
770 /*
771   start an ldb request
772   NOTE: the request must be a talloc context.
773   returns LDB_ERR_* on errors.
774 */
775 int ldb_request(struct ldb_context *ldb, struct ldb_request *req)
776 {
777         struct ldb_module *module;
778         int ret;
779
780         if (req->callback == NULL) {
781                 ldb_set_errstring(ldb, "Requests MUST define callbacks");
782                 return LDB_ERR_UNWILLING_TO_PERFORM;
783         }
784
785         ldb_reset_err_string(ldb);
786
787         if (ldb->flags & LDB_FLG_ENABLE_TRACING) {
788                 ldb_trace_request(ldb, req);
789         }
790
791         /* call the first module in the chain */
792         switch (req->operation) {
793         case LDB_SEARCH:
794                 FIRST_OP(ldb, search);
795                 ret = module->ops->search(module, req);
796                 break;
797         case LDB_ADD:
798                 /* we have to canonicalise here, as so many places
799                  * in modules and backends assume we don't have two
800                  * elements with the same name */
801                 ret = ldb_msg_canonicalize_ex(ldb, req->op.add.message,
802                                               (TALLOC_CTX*)req,
803                                               discard_const(&req->op.add.message));
804                 if (ret != LDB_SUCCESS) {
805                         ldb_oom(ldb);
806                         return LDB_ERR_OPERATIONS_ERROR;
807                 }
808                 FIRST_OP(ldb, add);
809                 ret = module->ops->add(module, req);
810                 break;
811         case LDB_MODIFY:
812                 FIRST_OP(ldb, modify);
813                 ret = module->ops->modify(module, req);
814                 break;
815         case LDB_DELETE:
816                 FIRST_OP(ldb, del);
817                 ret = module->ops->del(module, req);
818                 break;
819         case LDB_RENAME:
820                 if (!ldb_dn_validate(req->op.rename.olddn)) {
821                         ldb_asprintf_errstring(ldb, "ldb_rename: invalid olddn '%s'",
822                                                ldb_dn_get_linearized(req->op.rename.olddn));
823                         return LDB_ERR_INVALID_DN_SYNTAX;
824                 }
825                 if (!ldb_dn_validate(req->op.rename.newdn)) {
826                         ldb_asprintf_errstring(ldb, "ldb_rename: invalid newdn '%s'",
827                                                ldb_dn_get_linearized(req->op.rename.newdn));
828                         return LDB_ERR_INVALID_DN_SYNTAX;
829                 }
830                 FIRST_OP(ldb, rename);
831                 ret = module->ops->rename(module, req);
832                 break;
833         case LDB_EXTENDED:
834                 FIRST_OP(ldb, extended);
835                 ret = module->ops->extended(module, req);
836                 break;
837         default:
838                 FIRST_OP(ldb, request);
839                 ret = module->ops->request(module, req);
840                 break;
841         }
842
843         return ret;
844 }
845
846 int ldb_request_done(struct ldb_request *req, int status)
847 {
848         req->handle->state = LDB_ASYNC_DONE;
849         req->handle->status = status;
850         return status;
851 }
852
853 /*
854   search the database given a LDAP-like search expression
855
856   returns an LDB error code
857
858   Use talloc_free to free the ldb_message returned in 'res', if successful
859
860 */
861 int ldb_search_default_callback(struct ldb_request *req,
862                                 struct ldb_reply *ares)
863 {
864         struct ldb_result *res;
865         unsigned int n;
866
867         res = talloc_get_type(req->context, struct ldb_result);
868
869         if (!ares) {
870                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
871         }
872         if (ares->error != LDB_SUCCESS) {
873                 return ldb_request_done(req, ares->error);
874         }
875
876         switch (ares->type) {
877         case LDB_REPLY_ENTRY:
878                 res->msgs = talloc_realloc(res, res->msgs,
879                                         struct ldb_message *, res->count + 2);
880                 if (! res->msgs) {
881                         return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
882                 }
883
884                 res->msgs[res->count + 1] = NULL;
885
886                 res->msgs[res->count] = talloc_move(res->msgs, &ares->message);
887                 res->count++;
888                 break;
889
890         case LDB_REPLY_REFERRAL:
891                 if (res->refs) {
892                         for (n = 0; res->refs[n]; n++) /*noop*/ ;
893                 } else {
894                         n = 0;
895                 }
896
897                 res->refs = talloc_realloc(res, res->refs, char *, n + 2);
898                 if (! res->refs) {
899                         return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
900                 }
901
902                 res->refs[n] = talloc_move(res->refs, &ares->referral);
903                 res->refs[n + 1] = NULL;
904                 break;
905
906         case LDB_REPLY_DONE:
907                 /* TODO: we should really support controls on entries
908                  * and referrals too! */
909                 res->controls = talloc_move(res, &ares->controls);
910
911                 /* this is the last message, and means the request is done */
912                 /* we have to signal and eventual ldb_wait() waiting that the
913                  * async request operation was completed */
914                 talloc_free(ares);
915                 return ldb_request_done(req, LDB_SUCCESS);
916         }
917
918         talloc_free(ares);
919
920         return LDB_SUCCESS;
921 }
922
923 int ldb_modify_default_callback(struct ldb_request *req, struct ldb_reply *ares)
924 {
925         struct ldb_result *res;
926         unsigned int n;
927         int ret;
928
929         res = talloc_get_type(req->context, struct ldb_result);
930
931         if (!ares) {
932                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
933         }
934
935         if (ares->error != LDB_SUCCESS) {
936                 ret = ares->error;
937                 talloc_free(ares);
938                 return ldb_request_done(req, ret);
939         }
940
941         switch (ares->type) {
942         case LDB_REPLY_REFERRAL:
943                 if (res->refs) {
944                         for (n = 0; res->refs[n]; n++) /*noop*/ ;
945                 } else {
946                         n = 0;
947                 }
948
949                 res->refs = talloc_realloc(res, res->refs, char *, n + 2);
950                 if (! res->refs) {
951                         return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
952                 }
953
954                 res->refs[n] = talloc_move(res->refs, &ares->referral);
955                 res->refs[n + 1] = NULL;
956                 break;
957
958         case LDB_REPLY_DONE:
959                 talloc_free(ares);
960                 return ldb_request_done(req, LDB_SUCCESS);
961         default:
962                 talloc_free(ares);
963                 ldb_set_errstring(req->handle->ldb, "Invalid reply type!");
964                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
965         }
966
967         talloc_free(ares);
968         return ldb_request_done(req, LDB_SUCCESS);
969 }
970
971 int ldb_op_default_callback(struct ldb_request *req, struct ldb_reply *ares)
972 {
973         int ret;
974
975         if (!ares) {
976                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
977         }
978
979         if (ares->error != LDB_SUCCESS) {
980                 ret = ares->error;
981                 talloc_free(ares);
982                 return ldb_request_done(req, ret);
983         }
984
985         if (ares->type != LDB_REPLY_DONE) {
986                 talloc_free(ares);
987                 ldb_set_errstring(req->handle->ldb, "Invalid reply type!");
988                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
989         }
990
991         talloc_free(ares);
992         return ldb_request_done(req, LDB_SUCCESS);
993 }
994
995 int ldb_build_search_req_ex(struct ldb_request **ret_req,
996                         struct ldb_context *ldb,
997                         void *mem_ctx,
998                         struct ldb_dn *base,
999                         enum ldb_scope scope,
1000                         struct ldb_parse_tree *tree,
1001                         const char * const *attrs,
1002                         struct ldb_control **controls,
1003                         void *context,
1004                         ldb_request_callback_t callback,
1005                         struct ldb_request *parent)
1006 {
1007         struct ldb_request *req;
1008
1009         *ret_req = NULL;
1010
1011         req = talloc(mem_ctx, struct ldb_request);
1012         if (req == NULL) {
1013                 ldb_oom(ldb);
1014                 return LDB_ERR_OPERATIONS_ERROR;
1015         }
1016
1017         req->operation = LDB_SEARCH;
1018         if (base == NULL) {
1019                 req->op.search.base = ldb_dn_new(req, ldb, NULL);
1020         } else {
1021                 req->op.search.base = base;
1022         }
1023         req->op.search.scope = scope;
1024
1025         req->op.search.tree = tree;
1026         if (req->op.search.tree == NULL) {
1027                 ldb_set_errstring(ldb, "'tree' can't be NULL");
1028                 talloc_free(req);
1029                 return LDB_ERR_OPERATIONS_ERROR;
1030         }
1031
1032         req->op.search.attrs = attrs;
1033         req->controls = controls;
1034         req->context = context;
1035         req->callback = callback;
1036
1037         ldb_set_timeout_from_prev_req(ldb, parent, req);
1038
1039         req->handle = ldb_handle_new(req, ldb);
1040         if (req->handle == NULL) {
1041                 ldb_oom(ldb);
1042                 return LDB_ERR_OPERATIONS_ERROR;
1043         }
1044
1045         if (parent) {
1046                 req->handle->nesting++;
1047         }
1048
1049         *ret_req = req;
1050         return LDB_SUCCESS;
1051 }
1052
1053 int ldb_build_search_req(struct ldb_request **ret_req,
1054                         struct ldb_context *ldb,
1055                         void *mem_ctx,
1056                         struct ldb_dn *base,
1057                         enum ldb_scope scope,
1058                         const char *expression,
1059                         const char * const *attrs,
1060                         struct ldb_control **controls,
1061                         void *context,
1062                         ldb_request_callback_t callback,
1063                         struct ldb_request *parent)
1064 {
1065         struct ldb_parse_tree *tree;
1066         int ret;
1067
1068         tree = ldb_parse_tree(mem_ctx, expression);
1069         if (tree == NULL) {
1070                 ldb_set_errstring(ldb, "Unable to parse search expression");
1071                 return LDB_ERR_OPERATIONS_ERROR;
1072         }
1073
1074         ret = ldb_build_search_req_ex(ret_req, ldb, mem_ctx, base,
1075                                       scope, tree, attrs, controls,
1076                                       context, callback, parent);
1077         if (ret == LDB_SUCCESS) {
1078                 talloc_steal(*ret_req, tree);
1079         }
1080         return ret;
1081 }
1082
1083 int ldb_build_add_req(struct ldb_request **ret_req,
1084                         struct ldb_context *ldb,
1085                         void *mem_ctx,
1086                         const struct ldb_message *message,
1087                         struct ldb_control **controls,
1088                         void *context,
1089                         ldb_request_callback_t callback,
1090                         struct ldb_request *parent)
1091 {
1092         struct ldb_request *req;
1093
1094         *ret_req = NULL;
1095
1096         req = talloc(mem_ctx, struct ldb_request);
1097         if (req == NULL) {
1098                 ldb_set_errstring(ldb, "Out of Memory");
1099                 return LDB_ERR_OPERATIONS_ERROR;
1100         }
1101
1102         req->operation = LDB_ADD;
1103         req->op.add.message = message;
1104         req->controls = controls;
1105         req->context = context;
1106         req->callback = callback;
1107
1108         ldb_set_timeout_from_prev_req(ldb, parent, req);
1109
1110         req->handle = ldb_handle_new(req, ldb);
1111         if (req->handle == NULL) {
1112                 ldb_oom(ldb);
1113                 return LDB_ERR_OPERATIONS_ERROR;
1114         }
1115
1116         if (parent) {
1117                 req->handle->nesting++;
1118         }
1119
1120         *ret_req = req;
1121
1122         return LDB_SUCCESS;
1123 }
1124
1125 int ldb_build_mod_req(struct ldb_request **ret_req,
1126                         struct ldb_context *ldb,
1127                         void *mem_ctx,
1128                         const struct ldb_message *message,
1129                         struct ldb_control **controls,
1130                         void *context,
1131                         ldb_request_callback_t callback,
1132                         struct ldb_request *parent)
1133 {
1134         struct ldb_request *req;
1135
1136         *ret_req = NULL;
1137
1138         req = talloc(mem_ctx, struct ldb_request);
1139         if (req == NULL) {
1140                 ldb_set_errstring(ldb, "Out of Memory");
1141                 return LDB_ERR_OPERATIONS_ERROR;
1142         }
1143
1144         req->operation = LDB_MODIFY;
1145         req->op.mod.message = message;
1146         req->controls = controls;
1147         req->context = context;
1148         req->callback = callback;
1149
1150         ldb_set_timeout_from_prev_req(ldb, parent, req);
1151
1152         req->handle = ldb_handle_new(req, ldb);
1153         if (req->handle == NULL) {
1154                 ldb_oom(ldb);
1155                 return LDB_ERR_OPERATIONS_ERROR;
1156         }
1157
1158         if (parent) {
1159                 req->handle->nesting++;
1160         }
1161
1162         *ret_req = req;
1163
1164         return LDB_SUCCESS;
1165 }
1166
1167 int ldb_build_del_req(struct ldb_request **ret_req,
1168                         struct ldb_context *ldb,
1169                         void *mem_ctx,
1170                         struct ldb_dn *dn,
1171                         struct ldb_control **controls,
1172                         void *context,
1173                         ldb_request_callback_t callback,
1174                         struct ldb_request *parent)
1175 {
1176         struct ldb_request *req;
1177
1178         *ret_req = NULL;
1179
1180         req = talloc(mem_ctx, struct ldb_request);
1181         if (req == NULL) {
1182                 ldb_set_errstring(ldb, "Out of Memory");
1183                 return LDB_ERR_OPERATIONS_ERROR;
1184         }
1185
1186         req->operation = LDB_DELETE;
1187         req->op.del.dn = dn;
1188         req->controls = controls;
1189         req->context = context;
1190         req->callback = callback;
1191
1192         ldb_set_timeout_from_prev_req(ldb, parent, req);
1193
1194         req->handle = ldb_handle_new(req, ldb);
1195         if (req->handle == NULL) {
1196                 ldb_oom(ldb);
1197                 return LDB_ERR_OPERATIONS_ERROR;
1198         }
1199
1200         if (parent) {
1201                 req->handle->nesting++;
1202         }
1203
1204         *ret_req = req;
1205
1206         return LDB_SUCCESS;
1207 }
1208
1209 int ldb_build_rename_req(struct ldb_request **ret_req,
1210                         struct ldb_context *ldb,
1211                         void *mem_ctx,
1212                         struct ldb_dn *olddn,
1213                         struct ldb_dn *newdn,
1214                         struct ldb_control **controls,
1215                         void *context,
1216                         ldb_request_callback_t callback,
1217                         struct ldb_request *parent)
1218 {
1219         struct ldb_request *req;
1220
1221         *ret_req = NULL;
1222
1223         req = talloc(mem_ctx, struct ldb_request);
1224         if (req == NULL) {
1225                 ldb_set_errstring(ldb, "Out of Memory");
1226                 return LDB_ERR_OPERATIONS_ERROR;
1227         }
1228
1229         req->operation = LDB_RENAME;
1230         req->op.rename.olddn = olddn;
1231         req->op.rename.newdn = newdn;
1232         req->controls = controls;
1233         req->context = context;
1234         req->callback = callback;
1235
1236         ldb_set_timeout_from_prev_req(ldb, parent, req);
1237
1238         req->handle = ldb_handle_new(req, ldb);
1239         if (req->handle == NULL) {
1240                 ldb_oom(ldb);
1241                 return LDB_ERR_OPERATIONS_ERROR;
1242         }
1243
1244         if (parent) {
1245                 req->handle->nesting++;
1246         }
1247
1248         *ret_req = req;
1249
1250         return LDB_SUCCESS;
1251 }
1252
1253 int ldb_extended_default_callback(struct ldb_request *req,
1254                                   struct ldb_reply *ares)
1255 {
1256         struct ldb_result *res;
1257
1258         res = talloc_get_type(req->context, struct ldb_result);
1259
1260         if (!ares) {
1261                 return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
1262         }
1263         if (ares->error != LDB_SUCCESS) {
1264                 return ldb_request_done(req, ares->error);
1265         }
1266
1267         if (ares->type == LDB_REPLY_DONE) {
1268
1269                 /* TODO: we should really support controls on entries and referrals too! */
1270                 res->extended = talloc_move(res, &ares->response);
1271                 res->controls = talloc_move(res, &ares->controls);
1272
1273                 talloc_free(ares);
1274                 return ldb_request_done(req, LDB_SUCCESS);
1275         }
1276
1277         talloc_free(ares);
1278         ldb_set_errstring(req->handle->ldb, "Invalid reply type!");
1279         return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
1280 }
1281
1282 int ldb_build_extended_req(struct ldb_request **ret_req,
1283                            struct ldb_context *ldb,
1284                            void *mem_ctx,
1285                            const char *oid,
1286                            void *data,
1287                            struct ldb_control **controls,
1288                            void *context,
1289                            ldb_request_callback_t callback,
1290                            struct ldb_request *parent)
1291 {
1292         struct ldb_request *req;
1293
1294         *ret_req = NULL;
1295
1296         req = talloc(mem_ctx, struct ldb_request);
1297         if (req == NULL) {
1298                 ldb_set_errstring(ldb, "Out of Memory");
1299                 return LDB_ERR_OPERATIONS_ERROR;
1300         }
1301
1302         req->operation = LDB_EXTENDED;
1303         req->op.extended.oid = oid;
1304         req->op.extended.data = data;
1305         req->controls = controls;
1306         req->context = context;
1307         req->callback = callback;
1308
1309         ldb_set_timeout_from_prev_req(ldb, parent, req);
1310
1311         req->handle = ldb_handle_new(req, ldb);
1312         if (req->handle == NULL) {
1313                 ldb_oom(ldb);
1314                 return LDB_ERR_OPERATIONS_ERROR;
1315         }
1316
1317         if (parent) {
1318                 req->handle->nesting++;
1319         }
1320
1321         *ret_req = req;
1322
1323         return LDB_SUCCESS;
1324 }
1325
1326 int ldb_extended(struct ldb_context *ldb,
1327                  const char *oid,
1328                  void *data,
1329                  struct ldb_result **_res)
1330 {
1331         struct ldb_request *req;
1332         int ret;
1333         struct ldb_result *res;
1334
1335         *_res = NULL;
1336
1337         res = talloc_zero(ldb, struct ldb_result);
1338         if (!res) {
1339                 return LDB_ERR_OPERATIONS_ERROR;
1340         }
1341
1342         ret = ldb_build_extended_req(&req, ldb, ldb,
1343                                      oid, data, NULL,
1344                                      res, ldb_extended_default_callback,
1345                                      NULL);
1346         if (ret != LDB_SUCCESS) goto done;
1347
1348         ldb_set_timeout(ldb, req, 0); /* use default timeout */
1349
1350         ret = ldb_request(ldb, req);
1351
1352         if (ret == LDB_SUCCESS) {
1353                 ret = ldb_wait(req->handle, LDB_WAIT_ALL);
1354         }
1355
1356         talloc_free(req);
1357
1358 done:
1359         if (ret != LDB_SUCCESS) {
1360                 talloc_free(res);
1361         }
1362
1363         *_res = res;
1364         return ret;
1365 }
1366
1367 /*
1368   note that ldb_search() will automatically replace a NULL 'base' value
1369   with the defaultNamingContext from the rootDSE if available.
1370 */
1371 int ldb_search(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
1372                 struct ldb_result **result, struct ldb_dn *base,
1373                 enum ldb_scope scope, const char * const *attrs,
1374                 const char *exp_fmt, ...)
1375 {
1376         struct ldb_request *req;
1377         struct ldb_result *res;
1378         char *expression;
1379         va_list ap;
1380         int ret;
1381
1382         expression = NULL;
1383         *result = NULL;
1384         req = NULL;
1385
1386         res = talloc_zero(mem_ctx, struct ldb_result);
1387         if (!res) {
1388                 return LDB_ERR_OPERATIONS_ERROR;
1389         }
1390
1391         if (exp_fmt) {
1392                 va_start(ap, exp_fmt);
1393                 expression = talloc_vasprintf(mem_ctx, exp_fmt, ap);
1394                 va_end(ap);
1395
1396                 if (!expression) {
1397                         talloc_free(res);
1398                         return LDB_ERR_OPERATIONS_ERROR;
1399                 }
1400         }
1401
1402         ret = ldb_build_search_req(&req, ldb, mem_ctx,
1403                                         base?base:ldb_get_default_basedn(ldb),
1404                                         scope,
1405                                         expression,
1406                                         attrs,
1407                                         NULL,
1408                                         res,
1409                                         ldb_search_default_callback,
1410                                         NULL);
1411
1412         if (ret != LDB_SUCCESS) goto done;
1413
1414         ret = ldb_request(ldb, req);
1415
1416         if (ret == LDB_SUCCESS) {
1417                 ret = ldb_wait(req->handle, LDB_WAIT_ALL);
1418         }
1419
1420 done:
1421         if (ret != LDB_SUCCESS) {
1422                 talloc_free(res);
1423                 res = NULL;
1424         }
1425
1426         talloc_free(expression);
1427         talloc_free(req);
1428
1429         *result = res;
1430         return ret;
1431 }
1432
1433 /*
1434   add a record to the database. Will fail if a record with the given class
1435   and key already exists
1436 */
1437 int ldb_add(struct ldb_context *ldb,
1438             const struct ldb_message *message)
1439 {
1440         struct ldb_request *req;
1441         int ret;
1442
1443         ret = ldb_msg_sanity_check(ldb, message);
1444         if (ret != LDB_SUCCESS) {
1445                 return ret;
1446         }
1447
1448         ret = ldb_build_add_req(&req, ldb, ldb,
1449                                         message,
1450                                         NULL,
1451                                         NULL,
1452                                         ldb_op_default_callback,
1453                                         NULL);
1454
1455         if (ret != LDB_SUCCESS) return ret;
1456
1457         /* do request and autostart a transaction */
1458         ret = ldb_autotransaction_request(ldb, req);
1459
1460         talloc_free(req);
1461         return ret;
1462 }
1463
1464 /*
1465   modify the specified attributes of a record
1466 */
1467 int ldb_modify(struct ldb_context *ldb,
1468                const struct ldb_message *message)
1469 {
1470         struct ldb_request *req;
1471         int ret;
1472
1473         ret = ldb_msg_sanity_check(ldb, message);
1474         if (ret != LDB_SUCCESS) {
1475                 return ret;
1476         }
1477
1478         ret = ldb_build_mod_req(&req, ldb, ldb,
1479                                         message,
1480                                         NULL,
1481                                         NULL,
1482                                         ldb_op_default_callback,
1483                                         NULL);
1484
1485         if (ret != LDB_SUCCESS) return ret;
1486
1487         /* do request and autostart a transaction */
1488         ret = ldb_autotransaction_request(ldb, req);
1489
1490         talloc_free(req);
1491         return ret;
1492 }
1493
1494
1495 /*
1496   delete a record from the database
1497 */
1498 int ldb_delete(struct ldb_context *ldb, struct ldb_dn *dn)
1499 {
1500         struct ldb_request *req;
1501         int ret;
1502
1503         ret = ldb_build_del_req(&req, ldb, ldb,
1504                                         dn,
1505                                         NULL,
1506                                         NULL,
1507                                         ldb_op_default_callback,
1508                                         NULL);
1509
1510         if (ret != LDB_SUCCESS) return ret;
1511
1512         /* do request and autostart a transaction */
1513         ret = ldb_autotransaction_request(ldb, req);
1514
1515         talloc_free(req);
1516         return ret;
1517 }
1518
1519 /*
1520   rename a record in the database
1521 */
1522 int ldb_rename(struct ldb_context *ldb,
1523                 struct ldb_dn *olddn, struct ldb_dn *newdn)
1524 {
1525         struct ldb_request *req;
1526         int ret;
1527
1528         ret = ldb_build_rename_req(&req, ldb, ldb,
1529                                         olddn,
1530                                         newdn,
1531                                         NULL,
1532                                         NULL,
1533                                         ldb_op_default_callback,
1534                                         NULL);
1535
1536         if (ret != LDB_SUCCESS) return ret;
1537
1538         /* do request and autostart a transaction */
1539         ret = ldb_autotransaction_request(ldb, req);
1540
1541         talloc_free(req);
1542         return ret;
1543 }
1544
1545
1546 /*
1547   return the global sequence number
1548 */
1549 int ldb_sequence_number(struct ldb_context *ldb,
1550                         enum ldb_sequence_type type, uint64_t *seq_num)
1551 {
1552         struct ldb_seqnum_request *seq;
1553         struct ldb_seqnum_result *seqr;
1554         struct ldb_result *res;
1555         TALLOC_CTX *tmp_ctx;
1556         int ret;
1557
1558         *seq_num = 0;
1559
1560         tmp_ctx = talloc_zero(ldb, struct ldb_request);
1561         if (tmp_ctx == NULL) {
1562                 ldb_set_errstring(ldb, "Out of Memory");
1563                 return LDB_ERR_OPERATIONS_ERROR;
1564         }
1565         seq = talloc_zero(tmp_ctx, struct ldb_seqnum_request);
1566         if (seq == NULL) {
1567                 ldb_set_errstring(ldb, "Out of Memory");
1568                 ret = LDB_ERR_OPERATIONS_ERROR;
1569                 goto done;
1570         }
1571         seq->type = type;
1572
1573         ret = ldb_extended(ldb, LDB_EXTENDED_SEQUENCE_NUMBER, seq, &res);
1574         if (ret != LDB_SUCCESS) {
1575                 goto done;
1576         }
1577         talloc_steal(tmp_ctx, res);
1578
1579         if (strcmp(LDB_EXTENDED_SEQUENCE_NUMBER, res->extended->oid) != 0) {
1580                 ldb_set_errstring(ldb, "Invalid OID in reply");
1581                 ret = LDB_ERR_OPERATIONS_ERROR;
1582                 goto done;
1583         }
1584         seqr = talloc_get_type(res->extended->data,
1585                                 struct ldb_seqnum_result);
1586         *seq_num = seqr->seq_num;
1587
1588 done:
1589         talloc_free(tmp_ctx);
1590         return ret;
1591 }
1592
1593 /*
1594   return extended error information
1595 */
1596 const char *ldb_errstring(struct ldb_context *ldb)
1597 {
1598         if (ldb->err_string) {
1599                 return ldb->err_string;
1600         }
1601
1602         return NULL;
1603 }
1604
1605 /*
1606   return a string explaining what a ldb error constant meancs
1607 */
1608 const char *ldb_strerror(int ldb_err)
1609 {
1610         switch (ldb_err) {
1611         case LDB_SUCCESS:
1612                 return "Success";
1613         case LDB_ERR_OPERATIONS_ERROR:
1614                 return "Operations error";
1615         case LDB_ERR_PROTOCOL_ERROR:
1616                 return "Protocol error";
1617         case LDB_ERR_TIME_LIMIT_EXCEEDED:
1618                 return "Time limit exceeded";
1619         case LDB_ERR_SIZE_LIMIT_EXCEEDED:
1620                 return "Size limit exceeded";
1621         case LDB_ERR_COMPARE_FALSE:
1622                 return "Compare false";
1623         case LDB_ERR_COMPARE_TRUE:
1624                 return "Compare true";
1625         case LDB_ERR_AUTH_METHOD_NOT_SUPPORTED:
1626                 return "Auth method not supported";
1627         case LDB_ERR_STRONG_AUTH_REQUIRED:
1628                 return "Strong auth required";
1629 /* 9 RESERVED */
1630         case LDB_ERR_REFERRAL:
1631                 return "Referral error";
1632         case LDB_ERR_ADMIN_LIMIT_EXCEEDED:
1633                 return "Admin limit exceeded";
1634         case LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION:
1635                 return "Unsupported critical extension";
1636         case LDB_ERR_CONFIDENTIALITY_REQUIRED:
1637                 return "Confidentiality required";
1638         case LDB_ERR_SASL_BIND_IN_PROGRESS:
1639                 return "SASL bind in progress";
1640         case LDB_ERR_NO_SUCH_ATTRIBUTE:
1641                 return "No such attribute";
1642         case LDB_ERR_UNDEFINED_ATTRIBUTE_TYPE:
1643                 return "Undefined attribute type";
1644         case LDB_ERR_INAPPROPRIATE_MATCHING:
1645                 return "Inappropriate matching";
1646         case LDB_ERR_CONSTRAINT_VIOLATION:
1647                 return "Constraint violation";
1648         case LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS:
1649                 return "Attribute or value exists";
1650         case LDB_ERR_INVALID_ATTRIBUTE_SYNTAX:
1651                 return "Invalid attribute syntax";
1652 /* 22-31 unused */
1653         case LDB_ERR_NO_SUCH_OBJECT:
1654                 return "No such object";
1655         case LDB_ERR_ALIAS_PROBLEM:
1656                 return "Alias problem";
1657         case LDB_ERR_INVALID_DN_SYNTAX:
1658                 return "Invalid DN syntax";
1659 /* 35 RESERVED */
1660         case LDB_ERR_ALIAS_DEREFERENCING_PROBLEM:
1661                 return "Alias dereferencing problem";
1662 /* 37-47 unused */
1663         case LDB_ERR_INAPPROPRIATE_AUTHENTICATION:
1664                 return "Inappropriate authentication";
1665         case LDB_ERR_INVALID_CREDENTIALS:
1666                 return "Invalid credentials";
1667         case LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS:
1668                 return "insufficient access rights";
1669         case LDB_ERR_BUSY:
1670                 return "Busy";
1671         case LDB_ERR_UNAVAILABLE:
1672                 return "Unavailable";
1673         case LDB_ERR_UNWILLING_TO_PERFORM:
1674                 return "Unwilling to perform";
1675         case LDB_ERR_LOOP_DETECT:
1676                 return "Loop detect";
1677 /* 55-63 unused */
1678         case LDB_ERR_NAMING_VIOLATION:
1679                 return "Naming violation";
1680         case LDB_ERR_OBJECT_CLASS_VIOLATION:
1681                 return "Object class violation";
1682         case LDB_ERR_NOT_ALLOWED_ON_NON_LEAF:
1683                 return "Not allowed on non-leaf";
1684         case LDB_ERR_NOT_ALLOWED_ON_RDN:
1685                 return "Not allowed on RDN";
1686         case LDB_ERR_ENTRY_ALREADY_EXISTS:
1687                 return "Entry already exists";
1688         case LDB_ERR_OBJECT_CLASS_MODS_PROHIBITED:
1689                 return "Object class mods prohibited";
1690 /* 70 RESERVED FOR CLDAP */
1691         case LDB_ERR_AFFECTS_MULTIPLE_DSAS:
1692                 return "Affects multiple DSAs";
1693 /* 72-79 unused */
1694         case LDB_ERR_OTHER:
1695                 return "Other";
1696         }
1697
1698         return "Unknown error";
1699 }
1700
1701 /*
1702   set backend specific opaque parameters
1703 */
1704 int ldb_set_opaque(struct ldb_context *ldb, const char *name, void *value)
1705 {
1706         struct ldb_opaque *o;
1707
1708         /* allow updating an existing value */
1709         for (o=ldb->opaque;o;o=o->next) {
1710                 if (strcmp(o->name, name) == 0) {
1711                         o->value = value;
1712                         return LDB_SUCCESS;
1713                 }
1714         }
1715
1716         o = talloc(ldb, struct ldb_opaque);
1717         if (o == NULL) {
1718                 ldb_oom(ldb);
1719                 return LDB_ERR_OTHER;
1720         }
1721         o->next = ldb->opaque;
1722         o->name = name;
1723         o->value = value;
1724         ldb->opaque = o;
1725         return LDB_SUCCESS;
1726 }
1727
1728 /*
1729   get a previously set opaque value
1730 */
1731 void *ldb_get_opaque(struct ldb_context *ldb, const char *name)
1732 {
1733         struct ldb_opaque *o;
1734         for (o=ldb->opaque;o;o=o->next) {
1735                 if (strcmp(o->name, name) == 0) {
1736                         return o->value;
1737                 }
1738         }
1739         return NULL;
1740 }
1741
1742 int ldb_global_init(void)
1743 {
1744         /* Provided for compatibility with some older versions of ldb */
1745         return 0;
1746 }
1747
1748 /* return the ldb flags */
1749 unsigned int ldb_get_flags(struct ldb_context *ldb)
1750 {
1751         return ldb->flags;
1752 }
1753
1754 /* set the ldb flags */
1755 void ldb_set_flags(struct ldb_context *ldb, unsigned flags)
1756 {
1757         ldb->flags = flags;
1758 }