r955: Update debian package rules... builds now
[ira/wip.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         printf("Doing search for : %s\n", ret);
43         return ret;
44 }
45
46 /* 
47  * Saves the dn as private_data for every key/val
48  */
49
50 static WERROR ldb_open_registry(REG_HANDLE *handle, const char *location, const char *credentials)
51 {
52         struct ldb_context *c;
53         c = ldb_connect(location, 0, NULL);
54
55         if(!c) return WERR_FOOBAR;
56
57         handle->backend_data = c;
58         
59         return WERR_OK;
60 }
61
62 static WERROR ldb_close_registry(REG_HANDLE *h) 
63 {
64         ldb_close((struct ldb_context *)h->backend_data);
65         return WERR_OK;
66 }
67
68 static WERROR ldb_fetch_subkeys(REG_KEY *k, int *count, REG_KEY ***subkeys)
69 {
70         struct ldb_context *c = k->handle->backend_data;
71         char *path;
72         struct ldb_message **msg;
73         char *ldap_path;
74         TALLOC_CTX *mem_ctx = talloc_init("ldb_path");
75         REG_KEY *key = NULL;
76         ldap_path = reg_path_to_ldb(mem_ctx, reg_key_get_path(k));
77         
78         if(ldb_search(c, NULL, LDB_SCOPE_ONELEVEL, ldap_path, NULL,&msg) > 0) {
79                 key = reg_key_new_abs(reg_key_get_path(k), k->handle, ldap_path);
80                 talloc_steal(mem_ctx, key->mem_ctx, ldap_path);
81                 /* FIXME */
82         }
83
84         ldb_search_free(c, msg);
85         talloc_destroy(mem_ctx);
86         return WERR_OK;
87 }
88
89 static WERROR ldb_get_hive(REG_HANDLE *h, int num, REG_KEY **key)
90 {
91         /* FIXME */     
92 }
93
94 static WERROR ldb_open_key(REG_HANDLE *h, int num, const char *name, REG_KEY **key)
95 {
96         struct ldb_context *c = h->backend_data;
97         char *path;
98         struct ldb_message **msg;
99         char *ldap_path;
100         TALLOC_CTX *mem_ctx = talloc_init("ldb_path");
101         ldap_path = reg_path_to_ldb(mem_ctx, name);
102         
103         if(ldb_search(c, NULL, LDB_SCOPE_BASE, ldap_path, NULL,&msg) > 0) {
104                 *key = reg_key_new_abs(name, h, ldap_path);
105                 talloc_steal(mem_ctx, (*key)->mem_ctx, ldap_path);
106                 /* FIXME */
107         }
108
109         ldb_search_free(c, msg);
110         talloc_destroy(mem_ctx);
111
112         return WERR_OK;;
113 }
114
115 static struct registry_ops reg_backend_ldb = {
116         .name = "ldb",
117         .open_registry = ldb_open_registry,
118         .close_registry = ldb_close_registry,
119         .open_key = ldb_open_key,
120         .fetch_subkeys = ldb_fetch_subkeys,
121 };
122
123 NTSTATUS registry_ldb_init(void)
124 {
125         return register_backend("registry", &reg_backend_ldb);
126 }