summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2013-09-06 10:43:35 +0200
committerJakub Hrozek <jhrozek@redhat.com>2013-09-26 21:15:10 +0200
commit27a2608433dbb808a4dc2ec0d169625c2c5f3eb5 (patch)
tree4272e3a8f0593ed038c078181d10c372cbab8f78
parent15ef8f1a2f13cda195ed3c05ca7c9d815a040bb3 (diff)
downloadsssd-27a2608433dbb808a4dc2ec0d169625c2c5f3eb5.tar.gz
sssd-27a2608433dbb808a4dc2ec0d169625c2c5f3eb5.tar.xz
sssd-27a2608433dbb808a4dc2ec0d169625c2c5f3eb5.zip
ad: store group in correct tree on initgroups via tokenGroups
If tokenGroups contains group from different domain than user's, we stored it under the user's domain tree in sysdb. This patch changes it so we store it under group's domain tree. Resolves: https://fedorahosted.org/sssd/ticket/2066
-rw-r--r--src/providers/ldap/sdap_async_initgroups_ad.c52
1 files changed, 41 insertions, 11 deletions
diff --git a/src/providers/ldap/sdap_async_initgroups_ad.c b/src/providers/ldap/sdap_async_initgroups_ad.c
index f6d236dea..a0841a799 100644
--- a/src/providers/ldap/sdap_async_initgroups_ad.c
+++ b/src/providers/ldap/sdap_async_initgroups_ad.c
@@ -364,9 +364,12 @@ sdap_get_ad_tokengroups_initgroups_lookup_done(struct tevent_req *subreq)
char *sid_str;
gid_t gid;
time_t now;
+ struct sss_domain_info *group_domain;
struct sysdb_attrs **users;
struct ldb_message_element *el;
struct ldb_message *msg;
+ struct ldb_dn *group_ldb_dn;
+ const char *group_str_dn;
char **ldap_grouplist;
char **sysdb_grouplist;
char **add_groups;
@@ -471,12 +474,20 @@ sdap_get_ad_tokengroups_initgroups_lookup_done(struct tevent_req *subreq)
continue;
}
+ group_domain = find_subdomain_by_sid(get_domains_head(state->domain),
+ sid_str);
+ if (group_domain == NULL) {
+ DEBUG(SSSDBG_MINOR_FAILURE, ("Domain not found for SID %s\n",
+ sid_str));
+ continue;
+ }
+
DEBUG(SSSDBG_TRACE_LIBS,
("Processing membership GID [%"SPRIgid"]\n", gid));
/* Check whether this GID already exists in the sysdb */
- ret = sysdb_search_group_by_gid(tmp_ctx, state->sysdb, state->domain,
- gid, attrs, &msg);
+ ret = sysdb_search_group_by_gid(tmp_ctx, group_domain->sysdb,
+ group_domain, gid, attrs, &msg);
if (ret == EOK) {
group_name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
if (!group_name) {
@@ -491,9 +502,10 @@ sdap_get_ad_tokengroups_initgroups_lookup_done(struct tevent_req *subreq)
* the group or its GID occurs, it will replace this
* temporary entry.
*/
+
group_name = sid_str;
- ret = sysdb_add_incomplete_group(state->sysdb,
- state->domain,
+ ret = sysdb_add_incomplete_group(group_domain->sysdb,
+ group_domain,
group_name, gid,
NULL, sid_str, false, now);
if (ret != EOK) {
@@ -510,13 +522,31 @@ sdap_get_ad_tokengroups_initgroups_lookup_done(struct tevent_req *subreq)
goto done;
}
+ group_ldb_dn = sysdb_group_dn(group_domain->sysdb, tmp_ctx,
+ group_domain, group_name);
+ if (group_ldb_dn == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("sysdb_group_dn() failed\n"));
+ ret = ENOMEM;
+ goto done;
+ }
+
+ group_str_dn = ldb_dn_get_linearized(group_ldb_dn);
+ if (group_str_dn == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("ldb_dn_get_linearized() failed\n"));
+ ret = EINVAL;
+ goto done;
+ }
+
ldap_grouplist[group_count] =
- talloc_strdup(ldap_grouplist, group_name);
+ talloc_strdup(ldap_grouplist, group_str_dn);
if (!ldap_grouplist[group_count]) {
ret = ENOMEM;
goto done;
}
+ talloc_zfree(group_ldb_dn); /* also frees group_str_dn */
+ group_str_dn = NULL;
+
group_count++;
}
ldap_grouplist[group_count] = NULL;
@@ -524,8 +554,8 @@ sdap_get_ad_tokengroups_initgroups_lookup_done(struct tevent_req *subreq)
/* Get the current sysdb group list for this user
* so we can update it.
*/
- ret = get_sysdb_grouplist(state, state->sysdb, state->domain,
- state->username, &sysdb_grouplist);
+ ret = get_sysdb_grouplist_dn(state, state->sysdb, state->domain,
+ state->username, &sysdb_grouplist);
if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
("Could not get the list of groups for [%s] in the sysdb: "
@@ -543,10 +573,10 @@ sdap_get_ad_tokengroups_initgroups_lookup_done(struct tevent_req *subreq)
DEBUG(SSSDBG_TRACE_LIBS,
("Updating memberships for [%s]\n", state->username));
- ret = sysdb_update_members(state->sysdb, state->domain,
- state->username, SYSDB_MEMBER_USER,
- (const char *const *) add_groups,
- (const char *const *) del_groups);
+ ret = sysdb_update_members_dn(state->sysdb, state->domain,
+ state->username, SYSDB_MEMBER_USER,
+ (const char *const *) add_groups,
+ (const char *const *) del_groups);
if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
("Membership update failed [%d]: %s\n",