Line data Source code
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 <ldb.h>
34 : #include <ldb_errors.h>
35 : #include <ldb_module.h>
36 : #include "dsdb/samdb/ldb_modules/util.h"
37 : #include "dsdb/samdb/samdb.h"
38 :
39 :
40 43095 : static int samba_secrets_init(struct ldb_module *module)
41 : {
42 43095 : struct ldb_context *ldb = ldb_module_get_ctx(module);
43 : int ret, len, i;
44 43095 : TALLOC_CTX *tmp_ctx = talloc_new(module);
45 : struct ldb_module *backend_module, *module_chain;
46 : const char **reverse_module_list;
47 : /*
48 : Add modules to the list to activate them by default
49 : beware often order is important
50 :
51 : The list is presented here as a set of declarations to show the
52 : stack visually
53 : */
54 : static const char *modules_list[] = {"update_keytab",
55 : "secrets_tdb_sync",
56 : "objectguid",
57 : "rdn_name",
58 : NULL };
59 :
60 43095 : if (!tmp_ctx) {
61 0 : return ldb_oom(ldb);
62 : }
63 :
64 : /* Now prepare the module chain. Oddly, we must give it to ldb_load_modules_list in REVERSE */
65 79699 : for (len = 0; modules_list[len]; len++) { /* noop */};
66 :
67 43095 : reverse_module_list = talloc_array(tmp_ctx, const char *, len+1);
68 43095 : if (!reverse_module_list) {
69 0 : talloc_free(tmp_ctx);
70 0 : return ldb_oom(ldb);
71 : }
72 215475 : for (i=0; i < len; i++) {
73 172380 : reverse_module_list[i] = modules_list[(len - 1) - i];
74 : }
75 43095 : reverse_module_list[i] = NULL;
76 :
77 : /* The backend (at least until the partitions module
78 : * reconfigures things) is the next module in the currently
79 : * loaded chain */
80 43095 : backend_module = ldb_module_next(module);
81 43095 : ret = ldb_module_load_list(ldb, reverse_module_list, backend_module, &module_chain);
82 43095 : if (ret != LDB_SUCCESS) {
83 0 : talloc_free(tmp_ctx);
84 0 : return ret;
85 : }
86 :
87 43095 : talloc_free(tmp_ctx);
88 : /* Set this as the 'next' module, so that we effectivly append it to module chain */
89 43095 : ldb_module_set_next(module, module_chain);
90 :
91 43095 : return ldb_next_init(module);
92 : }
93 :
94 : static const struct ldb_module_ops ldb_samba_secrets_module_ops = {
95 : .name = "samba_secrets",
96 : .init_context = samba_secrets_init,
97 : };
98 :
99 4310 : int ldb_samba_secrets_module_init(const char *version)
100 : {
101 4310 : LDB_MODULE_CHECK_VERSION(version);
102 4310 : return ldb_register_module(&ldb_samba_secrets_module_ops);
103 : }
|