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 69623 : static int samba_secrets_init(struct ldb_module *module) 41 : { 42 69623 : struct ldb_context *ldb = ldb_module_get_ctx(module); 43 2687 : int ret, len, i; 44 69623 : TALLOC_CTX *tmp_ctx = talloc_new(module); 45 2687 : struct ldb_module *backend_module, *module_chain; 46 2687 : 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 2687 : static const char *modules_list[] = {"update_keytab", 55 : "secrets_tdb_sync", 56 : "objectguid", 57 : "rdn_name", 58 : NULL }; 59 : 60 69623 : 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 348115 : for (len = 0; modules_list[len]; len++) { /* noop */}; 66 : 67 69623 : reverse_module_list = talloc_array(tmp_ctx, const char *, len+1); 68 69623 : if (!reverse_module_list) { 69 0 : talloc_free(tmp_ctx); 70 0 : return ldb_oom(ldb); 71 : } 72 348115 : for (i=0; i < len; i++) { 73 278492 : reverse_module_list[i] = modules_list[(len - 1) - i]; 74 : } 75 69623 : 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 69623 : backend_module = ldb_module_next(module); 81 69623 : ret = ldb_module_load_list(ldb, reverse_module_list, backend_module, &module_chain); 82 69623 : if (ret != LDB_SUCCESS) { 83 0 : talloc_free(tmp_ctx); 84 0 : return ret; 85 : } 86 : 87 69623 : talloc_free(tmp_ctx); 88 : /* Set this as the 'next' module, so that we effectivly append it to module chain */ 89 69623 : ldb_module_set_next(module, module_chain); 90 : 91 69623 : 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 6040 : int ldb_samba_secrets_module_init(const char *version) 100 : { 101 6040 : LDB_MODULE_CHECK_VERSION(version); 102 6040 : return ldb_register_module(&ldb_samba_secrets_module_ops); 103 : }