summaryrefslogtreecommitdiff
path: root/src/db/sysdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/db/sysdb.c')
-rw-r--r--src/db/sysdb.c148
1 files changed, 97 insertions, 51 deletions
diff --git a/src/db/sysdb.c b/src/db/sysdb.c
index 9fcb7ae5..f36eadea 100644
--- a/src/db/sysdb.c
+++ b/src/db/sysdb.c
@@ -1337,34 +1337,29 @@ errno_t sysdb_attrs_to_list(TALLOC_CTX *mem_ctx,
return EOK;
}
-errno_t sysdb_has_enumerated(struct sysdb_ctx *sysdb,
- bool *has_enumerated)
+errno_t sysdb_get_bool(struct sysdb_ctx *sysdb,
+ struct ldb_dn *dn,
+ const char *attr_name,
+ bool *value)
{
+ TALLOC_CTX *tmp_ctx;
+ struct ldb_result *res;
errno_t ret;
int lret;
- struct ldb_dn *base_dn;
- struct ldb_result *res;
- const char *attributes[2] = {SYSDB_HAS_ENUMERATED,
- NULL};
- TALLOC_CTX *tmp_ctx;
-
+ const char *attrs[2] = {attr_name, NULL};
tmp_ctx = talloc_new(NULL);
- if (!tmp_ctx) {
- ret = ENOMEM;
- goto done;
+ if (tmp_ctx == NULL) {
+ return ENOMEM;
}
- base_dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
- SYSDB_DOM_BASE,
- sysdb->domain->name);
- if (!base_dn) {
- ret = ENOMEM;
+ lret = ldb_search(sysdb->ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE,
+ attrs, NULL);
+ if (lret != LDB_SUCCESS) {
+ ret = sysdb_error_to_errno(lret);
goto done;
}
- lret = ldb_search(sysdb->ldb, tmp_ctx, &res, base_dn,
- LDB_SCOPE_BASE, attributes, NULL);
if (lret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(lret);
goto done;
@@ -1378,20 +1373,17 @@ errno_t sysdb_has_enumerated(struct sysdb_ctx *sysdb,
* This object in the sysdb exists mostly just
* to contain this attribute.
*/
- *has_enumerated = false;
+ *value = false;
ret = EOK;
goto done;
} else if (res->count != 1) {
- DEBUG(0, ("Corrupted database. "
- "More than one entry for base search.\n"));
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Got more than one reply for base search!\n"));
ret = EIO;
goto done;
}
- /* Object existed. Return the stored value */
- *has_enumerated = ldb_msg_find_attr_as_bool(res->msgs[0],
- SYSDB_HAS_ENUMERATED,
- false);
+ *value = ldb_msg_find_attr_as_bool(res->msgs[0], attr_name, false);
ret = EOK;
@@ -1400,65 +1392,61 @@ done:
return ret;
}
-errno_t sysdb_set_enumerated(struct sysdb_ctx *sysdb,
- bool enumerated)
+errno_t sysdb_set_bool(struct sysdb_ctx *sysdb,
+ struct ldb_dn *dn,
+ const char *cn_value,
+ const char *attr_name,
+ bool value)
{
+ TALLOC_CTX *tmp_ctx = NULL;
+ struct ldb_message *msg = NULL;
+ struct ldb_result *res = NULL;
errno_t ret;
int lret;
- TALLOC_CTX *tmp_ctx;
- struct ldb_message *msg;
- struct ldb_result *res;
- struct ldb_dn *dn;
- tmp_ctx = talloc_new(NULL);
- if (!tmp_ctx) {
- ret = ENOMEM;
- goto done;
+ if (dn == NULL || cn_value == NULL || attr_name == NULL) {
+ return EINVAL;
}
- dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
- SYSDB_DOM_BASE,
- sysdb->domain->name);
- if (!dn) {
- ret = ENOMEM;
- goto done;
+ tmp_ctx = talloc_new(NULL);
+ if (tmp_ctx == NULL) {
+ return ENOMEM;
}
- lret = ldb_search(sysdb->ldb, tmp_ctx, &res,
- dn, LDB_SCOPE_BASE,
+ lret = ldb_search(sysdb->ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE,
NULL, NULL);
if (lret != LDB_SUCCESS) {
- ret = EIO;
+ ret = sysdb_error_to_errno(lret);
goto done;
}
msg = ldb_msg_new(tmp_ctx);
- if (!msg) {
+ if (msg == NULL) {
ret = ENOMEM;
goto done;
}
msg->dn = dn;
if (res->count == 0) {
- lret = ldb_msg_add_string(msg, "cn", sysdb->domain->name);
+ lret = ldb_msg_add_string(msg, "cn", cn_value);
if (lret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(lret);
goto done;
}
} else if (res->count != 1) {
- DEBUG(0, ("Got more than one reply for base search!\n"));
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Got more than one reply for base search!\n"));
ret = EIO;
goto done;
} else {
- lret = ldb_msg_add_empty(msg, SYSDB_HAS_ENUMERATED,
- LDB_FLAG_MOD_REPLACE, NULL);
+ lret = ldb_msg_add_empty(msg, attr_name, LDB_FLAG_MOD_REPLACE, NULL);
if (lret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(lret);
goto done;
}
}
- lret = ldb_msg_add_fmt(msg, SYSDB_HAS_ENUMERATED, "%s",
- enumerated?"TRUE":"FALSE");
+
+ lret = ldb_msg_add_fmt(msg, attr_name, "%s", value ? "TRUE" : "FALSE");
if (lret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(lret);
goto done;
@@ -1477,6 +1465,64 @@ done:
return ret;
}
+errno_t sysdb_has_enumerated(struct sysdb_ctx *sysdb,
+ bool *has_enumerated)
+{
+ errno_t ret;
+ struct ldb_dn *dn;
+ TALLOC_CTX *tmp_ctx;
+
+
+ tmp_ctx = talloc_new(NULL);
+ if (!tmp_ctx) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
+ SYSDB_DOM_BASE,
+ sysdb->domain->name);
+ if (!dn) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ret = sysdb_get_bool(sysdb, dn, SYSDB_HAS_ENUMERATED, has_enumerated);
+
+done:
+ talloc_free(tmp_ctx);
+ return ret;
+}
+
+errno_t sysdb_set_enumerated(struct sysdb_ctx *sysdb,
+ bool enumerated)
+{
+ errno_t ret;
+ TALLOC_CTX *tmp_ctx;
+ struct ldb_dn *dn;
+
+ tmp_ctx = talloc_new(NULL);
+ if (!tmp_ctx) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
+ SYSDB_DOM_BASE,
+ sysdb->domain->name);
+ if (!dn) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ret = sysdb_set_bool(sysdb, dn, sysdb->domain->name,
+ SYSDB_HAS_ENUMERATED, enumerated);
+
+done:
+ talloc_free(tmp_ctx);
+ return ret;
+}
+
errno_t sysdb_attrs_primary_name(struct sysdb_ctx *sysdb,
struct sysdb_attrs *attrs,
const char *ldap_attr,