s4-dsdb: use ldb_operr() in the dsdb code
[metze/samba/wip.git] / source4 / dsdb / samdb / ldb_modules / samba_secrets.c
1 /* 
2    Samba4 module loading module (for secrets)
3
4    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2009
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 /*
21  *  Name: ldb
22  *
23  *  Component: Samba4 module loading module (for secrets.ldb)
24  *
25  *  Description: Implement a single 'module' in the secrets.ldb database
26  *
27  *  This is to avoid forcing a reprovision of the ldb databases when we change the internal structure of the code
28  *
29  *  Author: Andrew Bartlett
30  */
31
32 #include "includes.h"
33 #include "lib/ldb/include/ldb.h"
34 #include "lib/ldb/include/ldb_errors.h"
35 #include "lib/ldb/include/ldb_module.h"
36 #include "lib/ldb/include/ldb_private.h"
37
38 #include "dsdb/samdb/ldb_modules/util.h"
39 #include "dsdb/samdb/samdb.h"
40
41
42 static int samba_secrets_init(struct ldb_module *module)
43 {
44         struct ldb_context *ldb = ldb_module_get_ctx(module);
45         int ret, len, i;
46         TALLOC_CTX *tmp_ctx = talloc_new(module);
47         struct ldb_module *backend_module, *module_chain;
48         const char **reverse_module_list;
49         /*
50           Add modules to the list to activate them by default
51           beware often order is important
52           
53           The list is presented here as a set of declarations to show the
54           stack visually
55         */
56         static const char *modules_list[] = {"update_keytab",
57                                              "objectguid",
58                                              "rdn_name",
59                                              NULL };
60
61         if (!tmp_ctx) {
62                 return ldb_oom(ldb);
63         }
64
65         /* Now prepare the module chain.  Oddly, we must give it to ldb_load_modules_list in REVERSE */
66         for (len = 0; modules_list[len]; len++) { /* noop */};
67
68         reverse_module_list = talloc_array(tmp_ctx, const char *, len+1);
69         if (!reverse_module_list) {
70                 talloc_free(tmp_ctx);
71                 return ldb_oom(ldb);
72         }
73         for (i=0; i < len; i++) {
74                 reverse_module_list[i] = modules_list[(len - 1) - i];
75         }
76         reverse_module_list[i] = NULL;
77
78         /* The backend (at least until the partitions module
79          * reconfigures things) is the next module in the currently
80          * loaded chain */
81         backend_module = module->next;
82         ret = ldb_load_modules_list(ldb, reverse_module_list, backend_module, &module_chain);
83         if (ret != LDB_SUCCESS) {
84                 talloc_free(tmp_ctx);
85                 return ret;
86         }
87
88         talloc_free(tmp_ctx);
89         /* Set this as the 'next' module, so that we effectivly append it to module chain */
90         module->next = module_chain;
91
92         return ldb_next_init(module);
93 }
94
95 _PUBLIC_ const struct ldb_module_ops ldb_samba_secrets_module_ops = {
96         .name              = "samba_secrets",
97         .init_context      = samba_secrets_init,
98 };