Branch data Line data Source code
1 : : /*
2 : : Authors:
3 : : Jakub Hrozek <jhrozek@redhat.com>
4 : :
5 : : Copyright (C) 2012 Red Hat
6 : :
7 : : This program is free software; you can redistribute it and/or modify
8 : : it under the terms of the GNU General Public License as published by
9 : : the Free Software Foundation; either version 3 of the License, or
10 : : (at your option) any later version.
11 : :
12 : : This program is distributed in the hope that it will be useful,
13 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : : GNU General Public License for more details.
16 : :
17 : : You should have received a copy of the GNU General Public License
18 : : along with this program. If not, see <http://www.gnu.org/licenses/>.
19 : : */
20 : :
21 : : #include <talloc.h>
22 : :
23 : : #include "db/sysdb.h"
24 : : #include "db/sysdb_private.h"
25 : : #include "db/sysdb_autofs.h"
26 : :
27 : : #define SYSDB_TMPL_AUTOFS_ENTRY SYSDB_NAME"=%s,"SYSDB_TMPL_CUSTOM
28 : :
29 : : static struct ldb_dn *
30 : 10 : sysdb_autofsmap_dn(TALLOC_CTX *mem_ctx,
31 : : struct sysdb_ctx *sysdb,
32 : : const char *map_name)
33 : : {
34 : 10 : return sysdb_custom_dn(sysdb, mem_ctx, map_name, AUTOFS_MAP_SUBDIR);
35 : : }
36 : :
37 : : static struct ldb_dn *
38 : 110 : sysdb_autofsentry_dn(TALLOC_CTX *mem_ctx,
39 : : struct sysdb_ctx *sysdb,
40 : : const char *map_name,
41 : : const char *entry_name,
42 : : const char *entry_value)
43 : : {
44 : : errno_t ret;
45 : : TALLOC_CTX *tmp_ctx;
46 : : char *clean_name;
47 : : char *clean_value;
48 : : const char *rdn;
49 : 110 : struct ldb_dn *dn = NULL;
50 : :
51 : 110 : tmp_ctx = talloc_new(NULL);
52 [ + - ]: 110 : if (!tmp_ctx) {
53 : : return NULL;
54 : : }
55 : :
56 : 110 : ret = sysdb_dn_sanitize(tmp_ctx, entry_name, &clean_name);
57 [ + - ]: 110 : if (ret != EOK) {
58 : : goto done;
59 : : }
60 : :
61 : 110 : ret = sysdb_dn_sanitize(tmp_ctx, entry_value, &clean_value);
62 [ + - ]: 110 : if (ret != EOK) {
63 : : goto done;
64 : : }
65 : :
66 : 110 : rdn = talloc_asprintf(tmp_ctx, "%s%s", clean_name, clean_value);
67 [ + - ]: 110 : if (!rdn) {
68 : : goto done;
69 : : }
70 : :
71 : 110 : dn = ldb_dn_new_fmt(mem_ctx, sysdb->ldb, SYSDB_TMPL_AUTOFS_ENTRY,
72 : : rdn, map_name, AUTOFS_MAP_SUBDIR,
73 : 110 : sysdb->domain->name);
74 : :
75 : : done:
76 : 110 : talloc_free(tmp_ctx);
77 : : return dn;
78 : : }
79 : :
80 : : errno_t
81 : 10 : sysdb_save_autofsmap(struct sysdb_ctx *sysdb_ctx,
82 : : const char *name,
83 : : const char *autofsmapname,
84 : : struct sysdb_attrs *attrs,
85 : : int cache_timeout,
86 : : time_t now)
87 : : {
88 : : errno_t ret;
89 : : TALLOC_CTX *tmp_ctx;
90 : :
91 [ + - ][ + - ]: 10 : DEBUG(SSSDBG_TRACE_FUNC, ("Adding autofs map %s\n", autofsmapname));
[ - + ][ # # ]
[ # # ]
92 : :
93 : 10 : tmp_ctx = talloc_new(NULL);
94 [ + - ]: 10 : if (!tmp_ctx) {
95 : : return ENOMEM;
96 : : }
97 : :
98 [ + - ]: 10 : if (!attrs) {
99 : 10 : attrs = sysdb_new_attrs(tmp_ctx);
100 [ + - ]: 10 : if (!attrs) {
101 : : ret = ENOMEM;
102 : : goto done;
103 : : }
104 : : }
105 : :
106 : 10 : ret = sysdb_attrs_add_string(attrs, SYSDB_OBJECTCLASS,
107 : : SYSDB_AUTOFS_MAP_OC);
108 [ - + ]: 10 : if (ret != EOK) {
109 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Could not set map object class [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
110 : : ret, strerror(ret)));
111 : : goto done;
112 : : }
113 : :
114 : 10 : ret = sysdb_attrs_add_string(attrs, SYSDB_AUTOFS_MAP_NAME, autofsmapname);
115 [ - + ]: 10 : if (ret != EOK) {
116 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Could not set map name [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
117 : : ret, strerror(ret)));
118 : : goto done;
119 : : }
120 : :
121 : 10 : ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, name);
122 [ - + ]: 10 : if (ret != EOK) {
123 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Could not set name attribute [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
124 : : ret, strerror(ret)));
125 : : goto done;
126 : : }
127 : :
128 : 10 : ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
129 [ - + ]: 10 : if (ret) {
130 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Could not set sysdb lastUpdate [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
131 : : ret, strerror(ret)));
132 : : goto done;
133 : : }
134 : :
135 [ - + ]: 10 : ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
136 : : ((cache_timeout) ?
137 : 0 : (now + cache_timeout) : 0));
138 [ - + ]: 10 : if (ret) {
139 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Could not set sysdb cache expire [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
140 : : ret, strerror(ret)));
141 : : goto done;
142 : : }
143 : :
144 : 10 : ret = sysdb_store_custom(sysdb_ctx, name, AUTOFS_MAP_SUBDIR, attrs);
145 [ - + ]: 10 : if (ret != EOK) {
146 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("sysdb_store_custom failed [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
147 : : ret, strerror(ret)));
148 : : goto done;
149 : : }
150 : :
151 : : ret = EOK;
152 : : done:
153 : 10 : talloc_free(tmp_ctx);
154 : 10 : return ret;
155 : : }
156 : :
157 : : errno_t
158 : 10 : sysdb_delete_autofsmap(struct sysdb_ctx *sysdb_ctx,
159 : : const char *name)
160 : : {
161 [ + - ][ + - ]: 10 : DEBUG(SSSDBG_TRACE_FUNC, ("Deleting autofs map %s\n", name));
[ - + ][ # # ]
[ # # ]
162 : 10 : return sysdb_delete_custom(sysdb_ctx, name, AUTOFS_MAP_SUBDIR);
163 : : }
164 : :
165 : : errno_t
166 : 20 : sysdb_get_map_byname(TALLOC_CTX *mem_ctx,
167 : : struct sysdb_ctx *sysdb,
168 : : const char *map_name,
169 : : struct ldb_message **_map)
170 : : {
171 : : errno_t ret;
172 : : TALLOC_CTX *tmp_ctx;
173 : : const char *filter;
174 : : char *safe_map_name;
175 : : size_t count;
176 : : struct ldb_message **msgs;
177 : 20 : const char *attrs[] = { SYSDB_OBJECTCLASS,
178 : : SYSDB_CACHE_EXPIRE,
179 : : SYSDB_LAST_UPDATE,
180 : : SYSDB_AUTOFS_MAP_NAME,
181 : : SYSDB_MEMBER,
182 : : NULL };
183 : :
184 : 20 : tmp_ctx = talloc_new(NULL);
185 [ + - ]: 20 : if (!tmp_ctx) return ENOMEM;
186 : :
187 : 20 : ret = sss_filter_sanitize(tmp_ctx, map_name, &safe_map_name);
188 [ - + ]: 20 : if (ret != EOK) {
189 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_CRIT_FAILURE,
[ # # ][ # # ]
[ # # ]
190 : : ("Cannot sanitize map [%s] error [%d]: %s\n",
191 : : map_name, ret, strerror(ret)));
192 : : goto done;
193 : : }
194 : :
195 : 20 : filter = talloc_asprintf(tmp_ctx, "(&(objectclass=%s)(%s=%s))",
196 : : SYSDB_AUTOFS_MAP_OC, SYSDB_NAME, safe_map_name);
197 [ + - ]: 20 : if (!filter) {
198 : : ret = EOK;
199 : : goto done;
200 : : }
201 : :
202 : 20 : ret = sysdb_search_custom(tmp_ctx, sysdb, filter,
203 : : AUTOFS_MAP_SUBDIR, attrs,
204 : : &count, &msgs);
205 [ - + ]: 20 : if (ret != EOK && ret != ENOENT) {
206 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_CRIT_FAILURE,
[ # # ][ # # ]
[ # # ]
207 : : ("Error looking up autofs map [%s]", safe_map_name));
208 : : goto done;
209 [ + + ]: 20 : } else if (ret == ENOENT) {
210 [ + - ][ + - ]: 10 : DEBUG(SSSDBG_TRACE_FUNC, ("No such map\n"));
[ - + ][ # # ]
[ # # ]
211 : 10 : *_map = NULL;
212 : 10 : goto done;
213 : : }
214 : :
215 [ - + ]: 10 : if (count != 1) {
216 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_CRIT_FAILURE,
[ # # ][ # # ]
[ # # ]
217 : : ("More than one map named %s\n", safe_map_name));
218 : : goto done;
219 : : }
220 : :
221 : 10 : *_map = talloc_steal(mem_ctx, msgs[0]);
222 : 10 : ret = EOK;
223 : : done:
224 : 20 : talloc_free(tmp_ctx);
225 : : return ret;
226 : : }
227 : :
228 : : errno_t
229 : 110 : sysdb_save_autofsentry(struct sysdb_ctx *sysdb_ctx,
230 : : const char *map,
231 : : const char *key,
232 : : const char *value,
233 : : struct sysdb_attrs *attrs)
234 : : {
235 : : errno_t ret;
236 : : TALLOC_CTX *tmp_ctx;
237 : : struct ldb_message *msg;
238 : : struct ldb_dn *dn;
239 : : const char *name;
240 : :
241 [ + - ][ + - ]: 110 : DEBUG(SSSDBG_TRACE_FUNC,
[ - + ][ # # ]
[ # # ]
242 : : ("Adding autofs entry [%s] - [%s]\n", key, value));
243 : :
244 : 110 : tmp_ctx = talloc_new(NULL);
245 [ + - ]: 110 : if (!tmp_ctx) {
246 : : return ENOMEM;
247 : : }
248 : :
249 [ + - ]: 110 : if (!attrs) {
250 : 110 : attrs = sysdb_new_attrs(tmp_ctx);
251 [ + - ]: 110 : if (!attrs) {
252 : : ret = ENOMEM;
253 : : goto done;
254 : : }
255 : : }
256 : :
257 : 110 : ret = sysdb_attrs_add_string(attrs, SYSDB_OBJECTCLASS,
258 : : SYSDB_AUTOFS_ENTRY_OC);
259 [ - + ]: 110 : if (ret != EOK) {
260 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Could not set entry object class [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
261 : : ret, strerror(ret)));
262 : : goto done;
263 : : }
264 : :
265 : 110 : ret = sysdb_attrs_add_string(attrs, SYSDB_AUTOFS_ENTRY_KEY, key);
266 [ - + ]: 110 : if (ret != EOK) {
267 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Could not set entry key [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
268 : : ret, strerror(ret)));
269 : : goto done;
270 : : }
271 : :
272 : 110 : ret = sysdb_attrs_add_string(attrs, SYSDB_AUTOFS_ENTRY_VALUE, value);
273 [ - + ]: 110 : if (ret != EOK) {
274 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Could not set entry key [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
275 : : ret, strerror(ret)));
276 : : goto done;
277 : : }
278 : :
279 : 110 : name = talloc_asprintf(tmp_ctx, "%s%s", key, value);
280 [ + - ]: 110 : if (!name) {
281 : : ret = ENOMEM;
282 : : goto done;
283 : : }
284 : :
285 : 110 : ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, name);
286 [ - + ]: 110 : if (ret != EOK) {
287 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Could not set name attribute [%d]: %s\n",
[ # # ][ # # ]
[ # # ]
288 : : ret, strerror(ret)));
289 : : goto done;
290 : : }
291 : :
292 : 110 : dn = sysdb_autofsentry_dn(tmp_ctx, sysdb_ctx, map, key, value);
293 [ + - ]: 110 : if (!dn) {
294 : : ret = ENOMEM;
295 : : goto done;
296 : : }
297 : :
298 : 110 : msg = ldb_msg_new(tmp_ctx);
299 [ + - ]: 110 : if (!msg) {
300 : : ret = ENOMEM;
301 : : goto done;
302 : : }
303 : :
304 : 110 : msg->dn = dn;
305 : 110 : msg->elements = attrs->a;
306 : 110 : msg->num_elements = attrs->num;
307 : :
308 : 110 : ret = ldb_add(sysdb_ctx->ldb, msg);
309 : 110 : ret = sysdb_error_to_errno(ret);
310 : : done:
311 : 110 : talloc_free(tmp_ctx);
312 : 110 : return ret;
313 : : }
314 : :
315 : : errno_t
316 : 0 : sysdb_del_autofsentry(struct sysdb_ctx *sysdb_ctx,
317 : : const char *map,
318 : : const char *key,
319 : : const char *value)
320 : : {
321 : : struct ldb_dn *dn;
322 : : errno_t ret;
323 : :
324 : 0 : dn = sysdb_autofsentry_dn(sysdb_ctx, sysdb_ctx, map, key, value);
325 [ # # ]: 0 : if (!dn) {
326 : : return ENOMEM;
327 : : }
328 : :
329 : 0 : ret = sysdb_delete_entry(sysdb_ctx, dn, true);
330 : 0 : talloc_free(dn);
331 : 0 : return ret;
332 : : }
333 : :
334 : : errno_t
335 : 10 : sysdb_autofs_entries_by_map(TALLOC_CTX *mem_ctx,
336 : : struct sysdb_ctx *sysdb,
337 : : const char *mapname,
338 : : size_t *_count,
339 : : struct ldb_message ***_entries)
340 : : {
341 : : errno_t ret;
342 : : TALLOC_CTX *tmp_ctx;
343 : : char *filter;
344 : 10 : const char *attrs[] = { SYSDB_AUTOFS_ENTRY_KEY,
345 : : SYSDB_AUTOFS_ENTRY_VALUE,
346 : : NULL };
347 : : size_t count;
348 : : struct ldb_message **msgs;
349 : : struct ldb_dn *mapdn;
350 : :
351 [ + - ][ + - ]: 10 : DEBUG(SSSDBG_TRACE_FUNC, ("Getting entries for map %s\n", mapname));
[ - + ][ # # ]
[ # # ]
352 : :
353 : 10 : tmp_ctx = talloc_new(NULL);
354 [ + - ]: 10 : if (!tmp_ctx) {
355 : : return ENOMEM;
356 : : }
357 : :
358 : 10 : mapdn = sysdb_autofsmap_dn(tmp_ctx, sysdb, mapname);
359 [ + - ]: 10 : if (!mapdn) {
360 : : ret = ENOMEM;
361 : : goto done;
362 : : }
363 : :
364 : 10 : filter = talloc_asprintf(tmp_ctx, "(objectclass=%s)",
365 : : SYSDB_AUTOFS_ENTRY_OC);
366 [ + - ]: 10 : if (!filter) {
367 : : ret = ENOMEM;
368 : : goto done;
369 : : }
370 : :
371 : 10 : ret = sysdb_search_entry(tmp_ctx, sysdb, mapdn, LDB_SCOPE_ONELEVEL,
372 : : filter, attrs, &count, &msgs);
373 [ - + ]: 10 : if (ret != EOK && ret != ENOENT) {
374 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("sysdb search failed: %d\n", ret));
[ # # ][ # # ]
[ # # ]
375 : : goto done;
376 [ - + ]: 10 : } else if (ret == ENOENT) {
377 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_TRACE_FUNC, ("No entries for the map\n"));
[ # # ][ # # ]
[ # # ]
378 : 0 : *_count = 0;
379 : 0 : *_entries = NULL;
380 : 0 : goto done;
381 : : }
382 : :
383 : 10 : *_count = count;
384 : 10 : *_entries = talloc_steal(mem_ctx, msgs);
385 : 10 : ret = EOK;
386 [ + - ][ + - ]: 10 : DEBUG(SSSDBG_TRACE_INTERNAL, ("found %d entries for map %s\n",
[ - + ][ # # ]
[ # # ]
387 : : count, mapname));
388 : : done:
389 : 10 : talloc_free(tmp_ctx);
390 : : return ret;
391 : : }
392 : :
393 : : errno_t
394 : 0 : sysdb_set_autofsmap_attr(struct sysdb_ctx *sysdb,
395 : : const char *name,
396 : : struct sysdb_attrs *attrs,
397 : : int mod_op)
398 : : {
399 : : errno_t ret;
400 : : struct ldb_dn *dn;
401 : : TALLOC_CTX *tmp_ctx;
402 : :
403 : 0 : tmp_ctx = talloc_new(NULL);
404 [ # # ]: 0 : if (!tmp_ctx) {
405 : : return ENOMEM;
406 : : }
407 : :
408 : 0 : dn = sysdb_autofsmap_dn(tmp_ctx, sysdb, name);
409 [ # # ]: 0 : if (!dn) {
410 : : ret = ENOMEM;
411 : : goto done;
412 : : }
413 : :
414 : 0 : ret = sysdb_set_entry_attr(sysdb, dn, attrs, mod_op);
415 : :
416 : : done:
417 : 0 : talloc_free(tmp_ctx);
418 : 0 : return ret;
419 : 110 : }
|