URL: https://github.com/SSSD/sssd/pull/777
Author: jhrozek
 Title: #777: TESTS: Add a unit test for UPNs stored by sss_ncache_prepopulate
Action: opened

PR body:
"""
This is a test for https://github.com/SSSD/sssd/pull/776
"""

To pull the PR as Git branch:
git remote add ghsssd https://github.com/SSSD/sssd
git fetch ghsssd pull/777/head:pr777
git checkout pr777
From baed499792a7c6576be8b2cb31b78871a6ebf2bc Mon Sep 17 00:00:00 2001
From: Sumit Bose <sb...@redhat.com>
Date: Tue, 12 Mar 2019 13:02:18 +0100
Subject: [PATCH 1/4] NEGCACHE: initialize UPN negative cache as well

UPNs are handled separately in the negative cache. To properly filter
user names even in the case of the fallback to a UPN lookup the negative
cahe for UPNs has to be initialized with the names from the filter_user
option as well.

If the name from the option is a short name it will be added to the
negative UPN cache for each domain with the respective domain name. If
the name from the option is fully-qualified it will be added as is to
the negative UPN cache for each domain.

Related to https://pagure.io/SSSD/sssd/issue/3978
---
 src/man/sssd.conf.5.xml         |  3 ++-
 src/responder/common/negcache.c | 42 +++++++++++++++++++++++++++++----
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/src/man/sssd.conf.5.xml b/src/man/sssd.conf.5.xml
index bea25c6228..180fc2486d 100644
--- a/src/man/sssd.conf.5.xml
+++ b/src/man/sssd.conf.5.xml
@@ -849,7 +849,8 @@
                             from the sss NSS database. This is particularly
                             useful for system accounts. This option can also
                             be set per-domain or include fully-qualified names
-                            to filter only users from the particular domain.
+                            to filter only users from the particular domain or
+                            by a user princiapal name (UPN).
                         </para>
                         <para>
                             NOTE: The filter_groups option doesn't affect
diff --git a/src/responder/common/negcache.c b/src/responder/common/negcache.c
index c5c43178f0..ca3b062a9c 100644
--- a/src/responder/common/negcache.c
+++ b/src/responder/common/negcache.c
@@ -974,10 +974,16 @@ errno_t sss_ncache_prepopulate(struct sss_nc_ctx *ncache,
             }
 
             if (domainname && strcmp(domainname, dom->name)) {
-                DEBUG(SSSDBG_CRIT_FAILURE,
+                DEBUG(SSSDBG_TRACE_FUNC,
                       "Mismatch between domain name (%s) and name "
-                          "set in FQN  (%s), skipping user %s\n",
-                          dom->name, domainname, name);
+                          "set in FQN  (%s), assuming %s is UPN\n",
+                          dom->name, domainname, filter_list[i]);
+                ret = sss_ncache_set_upn(ncache, true, dom, filter_list[i]);
+                if (ret != EOK) {
+                    DEBUG(SSSDBG_OP_FAILURE,
+                          "sss_ncache_set_upn failed (%d [%s]), ignored\n",
+                          ret, sss_strerror(ret));
+                }
                 continue;
             }
 
@@ -986,13 +992,19 @@ errno_t sss_ncache_prepopulate(struct sss_nc_ctx *ncache,
                 continue;
             }
 
+            ret = sss_ncache_set_upn(ncache, true, dom, fqname);
+            if (ret != EOK) {
+                DEBUG(SSSDBG_OP_FAILURE,
+                      "sss_ncache_set_upn failed (%d [%s]), ignored\n",
+                      ret, sss_strerror(ret));
+            }
             ret = sss_ncache_set_user(ncache, true, dom, fqname);
             talloc_zfree(fqname);
             if (ret != EOK) {
                 DEBUG(SSSDBG_CRIT_FAILURE,
                       "Failed to store permanent user filter for [%s]"
                           " (%d [%s])\n", filter_list[i],
-                          ret, strerror(ret));
+                          ret, sss_strerror(ret));
                 continue;
             }
         }
