summaryrefslogtreecommitdiff
path: root/source4/nbt_server/wins/wins_ldb.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2006-01-13 16:58:04 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:51:02 -0500
commitcd9752d61f49a07a1e943b524c56e0bb75cdeb61 (patch)
treeb222f4e73663512c7fd960b7940789c3e696a1ab /source4/nbt_server/wins/wins_ldb.c
parentef1572dbc160f4e0ae7eb5b4aa02fdb8b1817ec4 (diff)
downloadsamba-cd9752d61f49a07a1e943b524c56e0bb75cdeb61.tar.gz
samba-cd9752d61f49a07a1e943b524c56e0bb75cdeb61.tar.bz2
samba-cd9752d61f49a07a1e943b524c56e0bb75cdeb61.zip
r12909: add an ldb module for the wins.ldb,
it currently doesn't do much, but it's later prevent adding corrupted records via ldbedit, and will take care of the versionID counter metze (This used to be commit a6f279bc43c74cf4dc116cb6ba99f1aed13a4de9)
Diffstat (limited to 'source4/nbt_server/wins/wins_ldb.c')
-rw-r--r--source4/nbt_server/wins/wins_ldb.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/source4/nbt_server/wins/wins_ldb.c b/source4/nbt_server/wins/wins_ldb.c
new file mode 100644
index 0000000000..7bf1fa9916
--- /dev/null
+++ b/source4/nbt_server/wins/wins_ldb.c
@@ -0,0 +1,137 @@
+/*
+ ldb database module
+
+ Copyright (C) Stefan Metzmacher 2006
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ * Name: ldb
+ *
+ * Component: ldb winsdb module
+ *
+ * Description: verify winsdb records before they're written to disk
+ *
+ * Author: Stefan Metzmacher
+ */
+
+#include "includes.h"
+#include "nbt_server/nbt_server.h"
+#include "nbt_server/wins/winsdb.h"
+#include "lib/ldb/include/ldb.h"
+#include "lib/ldb/include/ldb_errors.h"
+#include "lib/ldb/include/ldb_private.h"
+
+/* add_record: do things with the sambaPassword attribute */
+static int wins_ldb_verify(struct ldb_module *module, struct ldb_request *req, const struct ldb_message *msg)
+{
+ struct winsdb_handle *h = talloc_get_type(ldb_get_opaque(module->ldb, "winsdb_handle"),
+ struct winsdb_handle);
+ char *error = NULL;
+
+ if (!h) {
+ error = talloc_strdup(module, "WINS_LDB: INTERNAL ERROR: no winsdb_handle present!");
+ ldb_debug(module->ldb, LDB_DEBUG_FATAL, "%s", error);
+ ldb_set_errstring(module, error);
+ return LDB_ERR_OTHER;
+ }
+
+ switch (h->caller) {
+ case WINSDB_HANDLE_CALLER_NBTD:
+ case WINSDB_HANDLE_CALLER_WREPL:
+ /* we trust our nbt and wrepl code ... */
+ return ldb_next_request(module, req);
+
+ case WINSDB_HANDLE_CALLER_ADMIN:
+ error = talloc_strdup(module, "WINS_LDB: TODO verify add/modify for WINSDB_HANDLE_CALLER_ADMIN");
+ ldb_debug(module->ldb, LDB_DEBUG_WARNING, "%s\n", error);
+ return ldb_next_request(module, req);
+ }
+
+ return LDB_ERR_OTHER;
+}
+
+static int wins_ldb_request(struct ldb_module *module, struct ldb_request *req)
+{
+ const struct ldb_message *msg = req->op.mod.message;
+
+ switch (req->operation) {
+ case LDB_REQ_ADD:
+ msg = req->op.add.message;
+ break;
+
+ case LDB_REQ_MODIFY:
+ msg = req->op.mod.message;
+ break;
+
+ default:
+ goto call_next;
+ }
+
+ if (ldb_dn_is_special(msg->dn)) goto call_next;
+
+ return wins_ldb_verify(module, req, msg);
+
+call_next:
+ return ldb_next_request(module, req);
+}
+
+static const struct ldb_module_ops wins_ldb_ops = {
+ .name = "wins_ldb",
+ .request = wins_ldb_request
+};
+
+
+/* the init function */
+struct ldb_module *wins_ldb_module_init(struct ldb_context *ldb, const char *options[])
+{
+ struct ldb_module *ctx;
+ struct winsdb_handle *h;
+ const char *owner;
+ int ret;
+
+ ctx = talloc(ldb, struct ldb_module);
+ if (!ctx) return NULL;
+
+ ctx->private_data = NULL;
+ ctx->ldb = ldb;
+ ctx->prev = ctx->next = NULL;
+ ctx->ops = &wins_ldb_ops;
+
+ owner = lp_parm_string(-1, "winsdb", "local_owner");
+ if (!owner) {
+ owner = iface_n_ip(0);
+ if (!owner) {
+ owner = "0.0.0.0";
+ }
+ }
+
+ h = talloc(ctx, struct winsdb_handle);
+ if (!h) goto failed;
+ h->ldb = ldb;
+ h->caller = WINSDB_HANDLE_CALLER_ADMIN;
+ h->local_owner = talloc_strdup(h, owner);
+ if (!h->local_owner) goto failed;
+
+ ret = ldb_set_opaque(ldb, "winsdb_handle", h);
+ if (ret != LDB_SUCCESS) goto failed;
+
+ return ctx;
+
+failed:
+ talloc_free(ctx);
+ return NULL;
+}