diff options
Diffstat (limited to 'src/db')
-rw-r--r-- | src/db/sysdb.h | 24 | ||||
-rw-r--r-- | src/db/sysdb_search.c | 132 |
2 files changed, 137 insertions, 19 deletions
diff --git a/src/db/sysdb.h b/src/db/sysdb.h index 48dd26dd2..0f745ccb1 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -601,10 +601,22 @@ int sysdb_enumpwent(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, struct ldb_result **res); +int sysdb_enumpwent_filter(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *name_filter, + const char *addtl_filter, + struct ldb_result **res); + int sysdb_enumpwent_with_views(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, struct ldb_result **res); +int sysdb_enumpwent_filter_with_views(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *name_filter, + const char *addtl_filter, + struct ldb_result **res); + int sysdb_getgrnam(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, const char *name, @@ -619,10 +631,22 @@ int sysdb_enumgrent(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, struct ldb_result **res); +int sysdb_enumgrent_filter(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *name_filter, + const char *addtl_filter, + struct ldb_result **res); + int sysdb_enumgrent_with_views(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, struct ldb_result **res); +int sysdb_enumgrent_filter_with_views(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *name_filter, + const char *addtl_filter, + struct ldb_result **res); + struct sysdb_netgroup_ctx { enum {SYSDB_NETGROUP_TRIPLE_VAL, SYSDB_NETGROUP_GROUP_VAL} type; union { diff --git a/src/db/sysdb_search.c b/src/db/sysdb_search.c index a8dcc9f8d..4f617b841 100644 --- a/src/db/sysdb_search.c +++ b/src/db/sysdb_search.c @@ -255,12 +255,55 @@ done: return ret; } -int sysdb_enumpwent(TALLOC_CTX *mem_ctx, - struct sss_domain_info *domain, - struct ldb_result **_res) +static char *enum_filter(TALLOC_CTX *mem_ctx, + const char *base_filter, + const char *name_filter, + const char *addtl_filter) +{ + char *filter; + TALLOC_CTX *tmp_ctx = NULL; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return NULL; + } + + if (name_filter == NULL && addtl_filter == NULL) { + filter = talloc_strdup(tmp_ctx, base_filter); + } else { + filter = talloc_asprintf(tmp_ctx, "(&%s", base_filter); + + if (filter != NULL && name_filter != NULL) { + filter = talloc_asprintf_append(filter, "(%s=%s)", + SYSDB_NAME, name_filter); + } + + if (filter != NULL && addtl_filter != NULL) { + filter = talloc_asprintf_append(filter, "%s", addtl_filter); + } + + if (filter != NULL) { + filter = talloc_asprintf_append(filter, ")"); + } + } + + if (filter) { + talloc_steal(mem_ctx, filter); + } + + talloc_free(tmp_ctx); + return filter; +} + +int sysdb_enumpwent_filter(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *name_filter, + const char *addtl_filter, + struct ldb_result **_res) { TALLOC_CTX *tmp_ctx; static const char *attrs[] = SYSDB_PW_ATTRS; + char *filter = NULL; struct ldb_dn *base_dn; struct ldb_result *res; int ret; @@ -276,8 +319,16 @@ int sysdb_enumpwent(TALLOC_CTX *mem_ctx, goto done; } + filter = enum_filter(tmp_ctx, SYSDB_PWENT_FILTER, + name_filter, addtl_filter); + if (filter == NULL) { + ret = ENOMEM; + goto done; + } + DEBUG(SSSDBG_TRACE_LIBS, "Searching cache with [%s]\n", filter); + ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res, base_dn, - LDB_SCOPE_SUBTREE, attrs, SYSDB_PWENT_FILTER); + LDB_SCOPE_SUBTREE, attrs, "%s", filter); if (ret) { ret = sysdb_error_to_errno(ret); goto done; @@ -290,9 +341,18 @@ done: return ret; } -int sysdb_enumpwent_with_views(TALLOC_CTX *mem_ctx, - struct sss_domain_info *domain, - struct ldb_result **_res) +int sysdb_enumpwent(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + struct ldb_result **_res) +{ + return sysdb_enumpwent_filter(mem_ctx, domain, NULL, 0, _res); +} + +int sysdb_enumpwent_filter_with_views(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *name_filter, + const char *addtl_filter, + struct ldb_result **_res) { TALLOC_CTX *tmp_ctx; struct ldb_result *res; @@ -305,7 +365,7 @@ int sysdb_enumpwent_with_views(TALLOC_CTX *mem_ctx, return ENOMEM; } - ret = sysdb_enumpwent(tmp_ctx, domain, &res); + ret = sysdb_enumpwent_filter(tmp_ctx, domain, name_filter, addtl_filter, &res); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "sysdb_enumpwent failed.\n"); goto done; @@ -331,6 +391,13 @@ done: return ret; } +int sysdb_enumpwent_with_views(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + struct ldb_result **_res) +{ + return sysdb_enumpwent_filter_with_views(mem_ctx, domain, NULL, NULL, _res); +} + /* groups */ static int mpg_convert(struct ldb_message *msg) @@ -662,13 +729,16 @@ done: return ret; } -int sysdb_enumgrent(TALLOC_CTX *mem_ctx, - struct sss_domain_info *domain, - struct ldb_result **_res) +int sysdb_enumgrent_filter(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *name_filter, + const char *addtl_filter, + struct ldb_result **_res) { TALLOC_CTX *tmp_ctx; static const char *attrs[] = SYSDB_GRSRC_ATTRS; - const char *fmt_filter; + const char *filter = NULL; + const char *base_filter; struct ldb_dn *base_dn; struct ldb_result *res; int ret; @@ -679,11 +749,11 @@ int sysdb_enumgrent(TALLOC_CTX *mem_ctx, } if (domain->mpg) { - fmt_filter = SYSDB_GRENT_MPG_FILTER; + base_filter = SYSDB_GRENT_MPG_FILTER; base_dn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb, SYSDB_DOM_BASE, domain->name); } else { - fmt_filter = SYSDB_GRENT_FILTER; + base_filter = SYSDB_GRENT_FILTER; base_dn = sysdb_group_base_dn(tmp_ctx, domain); } if (!base_dn) { @@ -691,8 +761,16 @@ int sysdb_enumgrent(TALLOC_CTX *mem_ctx, goto done; } + filter = enum_filter(tmp_ctx, base_filter, + name_filter, addtl_filter); + if (filter == NULL) { + ret = ENOMEM; + goto done; + } + DEBUG(SSSDBG_TRACE_LIBS, "Searching cache with [%s]\n", filter); + ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res, base_dn, - LDB_SCOPE_SUBTREE, attrs, "%s", fmt_filter); + LDB_SCOPE_SUBTREE, attrs, "%s", filter); if (ret) { ret = sysdb_error_to_errno(ret); goto done; @@ -710,9 +788,18 @@ done: return ret; } -int sysdb_enumgrent_with_views(TALLOC_CTX *mem_ctx, - struct sss_domain_info *domain, - struct ldb_result **_res) +int sysdb_enumgrent(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + struct ldb_result **_res) +{ + return sysdb_enumgrent_filter(mem_ctx, domain, NULL, 0, _res); +} + +int sysdb_enumgrent_filter_with_views(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + const char *name_filter, + const char *addtl_filter, + struct ldb_result **_res) { TALLOC_CTX *tmp_ctx; struct ldb_result *res; @@ -725,7 +812,7 @@ int sysdb_enumgrent_with_views(TALLOC_CTX *mem_ctx, return ENOMEM; } - ret = sysdb_enumgrent(tmp_ctx, domain,&res); + ret = sysdb_enumgrent_filter(tmp_ctx, domain, name_filter, addtl_filter, &res); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "sysdb_enumgrent failed.\n"); goto done; @@ -759,6 +846,13 @@ done: return ret; } +int sysdb_enumgrent_with_views(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + struct ldb_result **_res) +{ + return sysdb_enumgrent_filter_with_views(mem_ctx, domain, NULL, NULL, _res); +} + int sysdb_initgroups(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, const char *name, |