[SSSD] [PATCH] SYSDB: move sysdb_get_real_name() from sysdb.c to sysdb_search.c

Jakub Hrozek jhrozek at redhat.com
Fri Oct 3 16:09:15 UTC 2014


Another cleanup patch I had in my branch.
-------------- next part --------------
>From 60e29ae51262ef5e25c4c59b8a0f8a80be69ae61 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Sun, 21 Sep 2014 16:55:21 +0200
Subject: [PATCH] SYSDB: move sysdb_get_real_name() from sysdb.c to
 sysdb_search.c

The sysdb.c should be reserved for utility and setup functions. Search
functions belong to sysdb_search.c Keeping functions in specialized
modules helps to maintain nice dependencies and in overall makes unit
testing easier.

Moreover, the function was not unit tested, which needed fixing.
---
 src/db/sysdb.c          | 52 -----------------------------------------------
 src/db/sysdb.h          |  2 +-
 src/db/sysdb_search.c   | 54 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/tests/sysdb-tests.c | 49 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 104 insertions(+), 53 deletions(-)

diff --git a/src/db/sysdb.c b/src/db/sysdb.c
index 3bc27c84a00db6813091b78ba9c7bbaf28461e51..88cff241fab9022c3fed45dbb409393dbe01a590 100644
--- a/src/db/sysdb.c
+++ b/src/db/sysdb.c
@@ -1882,58 +1882,6 @@ done:
     return ret;
 }
 
-errno_t sysdb_get_real_name(TALLOC_CTX *mem_ctx,
-                            struct sss_domain_info *domain,
-                            const char *name,
-                            const char **_cname)
-{
-    errno_t ret;
-    TALLOC_CTX *tmp_ctx;
-    struct ldb_result *res;
-    const char *cname;
-    struct ldb_message *msg;
-
-    tmp_ctx = talloc_new(NULL);
-    if (!tmp_ctx) {
-        return ENOMEM;
-    }
-
-    ret = sysdb_getpwnam(tmp_ctx, domain, name, &res);
-    if (ret != EOK) {
-        DEBUG(SSSDBG_OP_FAILURE, "Cannot canonicalize username\n");
-        goto done;
-    }
-
-    if (res->count == 0) {
-        ret = sysdb_search_user_by_upn(tmp_ctx, domain, name, NULL, &msg);
-        if (ret != EOK) {
-            /* User cannot be found in cache */
-            DEBUG(SSSDBG_OP_FAILURE, "Cannot find user [%s] in cache\n", name);
-            goto done;
-        }
-    } else if (res->count == 1) {
-        msg = res->msgs[0];
-    } else {
-        DEBUG(SSSDBG_CRIT_FAILURE,
-              "sysdb_getpwnam returned count: [%d]\n", res->count);
-        ret = EIO;
-        goto done;
-    }
-
-    cname = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
-    if (!cname) {
-        DEBUG(SSSDBG_CRIT_FAILURE, "A user with no name?\n");
-        ret = ENOENT;
-        goto done;
-    }
-
-    ret = EOK;
-    *_cname = talloc_steal(mem_ctx, cname);
-done:
-    talloc_free(tmp_ctx);
-    return ret;
-}
-
 errno_t sysdb_msg2attrs(TALLOC_CTX *mem_ctx, size_t count,
                         struct ldb_message **msgs,
                         struct sysdb_attrs ***attrs)
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index 81b39252c6604fd7c2b604b0b4bc7f00e035252b..2c5e8316f6c967233cf1d6f9ea8a171f1dffd649 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -329,7 +329,7 @@ errno_t sysdb_attrs_primary_name_list(struct sysdb_ctx *sysdb,
                                       char ***name_list);
 errno_t sysdb_get_real_name(TALLOC_CTX *mem_ctx,
                             struct sss_domain_info *domain,
-                            const char *name,
+                            const char *name_or_upn,
                             const char **_cname);
 
 errno_t sysdb_msg2attrs(TALLOC_CTX *mem_ctx, size_t count,
diff --git a/src/db/sysdb_search.c b/src/db/sysdb_search.c
index 3d789ae85daef5ea1a4a2c44255b5f7dda6af1ec..2ae215055fbf0ff85140ce5f484034c1af72b45a 100644
--- a/src/db/sysdb_search.c
+++ b/src/db/sysdb_search.c
@@ -985,3 +985,57 @@ done:
     talloc_free(tmp_ctx);
     return ret;
 }
