From 57e33404e0f98d9358e8c31eb2c2f764ee380b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Tue, 13 Aug 2019 12:59:49 +0200 Subject: [PATCH 69/90] sysdb: add sysdb_get_autofsentry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves: https://pagure.io/SSSD/sssd/issue/2607 Reviewed-by: Tomáš Halman --- src/db/sysdb_autofs.c | 73 +++++++++++++++++++++++++++++++++++++++++++ src/db/sysdb_autofs.h | 8 +++++ 2 files changed, 81 insertions(+) diff --git a/src/db/sysdb_autofs.c b/src/db/sysdb_autofs.c index c92a51658..f5186451e 100644 --- a/src/db/sysdb_autofs.c +++ b/src/db/sysdb_autofs.c @@ -341,6 +341,79 @@ done: return ret; } +errno_t +sysdb_get_autofsentry(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *map_name, + const char *entry_name, + struct ldb_message **_entry) +{ + TALLOC_CTX *tmp_ctx; + char *safe_entryname; + char *filter; + struct ldb_dn *mapdn; + size_t count; + struct ldb_message **msgs; + errno_t ret; + const char *attrs[] = { SYSDB_AUTOFS_ENTRY_KEY, + SYSDB_AUTOFS_ENTRY_VALUE, + SYSDB_CACHE_EXPIRE, + NULL }; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory!\n"); + return ENOMEM; + } + + ret = sss_filter_sanitize(tmp_ctx, entry_name, &safe_entryname); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, + "Cannot sanitize map [%s] error [%d]: %s\n", + map_name, ret, strerror(ret)); + goto done; + } + + filter = talloc_asprintf(tmp_ctx, "(&(objectclass=%s)(%s=%s))", + SYSDB_AUTOFS_ENTRY_OC, SYSDB_AUTOFS_ENTRY_KEY, + safe_entryname); + if (filter == NULL) { + ret = ENOMEM; + goto done; + } + + mapdn = sysdb_autofsmap_dn(tmp_ctx, domain, map_name); + if (!mapdn) { + ret = ENOMEM; + goto done; + } + + ret = sysdb_search_entry(tmp_ctx, domain->sysdb, mapdn, LDB_SCOPE_SUBTREE, + filter, attrs, &count, &msgs); + if (ret == ENOENT) { + goto done; + } else if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, "sysdb search failed: %d\n", ret); + goto done; + } + + if (count != 1) { + DEBUG(SSSDBG_CRIT_FAILURE, "More than one entry %s:%s found\n", + map_name, entry_name); + ret = ERR_INTERNAL; + goto done; + } + + *_entry = talloc_steal(mem_ctx, msgs[0]); + + ret = EOK; + +done: + talloc_free(tmp_ctx); + + return ret; +} + errno_t sysdb_del_autofsentry(struct sss_domain_info *domain, const char *entry_dn) diff --git a/src/db/sysdb_autofs.h b/src/db/sysdb_autofs.h index a3aba726c..0cbe6ddbf 100644 --- a/src/db/sysdb_autofs.h +++ b/src/db/sysdb_autofs.h @@ -61,6 +61,14 @@ sysdb_save_autofsentry(struct sss_domain_info *domain, struct sysdb_attrs *attrs, int cache_timeout, time_t now); + +errno_t +sysdb_get_autofsentry(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *map_name, + const char *entry_name, + struct ldb_message **_entry); + errno_t sysdb_del_autofsentry(struct sss_domain_info *domain, const char *entry_dn); -- 2.20.1