Branch data Line data Source code
1 : : /*
2 : : SSSD
3 : :
4 : : System Database - Sub-domain related calls
5 : :
6 : : Copyright (C) 2012 Jan Zeleny <jzeleny@redhat.com>
7 : : Copyright (C) 2012 Sumit Bose <sbose@redhat.com>
8 : :
9 : : This program is free software; you can redistribute it and/or modify
10 : : it under the terms of the GNU General Public License as published by
11 : : the Free Software Foundation; either version 3 of the License, or
12 : : (at your option) any later version.
13 : :
14 : : This program is distributed in the hope that it will be useful,
15 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : : GNU General Public License for more details.
18 : :
19 : : You should have received a copy of the GNU General Public License
20 : : along with this program. If not, see <http://www.gnu.org/licenses/>.
21 : : */
22 : :
23 : : #include "util/util.h"
24 : : #include "db/sysdb_private.h"
25 : :
26 : 10 : errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
27 : : size_t *subdomain_count,
28 : : struct sysdb_subdom ***subdomain_list)
29 : : {
30 : : int i;
31 : : errno_t ret;
32 : : TALLOC_CTX *tmp_ctx;
33 : : struct ldb_result *res;
34 : 10 : const char *attrs[] = {"cn",
35 : : SYSDB_SUBDOMAIN_REALM,
36 : : SYSDB_SUBDOMAIN_FLAT,
37 : : SYSDB_SUBDOMAIN_ID,
38 : : NULL};
39 : : struct sysdb_subdom **list;
40 : : struct ldb_dn *basedn;
41 : : const char *tmp_str;
42 : :
43 : 10 : tmp_ctx = talloc_new(NULL);
44 [ + - ]: 10 : if (tmp_ctx == NULL) {
45 : : ret = ENOMEM;
46 : : goto done;
47 : : }
48 : :
49 : 10 : basedn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE);
50 [ + - ]: 10 : if (basedn == NULL) {
51 : : ret = EIO;
52 : : goto done;
53 : : }
54 : 10 : ret = ldb_search(sysdb->ldb, tmp_ctx, &res,
55 : : basedn, LDB_SCOPE_ONELEVEL,
56 : : attrs, "objectclass=%s", SYSDB_SUBDOMAIN_CLASS);
57 [ + - ]: 10 : if (ret != LDB_SUCCESS) {
58 : : ret = EIO;
59 : : goto done;
60 : : }
61 : :
62 : 10 : list = talloc_zero_array(tmp_ctx, struct sysdb_subdom *, res->count + 1);
63 [ + - ]: 10 : if (list == NULL) {
64 : : ret = ENOMEM;
65 : : goto done;
66 : : }
67 : :
68 [ + + ]: 16 : for (i = 0; i < res->count; i++) {
69 : 6 : list[i] = talloc_zero(list, struct sysdb_subdom);
70 [ + - ]: 6 : if (list[i] == NULL) {
71 : : ret = ENOMEM;
72 : : goto done;
73 : : }
74 : 6 : tmp_str = ldb_msg_find_attr_as_string(res->msgs[i], "cn", NULL);
75 [ - + ]: 6 : if (tmp_str == NULL) {
76 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_MINOR_FAILURE,
[ # # ][ # # ]
[ # # ]
77 : : ("The object [%s] doesn't have a name\n",
78 : : ldb_dn_get_linearized(res->msgs[i]->dn)));
79 : : ret = EINVAL;
80 : : goto done;
81 : : }
82 : :
83 : 6 : list[i]->name = talloc_strdup(list, tmp_str);
84 [ + - ]: 6 : if (list[i]->name == NULL) {
85 : : ret = ENOMEM;
86 : : goto done;
87 : : }
88 : :
89 : 6 : tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
90 : : SYSDB_SUBDOMAIN_REALM, NULL);
91 [ + - ]: 6 : if (tmp_str != NULL) {
92 : 6 : list[i]->realm = talloc_strdup(list, tmp_str);
93 [ + - ]: 6 : if (list[i]->realm == NULL) {
94 : : ret = ENOMEM;
95 : : goto done;
96 : : }
97 : : }
98 : :
99 : 6 : tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
100 : : SYSDB_SUBDOMAIN_FLAT, NULL);
101 [ + - ]: 6 : if (tmp_str != NULL) {
102 : 6 : list[i]->flat_name = talloc_strdup(list, tmp_str);
103 [ + - ]: 6 : if (list[i]->flat_name == NULL) {
104 : : ret = ENOMEM;
105 : : goto done;
106 : : }
107 : : }
108 : :
109 : 6 : tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
110 : : SYSDB_SUBDOMAIN_ID, NULL);
111 [ + - ]: 6 : if (tmp_str != NULL) {
112 : 6 : list[i]->id = talloc_strdup(list, tmp_str);
113 [ + - ]: 6 : if (list[i]->id == NULL) {
114 : : ret = ENOMEM;
115 : : goto done;
116 : : }
117 : : }
118 : : }
119 : :
120 : 10 : list[res->count] = NULL;
121 : :
122 : 10 : *subdomain_count = res->count;
123 : 10 : *subdomain_list = talloc_steal(mem_ctx, list);
124 : 10 : ret = EOK;
125 : :
126 : : done:
127 : 10 : talloc_free(tmp_ctx);
128 : 10 : return ret;
129 : : }
130 : :
131 : 0 : errno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
132 : : struct sysdb_ctx *sysdb,
133 : : struct sysdb_subdom **_info)
134 : : {
135 : : errno_t ret;
136 : : TALLOC_CTX *tmp_ctx;
137 : : const char *tmp_str;
138 : : struct ldb_dn *basedn;
139 : : struct sysdb_subdom *info;
140 : : struct ldb_result *res;
141 : 0 : const char *attrs[] = {"cn",
142 : : SYSDB_SUBDOMAIN_REALM,
143 : : SYSDB_SUBDOMAIN_FLAT,
144 : : SYSDB_SUBDOMAIN_ID,
145 : : NULL};
146 : :
147 : 0 : tmp_ctx = talloc_new(NULL);
148 [ # # ]: 0 : if (tmp_ctx == NULL) {
149 : : return ENOMEM;
150 : : }
151 : :
152 : 0 : info = talloc_zero(tmp_ctx, struct sysdb_subdom);
153 [ # # ]: 0 : if (info == NULL) {
154 : : ret = ENOMEM;
155 : : goto done;
156 : : }
157 : :
158 : 0 : basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
159 : 0 : sysdb->domain->name);
160 [ # # ]: 0 : if (basedn == NULL) {
161 : : ret = EIO;
162 : : goto done;
163 : : }
164 : 0 : ret = ldb_search(sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_BASE, attrs,
165 : : NULL);
166 [ # # ]: 0 : if (ret != LDB_SUCCESS) {
167 : : ret = EIO;
168 : : goto done;
169 : : }
170 : :
171 [ # # ]: 0 : if (res->count == 0) {
172 : : ret = ENOENT;
173 : : goto done;
174 : : }
175 : :
176 [ # # ]: 0 : if (res->count > 1) {
177 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("Base search returned [%d] results, "
[ # # ][ # # ]
[ # # ]
178 : : "expected 1.\n", res->count));
179 : : ret = EINVAL;
180 : : goto done;
181 : : }
182 : :
183 : 0 : tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_REALM,
184 : : NULL);
185 [ # # ]: 0 : if (tmp_str != NULL) {
186 : 0 : info->realm = talloc_strdup(info, tmp_str);
187 [ # # ]: 0 : if (info->realm == NULL) {
188 : : ret = ENOMEM;
189 : : goto done;
190 : : }
191 : : }
192 : :
193 : 0 : tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_FLAT,
194 : : NULL);
195 [ # # ]: 0 : if (tmp_str != NULL) {
196 : 0 : info->flat_name = talloc_strdup(info, tmp_str);
197 [ # # ]: 0 : if (info->flat_name == NULL) {
198 : : ret = ENOMEM;
199 : : goto done;
200 : : }
201 : : }
202 : :
203 : 0 : tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_ID,
204 : : NULL);
205 [ # # ]: 0 : if (tmp_str != NULL) {
206 : 0 : info->id = talloc_strdup(info, tmp_str);
207 [ # # ]: 0 : if (info->id == NULL) {
208 : : ret = ENOMEM;
209 : : goto done;
210 : : }
211 : : }
212 : :
213 : 0 : *_info = talloc_steal(mem_ctx, info);
214 : : done:
215 : 0 : talloc_free(tmp_ctx);
216 : : return ret;
217 : : }
218 : :
219 : 0 : errno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
220 : : struct sysdb_subdom *domain_info)
221 : : {
222 : : TALLOC_CTX *tmp_ctx;
223 : : struct ldb_message *msg;
224 : : int ret;
225 : 0 : bool do_update = false;
226 : : struct sysdb_subdom *current_info;
227 : :
228 : 0 : tmp_ctx = talloc_new(NULL);
229 [ # # ]: 0 : if (tmp_ctx == NULL) {
230 : : return ENOMEM;
231 : : }
232 : :
233 : 0 : ret = sysdb_master_domain_get_info(tmp_ctx, sysdb, ¤t_info);
234 [ # # ]: 0 : if (ret != EOK) {
235 : : goto done;
236 : : }
237 : :
238 : 0 : msg = ldb_msg_new(tmp_ctx);
239 [ # # ]: 0 : if (msg == NULL) {
240 : : ret = ENOMEM;
241 : : goto done;
242 : : }
243 : :
244 : 0 : msg->dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
245 : 0 : sysdb->domain->name);
246 [ # # ]: 0 : if (msg->dn == NULL) {
247 : : ret = EIO;
248 : : goto done;
249 : : }
250 : :
251 [ # # ][ # # ]: 0 : if (domain_info->realm != NULL &&
252 [ # # ]: 0 : (current_info->realm == NULL ||
253 : 0 : strcmp(current_info->realm, domain_info->realm) != 0) ) {
254 : 0 : ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM,
255 : : LDB_FLAG_MOD_REPLACE, NULL);
256 [ # # ]: 0 : if (ret != LDB_SUCCESS) {
257 : 0 : ret = sysdb_error_to_errno(ret);
258 : : goto done;
259 : : }
260 : :
261 : 0 : ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM,
262 : : domain_info->realm);
263 [ # # ]: 0 : if (ret != LDB_SUCCESS) {
264 : 0 : ret = sysdb_error_to_errno(ret);
265 : : goto done;
266 : : }
267 : :
268 : : do_update = true;
269 : : }
270 : :
271 [ # # ][ # # ]: 0 : if (domain_info->flat_name != NULL &&
272 [ # # ]: 0 : (current_info->flat_name == NULL ||
273 : 0 : strcmp(current_info->flat_name, domain_info->flat_name) != 0) ) {
274 : 0 : ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT,
275 : : LDB_FLAG_MOD_REPLACE, NULL);
276 [ # # ]: 0 : if (ret != LDB_SUCCESS) {
277 : 0 : ret = sysdb_error_to_errno(ret);
278 : : goto done;
279 : : }
280 : :
281 : 0 : ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT,
282 : : domain_info->flat_name);
283 [ # # ]: 0 : if (ret != LDB_SUCCESS) {
284 : 0 : ret = sysdb_error_to_errno(ret);
285 : : goto done;
286 : : }
287 : :
288 : : do_update = true;
289 : : }
290 : :
291 [ # # ][ # # ]: 0 : if (domain_info->id != NULL &&
292 [ # # ]: 0 : (current_info->id == NULL ||
293 : 0 : strcmp(current_info->id, domain_info->id) != 0) ) {
294 : 0 : ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_REPLACE,
295 : : NULL);
296 [ # # ]: 0 : if (ret != LDB_SUCCESS) {
297 : 0 : ret = sysdb_error_to_errno(ret);
298 : : goto done;
299 : : }
300 : :
301 : 0 : ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_info->id);
302 [ # # ]: 0 : if (ret != LDB_SUCCESS) {
303 : 0 : ret = sysdb_error_to_errno(ret);
304 : : goto done;
305 : : }
306 : :
307 : : do_update = true;
308 : : }
309 : :
310 [ # # ]: 0 : if (do_update == false) {
311 : : ret = EOK;
312 : : goto done;
313 : : }
314 : :
315 : 0 : ret = ldb_modify(sysdb->ldb, msg);
316 [ # # ]: 0 : if (ret != LDB_SUCCESS) {
317 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
[ # # ][ # # ]
[ # # ]
318 : : "[%s]: [%d][%s]!\n",
319 : : domain_info->name, ret,
320 : : ldb_errstring(sysdb->ldb)));
321 : 0 : ret = sysdb_error_to_errno(ret);
322 : : goto done;
323 : : }
324 : :
325 : : ret = EOK;
326 : :
327 : : done:
328 : 0 : talloc_free(tmp_ctx);
329 : :
330 : : return ret;
331 : : }
332 : 3 : static errno_t sysdb_add_subdomain_attributes(struct sysdb_ctx *sysdb,
333 : : struct sysdb_subdom *domain_info)
334 : : {
335 : : TALLOC_CTX *tmp_ctx;
336 : : struct ldb_message *msg;
337 : : int ret;
338 : :
339 : 3 : tmp_ctx = talloc_new(NULL);
340 [ + - ]: 3 : if (tmp_ctx == NULL) {
341 : : return ENOMEM;
342 : : }
343 : :
344 : 3 : msg = ldb_msg_new(tmp_ctx);
345 [ + - ]: 3 : if (msg == NULL) {
346 : : ret = ENOMEM;
347 : : goto done;
348 : : }
349 : :
350 : 3 : msg->dn = ldb_dn_new_fmt(msg, sysdb->ldb, SYSDB_DOM_BASE,
351 : : domain_info->name);
352 [ + - ]: 3 : if (msg->dn == NULL) {
353 : : ret = ENOMEM;
354 : : goto done;
355 : : }
356 : :
357 : 3 : ret = ldb_msg_add_empty(msg, SYSDB_OBJECTCLASS, LDB_FLAG_MOD_ADD, NULL);
358 [ - + ]: 3 : if (ret != LDB_SUCCESS) {
359 : 0 : ret = sysdb_error_to_errno(ret);
360 : : goto done;
361 : : }
362 : :
363 : 3 : ret = ldb_msg_add_string(msg, SYSDB_OBJECTCLASS, SYSDB_SUBDOMAIN_CLASS);
364 [ - + ]: 3 : if (ret != LDB_SUCCESS) {
365 : 0 : ret = sysdb_error_to_errno(ret);
366 : : goto done;
367 : : }
368 : :
369 [ + - ]: 3 : if (domain_info->realm != NULL) {
370 : 3 : ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM, LDB_FLAG_MOD_ADD,
371 : : NULL);
372 [ - + ]: 3 : if (ret != LDB_SUCCESS) {
373 : 0 : ret = sysdb_error_to_errno(ret);
374 : : goto done;
375 : : }
376 : :
377 : 3 : ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM,
378 : : domain_info->realm);
379 [ - + ]: 3 : if (ret != LDB_SUCCESS) {
380 : 0 : ret = sysdb_error_to_errno(ret);
381 : : goto done;
382 : : }
383 : : }
384 : :
385 [ + - ]: 3 : if (domain_info->flat_name != NULL) {
386 : 3 : ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT, LDB_FLAG_MOD_ADD,
387 : : NULL);
388 [ - + ]: 3 : if (ret != LDB_SUCCESS) {
389 : 0 : ret = sysdb_error_to_errno(ret);
390 : : goto done;
391 : : }
392 : :
393 : 3 : ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT,
394 : : domain_info->flat_name);
395 [ - + ]: 3 : if (ret != LDB_SUCCESS) {
396 : 0 : ret = sysdb_error_to_errno(ret);
397 : : goto done;
398 : : }
399 : : }
400 : :
401 [ + - ]: 3 : if (domain_info->id != NULL) {
402 : 3 : ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_ADD,
403 : : NULL);
404 [ - + ]: 3 : if (ret != LDB_SUCCESS) {
405 : 0 : ret = sysdb_error_to_errno(ret);
406 : : goto done;
407 : : }
408 : :
409 : 3 : ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_info->id);
410 [ - + ]: 3 : if (ret != LDB_SUCCESS) {
411 : 0 : ret = sysdb_error_to_errno(ret);
412 : : goto done;
413 : : }
414 : : }
415 : :
416 : 3 : ret = ldb_modify(sysdb->ldb, msg);
417 [ - + ]: 3 : if (ret != LDB_SUCCESS) {
418 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
[ # # ][ # # ]
[ # # ]
419 : : "[%s]: [%d][%s]!\n",
420 : : domain_info->name, ret,
421 : : ldb_errstring(sysdb->ldb)));
422 : 0 : ret = sysdb_error_to_errno(ret);
423 : : goto done;
424 : : }
425 : :
426 : : ret = EOK;
427 : :
428 : : done:
429 : 3 : talloc_free(tmp_ctx);
430 : :
431 : : return ret;
432 : : }
433 : :
434 : 6 : errno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb,
435 : : int num_subdoms,
436 : : struct sysdb_subdom *subdoms)
437 : : {
438 : : int ret;
439 : : int sret;
440 : : size_t c;
441 : : size_t d;
442 : 6 : TALLOC_CTX *tmp_ctx = NULL;
443 : : size_t cur_subdomains_count;
444 : : struct sysdb_subdom **cur_subdomains;
445 : : struct ldb_dn *dn;
446 : 6 : bool in_transaction = false;
447 : : bool *keep_subdomain;
448 : :
449 : 6 : tmp_ctx = talloc_new(NULL);
450 [ + - ]: 6 : if (tmp_ctx == NULL) {
451 : : ret = ENOMEM;
452 : : goto done;
453 : : }
454 : :
455 : : /* Retrieve all subdomains that are currently in sysdb */
456 : 6 : ret = sysdb_get_subdomains(tmp_ctx, sysdb, &cur_subdomains_count,
457 : : &cur_subdomains);
458 [ - + ]: 6 : if (ret != EOK) {
459 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("sysdb_get_subdomains failed.\n"));
[ # # ][ # # ]
[ # # ]
460 : : goto done;
461 : : }
462 : :
463 : 6 : keep_subdomain = talloc_zero_array(tmp_ctx, bool, cur_subdomains_count);
464 [ - + ]: 6 : if (keep_subdomain == NULL) {
465 : 0 : ret = ENOMEM;
466 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero_array failed.\n"));
[ # # ][ # # ]
[ # # ]
467 : : goto done;
468 : : }
469 : :
470 : 6 : ret = sysdb_transaction_start(sysdb);
471 [ + - ]: 6 : if (ret != EOK) {
472 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("sysdb_transaction_start failed.\n"));
[ # # ][ # # ]
[ # # ]
473 : : goto done;
474 : : }
475 : : in_transaction = true;
476 : :
477 : : /* Go through a list of retrieved subdomains and:
478 : : * - if a subdomain already exists in sysdb, mark it for preservation
479 : : * - if the subdomain doesn't exist in sysdb, create its bare structure
480 : : */
481 [ + + ]: 11 : for (c = 0; c < num_subdoms; c++) {
482 [ + + ]: 6 : for (d = 0; d < cur_subdomains_count; d++) {
483 [ + + ]: 3 : if (strcasecmp(subdoms[c].name,
484 : 3 : cur_subdomains[d]->name) == 0) {
485 : 2 : keep_subdomain[d] = true;
486 : : /* sub-domain already in cache, nothing to do */
487 : 2 : break;
488 : : }
489 : : }
490 : :
491 [ + + ]: 5 : if (d == cur_subdomains_count) {
492 [ + - ][ + - ]: 3 : DEBUG(SSSDBG_TRACE_FUNC, ("Adding sub-domain [%s].\n",
[ - + ][ # # ]
[ # # ]
493 : : subdoms[c].name));
494 : 3 : ret = sysdb_domain_create(sysdb, subdoms[c].name);
495 [ - + ]: 3 : if (ret != EOK) {
496 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("sysdb_domain_create failed.\n"));
[ # # ][ # # ]
[ # # ]
497 : : goto done;
498 : : }
499 : :
500 : 3 : ret = sysdb_add_subdomain_attributes(sysdb, &subdoms[c]);
501 [ - + ]: 3 : if (ret != EOK) {
502 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE,
[ # # ][ # # ]
[ # # ]
503 : : ("sysdb_add_subdomain_attributes failed.\n"));
504 : : goto done;
505 : : }
506 : : }
507 : : }
508 : :
509 : : /* Now delete all subdomains that have been in sysdb prior to
510 : : * refreshing the list and are not marked for preservation
511 : : * (i.e. they are not in the new list of subdomains)
512 : : */
513 [ + + ]: 10 : for (d = 0; d < cur_subdomains_count; d++) {
514 [ + + ]: 4 : if (!keep_subdomain[d]) {
515 [ + - ][ + - ]: 2 : DEBUG(SSSDBG_TRACE_FUNC, ("Removing sub-domain [%s].\n",
[ - + ][ # # ]
[ # # ]
516 : : cur_subdomains[d]->name));
517 : 2 : dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
518 : 2 : cur_subdomains[d]->name);
519 [ + - ]: 2 : if (dn == NULL) {
520 : : ret = ENOMEM;
521 : : goto done;
522 : : }
523 : :
524 : 2 : ret = sysdb_delete_recursive(sysdb, dn, true);
525 [ - + ]: 2 : if (ret != EOK) {
526 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_OP_FAILURE, ("sysdb_delete_recursive failed.\n"));
[ # # ][ # # ]
[ # # ]
527 : : goto done;
528 : : }
529 : : }
530 : : }
531 : :
532 : 6 : ret = sysdb_transaction_commit(sysdb);
533 [ - + ]: 6 : if (ret != EOK) {
534 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_MINOR_FAILURE, ("Could not commit transaction\n"));
[ # # ][ # # ]
[ # # ]
535 : : goto done;
536 : : }
537 : : in_transaction = false;
538 : :
539 : : done:
540 [ - + ]: 6 : if (in_transaction) {
541 : 0 : sret = sysdb_transaction_cancel(sysdb);
542 [ # # ]: 0 : if (sret != EOK) {
543 [ # # ][ # # ]: 0 : DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
[ # # ][ # # ]
[ # # ]
544 : : }
545 : : }
546 : 6 : talloc_free(tmp_ctx);
547 : 6 : return ret;
548 : : }
549 : :
550 : 3 : errno_t sysdb_get_subdomain_context(TALLOC_CTX *mem_ctx,
551 : : struct sysdb_ctx *sysdb,
552 : : struct sss_domain_info *subdomain,
553 : : struct sysdb_ctx **subdomain_ctx)
554 : : {
555 : : struct sysdb_ctx *new_ctx;
556 : :
557 : 3 : new_ctx = talloc_zero(mem_ctx, struct sysdb_ctx);
558 [ + - ]: 3 : if (new_ctx == NULL) {
559 : : return ENOMEM;
560 : : }
561 : :
562 : 3 : new_ctx->domain = subdomain;
563 : 3 : new_ctx->mpg = true;
564 : :
565 : 3 : new_ctx->ldb = sysdb->ldb;
566 : 3 : new_ctx->ldb_file = sysdb->ldb_file;
567 : :
568 : 3 : *subdomain_ctx = new_ctx;
569 : :
570 : 3 : return EOK;
571 : : }
572 : :
573 : : #define CHECK_DOMAIN_INFO(dom_info) do { \
574 : : if (dom_info == NULL || dom_info->sysdb == NULL) { \
575 : : DEBUG(SSSDBG_OP_FAILURE, ("Invalid domain info.\n")); \
576 : : return EINVAL; \
577 : : } \
578 : : } while(0)
579 : :
580 : 1 : errno_t sysdb_search_domuser_by_name(TALLOC_CTX *mem_ctx,
581 : : struct sss_domain_info *domain,
582 : : const char *name,
583 : : const char **attrs,
584 : : struct ldb_message **msg)
585 : : {
586 [ + - ][ - + ]: 1 : CHECK_DOMAIN_INFO(domain);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
587 : :
588 : 1 : return sysdb_search_user_by_name(mem_ctx, domain->sysdb, name, attrs, msg);
589 : : }
590 : :
591 : 1 : errno_t sysdb_search_domuser_by_uid(TALLOC_CTX *mem_ctx,
592 : : struct sss_domain_info *domain,
593 : : uid_t uid,
594 : : const char **attrs,
595 : : struct ldb_message **msg)
596 : : {
597 [ + - ][ - + ]: 1 : CHECK_DOMAIN_INFO(domain);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
598 : :
599 : 1 : return sysdb_search_user_by_uid(mem_ctx, domain->sysdb, uid, attrs, msg);
600 : : }
601 : :
602 : 1 : errno_t sysdb_store_domuser(struct sss_domain_info *domain,
603 : : const char *name,
604 : : const char *pwd,
605 : : uid_t uid, gid_t gid,
606 : : const char *gecos,
607 : : const char *homedir,
608 : : const char *shell,
609 : : struct sysdb_attrs *attrs,
610 : : char **remove_attrs,
611 : : uint64_t cache_timeout,
612 : : time_t now)
613 : : {
614 [ + - ][ - + ]: 1 : CHECK_DOMAIN_INFO(domain);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
615 : :
616 : 1 : return sysdb_store_user(domain->sysdb, name, pwd, uid, gid, gecos, homedir,
617 : : shell, NULL, attrs, remove_attrs, cache_timeout, now);
618 : : }
619 : :
620 : 1 : errno_t sysdb_delete_domuser(struct sss_domain_info *domain,
621 : : const char *name, uid_t uid)
622 : : {
623 [ + - ][ - + ]: 1 : CHECK_DOMAIN_INFO(domain);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
624 : :
625 : 1 : return sysdb_delete_user(domain->sysdb, name, uid);
626 : : }
627 : :
628 : 1 : errno_t sysdb_search_domgroup_by_name(TALLOC_CTX *mem_ctx,
629 : : struct sss_domain_info *domain,
630 : : const char *name,
631 : : const char **attrs,
632 : : struct ldb_message **msg)
633 : : {
634 [ + - ][ - + ]: 1 : CHECK_DOMAIN_INFO(domain);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
635 : :
636 : 1 : return sysdb_search_group_by_name(mem_ctx, domain->sysdb,
637 : : name, attrs, msg);
638 : : }
639 : :
640 : 1 : errno_t sysdb_search_domgroup_by_gid(TALLOC_CTX *mem_ctx,
641 : : struct sss_domain_info *domain,
642 : : gid_t gid,
643 : : const char **attrs,
644 : : struct ldb_message **msg)
645 : : {
646 [ + - ][ - + ]: 1 : CHECK_DOMAIN_INFO(domain);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
647 : :
648 : 1 : return sysdb_search_group_by_gid(mem_ctx, domain->sysdb, gid, attrs, msg);
649 : : }
650 : :
651 : 1 : errno_t sysdb_store_domgroup(struct sss_domain_info *domain,
652 : : const char *name,
653 : : gid_t gid,
654 : : struct sysdb_attrs *attrs,
655 : : uint64_t cache_timeout,
656 : : time_t now)
657 : : {
658 [ + - ][ - + ]: 1 : CHECK_DOMAIN_INFO(domain);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
659 : :
660 : 1 : return sysdb_store_group(domain->sysdb, name, gid, attrs, cache_timeout,
661 : : now);
662 : : }
663 : :
664 : 1 : errno_t sysdb_delete_domgroup(struct sss_domain_info *domain,
665 : : const char *name, gid_t gid)
666 : : {
667 [ + - ][ - + ]: 1 : CHECK_DOMAIN_INFO(domain);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
668 : :
669 : 1 : return sysdb_delete_group(domain->sysdb, name, gid);
670 : : }
671 : :
672 : 0 : int sysdb_subdom_getpwnam(TALLOC_CTX *mem_ctx,
673 : : struct sysdb_ctx *sysdb,
674 : : const char *name,
675 : : struct ldb_result **res)
676 : : {
677 : 0 : char *src_name = NULL;
678 : : int ret;
679 : :
680 [ # # ]: 0 : if (sysdb->domain->parent) {
681 : 0 : src_name = talloc_asprintf(mem_ctx, sysdb->domain->names->fq_fmt,
682 : : name, sysdb->domain->name);
683 [ # # ]: 0 : if (!src_name) return ENOMEM;
684 : : }
685 : :
686 [ # # ]: 0 : ret = sysdb_getpwnam(mem_ctx, sysdb, src_name ? src_name : name, res);
687 : 0 : talloc_zfree(src_name);
688 : :
689 : 0 : return ret;
690 : : }
691 : :
692 : 0 : int sysdb_subdom_getgrnam(TALLOC_CTX *mem_ctx,
693 : : struct sysdb_ctx *sysdb,
694 : : const char *name,
695 : : struct ldb_result **res)
696 : : {
697 : 0 : char *src_name = NULL;
698 : : int ret;
699 : :
700 [ # # ]: 0 : if (sysdb->domain->parent) {
701 : 0 : src_name = talloc_asprintf(mem_ctx, sysdb->domain->names->fq_fmt,
702 : : name, sysdb->domain->name);
703 [ # # ]: 0 : if (!src_name) return ENOMEM;
704 : : }
705 : :
706 [ # # ]: 0 : ret = sysdb_getgrnam(mem_ctx, sysdb, src_name ? src_name : name, res);
707 : 0 : talloc_zfree(src_name);
708 : :
709 : 0 : return ret;
710 : 3 : }
|