summaryrefslogtreecommitdiff
path: root/source4/lib/registry/reg_backend_ldb.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/registry/reg_backend_ldb.c')
-rw-r--r--source4/lib/registry/reg_backend_ldb.c405
1 files changed, 0 insertions, 405 deletions
diff --git a/source4/lib/registry/reg_backend_ldb.c b/source4/lib/registry/reg_backend_ldb.c
deleted file mode 100644
index ca9327c174..0000000000
--- a/source4/lib/registry/reg_backend_ldb.c
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
- Registry interface
- Copyright (C) Jelmer Vernooij 2004.
-
- 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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-#include "registry.h"
-#include "lib/ldb/include/ldb.h"
-#include "lib/ldb/include/ldb_errors.h"
-#include "db_wrap.h"
-#include "librpc/gen_ndr/winreg.h"
-
-struct ldb_key_data
-{
- struct ldb_dn *dn;
- struct ldb_message **subkeys, **values;
- int subkey_count, value_count;
-};
-
-static int ldb_free_hive (struct registry_hive *hive)
-{
- talloc_free(hive->backend_data);
- hive->backend_data = NULL;
- return 0;
-}
-
-static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx, struct ldb_message *msg, const char **name, uint32_t *type, DATA_BLOB *data)
-{
- const struct ldb_val *val;
- *name = talloc_strdup(mem_ctx, ldb_msg_find_attr_as_string(msg, "value", NULL));
- *type = ldb_msg_find_attr_as_uint(msg, "type", 0);
- val = ldb_msg_find_ldb_val(msg, "data");
-
- switch (*type)
- {
- case REG_SZ:
- case REG_EXPAND_SZ:
- data->length = convert_string_talloc(mem_ctx, CH_UTF8, CH_UTF16, val->data, val->length, (void **)&data->data);
- break;
-
- case REG_DWORD: {
- uint32_t tmp = strtoul((char *)val->data, NULL, 0);
- *data = data_blob_talloc(mem_ctx, &tmp, 4);
- }
- break;
-
- default:
- *data = data_blob_talloc(mem_ctx, val->data, val->length);
- break;
- }
-}
-
-static struct ldb_message *reg_ldb_pack_value(struct ldb_context *ctx, TALLOC_CTX *mem_ctx, const char *name, uint32_t type, DATA_BLOB data)
-{
- struct ldb_val val;
- struct ldb_message *msg = talloc_zero(mem_ctx, struct ldb_message);
- char *type_s;
-
- ldb_msg_add_string(msg, "value", talloc_strdup(mem_ctx, name));
-
- switch (type) {
- case REG_SZ:
- case REG_EXPAND_SZ:
- val.length = convert_string_talloc(mem_ctx, CH_UTF16, CH_UTF8, (void *)data.data, data.length, (void **)&val.data);
- ldb_msg_add_value(msg, "data", &val, NULL);
- break;
-
- case REG_DWORD:
- ldb_msg_add_string(msg, "data", talloc_asprintf(mem_ctx, "0x%x", IVAL(data.data, 0)));
- break;
- default:
- ldb_msg_add_value(msg, "data", &data, NULL);
- }
-
-
- type_s = talloc_asprintf(mem_ctx, "%u", type);
- ldb_msg_add_string(msg, "type", type_s);
-
- return msg;
-}
-
-
-static int reg_close_ldb_key(struct registry_key *key)
-{
- struct ldb_key_data *kd = talloc_get_type(key->backend_data, struct ldb_key_data);
-/* struct ldb_context *c = key->hive->backend_data; */
-
- if (kd->subkeys) {
- talloc_free(kd->subkeys);
- kd->subkeys = NULL;
- }
-
- if (kd->values) {
- talloc_free(kd->values);
- kd->values = NULL;
- }
- return 0;
-}
-
-static struct ldb_dn *reg_path_to_ldb(TALLOC_CTX *mem_ctx, const struct registry_key *from, const char *path, const char *add)
-{
- TALLOC_CTX *local_ctx;
- struct ldb_dn *ret;
- char *mypath = talloc_strdup(mem_ctx, path);
- char *begin;
- struct ldb_key_data *kd = talloc_get_type(from->backend_data, struct ldb_key_data);
- struct ldb_context *ldb = talloc_get_type(from->hive->backend_data, struct ldb_context);
-
- local_ctx = talloc_new(mem_ctx);
-
- if (add) {
- ret = ldb_dn_new(mem_ctx, ldb, add);
- } else {
- ret = ldb_dn_new(mem_ctx, ldb, NULL);
- }
- if ( ! ldb_dn_validate(ret)) {
- talloc_free(ret);
- talloc_free(local_ctx);
- return NULL;
- }
-
- while(mypath) {
- char *keyname;
-
- begin = strrchr(mypath, '\\');
-
- if (begin) keyname = begin + 1;
- else keyname = mypath;
-
- if(strlen(keyname)) {
- ldb_dn_add_base_fmt(ret, "key=%s", keyname);
- }
-
- if(begin) {
- *begin = '\0';
- } else {
- break;
- }
- }
-
- ldb_dn_add_base(ret, kd->dn);
-
- talloc_free(local_ctx);
-
- return ret;
-}
-
-
-static WERROR ldb_get_subkey_by_id(TALLOC_CTX *mem_ctx, const struct registry_key *k, int idx, struct registry_key **subkey)
-{
- struct ldb_context *c = talloc_get_type(k->hive->backend_data, struct ldb_context);
- struct ldb_message_element *el;
- struct ldb_key_data *kd = talloc_get_type(k->backend_data, struct ldb_key_data);
- struct ldb_key_data *newkd;
-
- /* Do a search if necessary */
- if (kd->subkeys == NULL) {
- struct ldb_result *res;
- int ret;
-
- ret = ldb_search(c, kd->dn, LDB_SCOPE_ONELEVEL, "(key=*)", NULL, &res);
-
- if (ret != LDB_SUCCESS) {
- DEBUG(0, ("Error getting subkeys for '%s': %s\n", ldb_dn_get_linearized(kd->dn), ldb_errstring(c)));
- return WERR_FOOBAR;
- }
-
- kd->subkey_count = res->count;
- kd->subkeys = talloc_steal(kd, res->msgs);
- talloc_free(res);
- }
-
- if (idx >= kd->subkey_count) return WERR_NO_MORE_ITEMS;
-
- el = ldb_msg_find_element(kd->subkeys[idx], "key");
-
- *subkey = talloc(mem_ctx, struct registry_key);
- talloc_set_destructor(*subkey, reg_close_ldb_key);
- (*subkey)->name = talloc_strdup(mem_ctx, (char *)el->values[0].data);
- (*subkey)->backend_data = newkd = talloc_zero(*subkey, struct ldb_key_data);
- (*subkey)->last_mod = 0; /* TODO: we need to add this to the
- ldb backend properly */
- newkd->dn = ldb_dn_copy(mem_ctx, kd->subkeys[idx]->dn);
-
- return WERR_OK;
-}
-
-static WERROR ldb_get_value_by_id(TALLOC_CTX *mem_ctx, const struct registry_key *k, int idx, struct registry_value **value)
-{
- struct ldb_context *c = talloc_get_type(k->hive->backend_data, struct ldb_context);
- struct ldb_key_data *kd = talloc_get_type(k->backend_data, struct ldb_key_data);
-
- /* Do the search if necessary */
- if (kd->values == NULL) {
- struct ldb_result *res;
- int ret;
-
- ret = ldb_search(c, kd->dn, LDB_SCOPE_ONELEVEL, "(value=*)", NULL, &res);
-
- if (ret != LDB_SUCCESS) {
- DEBUG(0, ("Error getting values for '%s': %s\n", ldb_dn_get_linearized(kd->dn), ldb_errstring(c)));
- return WERR_FOOBAR;
- }
- kd->value_count = res->count;
- kd->values = talloc_steal(kd, res->msgs);
- talloc_free(res);
- }
-
- if(idx >= kd->value_count) return WERR_NO_MORE_ITEMS;
-
- *value = talloc(mem_ctx, struct registry_value);
-
- reg_ldb_unpack_value(mem_ctx, kd->values[idx], &(*value)->name, &(*value)->data_type, &(*value)->data);
-
- return WERR_OK;
-}
-
-static WERROR ldb_open_key(TALLOC_CTX *mem_ctx, const struct registry_key *h, const char *name, struct registry_key **key)
-{
- struct ldb_context *c = talloc_get_type(h->hive->backend_data, struct ldb_context);
- struct ldb_result *res;
- struct ldb_dn *ldap_path;
- int ret;
- struct ldb_key_data *newkd;
-
- ldap_path = reg_path_to_ldb(mem_ctx, h, name, NULL);
-
- ret = ldb_search(c, ldap_path, LDB_SCOPE_BASE, "(key=*)", NULL, &res);
-
- if (ret != LDB_SUCCESS) {
- DEBUG(0, ("Error opening key '%s': %s\n", ldb_dn_get_linearized(ldap_path), ldb_errstring(c)));
- return WERR_FOOBAR;
- } else if (res->count == 0) {
- talloc_free(res);
- return WERR_BADFILE;
- }
-
- *key = talloc(mem_ctx, struct registry_key);
- talloc_set_destructor(*key, reg_close_ldb_key);
- (*key)->name = talloc_strdup(mem_ctx, strrchr(name, '\\')?strchr(name, '\\'):name);
- (*key)->backend_data = newkd = talloc_zero(*key, struct ldb_key_data);
- newkd->dn = ldb_dn_copy(mem_ctx, res->msgs[0]->dn);
-
- talloc_free(res);
-
- return WERR_OK;
-}
-
-static WERROR ldb_open_hive(struct registry_hive *hive, struct registry_key **k)
-{
- struct ldb_key_data *kd;
- struct ldb_context *wrap;
-
- if (!hive->location) return WERR_INVALID_PARAM;
-
- wrap = ldb_wrap_connect(hive, hive->location, hive->session_info, hive->credentials, 0, NULL);
-
- if(!wrap) {
- DEBUG(1, ("ldb_open_hive: unable to connect\n"));
- return WERR_FOOBAR;
- }
-
- ldb_set_debug_stderr(wrap);
- hive->backend_data = wrap;
-
- *k = talloc_zero(hive, struct registry_key);
- talloc_set_destructor (*k, reg_close_ldb_key);
- talloc_set_destructor (hive, ldb_free_hive);
- (*k)->name = talloc_strdup(*k, "");
- (*k)->backend_data = kd = talloc_zero(*k, struct ldb_key_data);
- kd->dn = ldb_dn_new(*k, wrap, "hive=NONE");
-
-
- return WERR_OK;
-}
-
-static WERROR ldb_add_key (TALLOC_CTX *mem_ctx, const struct registry_key *parent, const char *name, uint32_t access_mask, struct security_descriptor *sd, struct registry_key **newkey)
-{
- struct ldb_context *ctx = talloc_get_type(parent->hive->backend_data, struct ldb_context);
- struct ldb_message *msg;
- struct ldb_key_data *newkd;
- int ret;
-
- msg = ldb_msg_new(mem_ctx);
-
- msg->dn = reg_path_to_ldb(msg, parent, name, NULL);
-
- ldb_msg_add_string(msg, "key", talloc_strdup(mem_ctx, name));
-
- ret = ldb_add(ctx, msg);
- if (ret < 0) {
- DEBUG(1, ("ldb_msg_add: %s\n", ldb_errstring(ctx)));
- return WERR_FOOBAR;
- }
-
- *newkey = talloc_zero(mem_ctx, struct registry_key);
- (*newkey)->name = talloc_strdup(mem_ctx, name);
-
- (*newkey)->backend_data = newkd = talloc_zero(*newkey, struct ldb_key_data);
- newkd->dn = talloc_steal(newkd, msg->dn);
-
- return WERR_OK;
-}
-
-static WERROR ldb_del_key (const struct registry_key *key, const char *child)
-{
- struct ldb_context *ctx = talloc_get_type(key->hive->backend_data, struct ldb_context);
- int ret;
- struct ldb_key_data *kd = talloc_get_type(key->backend_data, struct ldb_key_data);
- struct ldb_dn *childdn;
-
- childdn = ldb_dn_copy(ctx, kd->dn);
- ldb_dn_add_child_fmt(childdn, "key=%s", child);
-
- ret = ldb_delete(ctx, childdn);
-
- talloc_free(childdn);
-
- if (ret < 0) {
- DEBUG(1, ("ldb_del_key: %s\n", ldb_errstring(ctx)));
- return WERR_FOOBAR;
- }
-
- return WERR_OK;
-}
-
-static WERROR ldb_del_value (const struct registry_key *key, const char *child)
-{
- int ret;
- struct ldb_context *ctx = talloc_get_type(key->hive->backend_data, struct ldb_context);
- struct ldb_key_data *kd = talloc_get_type(key->backend_data, struct ldb_key_data);
- struct ldb_dn *childdn;
-
- childdn = ldb_dn_copy(ctx, kd->dn);
- ldb_dn_add_child_fmt(childdn, "value=%s", child);
-
- ret = ldb_delete(ctx, childdn);
-
- talloc_free(childdn);
-
- if (ret < 0) {
- DEBUG(1, ("ldb_del_value: %s\n", ldb_errstring(ctx)));
- return WERR_FOOBAR;
- }
-
- return WERR_OK;
-}
-
-static WERROR ldb_set_value (const struct registry_key *parent, const char *name, uint32_t type, DATA_BLOB data)
-{
- struct ldb_context *ctx = talloc_get_type(parent->hive->backend_data, struct ldb_context);
- struct ldb_message *msg;
- struct ldb_key_data *kd = talloc_get_type(parent->backend_data, struct ldb_key_data);
- int ret;
- TALLOC_CTX *mem_ctx = talloc_init("ldb_set_value");
-
- msg = reg_ldb_pack_value(ctx, mem_ctx, name, type, data);
-
- msg->dn = ldb_dn_copy(msg, kd->dn);
- ldb_dn_add_child_fmt(msg->dn, "value=%s", name);
-
- ret = ldb_add(ctx, msg);
- if (ret < 0) {
- ret = ldb_modify(ctx, msg);
- if (ret < 0) {
- DEBUG(1, ("ldb_msg_add: %s\n", ldb_errstring(ctx)));
- talloc_free(mem_ctx);
- return WERR_FOOBAR;
- }
- }
-
- talloc_free(mem_ctx);
- return WERR_OK;
-}
-
-static struct hive_operations reg_backend_ldb = {
- .name = "ldb",
- .add_key = ldb_add_key,
- .del_key = ldb_del_key,
- .open_hive = ldb_open_hive,
- .open_key = ldb_open_key,
- .get_value_by_index = ldb_get_value_by_id,
- .get_subkey_by_index = ldb_get_subkey_by_id,
- .set_value = ldb_set_value,
- .del_value = ldb_del_value,
-};
-
-NTSTATUS registry_ldb_init(void)
-{
- return registry_register(&reg_backend_ldb);
-}