summaryrefslogtreecommitdiffstats
path: root/src/db
diff options
context:
space:
mode:
authorSumit Bose <sbose@redhat.com>2017-03-12 18:31:03 +0100
committerJakub Hrozek <jhrozek@redhat.com>2017-03-23 17:18:57 +0100
commit70c0648f021ded3d31313eb962e1ad140f242673 (patch)
tree387fd14af633f6cc6a8232178e40e031a1f93cb6 /src/db
parent3994e8779d16db3e9fb30f03e5ecf5e811095ac2 (diff)
downloadsssd-70c0648f021ded3d31313eb962e1ad140f242673.tar.gz
sssd-70c0648f021ded3d31313eb962e1ad140f242673.tar.xz
sssd-70c0648f021ded3d31313eb962e1ad140f242673.zip
sdap_get_users_send(): new argument mapped_attrs
mapped_attrs can be a list of sysdb_attrs which are not available on the server side but should be store with the cached user entry. This is needed e.g. when the input to look up the user in LDAP is not an attribute which is stored in LDAP but some data where LDAP attributes are extracted from. The current use case is the certificate mapping library which can create LDAP search filters based on content of the certificate. To allow upcoming cache lookup to use the input directly it is stored in the user object in the cache. Related to https://pagure.io/SSSD/sssd/issue/3050 Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
Diffstat (limited to 'src/db')
-rw-r--r--src/db/sysdb.h3
-rw-r--r--src/db/sysdb_ops.c61
2 files changed, 64 insertions, 0 deletions
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index c677957bb..098f47f91 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -1246,6 +1246,9 @@ errno_t sysdb_search_user_by_cert(TALLOC_CTX *mem_ctx,
errno_t sysdb_remove_cert(struct sss_domain_info *domain,
const char *cert);
+errno_t sysdb_remove_mapped_data(struct sss_domain_info *domain,
+ struct sysdb_attrs *mapped_attr);
+
/* === Functions related to GPOs === */
#define SYSDB_GPO_CONTAINER "cn=gpos,cn=ad,cn=custom"
diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
index 242d3ce3b..6c2254df2 100644
--- a/src/db/sysdb_ops.c
+++ b/src/db/sysdb_ops.c
@@ -4685,6 +4685,67 @@ errno_t sysdb_search_user_by_cert(TALLOC_CTX *mem_ctx,
return sysdb_search_object_by_cert(mem_ctx, domain, cert, user_attrs, res);
}
+errno_t sysdb_remove_mapped_data(struct sss_domain_info *domain,
+ struct sysdb_attrs *mapped_attr)
+{
+ int ret;
+ char *val;
+ char *filter;
+ const char *attrs[] = {SYSDB_NAME, NULL};
+ struct ldb_result *res = NULL;
+ size_t c;
+ bool all_ok = true;
+
+ if (mapped_attr->num != 1 || mapped_attr->a[0].num_values != 1) {
+ DEBUG(SSSDBG_OP_FAILURE, "Unsupported number of attributes.\n");
+ return EINVAL;
+ }
+
+ ret = bin_to_ldap_filter_value(NULL, mapped_attr->a[0].values[0].data,
+ mapped_attr->a[0].values[0].length, &val);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_OP_FAILURE, "bin_to_ldap_filter_value failed.\n");
+ return ret;
+ }
+
+ filter = talloc_asprintf(NULL, "(&("SYSDB_UC")(%s=%s))",
+ mapped_attr->a[0].name, val);
+ talloc_free(val);
+ if (filter == NULL) {
+ DEBUG(SSSDBG_OP_FAILURE, "talloc_asprintf failed.\n");
+ return ENOMEM;
+ }
+
+ ret = sysdb_search_object_attr(NULL, domain, filter, attrs, false, &res);
+ talloc_free(filter);
+ if (ret == ENOENT || res == NULL) {
+ DEBUG(SSSDBG_TRACE_ALL, "Mapped data not found.\n");
+ talloc_free(res);
+ return EOK;
+ } else if (ret != EOK) {
+ talloc_free(res);
+ DEBUG(SSSDBG_OP_FAILURE, "sysdb_search_object_attr failed.\n");
+ return ret;
+ }
+
+ for (c = 0; c < res->count; c++) {
+ DEBUG(SSSDBG_TRACE_ALL, "Removing mapped data from [%s].\n",
+ ldb_dn_get_linearized(res->msgs[c]->dn));
+ /* The timestamp cache is skipped on purpose here. */
+ ret = sysdb_set_cache_entry_attr(domain->sysdb->ldb, res->msgs[c]->dn,
+ mapped_attr, SYSDB_MOD_DEL);
+ if (ret != EOK) {
+ all_ok = false;
+ DEBUG(SSSDBG_OP_FAILURE,
+ "Failed to remove mapped data from [%s], skipping.\n",
+ ldb_dn_get_linearized(res->msgs[c]->dn));
+ }
+ }
+ talloc_free(res);
+
+ return (all_ok ? EOK : EIO);
+}
+
errno_t sysdb_remove_cert(struct sss_domain_info *domain,
const char *cert)
{