sysdb_ranges.c revision fbd63f8f920a2591310d601b01c7b79aa4023a95
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainen/*
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen SSSD
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen System Database - ID ranges related calls
fab850a6aee4aaef4f4795bd7946807a3ba45041Timo Sirainen
28b8434ca4cba2e310d13ffc55e895d658725f43Timo Sirainen Copyright (C) 2012 Sumit Bose <sbose@redhat.com>
28b8434ca4cba2e310d13ffc55e895d658725f43Timo Sirainen
06af65f82453bb976cf8aa6fe2507e3a6253a04fTimo Sirainen This program is free software; you can redistribute it and/or modify
4909421ac41e143fe07a235c0d11e9f0452d716bTimo Sirainen it under the terms of the GNU General Public License as published by
e5d7056b6ef069e228f8ad3c9467662955cab3c6Timo Sirainen the Free Software Foundation; either version 3 of the License, or
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen (at your option) any later version.
134582c78f038b4d9b9fde127399aefa50935a53Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen This program is distributed in the hope that it will be useful,
4909421ac41e143fe07a235c0d11e9f0452d716bTimo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
885a3c2287ae3e5827aa580ea06b231de38abb47Timo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen GNU General Public License for more details.
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen You should have received a copy of the GNU General Public License
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen*/
8aa6fe58b1832da498b49de4383f9f1ef458945dTimo Sirainen
8aa6fe58b1832da498b49de4383f9f1ef458945dTimo Sirainen#include "util/util.h"
8aa6fe58b1832da498b49de4383f9f1ef458945dTimo Sirainen#include "db/sysdb_private.h"
8aa6fe58b1832da498b49de4383f9f1ef458945dTimo Sirainen
8aa6fe58b1832da498b49de4383f9f1ef458945dTimo Sirainenstatic errno_t find_attr_as_uint32_t(const struct ldb_message *msg,
8aa6fe58b1832da498b49de4383f9f1ef458945dTimo Sirainen const char *attr_name, uint32_t *result)
8aa6fe58b1832da498b49de4383f9f1ef458945dTimo Sirainen{
8aa6fe58b1832da498b49de4383f9f1ef458945dTimo Sirainen uint64_t val;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen val = ldb_msg_find_attr_as_uint64(msg, attr_name, UINT64_MAX);
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if (val == UINT64_MAX) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return ENOENT;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen } else if (val >= UINT32_MAX) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return EINVAL;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen *result = val;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return EOK;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen}
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenerrno_t sysdb_get_ranges(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen size_t *range_count,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen struct range_info ***range_list)
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen{
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen size_t c;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen errno_t ret;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen TALLOC_CTX *tmp_ctx;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen struct ldb_result *res;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen const char *attrs[] = {SYSDB_NAME,
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen SYSDB_BASE_ID,
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen SYSDB_ID_RANGE_SIZE,
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen SYSDB_BASE_RID,
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen SYSDB_SECONDARY_BASE_RID,
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen SYSDB_DOMAIN_ID,
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen NULL};
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen struct range_info **list;
27a44fcfd8d19bffe0f267f20a2b5d3fe7600fddTimo Sirainen struct ldb_dn *basedn;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen const char *tmp_str;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen tmp_ctx = talloc_new(NULL);
27a44fcfd8d19bffe0f267f20a2b5d3fe7600fddTimo Sirainen if (tmp_ctx == NULL) {
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = ENOMEM;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen goto done;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen }
27a44fcfd8d19bffe0f267f20a2b5d3fe7600fddTimo Sirainen
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen basedn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_TMPL_RANGE_BASE);
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen if (basedn == NULL) {
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = EIO;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen goto done;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen }
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = ldb_search(sysdb->ldb, tmp_ctx, &res,
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen basedn, LDB_SCOPE_ONELEVEL,
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen attrs, "objectclass=%s", SYSDB_ID_RANGE_CLASS);
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen if (ret != LDB_SUCCESS) {
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = EIO;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen goto done;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen }
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen list = talloc_zero_array(tmp_ctx, struct range_info *, res->count + 1);
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen if (list == NULL) {
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = ENOMEM;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen goto done;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen }
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen for (c = 0; c < res->count; c++) {
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen list[c] = talloc_zero(list, struct range_info);
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen if (list[c] == NULL) {
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = ENOMEM;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen goto done;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen }
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen tmp_str = ldb_msg_find_attr_as_string(res->msgs[c], SYSDB_NAME, NULL);
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen if (tmp_str == NULL) {
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen DEBUG(SSSDBG_MINOR_FAILURE, ("The object [%s] doesn't have a name.\n",
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ldb_dn_get_linearized(res->msgs[c]->dn)));
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = EINVAL;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen goto done;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen }
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen list[c]->name = talloc_strdup(list, tmp_str);
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen if (list[c]->name == NULL) {
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = ENOMEM;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen goto done;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen }
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen tmp_str = ldb_msg_find_attr_as_string(res->msgs[c], SYSDB_DOMAIN_ID,
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen NULL);
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen if (tmp_str != NULL) {
767431e5084a037c4dbefdf30ebfa03c84b1f449Timo Sirainen list[c]->trusted_dom_sid = talloc_strdup(list, tmp_str);
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen if (list[c]->trusted_dom_sid == NULL) {
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen ret = ENOMEM;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen goto done;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen }
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen }
10635b60b6f7776cd4c1f364ae8dc94c3b9254ecPascal Volk
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_BASE_ID,
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen &list[c]->base_id);
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen if (ret != EOK && ret != ENOENT) {
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen DEBUG(SSSDBG_MINOR_FAILURE, ("find_attr_as_uint32_t failed.\n"));
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen goto done;
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen }
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_ID_RANGE_SIZE,
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen &list[c]->id_range_size);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if (ret != EOK && ret != ENOENT) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen DEBUG(SSSDBG_MINOR_FAILURE, ("find_attr_as_uint32_t failed.\n"));
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen goto done;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen }
767431e5084a037c4dbefdf30ebfa03c84b1f449Timo Sirainen
767431e5084a037c4dbefdf30ebfa03c84b1f449Timo Sirainen ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_BASE_RID,
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen &list[c]->base_rid);
767431e5084a037c4dbefdf30ebfa03c84b1f449Timo Sirainen if (ret != EOK && ret != ENOENT) {
767431e5084a037c4dbefdf30ebfa03c84b1f449Timo Sirainen DEBUG(SSSDBG_MINOR_FAILURE, ("find_attr_as_uint32_t failed.\n"));
9ce62fcb795a4bb57f1c003fc8cbd63bff6e5463Timo Sirainen goto done;
9ce62fcb795a4bb57f1c003fc8cbd63bff6e5463Timo Sirainen }
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
9f3bb0e10835efb0c9b1eb9e09e16b614ec41b97Timo Sirainen ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_SECONDARY_BASE_RID,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen &list[c]->secondary_base_rid);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if (ret != EOK && ret != ENOENT) {
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen DEBUG(SSSDBG_MINOR_FAILURE, ("find_attr_as_uint32_t failed.\n"));
9f3bb0e10835efb0c9b1eb9e09e16b614ec41b97Timo Sirainen goto done;
9f3bb0e10835efb0c9b1eb9e09e16b614ec41b97Timo Sirainen }
9f3bb0e10835efb0c9b1eb9e09e16b614ec41b97Timo Sirainen }
9f3bb0e10835efb0c9b1eb9e09e16b614ec41b97Timo Sirainen list[res->count] = NULL;
9f3bb0e10835efb0c9b1eb9e09e16b614ec41b97Timo Sirainen
28b8434ca4cba2e310d13ffc55e895d658725f43Timo Sirainen *range_count = res->count;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen *range_list = talloc_steal(mem_ctx, list);
28b8434ca4cba2e310d13ffc55e895d658725f43Timo Sirainen ret = EOK;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainendone:
bd417d416988d11a6b555b9aa57779e7ed976951Timo Sirainen talloc_free(tmp_ctx);
fab850a6aee4aaef4f4795bd7946807a3ba45041Timo Sirainen return ret;
28b8434ca4cba2e310d13ffc55e895d658725f43Timo Sirainen}
28b8434ca4cba2e310d13ffc55e895d658725f43Timo Sirainen
28b8434ca4cba2e310d13ffc55e895d658725f43Timo Sirainenerrno_t sysdb_range_create(struct sysdb_ctx *sysdb, struct range_info *range)
28b8434ca4cba2e310d13ffc55e895d658725f43Timo Sirainen{
28b8434ca4cba2e310d13ffc55e895d658725f43Timo Sirainen struct ldb_message *msg;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen int ret;
0f9a8663b0ff6fe30389d02284a2b002c40914ebTimo Sirainen TALLOC_CTX *tmp_ctx;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
bde78a7bf5f9000f1ae4dc7ce6cabd012e1f8b79Pascal Volk /* if both or none are set, skip */
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if ((range->trusted_dom_sid == NULL && range->secondary_base_rid == 0) ||
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen (range->trusted_dom_sid != NULL && range->secondary_base_rid != 0)) {
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("Invalid range, skipping. Expected that "
06af65f82453bb976cf8aa6fe2507e3a6253a04fTimo Sirainen "either the secondary base RID or the SID of the trusted "
06af65f82453bb976cf8aa6fe2507e3a6253a04fTimo Sirainen "domain is set, but not both or none of them.\n"));
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen return EOK;
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen }
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen tmp_ctx = talloc_new(NULL);
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen if (!tmp_ctx) {
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen return ENOMEM;
bde78a7bf5f9000f1ae4dc7ce6cabd012e1f8b79Pascal Volk }
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen msg = ldb_msg_new(tmp_ctx);
cc52f19439f17c03e37fd65c6299a77d5c5e638aTimo Sirainen if (!msg) {
cc52f19439f17c03e37fd65c6299a77d5c5e638aTimo Sirainen ret = ENOMEM;
cc52f19439f17c03e37fd65c6299a77d5c5e638aTimo Sirainen goto done;
cc52f19439f17c03e37fd65c6299a77d5c5e638aTimo Sirainen }
cc52f19439f17c03e37fd65c6299a77d5c5e638aTimo Sirainen
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen msg->dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen SYSDB_TMPL_RANGE, range->name);
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen if (!msg->dn) {
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen ret = ENOMEM;
cc52f19439f17c03e37fd65c6299a77d5c5e638aTimo Sirainen goto done;
cc52f19439f17c03e37fd65c6299a77d5c5e638aTimo Sirainen }
cc52f19439f17c03e37fd65c6299a77d5c5e638aTimo Sirainen
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS,
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen SYSDB_ID_RANGE_CLASS);
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen if (ret) goto done;
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen if (range->trusted_dom_sid == NULL && range->secondary_base_rid != 0) {
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS,
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen SYSDB_DOMAIN_ID_RANGE_CLASS);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) goto done;
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_SECONDARY_BASE_RID,
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen (unsigned long) range->secondary_base_rid);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) goto done;
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen } else if (range->trusted_dom_sid != NULL &&
78ab753927acf4466f38e4a50694be3f4c4cc9abTimo Sirainen range->secondary_base_rid == 0) {
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS,
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen SYSDB_TRUSTED_AD_DOMAIN_RANGE_CLASS);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) goto done;
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_DOMAIN_ID,
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen range->trusted_dom_sid);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) goto done;
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen }
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, range->name);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) goto done;
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_BASE_ID,
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen (unsigned long) range->base_id);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) goto done;
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_ID_RANGE_SIZE,
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen (unsigned long) range->id_range_size);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) goto done;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_BASE_RID,
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen (unsigned long) range->base_rid);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) goto done;
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen (unsigned long)time(NULL));
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) goto done;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen ret = ldb_add(sysdb->ldb, msg);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if (ret) goto done;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen ret = sysdb_error_to_errno(ret);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainendone:
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen if (ret) {
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen }
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen talloc_zfree(tmp_ctx);
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen return ret;
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen}
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainenerrno_t sysdb_update_ranges(struct sysdb_ctx *sysdb,
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen struct range_info **ranges)
542a32ee5f4ca72626ec93b6313f909811c01534Timo Sirainen{
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen int ret;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen int sret;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen size_t c;
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen size_t d;
4909421ac41e143fe07a235c0d11e9f0452d716bTimo Sirainen TALLOC_CTX *tmp_ctx = NULL;
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen size_t cur_range_count;
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen struct range_info **cur_ranges;
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen struct ldb_dn *dn;
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen bool in_transaction = false;
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen bool *keep_range;
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen tmp_ctx = talloc_new(NULL);
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen if (tmp_ctx == NULL) {
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen ret = ENOMEM;
4909421ac41e143fe07a235c0d11e9f0452d716bTimo Sirainen goto done;
4909421ac41e143fe07a235c0d11e9f0452d716bTimo Sirainen }
d5ef38077adbff5b3e4d0b3c94a2057581dc78b6Timo Sirainen
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen /* Retrieve all ranges that are currently in sysdb */
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen ret = sysdb_get_ranges(tmp_ctx, sysdb, &cur_range_count,
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen &cur_ranges);
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen if (ret != EOK) {
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_get_ranges failed.\n"));
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen goto done;
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen }
d5ef38077adbff5b3e4d0b3c94a2057581dc78b6Timo Sirainen
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen keep_range = talloc_zero_array(tmp_ctx, bool, cur_range_count);
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen if (keep_range == NULL) {
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen ret = ENOMEM;
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero_array failed.\n"));
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen goto done;
d5eb47a791ec56149fd711cd8e44efc8babeaae5Timo Sirainen }
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen ret = sysdb_transaction_start(sysdb);
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen if (ret != EOK) {
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_transaction_start failed.\n"));
e5d7056b6ef069e228f8ad3c9467662955cab3c6Timo Sirainen goto done;
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainen }
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainen in_transaction = true;
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainen
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainen /* Go through a list of retrieved ranges and:
d5ef38077adbff5b3e4d0b3c94a2057581dc78b6Timo Sirainen * - if a range already exists in sysdb, mark it for preservation
d5ef38077adbff5b3e4d0b3c94a2057581dc78b6Timo Sirainen * - if the range doesn't exist in sysdb, create it
e5d7056b6ef069e228f8ad3c9467662955cab3c6Timo Sirainen */
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen for (c = 0; ranges[c] != NULL; c++) {
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen for (d = 0; d < cur_range_count; d++) {
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen if (strcasecmp(ranges[c]->name, cur_ranges[d]->name) == 0) {
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen keep_range[d] = true;
a3a55999bcfe2e57941cb64343f4ea80beabdab7Timo Sirainen /* range already in cache, nothing to do */
f2a1955d993f67982bc40ad7bbae9a036dabfd64Timo Sirainen break;
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen }
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen }
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen if (d == cur_range_count) {
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("Adding range [%s].\n", ranges[c]->name));
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen ret = sysdb_range_create(sysdb, ranges[c]);
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen if (ret != EOK) {
75d9024d9409f4710e51dbe40ffb338a84bb1446Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_range_create failed.\n"));
75d9024d9409f4710e51dbe40ffb338a84bb1446Timo Sirainen goto done;
6565fc65b6c12eeab52dabfbe7c60cb10c219d1eTimo Sirainen }
06e3d76a9780fabd0c1d0dca2c650aec84d4a9e8Timo Sirainen }
4605cab1123700c52c515a433a2802fcbc827c62Timo Sirainen }
4605cab1123700c52c515a433a2802fcbc827c62Timo Sirainen
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen /* Now delete all ranges that have been in sysdb prior to
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen * refreshing the list and are not marked for preservation
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen * (i.e. they are not in the new list of ranges)
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen */
a672f99363d5f37060c1331d00d2ee3c4626310fTimo Sirainen for (d = 0; d < cur_range_count; d++) {
a672f99363d5f37060c1331d00d2ee3c4626310fTimo Sirainen if (!keep_range[d]) {
a672f99363d5f37060c1331d00d2ee3c4626310fTimo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("Removing range [%s].\n",
d5ef38077adbff5b3e4d0b3c94a2057581dc78b6Timo Sirainen cur_ranges[d]->name));
ff3337516aad9843599905aeeb29812ea67c09d1Timo Sirainen dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen SYSDB_TMPL_RANGE, cur_ranges[d]->name);
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen if (dn == NULL) {
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen ret = ENOMEM;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen goto done;
885a3c2287ae3e5827aa580ea06b231de38abb47Timo Sirainen }
885a3c2287ae3e5827aa580ea06b231de38abb47Timo Sirainen
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen ret = sysdb_delete_entry(sysdb, dn, true);
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen if (ret != EOK) {
a672f99363d5f37060c1331d00d2ee3c4626310fTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_delete_entry failed.\n"));
d5ef38077adbff5b3e4d0b3c94a2057581dc78b6Timo Sirainen goto done;
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen }
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen }
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen }
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen ret = sysdb_transaction_commit(sysdb);
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen if (ret != EOK) {
72c47a26f4ded49d4827dc64818b34bbc9606fc4Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Could not commit transaction\n"));
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen goto done;
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen }
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen in_transaction = false;
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainendone:
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen if (in_transaction) {
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen sret = sysdb_transaction_cancel(sysdb);
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen if (sret != EOK) {
5296198635718c9bf5b2f972c9d5be52092d3d58Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
a2857829c642e2671779576b00c37b7d04693731Timo Sirainen }
4909421ac41e143fe07a235c0d11e9f0452d716bTimo Sirainen }
4a26584a87ee0e986d23a224b3b3e85c44254d7fTimo Sirainen talloc_free(tmp_ctx);
4a26584a87ee0e986d23a224b3b3e85c44254d7fTimo Sirainen return ret;
4a26584a87ee0e986d23a224b3b3e85c44254d7fTimo Sirainen}
968b2f633b7405bc2cf0596d04762994ceb279d0Timo Sirainen