4 Copyright (C) Stefan Metzmacher 2006
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.
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.
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/>.
23 * Component: ldb winsdb module
25 * Description: verify winsdb records before they're written to disk
27 * Author: Stefan Metzmacher
31 #include "lib/events/events.h"
32 #include "nbt_server/nbt_server.h"
33 #include "nbt_server/wins/winsdb.h"
34 #include <ldb_module.h>
35 #include "system/network.h"
36 #include "lib/socket/netif.h"
37 #include "param/param.h"
39 static int wins_ldb_verify(struct ldb_module
*module
, struct ldb_request
*req
)
41 struct ldb_context
*ldb
= ldb_module_get_ctx(module
);
42 struct winsdb_handle
*h
= talloc_get_type(ldb_get_opaque(ldb
, "winsdb_handle"),
43 struct winsdb_handle
);
44 const struct ldb_message
*msg
;
46 switch (req
->operation
) {
48 msg
= req
->op
.add
.message
;
52 msg
= req
->op
.mod
.message
;
56 return ldb_next_request(module
, req
);
59 /* do not manipulate our control entries */
60 if (ldb_dn_is_special(msg
->dn
)) {
61 return ldb_next_request(module
, req
);
65 ldb_debug_set(ldb
, LDB_DEBUG_FATAL
, "%s", "WINS_LDB: INTERNAL ERROR: no winsdb_handle present!");
70 case WINSDB_HANDLE_CALLER_NBTD
:
71 case WINSDB_HANDLE_CALLER_WREPL
:
72 /* we trust our nbt and wrepl code ... */
73 return ldb_next_request(module
, req
);
75 case WINSDB_HANDLE_CALLER_ADMIN
:
76 ldb_debug(ldb
, LDB_DEBUG_WARNING
, "%s\n", "WINS_LDB: TODO verify add/modify for WINSDB_HANDLE_CALLER_ADMIN");
77 return ldb_next_request(module
, req
);
83 static int wins_ldb_init(struct ldb_module
*module
)
85 struct ldb_context
*ldb
= ldb_module_get_ctx(module
);
86 struct winsdb_handle
*h
;
88 struct loadparm_context
*lp_ctx
= ldb_get_opaque(ldb
, "loadparm");
90 ldb_module_set_private(module
, NULL
);
92 owner
= lpcfg_parm_string(lp_ctx
, NULL
, "winsdb", "local_owner");
94 struct interface
*ifaces
;
95 load_interface_list(module
, lp_ctx
, &ifaces
);
96 owner
= iface_list_first_v4(ifaces
);
102 h
= talloc_zero(module
, struct winsdb_handle
);
105 h
->caller
= WINSDB_HANDLE_CALLER_ADMIN
;
106 h
->local_owner
= talloc_strdup(h
, owner
);
107 if (!h
->local_owner
) goto failed
;
109 return ldb_set_opaque(ldb
, "winsdb_handle", h
);
113 return LDB_ERR_OTHER
;
116 static const struct ldb_module_ops ldb_wins_ldb_module_ops
= {
118 .add
= wins_ldb_verify
,
119 .modify
= wins_ldb_verify
,
120 .init_context
= wins_ldb_init
123 int ldb_wins_ldb_module_init(const char *version
)
125 LDB_MODULE_CHECK_VERSION(version
);
126 return ldb_register_module(&ldb_wins_ldb_module_ops
);