/*
Copyright (C) 2021 Red Hat
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include
#include "db/sysdb_private.h"
#include "db/sysdb_subid.h"
#define SUBID_SUBDIR "subid_ranges"
errno_t sysdb_store_subid_range(struct sss_domain_info *domain,
const char *name,
int expiration_period,
struct sysdb_attrs *attrs)
{
TALLOC_CTX *tmp_ctx;
errno_t ret, sret;
bool in_transaction = false;
time_t now = time(NULL);
DEBUG(SSSDBG_TRACE_FUNC, "Storing subid ranges for %s, expiration period = %d\n",
name, expiration_period);
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
ret = sysdb_transaction_start(domain->sysdb);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n");
goto done;
}
in_transaction = true;
ret = sysdb_attrs_add_string(attrs, SYSDB_OBJECTCLASS, SYSDB_SUBID_RANGE_OC);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE,
"Could not set object class [%d]: %s\n", ret, strerror(ret));
goto done;
}
ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, name);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE,
"Could not set name attribute [%d]: %s\n", ret, strerror(ret));
goto done;
}
ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE,
"Could not set sysdb lastUpdate [%d]: %s\n",
ret, strerror(ret));
goto done;
}
ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
expiration_period ? (now + expiration_period) : 0);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE, "Could not set sysdb cache expire [%d]: %s\n",
ret, strerror(ret));
goto done;
}
ret = sysdb_store_custom(domain, name, SUBID_SUBDIR, attrs);
if (ret != EOK) {
goto done;
}
ret = sysdb_transaction_commit(domain->sysdb);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "Failed to commit transaction\n");
goto done;
}
in_transaction = false;
ret = EOK;
done:
if (in_transaction) {
sret = sysdb_transaction_cancel(domain->sysdb);
if (sret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "Could not cancel transaction\n");
}
}
talloc_free(tmp_ctx);
return ret;
}
errno_t sysdb_get_subid_ranges(TALLOC_CTX *mem_ctx,
struct sss_domain_info *domain,
const char *name,
const char **attrs,
struct ldb_message **_range)
{
TALLOC_CTX *tmp_ctx;
errno_t ret;
const char *filter;
struct ldb_message **ranges;
size_t num_ranges;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
filter = talloc_asprintf(tmp_ctx, "(&(%s=%s)(%s=%s))",
SYSDB_OBJECTCLASS, SYSDB_SUBID_RANGE_OC,
SYSDB_NAME, name);
if (!filter) {
ret = ENOMEM;
goto done;
}
ret = sysdb_search_custom(tmp_ctx, domain, filter,
SUBID_SUBDIR, attrs,
&num_ranges, &ranges);
if (ret != EOK) {
goto done;
}
if (num_ranges > 1) {
ret = EINVAL;
DEBUG(SSSDBG_CRIT_FAILURE,
"Found more than one range with name %s\n", name);
goto done;
}
*_range = talloc_steal(mem_ctx, ranges[0]);
ret = EOK;
done:
talloc_free(tmp_ctx);
return ret;
}
errno_t sysdb_delete_subid_range(struct sss_domain_info *domain,
const char *name)
{
DEBUG(SSSDBG_TRACE_FUNC, "Deleting subid ranges for %s\n", name);
return sysdb_delete_custom(domain, name, SUBID_SUBDIR);
}