@@ -1023,7 +1035,18 @@ errno_t sss_ncache_prepopulate(struct sss_nc_ctx *ncache,
             dom = responder_get_domain(rctx, domainname);
             if (!dom) {
                 DEBUG(SSSDBG_CRIT_FAILURE,
-                      "Invalid domain name [%s]\n", domainname);
+                      "Unknown domain name [%s], assuming [%s] is UPN\n",
+                      domainname, filter_list[i]);
+                for (dom = domain_list;
+                     dom != NULL;
+                     dom = get_next_domain(dom, SSS_GND_ALL_DOMAINS)) {
+                    ret = sss_ncache_set_upn(ncache, true, dom, filter_list[i]);
+                    if (ret != EOK) {
+                        DEBUG(SSSDBG_OP_FAILURE,
+                              "sss_ncache_set_upn failed (%d [%s]), ignored\n",
+                              ret, sss_strerror(ret));
+                    }
+                }
                 continue;
             }
 
@@ -1050,6 +1073,15 @@ errno_t sss_ncache_prepopulate(struct sss_nc_ctx *ncache,
                     continue;
                 }
 
+                ret = sss_ncache_set_upn(ncache, true, dom, fqname);
+                if (ret != EOK) {
+                   DEBUG(SSSDBG_CRIT_FAILURE,
+                         "Failed to store permanent upn filter for"
+                             " [%s:%s] (%d [%s])\n",
+                             dom->name, filter_list[i],
+                             ret, strerror(ret));
+                }
+
                 ret = sss_ncache_set_user(ncache, true, dom, fqname);
                 talloc_zfree(fqname);
                 if (ret != EOK) {

From 987f184619a86a90fd8065498f1fcd37cb3d49af Mon Sep 17 00:00:00 2001
From: Sumit Bose <sb...@redhat.com>
Date: Tue, 12 Mar 2019 18:16:38 +0100
Subject: [PATCH 2/4] NEGCACHE: fix typo in debug message

---
 src/responder/common/responder_get_domains.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/responder/common/responder_get_domains.c b/src/responder/common/responder_get_domains.c
index b60d0e0232..bf43bbfd0e 100644
--- a/src/responder/common/responder_get_domains.c
+++ b/src/responder/common/responder_get_domains.c
@@ -442,7 +442,8 @@ static void get_domains_at_startup_done(struct tevent_req *req)
         ret = sss_ncache_reset_repopulate_permanent(state->rctx,
                                                     state->optional_ncache);
         if (ret != EOK) {
-            DEBUG(SSSDBG_MINOR_FAILURE, "sss_dp_get_domains request failed.\n");
+            DEBUG(SSSDBG_MINOR_FAILURE,
+                  "sss_ncache_reset_repopulate_permanent failed.\n");
         }
     }
 

From e547865f1acb9d9982bc379fb14d6e6682b58b2a Mon Sep 17 00:00:00 2001
From: Sumit Bose <sb...@redhat.com>
Date: Tue, 12 Mar 2019 18:26:58 +0100
Subject: [PATCH 3/4] NEGCACHE: repopulate negative cache after get_domains

If SSSD starts offline the responders might only know about the
configured domain because the sub-domains have not been discovered yet.
As a result the permanent negative cache is only populated for the
configured domain.

If later the system goes online and the sub-domains are discovered or a
new sub-domain was discovered at runtime the permanent negative cache is
currently not created for those domains.

This patch repopulates the negative cache for all known domains to the
end of the get_domains request.

Related to https://pagure.io/SSSD/sssd/issue/3983
---
 src/responder/common/responder_get_domains.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/responder/common/responder_get_domains.c b/src/responder/common/responder_get_domains.c
index bf43bbfd0e..8f25885c08 100644
--- a/src/responder/common/responder_get_domains.c
+++ b/src/responder/common/responder_get_domains.c
@@ -308,6 +308,13 @@ sss_dp_get_domains_process(struct tevent_req *subreq)
 
         sss_resp_update_certmaps(state->rctx);
 
+        ret = sss_ncache_reset_repopulate_permanent(state->rctx,
+                                                    state->rctx->ncache);
+        if (ret != EOK) {
+            DEBUG(SSSDBG_OP_FAILURE,
+                  "sss_ncache_reset_repopulate_permanent failed, ignored.\n");
+        }
+
         tevent_req_done(req);
         return;
     }