+
+errno_t sysdb_get_real_name(TALLOC_CTX *mem_ctx,
+                            struct sss_domain_info *domain,
+                            const char *name_or_upn,
+                            const char **_cname)
+{
+    errno_t ret;
+    TALLOC_CTX *tmp_ctx;
+    struct ldb_result *res;
+    const char *cname;
+    struct ldb_message *msg;
+
+    tmp_ctx = talloc_new(NULL);
+    if (!tmp_ctx) {
+        return ENOMEM;
+    }
+
+    ret = sysdb_getpwnam(tmp_ctx, domain, name_or_upn, &res);
+    if (ret != EOK) {
+        DEBUG(SSSDBG_OP_FAILURE, "Cannot canonicalize username\n");
+        goto done;
+    }
+
+    if (res->count == 0) {
+        ret = sysdb_search_user_by_upn(tmp_ctx, domain, name_or_upn, NULL,
+                                       &msg);
+        if (ret != EOK) {
+            /* User cannot be found in cache */
+            DEBUG(SSSDBG_OP_FAILURE, "Cannot find user [%s] in cache\n",
+                                     name_or_upn);
+            goto done;
+        }
+    } else if (res->count == 1) {
+        msg = res->msgs[0];
+    } else {
+        DEBUG(SSSDBG_CRIT_FAILURE,
+              "sysdb_getpwnam returned count: [%d]\n", res->count);
+        ret = EIO;
+        goto done;
+    }
+
+    cname = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
+    if (!cname) {
+        DEBUG(SSSDBG_CRIT_FAILURE, "A user with no name?\n");
+        ret = ENOENT;
+        goto done;
+    }
+
+    ret = EOK;
+    *_cname = talloc_steal(mem_ctx, cname);
+done:
+    talloc_free(tmp_ctx);
+    return ret;
+}
diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c
index deb3568e204ea0792e01cb9c47b94869d815b5a6..8ba214c83f042bc6d210f5de55aac703c5f828e9 100644
--- a/src/tests/sysdb-tests.c
+++ b/src/tests/sysdb-tests.c
@@ -3455,6 +3455,45 @@ START_TEST (test_sysdb_attrs_to_list)
 }
 END_TEST
 
+START_TEST(test_sysdb_get_real_name)
+{
+    errno_t ret;
+    struct sysdb_test_ctx *test_ctx;
+    struct sysdb_attrs *user_attrs;
+    const char *str;
+
+    ret = setup_sysdb_tests(&test_ctx);
+    fail_if(ret != EOK, "Could not set up the test");
+
+    user_attrs = sysdb_new_attrs(test_ctx);
+    fail_unless(user_attrs != NULL, "sysdb_new_attrs failed");
+
+    ret = sysdb_attrs_add_string(user_attrs, SYSDB_NAME_ALIAS, "alias");
+    fail_unless(ret == EOK, "sysdb_attrs_add_string failed.");
+
+    ret = sysdb_attrs_add_string(user_attrs, SYSDB_UPN, "foo at bar");
+    fail_unless(ret == EOK, "sysdb_attrs_add_string failed.");
+
+    ret = sysdb_store_user(test_ctx->domain, "RealName",
+                           NULL, 22345, 0, "gecos",
+                           "/home/realname", "/bin/bash",
+                           NULL, user_attrs, NULL, -1, 0);
+    fail_unless(ret == EOK, "sysdb_store_user failed.");
+
+    /* Get real, uncanonicalized name as string */
+    ret = sysdb_get_real_name(test_ctx, test_ctx->domain, "alias", &str);
+    fail_unless(ret == EOK, "sysdb_get_real_name failed.");
+    fail_unless(strcmp(str, "RealName") == 0, "Expected [%s], got [%s].",
+                                              "RealName", str);
+
+    ret = sysdb_get_real_name(test_ctx, test_ctx->domain, "foo at bar", &str);
+    fail_unless(ret == EOK, "sysdb_get_real_name failed.");
+    fail_unless(strcmp(str, "RealName") == 0, "Expected [%s], got [%s].",
+                                              "foo at bar", str);
+
+}
+END_TEST
+
 START_TEST(test_group_rename)
 {
     struct sysdb_test_ctx *test_ctx;
@@ -4549,6 +4588,7 @@ START_TEST (test_sysdb_search_return_ENOENT)
     struct ldb_message **msgs = NULL;
     struct ldb_result *res = NULL;
     size_t count;
+    const char *str = NULL;
 
     /* Setup */
     ret = setup_sysdb_tests(&test_ctx);
@@ -4562,6 +4602,12 @@ START_TEST (test_sysdb_search_return_ENOENT)
                                ret, strerror(ret));
     talloc_zfree(msg);
 
+    ret = sysdb_get_real_name(test_ctx, test_ctx->domain,
+                              "nonexisting_user", &str);
+    fail_unless(ret == ENOENT, "sysdb_get_real_name error [%d][%s].",
+                               ret, strerror(ret));
+    talloc_zfree(str);
+
     ret = sysdb_search_user_by_uid(test_ctx, test_ctx->domain,
                                    1234, NULL, &msg);
     fail_unless(ret == ENOENT, "sysdb_search_user_by_uid error [%d][%s].",
@@ -5893,6 +5939,9 @@ Suite *create_sysdb_suite(void)
     /* Test SID string searches */
     tcase_add_test(tc_sysdb, test_sysdb_search_sid_str);
 
+    /* Test canonicalizing names */
+    tcase_add_test(tc_sysdb, test_sysdb_get_real_name);
+
     /* Test user and group renames */
     tcase_add_test(tc_sysdb, test_group_rename);
     tcase_add_test(tc_sysdb, test_user_rename);
-- 
1.9.3



More information about the sssd-devel mailing list