https://fedorahosted.org/sssd/ticket/2757

I wrote it on top of my previous override patches, but I think it will apply on master.
>From 8b44829f117e8078a65f0d167f2ad44ecc467497 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Wed, 19 Aug 2015 12:28:21 +0200
Subject: [PATCH] sss_override: support domains that requires fqname

Resolves:
https://fedorahosted.org/sssd/ticket/2757
---
 src/tools/sss_override.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 57 insertions(+), 2 deletions(-)

diff --git a/src/tools/sss_override.c b/src/tools/sss_override.c
index ff32951856816fcab2e57bc74a7f8a0711d3d6c1..af09f13950677c7f152f997681b3a0a18ee3420c 100644
--- a/src/tools/sss_override.c
+++ b/src/tools/sss_override.c
@@ -324,6 +324,54 @@ static struct sysdb_attrs *build_group_attrs(TALLOC_CTX *mem_ctx,
     return build_attrs(mem_ctx, group->name, 0, group->gid, 0, NULL, NULL);
 }
 
+static char *get_fqname(TALLOC_CTX *mem_ctx,
+                        struct sss_domain_info *domain,
+                        const char *name)
+{
+    char *fqname;
+    size_t fqlen;
+    size_t check;
+
+    if (domain == NULL) {
+        return NULL;
+    }
+
+    /* Get length. */
+    fqlen = sss_fqname(NULL, 0, domain->names, domain, name);
+    if (fqlen > 0) {
+        fqlen++; /* \0 */
+    } else {
+        return NULL;
+    }
+
+    fqname = talloc_zero_array(mem_ctx, char, fqlen);
+    if (fqname == NULL) {
+        DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
+        return NULL;
+    }
+
+    check = sss_fqname(fqname, fqlen, domain->names, domain, name);
+    if (check != fqlen - 1) {
+        DEBUG(SSSDBG_CRIT_FAILURE, "Failed to generate a fully qualified name "
+              "for user [%s] in [%s]! Skipping user.\n", name, domain->name);
+        talloc_free(fqname);
+        return NULL;
+    }
+
+    return fqname;
+}
+
+static char *get_sysname(TALLOC_CTX *mem_ctx,
+                         struct sss_domain_info *domain,
+                         const char *name)
+{
+    if (domain == NULL || !domain->fqnames) {
+        return talloc_strdup(mem_ctx, name);
+    }
+
+    return get_fqname(mem_ctx, domain, name);
+}
+
 static struct sss_domain_info *
 get_object_domain(enum sysdb_member_type type,
                   const char *name,
@@ -334,6 +382,7 @@ get_object_domain(enum sysdb_member_type type,
     struct sss_domain_info *dom;
     struct ldb_result *res;
     const char *strtype;
+    char *sysname;
     bool check_next;
     errno_t ret;
 
@@ -342,16 +391,22 @@ get_object_domain(enum sysdb_member_type type,
         return NULL;
     }
 
+    sysname = get_sysname(tmp_ctx, domain, name);
+    if (sysname == NULL) {
+        ret = ENOMEM;
+        goto done;
+    }
+
     /* Ensure that the object is in cache. */
     switch (type) {
     case SYSDB_MEMBER_USER:
-        if (getpwnam(name) == NULL) {
+        if (getpwnam(sysname) == NULL) {
             ret = ENOENT;
             goto done;
         }
         break;
     case SYSDB_MEMBER_GROUP:
-        if (getgrnam(name) == NULL) {
+        if (getgrnam(sysname) == NULL) {
             ret = ENOENT;
             goto done;
         }
-- 
1.9.3

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to