From bca555f3bdfa329514ef5f5d4558aebb856af489 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhro...@redhat.com>
Date: Wed, 13 Mar 2019 17:41:29 +0100
Subject: [PATCH 4/4] TESTS: Add a unit test for UPNs stored by
 sss_ncache_prepopulate

---
 src/tests/cmocka/test_negcache.c | 90 +++++++++++++++++++++++++-------
 1 file changed, 71 insertions(+), 19 deletions(-)

diff --git a/src/tests/cmocka/test_negcache.c b/src/tests/cmocka/test_negcache.c
index a0210928bd..f7a3b3fda6 100644
--- a/src/tests/cmocka/test_negcache.c
+++ b/src/tests/cmocka/test_negcache.c
@@ -39,6 +39,7 @@
 #include "lib/idmap/sss_idmap.h"
 #include "util/util.h"
 #include "util/util_sss_idmap.h"
+#include "db/sysdb_private.h"
 #include "responder/common/responder.h"
 #include "responder/common/negcache.h"
 
@@ -52,6 +53,7 @@
 #define TEST_CONF_DB "test_nss_conf.ldb"
 #define TEST_DOM_NAME "nss_test"
 #define TEST_ID_PROVIDER "ldap"
+#define TEST_SUBDOM_NAME "test.subdomain"
 
 /* register_cli_protocol_version is required in test since it links with
  * responder_common.c module
@@ -582,6 +584,29 @@ static int check_gid_in_ncache(struct sss_nc_ctx *ctx,
     return ret;
 }
 
+static int add_confdb_params(struct sss_test_conf_param params[],
+                             struct confdb_ctx *cdb, const char *section)
+{
+    const char *val[2];
+    int ret;
+
+    val[1] = NULL;
+
+    for (int i = 0; params[i].key; i++) {
+        val[0] = params[i].value;
+        ret = confdb_add_param(cdb, true, section, params[i].key, val);
+        assert_int_equal(ret, EOK);
+    }
+
+    return EOK;
+}
+
+static int add_nss_params(struct sss_test_conf_param nss_params[],
+                          struct confdb_ctx *cdb)
+{
+    return add_confdb_params(nss_params, cdb, CONFDB_NSS_CONF_ENTRY);
+}
+
 static void test_sss_ncache_prepopulate(void **state)
 {
     int ret;
@@ -589,9 +614,14 @@ static void test_sss_ncache_prepopulate(void **state)
     struct tevent_context *ev;
     struct sss_nc_ctx *ncache;
     struct sss_test_ctx *tc;
-    struct sss_domain_info *dom;
+    const char *const testdom[4] = { TEST_SUBDOM_NAME, "TEST.SUB", "test", "S-3" };
+    struct sss_domain_info *subdomain;
 
-    struct sss_test_conf_param params[] = {
+    struct sss_test_conf_param nss_params[] = {
+        { "filter_users", "testuser_nss@UPN.REALM" },
+        { NULL, NULL },
+    };
+    struct sss_test_conf_param dom_params[] = {
         { "filter_users", "testuser1, testuser2@"TEST_DOM_NAME", testuser3@somedomain" },
         { "filter_groups", "testgroup1, testgroup2@"TEST_DOM_NAME", testgroup3@somedomain" },
         { NULL, NULL },
@@ -602,22 +632,35 @@ static void test_sss_ncache_prepopulate(void **state)
     ev = tevent_context_init(ts);
     assert_non_null(ev);
 
-    dom = talloc_zero(ts, struct sss_domain_info);
-    assert_non_null(dom);
-    dom->name = discard_const_p(char, TEST_DOM_NAME);
-
     ts->nctx = mock_nctx(ts);
     assert_non_null(ts->nctx);
 
     tc = create_dom_test_ctx(ts, TESTS_PATH, TEST_CONF_DB,
-                             TEST_DOM_NAME, TEST_ID_PROVIDER, params);
+                             TEST_DOM_NAME, TEST_ID_PROVIDER, dom_params);
     assert_non_null(tc);
 
+    ret = add_nss_params(nss_params, tc->confdb);
+    assert_int_equal(ret, EOK);
+
+    subdomain = new_subdomain(tc, tc->dom,
+                              testdom[0], testdom[1], testdom[2], testdom[3],
+                              false, false, NULL, NULL, 0,
+                              tc->confdb);
+    assert_non_null(subdomain);
+
+    ret = sysdb_subdomain_store(tc->sysdb,
+                                testdom[0], testdom[1], testdom[2], testdom[3],
+                                false, false, NULL, 0, NULL);
+    assert_int_equal(ret, EOK);
+
+    ret = sysdb_update_subdomains(tc->dom, tc->confdb);
+    assert_int_equal(ret, EOK);
+
     ncache = ts->ctx;
-    ts->rctx = mock_rctx(ts, ev, dom, ts->nctx);
+    ts->rctx = mock_rctx(ts, ev, tc->dom, ts->nctx);
     assert_non_null(ts->rctx);
 
-    ret = sss_names_init(ts, tc->confdb, TEST_DOM_NAME, &dom->names);
+    ret = sss_names_init(ts, tc->confdb, TEST_DOM_NAME, &tc->dom->names);
     assert_int_equal(ret, EOK);
 
     ret = sss_ncache_prepopulate(ncache, tc->confdb, ts->rctx);
@@ -625,34 +668,37 @@ static void test_sss_ncache_prepopulate(void **state)
 
     sleep(SHORTSPAN);
 
-    ret = check_user_in_ncache(ncache, dom, "testuser1");
+    ret = check_user_in_ncache(ncache, tc->dom, "testuser1");
     assert_int_equal(ret, EEXIST);
 
-    ret = check_group_in_ncache(ncache, dom, "testgroup1");
+    ret = check_group_in_ncache(ncache, tc->dom, "testgroup1");
     assert_int_equal(ret, EEXIST);
 
-    ret = check_user_in_ncache(ncache, dom, "testuser2");
+    ret = check_user_in_ncache(ncache, tc->dom, "testuser2");
     assert_int_equal(ret, EEXIST);
 
-    ret = check_group_in_ncache(ncache, dom, "testgroup2");
+    ret = check_group_in_ncache(ncache, tc->dom, "testgroup2");
     assert_int_equal(ret, EEXIST);
 
-    ret = check_user_in_ncache(ncache, dom, "testuser3");
+    ret = check_user_in_ncache(ncache, tc->dom, "testuser3");
     assert_int_equal(ret, ENOENT);
 
-    ret = check_group_in_ncache(ncache, dom, "testgroup3");
+    ret = check_group_in_ncache(ncache, tc->dom, "testgroup3");
     assert_int_equal(ret, ENOENT);
 
-    ret = check_user_in_ncache(ncache, dom, "testuser3@somedomain");
+    ret = check_user_in_ncache(ncache, tc->dom, "testuser3@somedomain");
     assert_int_equal(ret, ENOENT);
 
-    ret = check_group_in_ncache(ncache, dom, "testgroup3@somedomain");
+    ret = sss_ncache_check_upn(ncache, tc->dom, "testuser3@somedomain");
+    assert_int_equal(ret, EEXIST);
+
+    ret = check_group_in_ncache(ncache, tc->dom, "testgroup3@somedomain");
     assert_int_equal(ret, ENOENT);
 
-    ret = check_user_in_ncache(ncache, dom, "root");
+    ret = check_user_in_ncache(ncache, tc->dom, "root");
     assert_int_equal(ret, EEXIST);
 
-    ret = check_group_in_ncache(ncache, dom, "root");
+    ret = check_group_in_ncache(ncache, tc->dom, "root");
     assert_int_equal(ret, EEXIST);
 
     ret = check_uid_in_ncache(ncache, 0);
@@ -660,6 +706,12 @@ static void test_sss_ncache_prepopulate(void **state)
 
     ret = check_gid_in_ncache(ncache, 0);
     assert_int_equal(ret, EEXIST);
+
+    ret = sss_ncache_check_upn(ncache, tc->dom, "testuser_nss@UPN.REALM");
+    assert_int_equal(ret, EEXIST);
+
+    ret = sss_ncache_check_upn(ncache, tc->dom->subdomains, "testuser_nss@UPN.REALM");
+    assert_int_equal(ret, EEXIST);
 }
 
 static void test_sss_ncache_default_domain_suffix(void **state)
_______________________________________________
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org
Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedorahosted.org/archives/list/sssd-devel@lists.fedorahosted.org

Reply via email to