summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2009-11-04 15:38:04 -0500
committerSimo Sorce <ssorce@redhat.com>2009-11-06 17:26:09 -0500
commit213b08986ee7ad623320761c51f9791b95d68679 (patch)
treeb412a555fb8a6a43ec0935ec05b15d0a23682dd0
parenta281b662f3634d15928d2757f6ea03c963ffbe32 (diff)
downloadsssd-213b08986ee7ad623320761c51f9791b95d68679.tar.gz
sssd-213b08986ee7ad623320761c51f9791b95d68679.tar.bz2
sssd-213b08986ee7ad623320761c51f9791b95d68679.zip
Store the original memberof attributes if any
Also change the interface of sdap_save_user_send() so that it can be more easily reused like it was done for sdap_save_group_send().
-rw-r--r--server/providers/ldap/sdap_async.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/server/providers/ldap/sdap_async.c b/server/providers/ldap/sdap_async.c
index bce25419..6aaad9f9 100644
--- a/server/providers/ldap/sdap_async.c
+++ b/server/providers/ldap/sdap_async.c
@@ -1305,7 +1305,6 @@ struct sdap_save_user_state {
static void sdap_save_user_done(struct tevent_req *subreq);
- /* FIXME: support non legacy */
/* FIXME: support storing additional attributes */
static struct tevent_req *sdap_save_user_send(TALLOC_CTX *memctx,
@@ -1314,7 +1313,7 @@ static struct tevent_req *sdap_save_user_send(TALLOC_CTX *memctx,
struct sdap_options *opts,
struct sss_domain_info *dom,
struct sdap_handle *sh,
- struct sdap_msg *entry)
+ struct sysdb_attrs *attrs)
{
struct tevent_req *req, *subreq;
struct sdap_save_user_state *state;
@@ -1340,12 +1339,9 @@ static struct tevent_req *sdap_save_user_send(TALLOC_CTX *memctx,
state->sh = sh;
state->dom = dom;
state->opts = opts;
+ state->attrs = attrs;
state->timestamp = NULL;
- ret = sdap_parse_user(state, state->opts, state->sh,
- entry, &state->attrs, NULL);
- if (ret) goto fail;
-
ret = sysdb_attrs_get_el(state->attrs,
opts->user_map[SDAP_AT_USER_NAME].sys_name, &el);
if (ret) goto fail;
@@ -1435,6 +1431,25 @@ static struct tevent_req *sdap_save_user_send(TALLOC_CTX *memctx,
}
}
+ ret = sysdb_attrs_get_el(state->attrs, SYSDB_MEMBEROF, &el);
+ if (ret) {
+ goto fail;
+ }
+ if (el->num_values == 0) {
+ DEBUG(7, ("Original memberOf is not available for [%s].\n",
+ state->name));
+ } else {
+ DEBUG(7, ("Adding original memberOf attributes to [%s].\n",
+ state->name));
+ for (i = 0; i < el->num_values; i++) {
+ ret = sysdb_attrs_add_string(user_attrs, SYSDB_ORIG_MEMBEROF,
+ (const char *) el->values[i].data);
+ if (ret) {
+ goto fail;
+ }
+ }
+ }
+
ret = sysdb_attrs_get_el(state->attrs,
opts->user_map[SDAP_AT_USER_MODSTAMP].sys_name, &el);
if (ret) {
@@ -2295,6 +2310,7 @@ static void sdap_get_users_done(struct sdap_op *op,
struct sdap_get_users_state *state = tevent_req_data(req,
struct sdap_get_users_state);
struct tevent_req *subreq;
+ struct sysdb_attrs *usr_attrs;
char *errmsg;
int result;
int ret;
@@ -2315,9 +2331,16 @@ static void sdap_get_users_done(struct sdap_op *op,
case LDAP_RES_SEARCH_ENTRY:
+ ret = sdap_parse_user(state, state->opts, state->sh,
+ reply, &usr_attrs, NULL);
+ if (ret != EOK) {
+ tevent_req_error(req, ret);
+ return;
+ }
+
subreq = sdap_save_user_send(state, state->ev, state->handle,
state->opts, state->dom,
- state->sh, reply);
+ state->sh, usr_attrs);
if (!subreq) {
tevent_req_error(req, ENOMEM);
return;