summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/db/sysdb.h5
-rw-r--r--src/db/sysdb_subdomains.c135
2 files changed, 103 insertions, 37 deletions
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index c6a70483..98cf6bcd 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -369,10 +369,15 @@ errno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx,
errno_t sysdb_domain_create(struct sysdb_ctx *sysdb, const char *domain_name);
+errno_t sysdb_subdomain_store(struct sysdb_ctx *sysdb,
+ const char *name, const char *realm,
+ const char *flat_name, const char *domain_id);
+
errno_t sysdb_update_subdomains(struct sss_domain_info *domain,
int num_subdoms,
struct sysdb_subdom *subdoms);
+
errno_t sysdb_master_domain_update(struct sss_domain_info *domain);
errno_t sysdb_master_domain_add_info(struct sss_domain_info *domain,
diff --git a/src/db/sysdb_subdomains.c b/src/db/sysdb_subdomains.c
index 2b1de126..d6692b6d 100644
--- a/src/db/sysdb_subdomains.c
+++ b/src/db/sysdb_subdomains.c
@@ -302,11 +302,24 @@ done:
return ret;
}
-static errno_t sysdb_add_subdomain_attributes(struct sysdb_ctx *sysdb,
- struct sysdb_subdom *domain_info)
+errno_t sysdb_subdomain_store(struct sysdb_ctx *sysdb,
+ const char *name, const char *realm,
+ const char *flat_name, const char *domain_id)
{
TALLOC_CTX *tmp_ctx;
struct ldb_message *msg;
+ struct ldb_dn *dn;
+ struct ldb_result *res;
+ const char *attrs[] = {"cn",
+ SYSDB_SUBDOMAIN_REALM,
+ SYSDB_SUBDOMAIN_FLAT,
+ SYSDB_SUBDOMAIN_ID,
+ NULL};
+ const char *tmp_str;
+ bool store = false;
+ int realm_flags = 0;
+ int flat_flags = 0;
+ int id_flags = 0;
int ret;
tmp_ctx = talloc_new(NULL);
@@ -314,72 +327,117 @@ static errno_t sysdb_add_subdomain_attributes(struct sysdb_ctx *sysdb,
return ENOMEM;
}
- msg = ldb_msg_new(tmp_ctx);
- if (msg == NULL) {
- ret = ENOMEM;
+ dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE, name);
+ if (dn == NULL) {
+ ret = EIO;
+ goto done;
+ }
+ ret = ldb_search(sysdb->ldb, tmp_ctx, &res,
+ dn, LDB_SCOPE_BASE, attrs, NULL);
+ if (ret != LDB_SUCCESS) {
+ ret = EIO;
goto done;
}
- msg->dn = ldb_dn_new_fmt(msg, sysdb->ldb, SYSDB_DOM_BASE,
- domain_info->name);
- if (msg->dn == NULL) {
- ret = ENOMEM;
+ if (res->count == 0) {
+ ret = sysdb_domain_create(sysdb, name);
+ if (ret) {
+ goto done;
+ }
+ store = true;
+ if (realm) realm_flags = LDB_FLAG_MOD_ADD;
+ if (flat_name) flat_flags = LDB_FLAG_MOD_ADD;
+ if (domain_id) id_flags = LDB_FLAG_MOD_ADD;
+ } else if (res->count != 1) {
+ ret = EINVAL;
goto done;
+ } else { /* 1 found */
+ if (realm) {
+ tmp_str = ldb_msg_find_attr_as_string(res->msgs[0],
+ SYSDB_SUBDOMAIN_REALM, NULL);
+ if (!tmp_str || strcasecmp(tmp_str, realm) != 0) {
+ realm_flags = LDB_FLAG_MOD_REPLACE;
+ }
+ }
+ if (flat_name) {
+ tmp_str = ldb_msg_find_attr_as_string(res->msgs[0],
+ SYSDB_SUBDOMAIN_FLAT, NULL);
+ if (!tmp_str || strcasecmp(tmp_str, flat_name) != 0) {
+ flat_flags = LDB_FLAG_MOD_REPLACE;
+ }
+ }
+ if (domain_id) {
+ tmp_str = ldb_msg_find_attr_as_string(res->msgs[0],
+ SYSDB_SUBDOMAIN_ID, NULL);
+ if (!tmp_str || strcasecmp(tmp_str, domain_id) != 0) {
+ id_flags = LDB_FLAG_MOD_REPLACE;
+ }
+ }
}
- ret = ldb_msg_add_empty(msg, SYSDB_OBJECTCLASS, LDB_FLAG_MOD_ADD, NULL);
- if (ret != LDB_SUCCESS) {
- ret = sysdb_error_to_errno(ret);
+ if (!store && realm_flags == 0 && flat_flags == 0 && id_flags == 0) {
+ ret = EOK;
goto done;
}
- ret = ldb_msg_add_string(msg, SYSDB_OBJECTCLASS, SYSDB_SUBDOMAIN_CLASS);
- if (ret != LDB_SUCCESS) {
- ret = sysdb_error_to_errno(ret);
+ msg = ldb_msg_new(tmp_ctx);
+ if (msg == NULL) {
+ ret = ENOMEM;
goto done;
}
+ msg->dn = dn;
+
+ if (store) {
+ ret = ldb_msg_add_empty(msg, SYSDB_OBJECTCLASS, LDB_FLAG_MOD_ADD, NULL);
+ if (ret != LDB_SUCCESS) {
+ ret = sysdb_error_to_errno(ret);
+ goto done;
+ }
+
+
+ ret = ldb_msg_add_string(msg, SYSDB_OBJECTCLASS, SYSDB_SUBDOMAIN_CLASS);
+ if (ret != LDB_SUCCESS) {
+ ret = sysdb_error_to_errno(ret);
+ goto done;
+ }
+ }
- if (domain_info->realm != NULL) {
- ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM, LDB_FLAG_MOD_ADD,
- NULL);
+ if (realm_flags) {
+ ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM, realm_flags, NULL);
if (ret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(ret);
goto done;
}
- ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM,
- domain_info->realm);
+ ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM, realm);
if (ret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(ret);
goto done;
}
}
- if (domain_info->flat_name != NULL) {
- ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT, LDB_FLAG_MOD_ADD,
- NULL);
+ if (flat_flags) {
+ ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT, flat_flags, NULL);
if (ret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(ret);
goto done;
}
- ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT,
- domain_info->flat_name);
+ ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT, flat_name);
if (ret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(ret);
goto done;
}
}
- if (domain_info->id != NULL) {
- ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_ADD,
- NULL);
+ if (id_flags) {
+ ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, id_flags, NULL);
if (ret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(ret);
goto done;
}
- ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_info->id);
+ ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_id);
if (ret != LDB_SUCCESS) {
ret = sysdb_error_to_errno(ret);
goto done;
@@ -389,8 +447,7 @@ static errno_t sysdb_add_subdomain_attributes(struct sysdb_ctx *sysdb,
ret = ldb_modify(sysdb->ldb, msg);
if (ret != LDB_SUCCESS) {
DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
- "[%s]: [%d][%s]!\n",
- domain_info->name, ret,
+ "[%s]: [%d][%s]!\n", name, ret,
ldb_errstring(sysdb->ldb)));
ret = sysdb_error_to_errno(ret);
goto done;
@@ -462,18 +519,22 @@ errno_t sysdb_update_subdomains(struct sss_domain_info *domain,
}
if (d == cur_subdomains_count) {
+ struct sss_domain_info *ns;
+
DEBUG(SSSDBG_TRACE_FUNC, ("Adding sub-domain [%s].\n",
subdoms[c].name));
- ret = sysdb_domain_create(domain->sysdb, subdoms[c].name);
- if (ret != EOK) {
- DEBUG(SSSDBG_OP_FAILURE, ("sysdb_domain_create failed.\n"));
+
+ ns = new_subdomain(tmp_ctx, domain,
+ subdoms[c].name, subdoms[c].realm,
+ subdoms[c].flat_name, subdoms[c].id);
+ if (!ns) {
+ DEBUG(SSSDBG_OP_FAILURE, ("new_subdomain failed.\n"));
goto done;
}
- ret = sysdb_add_subdomain_attributes(domain->sysdb, &subdoms[c]);
+ ret = sysdb_subdomain_create(ns);
if (ret != EOK) {
- DEBUG(SSSDBG_OP_FAILURE,
- ("sysdb_add_subdomain_attributes failed.\n"));
+ DEBUG(SSSDBG_OP_FAILURE, ("sysdb_subdomain_create failed.\n"));
goto done;
}
}