640b2adac05bb7f5e9fba064434c91852c3a72e6nd/*
8e34905974b7a442a55adac3b3fdb196c389e807takashi SSSD
640b2adac05bb7f5e9fba064434c91852c3a72e6nd
640b2adac05bb7f5e9fba064434c91852c3a72e6nd System Database - ID ranges related calls
8e34905974b7a442a55adac3b3fdb196c389e807takashi
640b2adac05bb7f5e9fba064434c91852c3a72e6nd Copyright (C) 2012 Sumit Bose <sbose@redhat.com>
640b2adac05bb7f5e9fba064434c91852c3a72e6nd
8e34905974b7a442a55adac3b3fdb196c389e807takashi This program is free software; you can redistribute it and/or modify
8e34905974b7a442a55adac3b3fdb196c389e807takashi it under the terms of the GNU General Public License as published by
640b2adac05bb7f5e9fba064434c91852c3a72e6nd the Free Software Foundation; either version 3 of the License, or
6e89d4f6c259afc94f8806c74a33a8fe81392499sf (at your option) any later version.
640b2adac05bb7f5e9fba064434c91852c3a72e6nd
640b2adac05bb7f5e9fba064434c91852c3a72e6nd This program is distributed in the hope that it will be useful,
640b2adac05bb7f5e9fba064434c91852c3a72e6nd but WITHOUT ANY WARRANTY; without even the implied warranty of
640b2adac05bb7f5e9fba064434c91852c3a72e6nd MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
640b2adac05bb7f5e9fba064434c91852c3a72e6nd GNU General Public License for more details.
640b2adac05bb7f5e9fba064434c91852c3a72e6nd
640b2adac05bb7f5e9fba064434c91852c3a72e6nd You should have received a copy of the GNU General Public License
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive along with this program. If not, see <http://www.gnu.org/licenses/>.
8e34905974b7a442a55adac3b3fdb196c389e807takashi*/
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive
ef685e00a47967e27d89709461728a229d762172nd#include "util/util.h"
ef685e00a47967e27d89709461728a229d762172nd#include "db/sysdb_private.h"
ef685e00a47967e27d89709461728a229d762172nd
a27e9e05958bc51ea09edb8d8d862fe8b125313bslivestatic errno_t find_attr_as_uint32_t(const struct ldb_message *msg,
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive const char *attr_name, uint32_t *result)
51853aa2ebfdf9903a094467e1d02099f143639daaron{
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive uint64_t val;
6e89d4f6c259afc94f8806c74a33a8fe81392499sf
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive val = ldb_msg_find_attr_as_uint64(msg, attr_name, UINT64_MAX);
b44815871de48215476ad1d4cc46d3f99da532a5erikabele
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive if (val == UINT64_MAX) {
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive return ENOENT;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive } else if (val >= UINT32_MAX) {
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive return EINVAL;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive }
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive
8e34905974b7a442a55adac3b3fdb196c389e807takashi *result = val;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive return EOK;
ef685e00a47967e27d89709461728a229d762172nd}
ef685e00a47967e27d89709461728a229d762172nd
a27e9e05958bc51ea09edb8d8d862fe8b125313bsliveerrno_t sysdb_get_ranges(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive size_t *range_count,
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive struct range_info ***range_list)
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive{
6e89d4f6c259afc94f8806c74a33a8fe81392499sf size_t c;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive errno_t ret;
b44815871de48215476ad1d4cc46d3f99da532a5erikabele TALLOC_CTX *tmp_ctx;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive struct ldb_result *res;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive const char *attrs[] = {SYSDB_NAME,
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive SYSDB_BASE_ID,
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive SYSDB_ID_RANGE_SIZE,
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive SYSDB_BASE_RID,
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive SYSDB_SECONDARY_BASE_RID,
dcbfc7bd0f8aaeea6833646813e948324fdc79a0rbowen SYSDB_DOMAIN_ID,
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive SYSDB_ID_RANGE_TYPE,
17ca00f92106c825382359ebf0a754f8df21e316rbowen NULL};
dcbfc7bd0f8aaeea6833646813e948324fdc79a0rbowen struct range_info **list;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive struct ldb_dn *basedn;
17ca00f92106c825382359ebf0a754f8df21e316rbowen const char *tmp_str;
17ca00f92106c825382359ebf0a754f8df21e316rbowen
dcbfc7bd0f8aaeea6833646813e948324fdc79a0rbowen tmp_ctx = talloc_new(NULL);
6e89d4f6c259afc94f8806c74a33a8fe81392499sf if (tmp_ctx == NULL) {
dcbfc7bd0f8aaeea6833646813e948324fdc79a0rbowen ret = ENOMEM;
dcbfc7bd0f8aaeea6833646813e948324fdc79a0rbowen goto done;
dcbfc7bd0f8aaeea6833646813e948324fdc79a0rbowen }
dcbfc7bd0f8aaeea6833646813e948324fdc79a0rbowen
dcbfc7bd0f8aaeea6833646813e948324fdc79a0rbowen basedn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_TMPL_RANGE_BASE);
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive if (basedn == NULL) {
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive ret = EIO;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive goto done;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive }
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive ret = ldb_search(sysdb->ldb, tmp_ctx, &res,
8e34905974b7a442a55adac3b3fdb196c389e807takashi basedn, LDB_SCOPE_ONELEVEL,
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive attrs, "objectclass=%s", SYSDB_ID_RANGE_CLASS);
ef685e00a47967e27d89709461728a229d762172nd if (ret != LDB_SUCCESS) {
ef685e00a47967e27d89709461728a229d762172nd ret = EIO;
ef685e00a47967e27d89709461728a229d762172nd goto done;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive }
222f0f03c2f9ee6343c18f80f0cb6e9aad21bc58slive
222f0f03c2f9ee6343c18f80f0cb6e9aad21bc58slive list = talloc_zero_array(tmp_ctx, struct range_info *, res->count + 1);
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive if (list == NULL) {
6e89d4f6c259afc94f8806c74a33a8fe81392499sf ret = ENOMEM;
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive goto done;
b44815871de48215476ad1d4cc46d3f99da532a5erikabele }
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive for (c = 0; c < res->count; c++) {
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive list[c] = talloc_zero(list, struct range_info);
a27e9e05958bc51ea09edb8d8d862fe8b125313bslive if (list[c] == NULL) {
222f0f03c2f9ee6343c18f80f0cb6e9aad21bc58slive ret = ENOMEM;
95e8cab14596a61826fa52477dcaebc07bfbad00colm goto done;
8e34905974b7a442a55adac3b3fdb196c389e807takashi }
95e8cab14596a61826fa52477dcaebc07bfbad00colm tmp_str = ldb_msg_find_attr_as_string(res->msgs[c], SYSDB_NAME, NULL);
95e8cab14596a61826fa52477dcaebc07bfbad00colm if (tmp_str == NULL) {
95e8cab14596a61826fa52477dcaebc07bfbad00colm DEBUG(SSSDBG_MINOR_FAILURE, "The object [%s] doesn't have a name.\n",
95e8cab14596a61826fa52477dcaebc07bfbad00colm ldb_dn_get_linearized(res->msgs[c]->dn));
95e8cab14596a61826fa52477dcaebc07bfbad00colm ret = EINVAL;
95e8cab14596a61826fa52477dcaebc07bfbad00colm goto done;
95e8cab14596a61826fa52477dcaebc07bfbad00colm }
95e8cab14596a61826fa52477dcaebc07bfbad00colm
6e89d4f6c259afc94f8806c74a33a8fe81392499sf list[c]->name = talloc_strdup(list, tmp_str);
95e8cab14596a61826fa52477dcaebc07bfbad00colm if (list[c]->name == NULL) {
95e8cab14596a61826fa52477dcaebc07bfbad00colm ret = ENOMEM;
95e8cab14596a61826fa52477dcaebc07bfbad00colm goto done;
95e8cab14596a61826fa52477dcaebc07bfbad00colm }
95e8cab14596a61826fa52477dcaebc07bfbad00colm
95e8cab14596a61826fa52477dcaebc07bfbad00colm tmp_str = ldb_msg_find_attr_as_string(res->msgs[c], SYSDB_DOMAIN_ID,
95e8cab14596a61826fa52477dcaebc07bfbad00colm NULL);
17efa6b5344b7574597eec03f02ef28103e19265nd if (tmp_str != NULL) {
8e34905974b7a442a55adac3b3fdb196c389e807takashi list[c]->trusted_dom_sid = talloc_strdup(list, tmp_str);
17efa6b5344b7574597eec03f02ef28103e19265nd if (list[c]->trusted_dom_sid == NULL) {
17efa6b5344b7574597eec03f02ef28103e19265nd ret = ENOMEM;
17efa6b5344b7574597eec03f02ef28103e19265nd goto done;
ef685e00a47967e27d89709461728a229d762172nd }
cd51960ffc0f49d7a9e702162ed49b3eb0909276dirkx }
17efa6b5344b7574597eec03f02ef28103e19265nd
17efa6b5344b7574597eec03f02ef28103e19265nd ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_BASE_ID,
cd51960ffc0f49d7a9e702162ed49b3eb0909276dirkx &list[c]->base_id);
6e89d4f6c259afc94f8806c74a33a8fe81392499sf if (ret != EOK && ret != ENOENT) {
cd51960ffc0f49d7a9e702162ed49b3eb0909276dirkx DEBUG(SSSDBG_MINOR_FAILURE, "find_attr_as_uint32_t failed.\n");
b44815871de48215476ad1d4cc46d3f99da532a5erikabele goto done;
cd51960ffc0f49d7a9e702162ed49b3eb0909276dirkx }
cd51960ffc0f49d7a9e702162ed49b3eb0909276dirkx
cd51960ffc0f49d7a9e702162ed49b3eb0909276dirkx ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_ID_RANGE_SIZE,
17efa6b5344b7574597eec03f02ef28103e19265nd &list[c]->id_range_size);
cd51960ffc0f49d7a9e702162ed49b3eb0909276dirkx if (ret != EOK && ret != ENOENT) {
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai DEBUG(SSSDBG_MINOR_FAILURE, "find_attr_as_uint32_t failed.\n");
8e34905974b7a442a55adac3b3fdb196c389e807takashi goto done;
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai }
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_BASE_RID,
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai &list[c]->base_rid);
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai if (ret != EOK && ret != ENOENT) {
8e34905974b7a442a55adac3b3fdb196c389e807takashi DEBUG(SSSDBG_MINOR_FAILURE, "find_attr_as_uint32_t failed.\n");
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai goto done;
6e89d4f6c259afc94f8806c74a33a8fe81392499sf }
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_SECONDARY_BASE_RID,
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai &list[c]->secondary_base_rid);
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai if (ret != EOK && ret != ENOENT) {
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai DEBUG(SSSDBG_MINOR_FAILURE, "find_attr_as_uint32_t failed.\n");
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai goto done;
86bb9693d63dfc1be14519a5b444467e4b0cdaf8kawai }
17efa6b5344b7574597eec03f02ef28103e19265nd
8e34905974b7a442a55adac3b3fdb196c389e807takashi tmp_str = ldb_msg_find_attr_as_string(res->msgs[c], SYSDB_ID_RANGE_TYPE,
17efa6b5344b7574597eec03f02ef28103e19265nd NULL);
17efa6b5344b7574597eec03f02ef28103e19265nd if (tmp_str != NULL) {
8e34905974b7a442a55adac3b3fdb196c389e807takashi list[c]->range_type = talloc_strdup(list, tmp_str);
b5468eddc0cb1691af19ddc70a6e205daf00a94ctrawick if (list[c]->range_type == NULL) {
b5468eddc0cb1691af19ddc70a6e205daf00a94ctrawick ret = ENOMEM;
8e34905974b7a442a55adac3b3fdb196c389e807takashi goto done;
b5468eddc0cb1691af19ddc70a6e205daf00a94ctrawick }
6e89d4f6c259afc94f8806c74a33a8fe81392499sf }
b5468eddc0cb1691af19ddc70a6e205daf00a94ctrawick
17efa6b5344b7574597eec03f02ef28103e19265nd }
b5468eddc0cb1691af19ddc70a6e205daf00a94ctrawick list[res->count] = NULL;
b5468eddc0cb1691af19ddc70a6e205daf00a94ctrawick
b5468eddc0cb1691af19ddc70a6e205daf00a94ctrawick *range_count = res->count;
17efa6b5344b7574597eec03f02ef28103e19265nd *range_list = talloc_steal(mem_ctx, list);
b5468eddc0cb1691af19ddc70a6e205daf00a94ctrawick ret = EOK;
17efa6b5344b7574597eec03f02ef28103e19265nd
8e34905974b7a442a55adac3b3fdb196c389e807takashidone:
17efa6b5344b7574597eec03f02ef28103e19265nd talloc_free(tmp_ctx);
17efa6b5344b7574597eec03f02ef28103e19265nd return ret;
17efa6b5344b7574597eec03f02ef28103e19265nd}
ef685e00a47967e27d89709461728a229d762172nd
222f0f03c2f9ee6343c18f80f0cb6e9aad21bc58sliveerrno_t sysdb_range_create(struct sysdb_ctx *sysdb, struct range_info *range)
17efa6b5344b7574597eec03f02ef28103e19265nd{
17efa6b5344b7574597eec03f02ef28103e19265nd struct ldb_message *msg;
222f0f03c2f9ee6343c18f80f0cb6e9aad21bc58slive int ret;
6e89d4f6c259afc94f8806c74a33a8fe81392499sf TALLOC_CTX *tmp_ctx;
222f0f03c2f9ee6343c18f80f0cb6e9aad21bc58slive
b44815871de48215476ad1d4cc46d3f99da532a5erikabele /* if both or none are set, skip */
222f0f03c2f9ee6343c18f80f0cb6e9aad21bc58slive if ((range->trusted_dom_sid == NULL && range->secondary_base_rid == 0) ||
222f0f03c2f9ee6343c18f80f0cb6e9aad21bc58slive (range->trusted_dom_sid != NULL && range->secondary_base_rid != 0)) {
17efa6b5344b7574597eec03f02ef28103e19265nd
17efa6b5344b7574597eec03f02ef28103e19265nd DEBUG(SSSDBG_OP_FAILURE, "Invalid range, skipping. Expected that "
1f2a7403f1389cbf2da0a53a2b2fb425dea75506erikabele "either the secondary base RID or the SID of the trusted "
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen "domain is set, but not both or none of them.\n");
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen return EOK;
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen }
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen tmp_ctx = talloc_new(NULL);
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen if (!tmp_ctx) {
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen return ENOMEM;
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen }
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen msg = ldb_msg_new(tmp_ctx);
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen if (!msg) {
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen ret = ENOMEM;
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen goto done;
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen }
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen msg->dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen SYSDB_TMPL_RANGE, range->name);
94abf1cc80072ea31506946ac6595631ca6d2c14rbowen if (!msg->dn) {
17efa6b5344b7574597eec03f02ef28103e19265nd ret = ENOMEM;
8e34905974b7a442a55adac3b3fdb196c389e807takashi goto done;
17efa6b5344b7574597eec03f02ef28103e19265nd }
17efa6b5344b7574597eec03f02ef28103e19265nd
1f666f93c91dbb492dc7706573b369cd03b84265poirier ret = sysdb_add_string(msg, SYSDB_OBJECTCLASS, SYSDB_ID_RANGE_CLASS);
ef685e00a47967e27d89709461728a229d762172nd if (ret) goto done;
1f2a7403f1389cbf2da0a53a2b2fb425dea75506erikabele
1f666f93c91dbb492dc7706573b369cd03b84265poirier if (range->trusted_dom_sid == NULL && range->secondary_base_rid != 0) {
17efa6b5344b7574597eec03f02ef28103e19265nd ret = sysdb_add_string(msg, SYSDB_OBJECTCLASS,
1f2a7403f1389cbf2da0a53a2b2fb425dea75506erikabele SYSDB_DOMAIN_ID_RANGE_CLASS);
6e89d4f6c259afc94f8806c74a33a8fe81392499sf if (ret) goto done;
1f2a7403f1389cbf2da0a53a2b2fb425dea75506erikabele
b44815871de48215476ad1d4cc46d3f99da532a5erikabele ret = sysdb_add_ulong(msg, SYSDB_SECONDARY_BASE_RID,
1f2a7403f1389cbf2da0a53a2b2fb425dea75506erikabele (unsigned long) range->secondary_base_rid);
1f2a7403f1389cbf2da0a53a2b2fb425dea75506erikabele if (ret) goto done;
1f2a7403f1389cbf2da0a53a2b2fb425dea75506erikabele } else if (range->trusted_dom_sid != NULL &&
17efa6b5344b7574597eec03f02ef28103e19265nd range->secondary_base_rid == 0) {
81622596373177e079337e956f7a5800895443b3erikabele ret = sysdb_add_string(msg, SYSDB_OBJECTCLASS,
81622596373177e079337e956f7a5800895443b3erikabele SYSDB_TRUSTED_AD_DOMAIN_RANGE_CLASS);
8e34905974b7a442a55adac3b3fdb196c389e807takashi if (ret) goto done;
81622596373177e079337e956f7a5800895443b3erikabele
ef685e00a47967e27d89709461728a229d762172nd ret = sysdb_add_string(msg, SYSDB_DOMAIN_ID, range->trusted_dom_sid);
ef685e00a47967e27d89709461728a229d762172nd if (ret) goto done;
ef685e00a47967e27d89709461728a229d762172nd }
81622596373177e079337e956f7a5800895443b3erikabele
81622596373177e079337e956f7a5800895443b3erikabele ret = sysdb_add_string(msg, SYSDB_NAME, range->name);
81622596373177e079337e956f7a5800895443b3erikabele if (ret) goto done;
81622596373177e079337e956f7a5800895443b3erikabele
6e89d4f6c259afc94f8806c74a33a8fe81392499sf ret = sysdb_add_ulong(msg, SYSDB_BASE_ID, (unsigned long) range->base_id);
81622596373177e079337e956f7a5800895443b3erikabele if (ret) goto done;
81622596373177e079337e956f7a5800895443b3erikabele
81622596373177e079337e956f7a5800895443b3erikabele ret = sysdb_add_ulong(msg, SYSDB_ID_RANGE_SIZE,
81622596373177e079337e956f7a5800895443b3erikabele (unsigned long) range->id_range_size);
81622596373177e079337e956f7a5800895443b3erikabele if (ret) goto done;
81622596373177e079337e956f7a5800895443b3erikabele
ef685e00a47967e27d89709461728a229d762172nd ret = sysdb_add_ulong(msg, SYSDB_BASE_RID,
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen (unsigned long) range->base_rid);
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen if (ret) goto done;
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen ret = sysdb_add_ulong(msg, SYSDB_CREATE_TIME, (unsigned long)time(NULL));
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen if (ret) goto done;
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen ret = sysdb_add_string(msg, SYSDB_ID_RANGE_TYPE, range->range_type);
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen if (ret) goto done;
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen
6e89d4f6c259afc94f8806c74a33a8fe81392499sf ret = ldb_add(sysdb->ldb, msg);
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen if (ret) goto done;
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen ret = sysdb_error_to_errno(ret);
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowendone:
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen if (ret) {
e554dd2dae4ba2c32dbd05fc0d4e0a42ef4ba902rbowen DEBUG(SSSDBG_TRACE_FUNC, "Error: %d (%s)\n", ret, strerror(ret));
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele }
8e34905974b7a442a55adac3b3fdb196c389e807takashi talloc_zfree(tmp_ctx);
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele return ret;
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele}
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabeleerrno_t sysdb_update_ranges(struct sysdb_ctx *sysdb,
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele struct range_info **ranges)
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele{
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele int ret;
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele int sret;
6e89d4f6c259afc94f8806c74a33a8fe81392499sf size_t c;
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele size_t d;
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele TALLOC_CTX *tmp_ctx = NULL;
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele size_t cur_range_count;
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele struct range_info **cur_ranges;
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele struct ldb_dn *dn;
f0eae6f6191f5730fa8db049f7391e93b4ff41b9erikabele bool in_transaction = false;
4a67c5c0053e1c1c2202122e46a42987f6fd28dfyoshiki bool *keep_range;
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd
8e34905974b7a442a55adac3b3fdb196c389e807takashi tmp_ctx = talloc_new(NULL);
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd if (tmp_ctx == NULL) {
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd ret = ENOMEM;
8e34905974b7a442a55adac3b3fdb196c389e807takashi goto done;
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd }
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd
8e34905974b7a442a55adac3b3fdb196c389e807takashi /* Retrieve all ranges that are currently in sysdb */
8e34905974b7a442a55adac3b3fdb196c389e807takashi ret = sysdb_get_ranges(tmp_ctx, sysdb, &cur_range_count,
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd &cur_ranges);
6e89d4f6c259afc94f8806c74a33a8fe81392499sf if (ret != EOK) {
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd DEBUG(SSSDBG_OP_FAILURE, "sysdb_get_ranges failed.\n");
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd goto done;
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd }
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd keep_range = talloc_zero_array(tmp_ctx, bool, cur_range_count);
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd if (keep_range == NULL) {
f4166cb2bf5e48c1b0f18b0d1f6757fce82230a8nd ret = ENOMEM;
17efa6b5344b7574597eec03f02ef28103e19265nd DEBUG(SSSDBG_OP_FAILURE, "talloc_zero_array failed.\n");
8e34905974b7a442a55adac3b3fdb196c389e807takashi goto done;
17efa6b5344b7574597eec03f02ef28103e19265nd }
17efa6b5344b7574597eec03f02ef28103e19265nd
17efa6b5344b7574597eec03f02ef28103e19265nd ret = sysdb_transaction_start(sysdb);
4a67c5c0053e1c1c2202122e46a42987f6fd28dfyoshiki if (ret != EOK) {
4a67c5c0053e1c1c2202122e46a42987f6fd28dfyoshiki DEBUG(SSSDBG_OP_FAILURE, "sysdb_transaction_start failed.\n");
17efa6b5344b7574597eec03f02ef28103e19265nd goto done;
17efa6b5344b7574597eec03f02ef28103e19265nd }
4a67c5c0053e1c1c2202122e46a42987f6fd28dfyoshiki in_transaction = true;
6e89d4f6c259afc94f8806c74a33a8fe81392499sf
4a67c5c0053e1c1c2202122e46a42987f6fd28dfyoshiki /* Go through a list of retrieved ranges and:
17efa6b5344b7574597eec03f02ef28103e19265nd * - if a range already exists in sysdb, mark it for preservation
4a67c5c0053e1c1c2202122e46a42987f6fd28dfyoshiki * - if the range doesn't exist in sysdb, create it
4a67c5c0053e1c1c2202122e46a42987f6fd28dfyoshiki */
17efa6b5344b7574597eec03f02ef28103e19265nd for (c = 0; ranges[c] != NULL; c++) {
17efa6b5344b7574597eec03f02ef28103e19265nd for (d = 0; d < cur_range_count; d++) {
e9e8e471353eaa5576e1e96530968d02f208e39fnd if (strcasecmp(ranges[c]->name, cur_ranges[d]->name) == 0) {
e9e8e471353eaa5576e1e96530968d02f208e39fnd keep_range[d] = true;
8e34905974b7a442a55adac3b3fdb196c389e807takashi /* range already in cache, nothing to do */
e9e8e471353eaa5576e1e96530968d02f208e39fnd break;
e9e8e471353eaa5576e1e96530968d02f208e39fnd }
1e1be8a0871405df3c1ec4d6d33aab71996ad0c9nilgun }
e9e8e471353eaa5576e1e96530968d02f208e39fnd
e9e8e471353eaa5576e1e96530968d02f208e39fnd if (d == cur_range_count) {
1e1be8a0871405df3c1ec4d6d33aab71996ad0c9nilgun DEBUG(SSSDBG_TRACE_FUNC, "Adding range [%s].\n", ranges[c]->name);
1e1be8a0871405df3c1ec4d6d33aab71996ad0c9nilgun ret = sysdb_range_create(sysdb, ranges[c]);
e9e8e471353eaa5576e1e96530968d02f208e39fnd if (ret != EOK) {
6e89d4f6c259afc94f8806c74a33a8fe81392499sf DEBUG(SSSDBG_OP_FAILURE, "sysdb_range_create failed.\n");
e9e8e471353eaa5576e1e96530968d02f208e39fnd goto done;
e9e8e471353eaa5576e1e96530968d02f208e39fnd }
e9e8e471353eaa5576e1e96530968d02f208e39fnd }
e9e8e471353eaa5576e1e96530968d02f208e39fnd }
e9e8e471353eaa5576e1e96530968d02f208e39fnd
e9e8e471353eaa5576e1e96530968d02f208e39fnd /* Now delete all ranges that have been in sysdb prior to
* refreshing the list and are not marked for preservation
* (i.e. they are not in the new list of ranges)
*/
for (d = 0; d < cur_range_count; d++) {
if (!keep_range[d]) {
DEBUG(SSSDBG_TRACE_FUNC, "Removing range [%s].\n",
cur_ranges[d]->name);
dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
SYSDB_TMPL_RANGE, cur_ranges[d]->name);
if (dn == NULL) {
ret = ENOMEM;
goto done;
}
ret = sysdb_delete_entry(sysdb, dn, true);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE, "sysdb_delete_entry failed.\n");
goto done;
}
}
}
ret = sysdb_transaction_commit(sysdb);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "Could not commit transaction\n");
goto done;
}
in_transaction = false;
done:
if (in_transaction) {
sret = sysdb_transaction_cancel(sysdb);
if (sret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "Could not cancel transaction\n");
}
}
talloc_free(tmp_ctx);
return ret;
}