[SSSD] [PATCH] sysdb: sysdb_search_group_by_name should work like sysdb_search_user_by_name
Sumit Bose
sbose at redhat.com
Tue Sep 16 15:58:36 UTC 2014
Hi,
I came across this when trying to resolve the SID of a group with the
group's name.
bye,
Sumit
-------------- next part --------------
From c26f19e3d3cca24e45ed36e395693862f5e1664f Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose at redhat.com>
Date: Fri, 12 Sep 2014 17:40:11 +0200
Subject: [PATCH] sysdb: sysdb_search_group_by_name should work like
sysdb_search_user_by_name
Currently sysdb_search_group_by_name uses an optimization which might
fail in case-insensitive environments. The DN of the group object is
generated with the help of the given name. Since the DN is
case-sensitive a group lookup will fail if different cases are used.
sysdb_search_user_by_name already handles case-insensitive searches well
and sysdb_search_group_by_name should use the same scheme.
---
src/db/sysdb_ops.c | 85 +++++++++++++++++++++++++++---------------------------
1 file changed, 42 insertions(+), 43 deletions(-)
diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
index 8a7feae..1777174 100644
--- a/src/db/sysdb_ops.c
+++ b/src/db/sysdb_ops.c
@@ -310,14 +310,23 @@ done:
/* =Search-User-by-[UID/SID/NAME]============================================= */
-int sysdb_search_user_by_name(TALLOC_CTX *mem_ctx,
- struct sss_domain_info *domain,
- const char *name,
- const char **attrs,
- struct ldb_message **msg)
+enum sysdb_obj_type {
+ SYSDB_UNKNOWN = 0,
+ SYSDB_USER,
+ SYSDB_GROUP
+};
+
+static int sysdb_search_by_name(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ const char *name,
+ enum sysdb_obj_type type,
+ const char **attrs,
+ struct ldb_message **msg)
{
TALLOC_CTX *tmp_ctx;
- const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, NULL };
+ const char *def_attrs[] = { SYSDB_NAME, NULL, NULL };
+ const char *base_tmpl = NULL;
+ const char *filter_tmpl = NULL;
struct ldb_message **msgs = NULL;
struct ldb_dn *basedn;
size_t msgs_count = 0;
@@ -326,13 +335,28 @@ int sysdb_search_user_by_name(TALLOC_CTX *mem_ctx,
char *filter;
int ret;
+ switch (type) {
+ case SYSDB_USER:
+ def_attrs[1] = SYSDB_UIDNUM;
+ base_tmpl = SYSDB_TMPL_USER_BASE;
+ filter_tmpl = SYSDB_PWNAM_FILTER;
+ break;
+ case SYSDB_GROUP:
+ def_attrs[1] = SYSDB_GIDNUM;
+ base_tmpl = SYSDB_TMPL_GROUP_BASE;
+ filter_tmpl = SYSDB_GRNAM_FILTER;
+ break;
+ default:
+ return EINVAL;
+ }
+
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) {
return ENOMEM;
}
basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
- SYSDB_TMPL_USER_BASE, domain->name);
+ base_tmpl, domain->name);
if (!basedn) {
ret = ENOMEM;
goto done;
@@ -344,7 +368,7 @@ int sysdb_search_user_by_name(TALLOC_CTX *mem_ctx,
goto done;
}
- filter = talloc_asprintf(tmp_ctx, SYSDB_PWNAM_FILTER, lc_sanitized_name,
+ filter = talloc_asprintf(tmp_ctx, filter_tmpl, lc_sanitized_name,
sanitized_name, sanitized_name);
if (!filter) {
ret = ENOMEM;
@@ -371,6 +395,15 @@ done:
return ret;
}
+int sysdb_search_user_by_name(TALLOC_CTX *mem_ctx,
+ struct sss_domain_info *domain,
+ const char *name,
+ const char **attrs,
+ struct ldb_message **msg)
+{
+ return sysdb_search_by_name(mem_ctx, domain, name, SYSDB_USER, attrs, msg);
+}
+
int sysdb_search_user_by_uid(TALLOC_CTX *mem_ctx,
struct sss_domain_info *domain,
uid_t uid,
@@ -509,41 +542,7 @@ int sysdb_search_group_by_name(TALLOC_CTX *mem_ctx,
const char **attrs,
struct ldb_message **msg)
{
- TALLOC_CTX *tmp_ctx;
- static const char *def_attrs[] = { SYSDB_NAME, SYSDB_GIDNUM, NULL };
- struct ldb_message **msgs = NULL;
- struct ldb_dn *basedn;
- size_t msgs_count = 0;
- int ret;
-
- tmp_ctx = talloc_new(NULL);
- if (!tmp_ctx) {
- return ENOMEM;
- }
-
- basedn = sysdb_group_dn(tmp_ctx, domain, name);
- if (!basedn) {
- ret = ENOMEM;
- goto done;
- }
-
- ret = sysdb_search_entry(tmp_ctx, domain->sysdb, basedn, LDB_SCOPE_BASE,
- NULL, attrs?attrs:def_attrs, &msgs_count, &msgs);
- if (ret) {
- goto done;
- }
-
- *msg = talloc_steal(mem_ctx, msgs[0]);
-
-done:
- if (ret == ENOENT) {
- DEBUG(SSSDBG_TRACE_FUNC, "No such entry\n");
- }
- else if (ret) {
- DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret));
- }
- talloc_zfree(tmp_ctx);
- return ret;
+ return sysdb_search_by_name(mem_ctx, domain, name, SYSDB_GROUP, attrs, msg);
}
int sysdb_search_group_by_gid(TALLOC_CTX *mem_ctx,
--
1.8.3.1
More information about the sssd-devel
mailing list