summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2013-01-14 12:22:22 -0500
committerJakub Hrozek <jhrozek@redhat.com>2013-02-10 22:08:46 +0100
commit65393a294e635822c1d7a15fe5853dc457ad8a2a (patch)
treebbd8f0e8be26d1839febe79650421a2daccc68e4 /src
parentaab938c5975f0e3b85c7c79a5d718e5fefed7217 (diff)
downloadsssd-65393a294e635822c1d7a15fe5853dc457ad8a2a.tar.gz
sssd-65393a294e635822c1d7a15fe5853dc457ad8a2a.tar.bz2
sssd-65393a294e635822c1d7a15fe5853dc457ad8a2a.zip
Update main domain info in place
Diffstat (limited to 'src')
-rw-r--r--src/db/sysdb.h5
-rw-r--r--src/db/sysdb_subdomains.c61
-rw-r--r--src/providers/ipa/ipa_subdomains.c9
-rw-r--r--src/responder/common/responder_get_domains.c25
4 files changed, 38 insertions, 62 deletions
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index 81048852..6753f437 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -373,10 +373,7 @@ errno_t sysdb_update_subdomains(struct sss_domain_info *domain,
int num_subdoms,
struct sysdb_subdom *subdoms);
-errno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
- struct sysdb_ctx *sysdb,
- struct sss_domain_info *domain,
- struct sysdb_subdom **info);
+errno_t sysdb_master_domain_update(struct sss_domain_info *domain);
errno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
struct sss_domain_info *domain,
diff --git a/src/db/sysdb_subdomains.c b/src/db/sysdb_subdomains.c
index eea27aad..5ee4df06 100644
--- a/src/db/sysdb_subdomains.c
+++ b/src/db/sysdb_subdomains.c
@@ -108,16 +108,12 @@ done:
return ret;
}
-errno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
- struct sysdb_ctx *sysdb,
- struct sss_domain_info *domain,
- struct sysdb_subdom **_info)
+errno_t sysdb_master_domain_update(struct sss_domain_info *domain)
{
errno_t ret;
TALLOC_CTX *tmp_ctx;
const char *tmp_str;
struct ldb_dn *basedn;
- struct sysdb_subdom *info;
struct ldb_result *res;
const char *attrs[] = {"cn",
SYSDB_SUBDOMAIN_REALM,
@@ -130,19 +126,14 @@ errno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
return ENOMEM;
}
- info = talloc_zero(tmp_ctx, struct sysdb_subdom);
- if (info == NULL) {
- ret = ENOMEM;
- goto done;
- }
-
- basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE, domain->name);
+ basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
+ SYSDB_DOM_BASE, domain->name);
if (basedn == NULL) {
ret = EIO;
goto done;
}
- ret = ldb_search(sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_BASE, attrs,
- NULL);
+ ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res,
+ basedn, LDB_SCOPE_BASE, attrs, NULL);
if (ret != LDB_SUCCESS) {
ret = EIO;
goto done;
@@ -162,9 +153,11 @@ errno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_REALM,
NULL);
- if (tmp_str != NULL) {
- info->realm = talloc_strdup(info, tmp_str);
- if (info->realm == NULL) {
+ if (tmp_str != NULL &&
+ (domain->realm == NULL || strcasecmp(tmp_str, domain->realm) != 0)) {
+ talloc_free(domain->realm);
+ domain->realm = talloc_strdup(domain, tmp_str);
+ if (domain->realm == NULL) {
ret = ENOMEM;
goto done;
}
@@ -172,9 +165,12 @@ errno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_FLAT,
NULL);
- if (tmp_str != NULL) {
- info->flat_name = talloc_strdup(info, tmp_str);
- if (info->flat_name == NULL) {
+ if (tmp_str != NULL &&
+ (domain->flat_name == NULL ||
+ strcasecmp(tmp_str, domain->flat_name) != 0)) {
+ talloc_free(domain->flat_name);
+ domain->flat_name = talloc_strdup(domain, tmp_str);
+ if (domain->flat_name == NULL) {
ret = ENOMEM;
goto done;
}
@@ -182,15 +178,17 @@ errno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_ID,
NULL);
- if (tmp_str != NULL) {
- info->id = talloc_strdup(info, tmp_str);
- if (info->id == NULL) {
+ if (tmp_str != NULL &&
+ (domain->domain_id == NULL ||
+ strcasecmp(tmp_str, domain->domain_id) != 0)) {
+ talloc_free(domain->domain_id);
+ domain->domain_id = talloc_strdup(domain, tmp_str);
+ if (domain->domain_id == NULL) {
ret = ENOMEM;
goto done;
}
}
- *_info = talloc_steal(mem_ctx, info);
done:
talloc_free(tmp_ctx);
return ret;
@@ -204,14 +202,13 @@ errno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
struct ldb_message *msg;
int ret;
bool do_update = false;
- struct sysdb_subdom *current_info;
tmp_ctx = talloc_new(NULL);
if (tmp_ctx == NULL) {
return ENOMEM;
}
- ret = sysdb_master_domain_get_info(tmp_ctx, sysdb, domain, &current_info);
+ ret = sysdb_master_domain_update(domain);
if (ret != EOK) {
goto done;
}
@@ -230,8 +227,8 @@ errno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
}
if (domain_info->realm != NULL &&
- (current_info->realm == NULL ||
- strcmp(current_info->realm, domain_info->realm) != 0) ) {
+ (domain->realm == NULL ||
+ strcmp(domain->realm, domain_info->realm) != 0) ) {
ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM,
LDB_FLAG_MOD_REPLACE, NULL);
if (ret != LDB_SUCCESS) {
@@ -250,8 +247,8 @@ errno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
}
if (domain_info->flat_name != NULL &&
- (current_info->flat_name == NULL ||
- strcmp(current_info->flat_name, domain_info->flat_name) != 0) ) {
+ (domain->flat_name == NULL ||
+ strcmp(domain->flat_name, domain_info->flat_name) != 0) ) {
ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT,
LDB_FLAG_MOD_REPLACE, NULL);
if (ret != LDB_SUCCESS) {
@@ -270,8 +267,8 @@ errno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
}
if (domain_info->id != NULL &&
- (current_info->id == NULL ||
- strcmp(current_info->id, domain_info->id) != 0) ) {
+ (domain->domain_id == NULL ||
+ strcmp(domain->domain_id, domain_info->id) != 0) ) {
ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_REPLACE,
NULL);
if (ret != LDB_SUCCESS) {
diff --git a/src/providers/ipa/ipa_subdomains.c b/src/providers/ipa/ipa_subdomains.c
index 114bd26e..385be1c3 100644
--- a/src/providers/ipa/ipa_subdomains.c
+++ b/src/providers/ipa/ipa_subdomains.c
@@ -756,7 +756,6 @@ static void ipa_subdomains_handler_ranges_done(struct tevent_req *req)
size_t reply_count;
struct sysdb_attrs **reply = NULL;
struct ipa_subdomains_req_ctx *ctx;
- struct sysdb_subdom *domain_info;
struct range_info **range_list = NULL;
struct sysdb_ctx *sysdb;
struct sss_domain_info *domain;
@@ -787,14 +786,14 @@ static void ipa_subdomains_handler_ranges_done(struct tevent_req *req)
}
- ret = sysdb_master_domain_get_info(ctx, sysdb, domain, &domain_info);
+ ret = sysdb_master_domain_update(domain);
if (ret != EOK) {
goto done;
}
- if (domain_info->flat_name == NULL ||
- domain_info->id == NULL ||
- domain_info->name == NULL) {
+ if (domain->flat_name == NULL ||
+ domain->domain_id == NULL ||
+ domain->realm == NULL) {
ctx->search_base_iter = 0;
ctx->search_bases = ctx->sd_ctx->master_search_bases;
diff --git a/src/responder/common/responder_get_domains.c b/src/responder/common/responder_get_domains.c
index 1ad9fbfa..7049d60a 100644
--- a/src/responder/common/responder_get_domains.c
+++ b/src/responder/common/responder_get_domains.c
@@ -283,7 +283,6 @@ process_subdomains(struct sss_domain_info *domain)
size_t c;
size_t subdomain_count;
struct sss_domain_info **subdomains;
- struct sysdb_subdom *master_info;
/* Retrieve all subdomains of this domain from sysdb
* and create their struct sss_domain_info representations
@@ -308,31 +307,15 @@ process_subdomains(struct sss_domain_info *domain)
subdomains[c]->next = subdomains[c + 1];
}
- if (domain->flat_name == NULL || domain->domain_id == NULL) {
- ret = sysdb_master_domain_get_info(domain, domain->sysdb,
- domain, &master_info);
+ if (domain->realm == NULL ||
+ domain->flat_name == NULL ||
+ domain->domain_id == NULL) {
+ ret = sysdb_master_domain_update(domain);
if (ret != EOK) {
DEBUG(SSSDBG_FUNC_DATA, ("sysdb_master_domain_get_info " \
"failed.\n"));
goto done;
}
-
- if (domain->flat_name == NULL) {
- domain->flat_name = talloc_strdup(domain, master_info->flat_name);
- if (domain->flat_name == NULL) {
- DEBUG(SSSDBG_MINOR_FAILURE, ("talloc_strdup failed, ignoring"));
- }
- }
-
- if (domain->domain_id == NULL) {
- domain->domain_id = talloc_strdup(domain, master_info->id);
- if (domain->domain_id == NULL) {
- DEBUG(SSSDBG_MINOR_FAILURE, ("talloc_strdup failed, ignoring"));
- }
- }
- talloc_free(master_info);
- DEBUG(SSSDBG_TRACE_LIBS, ("Adding flat name [%s] to domain [%s].\n",
- domain->flat_name, domain->name));
}
errno = 0;