Blame SOURCES/0006-utils-add-SSS_GND_SUBDOMAINS-flag-for-get_next_domai.patch

b833e0
From 385af99ff4d5a75d0c1edc9ad830da3eb7478295 Mon Sep 17 00:00:00 2001
b833e0
From: Sumit Bose <sbose@redhat.com>
b833e0
Date: Thu, 8 Oct 2020 17:57:29 +0200
b833e0
Subject: [PATCH 6/8] utils: add SSS_GND_SUBDOMAINS flag for get_next_domain()
b833e0
b833e0
To allow to only iterate over a singel domain an its sub-domains a new
b833e0
flag is added to get_next_domain().
b833e0
b833e0
Resolves: https://github.com/SSSD/sssd/issues/5238
b833e0
b833e0
Reviewed-by: Alexey Tikhonov <atikhono@redhat.com>
b833e0
---
b833e0
 src/tests/cmocka/test_utils.c | 31 +++++++++++++++++++++++++++++++
b833e0
 src/util/domain_info_utils.c  | 10 +++++++---
b833e0
 src/util/util.h               |  4 ++++
b833e0
 3 files changed, 42 insertions(+), 3 deletions(-)
b833e0
b833e0
diff --git a/src/tests/cmocka/test_utils.c b/src/tests/cmocka/test_utils.c
b833e0
index 945f5cb44..d77a972c1 100644
b833e0
--- a/src/tests/cmocka/test_utils.c
b833e0
+++ b/src/tests/cmocka/test_utils.c
b833e0
@@ -877,6 +877,37 @@ static void test_get_next_domain_flags(void **state)
b833e0
 
b833e0
     dom = get_next_domain(dom, gnd_flags);
b833e0
     assert_null(dom);
b833e0
+
b833e0
+    /* Descend only to subdomains */
b833e0
+    gnd_flags = SSS_GND_SUBDOMAINS | SSS_GND_INCLUDE_DISABLED;
b833e0
+
b833e0
+    dom = get_next_domain(test_ctx->dom_list, gnd_flags);
b833e0
+    assert_non_null(dom);
b833e0
+    assert_string_equal(dom->name, "sub1a");
b833e0
+
b833e0
+    dom = get_next_domain(dom, gnd_flags);
b833e0
+    assert_null(dom);
b833e0
+
b833e0
+    dom = find_domain_by_name_ex(test_ctx->dom_list, "dom2", true,
b833e0
+                                 SSS_GND_ALL_DOMAINS);
b833e0
+    assert_non_null(dom);
b833e0
+    assert_string_equal(dom->name, "dom2");
b833e0
+
b833e0
+    dom = get_next_domain(dom, gnd_flags);
b833e0
+    assert_non_null(dom);
b833e0
+    assert_string_equal(dom->name, "sub2a");
b833e0
+
b833e0
+    dom = get_next_domain(dom, gnd_flags);
b833e0
+    assert_non_null(dom);
b833e0
+    assert_string_equal(dom->name, "sub2b");
b833e0
+
b833e0
+    dom = get_next_domain(dom, gnd_flags);
b833e0
+    assert_null(dom);
b833e0
+
b833e0
+    /* Expect NULL if the domain has no sub-domains */
b833e0
+    test_ctx->dom_list->subdomains = NULL;
b833e0
+    dom = get_next_domain(test_ctx->dom_list, gnd_flags);
b833e0
+    assert_null(dom);
b833e0
 }
b833e0
 
b833e0
 struct name_init_test_ctx {
b833e0
diff --git a/src/util/domain_info_utils.c b/src/util/domain_info_utils.c
b833e0
index aa3582f03..4d4726daa 100644
b833e0
--- a/src/util/domain_info_utils.c
b833e0
+++ b/src/util/domain_info_utils.c
b833e0
@@ -39,16 +39,20 @@ struct sss_domain_info *get_next_domain(struct sss_domain_info *domain,
b833e0
                                         uint32_t gnd_flags)
b833e0
 {
b833e0
     struct sss_domain_info *dom;
b833e0
-    bool descend = gnd_flags & SSS_GND_DESCEND;
b833e0
+    bool descend = gnd_flags & (SSS_GND_DESCEND | SSS_GND_SUBDOMAINS);
b833e0
     bool include_disabled = gnd_flags & SSS_GND_INCLUDE_DISABLED;
b833e0
+    bool only_subdomains = gnd_flags & SSS_GND_SUBDOMAINS;
b833e0
 
b833e0
     dom = domain;
b833e0
     while (dom) {
b833e0
         if (descend && dom->subdomains) {
b833e0
             dom = dom->subdomains;
b833e0
-        } else if (dom->next) {
b833e0
+        } else if (dom->next && only_subdomains && IS_SUBDOMAIN(dom)) {
b833e0
             dom = dom->next;
b833e0
-        } else if (descend && IS_SUBDOMAIN(dom) && dom->parent->next) {
b833e0
+        } else if (dom->next && !only_subdomains) {
b833e0
+            dom = dom->next;
b833e0
+        } else if (descend && !only_subdomains && IS_SUBDOMAIN(dom)
b833e0
+                            && dom->parent->next) {
b833e0
             dom = dom->parent->next;
b833e0
         } else {
b833e0
             dom = NULL;
b833e0
diff --git a/src/util/util.h b/src/util/util.h
b833e0
index fbcac5cd0..581c0edfb 100644
b833e0
--- a/src/util/util.h
b833e0
+++ b/src/util/util.h
b833e0
@@ -565,7 +565,11 @@ struct sss_domain_info *get_domains_head(struct sss_domain_info *domain);
b833e0
 
b833e0
 #define SSS_GND_DESCEND 0x01
b833e0
 #define SSS_GND_INCLUDE_DISABLED 0x02
b833e0
+/* Descend to sub-domains of current domain but do not go to next parent */
b833e0
+#define SSS_GND_SUBDOMAINS 0x04
b833e0
 #define SSS_GND_ALL_DOMAINS (SSS_GND_DESCEND | SSS_GND_INCLUDE_DISABLED)
b833e0
+#define SSS_GND_ALL_SUBDOMAINS (SSS_GND_SUBDOMAINS | SSS_GND_INCLUDE_DISABLED)
b833e0
+
b833e0
 struct sss_domain_info *get_next_domain(struct sss_domain_info *domain,
b833e0
                                         uint32_t gnd_flags);
b833e0
 struct sss_domain_info *find_domain_by_name(struct sss_domain_info *domain,
b833e0
-- 
b833e0
2.21.3
b833e0