summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2014-09-21 16:55:21 +0200
committerJakub Hrozek <jhrozek@redhat.com>2014-10-06 14:19:37 +0200
commitd7d3ee1b8ab7a05129c83da8a185351d7c751c1c (patch)
treef2c2d9a2626791c412f661d08bed43c8eca69f99
parente4f6562e4043aa645088862d1cc657c3eff43c49 (diff)
downloadsssd-d7d3ee1b8ab7a05129c83da8a185351d7c751c1c.tar.gz
sssd-d7d3ee1b8ab7a05129c83da8a185351d7c751c1c.tar.xz
sssd-d7d3ee1b8ab7a05129c83da8a185351d7c751c1c.zip
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. Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
-rw-r--r--src/db/sysdb.c52
-rw-r--r--src/db/sysdb.h2
-rw-r--r--src/db/sysdb_search.c54
-rw-r--r--src/tests/sysdb-tests.c49
4 files changed, 104 insertions, 53 deletions
diff --git a/src/db/sysdb.c b/src/db/sysdb.c
index 3bc27c84a..88cff241f 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 81b39252c..2c5e8316f 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 3d789ae85..2ae215055 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 deb3568e2..8ba214c83 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@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@bar", &str);
+ fail_unless(ret == EOK, "sysdb_get_real_name failed.");
+ fail_unless(strcmp(str, "RealName") == 0, "Expected [%s], got [%s].",
+ "foo@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);