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

When saving aliases, sdap_check_aliases tests if there is another user
with primary name as the alias being processed. It however, does not
check if it found the user himself. This can lead to errors, which are
skipped during RFC2307bis, but can break initgroups of RFC2307.

I think this is important enough to apply into 1.8
>From e62a6aa1165e5708e74521d3d05686092eda5d7c Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhro...@redhat.com>
Date: Wed, 18 Apr 2012 12:54:21 +0200
Subject: [PATCH] sdap_check_aliases must not error when detects the same user

https://fedorahosted.org/sssd/ticket/1307
---
 src/providers/ldap/sdap_async.c |   44 +++++++++++++++++++++++++++-----------
 1 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/src/providers/ldap/sdap_async.c b/src/providers/ldap/sdap_async.c
index 
076a3f22006eb2c27c295aa50bff1e2b3f58bfa9..bec4675c1ab42962767583ff85a16061eb17c5a4
 100644
--- a/src/providers/ldap/sdap_async.c
+++ b/src/providers/ldap/sdap_async.c
@@ -2082,7 +2082,7 @@ errno_t sdap_check_aliases(struct sysdb_ctx *sysdb,
     struct ldb_message *msg;
     TALLOC_CTX *tmp_ctx = NULL;
     char **parents;
-    uid_t alias_uid;
+    uid_t alias_uid, uid;
     int i;
 
     tmp_ctx = talloc_new(NULL);
@@ -2092,14 +2092,22 @@ errno_t sdap_check_aliases(struct sysdb_ctx *sysdb,
                                    opts->user_map[SDAP_AT_USER_NAME].name,
                                    &name);
     if (ret != EOK) {
-        DEBUG(1, ("Could not get the primary name\n"));
+        DEBUG(SSSDBG_TRACE_INTERNAL, ("Could not get the primary name\n"));
+        goto done;
+    }
+
+    ret = sysdb_attrs_get_uint32_t(user_attrs,
+                                   opts->user_map[SDAP_AT_USER_UID].name,
+                                   &uid);
+    if (ret != EOK) {
+        DEBUG(SSSDBG_TRACE_INTERNAL, ("Could not get UID\n"));
         goto done;
     }
 
     ret = sysdb_attrs_get_aliases(tmp_ctx, user_attrs, name,
                                   !dom->case_sensitive, &aliases);
     if (ret != EOK) {
-        DEBUG(1, ("Failed to get the alias list\n"));
+        DEBUG(SSSDBG_TRACE_INTERNAL, ("Failed to get the alias list\n"));
         goto done;
     }
 
@@ -2110,21 +2118,28 @@ errno_t sdap_check_aliases(struct sysdb_ctx *sysdb,
         ret = sysdb_search_user_by_name(tmp_ctx, sysdb,
                                         aliases[i], NULL, &msg);
         if (ret && ret != ENOENT) {
-            DEBUG(1, ("Error searching the cache\n"));
+            DEBUG(SSSDBG_TRACE_INTERNAL, ("Error searching the cache\n"));
             goto done;
         } else if (ret == ENOENT) {
-            DEBUG(9, ("No user with primary name same as alias %s\n", 
aliases[i]));
+            DEBUG(SSSDBG_TRACE_INTERNAL,
+                  ("No user with primary name same as alias %s\n", 
aliases[i]));
             continue;
         }
 
         alias_uid = ldb_msg_find_attr_as_uint64(msg, SYSDB_UIDNUM, 0);
         if (alias_uid) {
-            DEBUG(1, ("Cache contains non-fake user with same name "
-                      "as alias %s\n", aliases[i]));
+            if (alias_uid == uid) {
+                DEBUG(SSSDBG_TRACE_INTERNAL,
+                      ("User already cached, skipping\n"));
+                continue;
+            }
+            DEBUG(SSSDBG_FATAIL_FAILURE,
+                  ("Cache contains non-fake user with same name "
+                   "as alias %s\n", aliases[i]));
             ret = EIO;
             goto done;
         }
-        DEBUG(7, ("%s is a fake user\n", aliases[i]));
+        DEBUG(SSSDBG_TRACE_FUNC, ("%s is a fake user\n", aliases[i]));
 
         if (steal_memberships) {
             /* Get direct sysdb parents */
@@ -2132,8 +2147,9 @@ errno_t sdap_check_aliases(struct sysdb_ctx *sysdb,
                                            SYSDB_MEMBER_USER,
                                            aliases[i], &parents);
             if (ret) {
-                DEBUG(1, ("Could not get direct parents for %s: %d [%s]\n",
-                          aliases[i], ret, strerror(ret)));
+                DEBUG(SSSDBG_FATAL_FAILURE,
+                      ("Could not get direct parents for %s: %d [%s]\n",
+                       aliases[i], ret, strerror(ret)));
                 goto done;
             }
 
@@ -2141,15 +2157,17 @@ errno_t sdap_check_aliases(struct sysdb_ctx *sysdb,
                                     (const char *const *) parents,
                                     NULL);
             if (ret != EOK) {
-                DEBUG(1, ("Membership update failed [%d]: %s\n",
-                          ret, strerror(ret)));
+                DEBUG(SSSDBG_FATAL_FAILURE,
+                      ("Membership update failed [%d]: %s\n",
+                      ret, strerror(ret)));
                 goto done;
             }
         }
 
         ret = sysdb_delete_user(sysdb, aliases[i], alias_uid);
         if (ret) {
-            DEBUG(1, ("Error deleting fake user %s\n", aliases[i]));
+            DEBUG(SSSDBG_FATAL_FAILURE,
+                  ("Error deleting fake user %s\n", aliases[i]));
             goto done;
         }
     }
-- 
1.7.7.6

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

Reply via email to