498dc6991b71ba3a1854322eedbf89fadd15a852
[sfrench/samba-autobuild/.git] / source4 / lib / registry / reg_backend_ldb / reg_backend_ldb.c
1 /* 
2    Unix SMB/CIFS implementation.
3    Registry interface
4    Copyright (C) Jelmer Vernooij                                          2004.
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 2 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, write to the Free Software
18    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #include "includes.h"
22 #include "lib/registry/common/registry.h"
23
24 static char *reg_path_to_ldb(TALLOC_CTX *mem_ctx, const char *path)
25 {
26         char *ret = talloc_strdup(mem_ctx, "(dn=");
27         char *begin = (char *)path;
28         char *end = NULL;
29
30         while(begin) {
31                 end = strchr(begin, '\\');
32                 if(end)end = '\0';
33                 if(end - begin != 0) ret = talloc_asprintf_append(mem_ctx, ret, "key=%s,", begin);
34                         
35                 if(end) {
36                         *end = '\\';
37                         begin = end+1;
38                 } else begin = NULL;
39         }
40
41         ret[strlen(ret)-1] = ')';
42         return ret;
43 }
44
45 /* 
46  * Saves the dn as private_data for every key/val
47  */
48
49 static WERROR ldb_open_registry(REG_HANDLE *handle, const char *location, const char *credentials)
50 {
51         struct ldb_context *c;
52         c = ldb_connect(location, 0, NULL);
53
54         if(!c) return WERR_FOOBAR;
55
56         handle->backend_data = c;
57         
58         return WERR_OK;
59 }
60
61 static WERROR ldb_close_registry(REG_HANDLE *h) 
62 {
63         ldb_close((struct ldb_context *)h->backend_data);
64         return WERR_OK;
65 }
66
67 static WERROR ldb_fetch_subkeys(REG_KEY *k, int *count, REG_KEY ***subkeys)
68 {
69         struct ldb_context *c = k->handle->backend_data;
70         char *path;
71         struct ldb_message **msg;
72         char *ldap_path;
73         TALLOC_CTX *mem_ctx = talloc_init("ldb_path");
74         REG_KEY *key = NULL;
75         ldap_path = reg_path_to_ldb(mem_ctx, reg_key_get_path(k));
76         
77         if(ldb_search(c, NULL, LDB_SCOPE_ONELEVEL, ldap_path, NULL,&msg) > 0) {
78                 key = reg_key_new_abs(reg_key_get_path(k), k->handle, ldap_path);
79                 talloc_steal(mem_ctx, key->mem_ctx, ldap_path);
80                 /* FIXME */
81         }
82
83         ldb_search_free(c, msg);
84         talloc_destroy(mem_ctx);
85         return WERR_OK;
86 }
87
88
89
90 static WERROR ldb_open_key(REG_HANDLE *h, const char *name, REG_KEY **key)
91 {
92         struct ldb_context *c = h->backend_data;
93         char *path;
94         struct ldb_message **msg;
95         char *ldap_path;
96         TALLOC_CTX *mem_ctx = talloc_init("ldb_path");
97         ldap_path = reg_path_to_ldb(mem_ctx, name);
98         
99         if(ldb_search(c, NULL, LDB_SCOPE_BASE, ldap_path, NULL,&msg) > 0) {
100                 *key = reg_key_new_abs(name, h, ldap_path);
101                 talloc_steal(mem_ctx, (*key)->mem_ctx, ldap_path);
102                 /* FIXME */
103         }
104
105         ldb_search_free(c, msg);
106         talloc_destroy(mem_ctx);
107
108         return WERR_OK;;
109 }
110
111 static struct registry_ops reg_backend_ldb = {
112         .name = "ldb",
113         .open_registry = ldb_open_registry,
114         .close_registry = ldb_close_registry,
115         .open_key = ldb_open_key,
116         .fetch_subkeys = ldb_fetch_subkeys,
117 };
118
119 NTSTATUS registry_ldb_init(void)
120 {
121         return register_backend("registry", &reg_backend_ldb);
122 }