Blame SOURCES/0003-Use-trust-find-and-trustdomain-find-to-identify-all-.patch

8fe9ce
From 886153da7dd1ca1f5d37dd9c1e2141850b7177b2 Mon Sep 17 00:00:00 2001
8fe9ce
From: Rob Crittenden <rcritten@redhat.com>
8fe9ce
Date: Tue, 17 Nov 2020 20:37:52 -0500
8fe9ce
Subject: [PATCH] Use trust-find and trustdomain-find to identify all AD trusts
8fe9ce
8fe9ce
Not all AD domains are visible to trust-find. For each trust
8fe9ce
iterate over trustdomain-find <domain> to find the complete
8fe9ce
list of domains.
8fe9ce
8fe9ce
Signed-off-by: Rob Crittenden <rcritten@redhat.com>
8fe9ce
---
8fe9ce
 src/ipahealthcheck/ipa/trust.py |  20 +++--
8fe9ce
 tests/test_ipa_trust.py         | 155 ++++++++++++++++++++------------
8fe9ce
 2 files changed, 108 insertions(+), 67 deletions(-)
8fe9ce
8fe9ce
diff --git a/src/ipahealthcheck/ipa/trust.py b/src/ipahealthcheck/ipa/trust.py
8fe9ce
index 0abe5cd..00971c4 100644
8fe9ce
--- a/src/ipahealthcheck/ipa/trust.py
8fe9ce
+++ b/src/ipahealthcheck/ipa/trust.py
8fe9ce
@@ -42,16 +42,18 @@ def get_trust_domains():
8fe9ce
 
8fe9ce
     Each entry is a dictionary representating an AD domain.
8fe9ce
     """
8fe9ce
-    result = api.Command.trust_find()
8fe9ce
-    results = result['result']
8fe9ce
     trust_domains = []
8fe9ce
-    for result in results:
8fe9ce
-        if result.get('trusttype')[0] == 'Active Directory domain':
8fe9ce
-            domain = dict()
8fe9ce
-            domain['domain'] = result.get('cn')[0]
8fe9ce
-            domain['domainsid'] = result.get('ipanttrusteddomainsid')[0]
8fe9ce
-            domain['netbios'] = result.get('ipantflatname')[0]
8fe9ce
-            trust_domains.append(domain)
8fe9ce
+    trusts = api.Command.trust_find(pkey_only=True, raw=True)
8fe9ce
+    for trust in trusts['result']:
8fe9ce
+        for cn in trust.get('cn'):
8fe9ce
+            trustdomains = api.Command.trustdomain_find(cn, raw=True)
8fe9ce
+            for trustdomain in trustdomains['result']:
8fe9ce
+                domain = dict()
8fe9ce
+                domain['domain'] = trustdomain.get('cn')[0]
8fe9ce
+                domain['domainsid'] = trustdomain.get(
8fe9ce
+                    'ipanttrusteddomainsid')[0]
8fe9ce
+                domain['netbios'] = trustdomain.get('ipantflatname')[0]
8fe9ce
+                trust_domains.append(domain)
8fe9ce
     return trust_domains
8fe9ce
 
8fe9ce
 
8fe9ce
diff --git a/tests/test_ipa_trust.py b/tests/test_ipa_trust.py
8fe9ce
index 3c4b947..f3a9f27 100644
8fe9ce
--- a/tests/test_ipa_trust.py
8fe9ce
+++ b/tests/test_ipa_trust.py
8fe9ce
@@ -72,6 +72,56 @@ class mock_ldap_conn:
8fe9ce
         return tuple()
8fe9ce
 
8fe9ce
 
8fe9ce
+#
8fe9ce
+# Construct a setup with two direct trusts and one sub domain
8fe9ce
+#
8fe9ce
+def trust_find():
8fe9ce
+    return [{
8fe9ce
+        'result': [
8fe9ce
+            {
8fe9ce
+                'cn': ['ad.example'],
8fe9ce
+            },
8fe9ce
+            {
8fe9ce
+                'cn': ['child.example'],
8fe9ce
+            },
8fe9ce
+        ]
8fe9ce
+    }]
8fe9ce
+
8fe9ce
+
8fe9ce
+def trustdomain_find():
8fe9ce
+    return [
8fe9ce
+        {
8fe9ce
+            "result": [
8fe9ce
+                {
8fe9ce
+                    "cn": ["ad.example"],
8fe9ce
+                    "ipantflatname": ["ADROOT"],
8fe9ce
+                    "ipanttrusteddomainsid": ["S-1-5-21-abc"],
8fe9ce
+                    "ipanttrusttype": ["2"],
8fe9ce
+                    "ipanttrustattributes": ["8"],
8fe9ce
+                },
8fe9ce
+                {
8fe9ce
+                    "cn": ["child.ad.example"],
8fe9ce
+                    "ipantflatname": ["CHILD.ADROOT"],
8fe9ce
+                    "ipanttrusteddomainsid": ["S-1-5-22-def"],
8fe9ce
+                    "ipanttrusttype": ["2"],
8fe9ce
+                    "ipanttrustattributes": ["1"],
8fe9ce
+                },
8fe9ce
+            ],
8fe9ce
+        },
8fe9ce
+        {
8fe9ce
+            "result": [
8fe9ce
+                {
8fe9ce
+                    "cn": ["child.example"],
8fe9ce
+                    "ipantflatname": ["CHILD"],
8fe9ce
+                    "ipanttrusteddomainsid": ["S-1-5-21-ghi"],
8fe9ce
+                    "ipanttrusttype": ["2"],
8fe9ce
+                    "ipanttrustattributes": ["8"],
8fe9ce
+                },
8fe9ce
+            ],
8fe9ce
+        },
8fe9ce
+    ]
8fe9ce
+
8fe9ce
+
8fe9ce
 class SSSDDomain:
8fe9ce
     def __init__(self, return_ipa_server_mode=True, provider='ipa'):
8fe9ce
         self.return_ipa_server_mode = return_ipa_server_mode
8fe9ce
@@ -246,31 +296,17 @@ class TestTrustDomains(BaseTest):
8fe9ce
         dlresult.returncode = 0
8fe9ce
         dlresult.error_log = ''
8fe9ce
         dlresult.output = 'implicit_files\nipa.example\nad.example\n' \
8fe9ce
-            'child.example\n'
8fe9ce
+            'child.ad.example\nchild.example\n'
8fe9ce
         olresult = namedtuple('run', ['returncode', 'error_log'])
8fe9ce
         olresult.returncode = 0
8fe9ce
         olresult.error_log = ''
8fe9ce
         olresult.output = 'Online status: Online\n\n'
8fe9ce
 
8fe9ce
-        mock_run.side_effect = [dlresult, olresult, olresult]
8fe9ce
+        mock_run.side_effect = [dlresult, olresult, olresult, olresult]
8fe9ce
 
8fe9ce
         # get_trust_domains()
8fe9ce
-        m_api.Command.trust_find.side_effect = [{
8fe9ce
-            'result': [
8fe9ce
-                {
8fe9ce
-                    'cn': ['ad.example'],
8fe9ce
-                    'ipantflatname': ['ADROOT'],
8fe9ce
-                    'ipanttrusteddomainsid': ['S-1-5-21-abc'],
8fe9ce
-                    'trusttype': ['Active Directory domain'],
8fe9ce
-                },
8fe9ce
-                {
8fe9ce
-                    'cn': ['child.example'],
8fe9ce
-                    'ipantflatname': ['ADROOT'],
8fe9ce
-                    'ipanttrusteddomainsid': ['S-1-5-21-def'],
8fe9ce
-                    'trusttype': ['Active Directory domain'],
8fe9ce
-                },
8fe9ce
-            ]
8fe9ce
-        }]
8fe9ce
+        m_api.Command.trust_find.side_effect = trust_find()
8fe9ce
+        m_api.Command.trustdomain_find.side_effect = trustdomain_find()
8fe9ce
 
8fe9ce
         framework = object()
8fe9ce
         registry.initialize(framework, config.Config)
8fe9ce
@@ -279,15 +315,17 @@ class TestTrustDomains(BaseTest):
8fe9ce
 
8fe9ce
         self.results = capture_results(f)
8fe9ce
 
8fe9ce
-        assert len(self.results) == 3
8fe9ce
+        assert len(self.results) == 4
8fe9ce
 
8fe9ce
         result = self.results.results[0]
8fe9ce
         assert result.result == constants.SUCCESS
8fe9ce
         assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
         assert result.check == 'IPATrustDomainsCheck'
8fe9ce
         assert result.kw.get('key') == 'domain-list'
8fe9ce
-        assert result.kw.get('trust_domains') == 'ad.example, child.example'
8fe9ce
-        assert result.kw.get('sssd_domains') == 'ad.example, child.example'
8fe9ce
+        assert result.kw.get('trust_domains') == \
8fe9ce
+            'ad.example, child.ad.example, child.example'
8fe9ce
+        assert result.kw.get('sssd_domains') == \
8fe9ce
+            'ad.example, child.ad.example, child.example'
8fe9ce
 
8fe9ce
         result = self.results.results[1]
8fe9ce
         assert result.result == constants.SUCCESS
8fe9ce
@@ -301,6 +339,13 @@ class TestTrustDomains(BaseTest):
8fe9ce
         assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
         assert result.check == 'IPATrustDomainsCheck'
8fe9ce
         assert result.kw.get('key') == 'domain-status'
8fe9ce
+        assert result.kw.get('domain') == 'child.ad.example'
8fe9ce
+
8fe9ce
+        result = self.results.results[3]
8fe9ce
+        assert result.result == constants.SUCCESS
8fe9ce
+        assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
+        assert result.check == 'IPATrustDomainsCheck'
8fe9ce
+        assert result.kw.get('key') == 'domain-status'
8fe9ce
         assert result.kw.get('domain') == 'child.example'
8fe9ce
 
8fe9ce
     @patch('ipapython.ipautil.run')
8fe9ce
@@ -319,22 +364,8 @@ class TestTrustDomains(BaseTest):
8fe9ce
         mock_run.side_effect = [dlresult, olresult, olresult]
8fe9ce
 
8fe9ce
         # get_trust_domains()
8fe9ce
-        m_api.Command.trust_find.side_effect = [{
8fe9ce
-            'result': [
8fe9ce
-                {
8fe9ce
-                    'cn': ['ad.example'],
8fe9ce
-                    'ipantflatname': ['ADROOT'],
8fe9ce
-                    'ipanttrusteddomainsid': ['S-1-5-21-abc'],
8fe9ce
-                    'trusttype': ['Active Directory domain'],
8fe9ce
-                },
8fe9ce
-                {
8fe9ce
-                    'cn': ['child.example'],
8fe9ce
-                    'ipantflatname': ['ADROOT'],
8fe9ce
-                    'ipanttrusteddomainsid': ['S-1-5-21-def'],
8fe9ce
-                    'trusttype': ['Active Directory domain'],
8fe9ce
-                },
8fe9ce
-            ]
8fe9ce
-        }]
8fe9ce
+        m_api.Command.trust_find.side_effect = trust_find()
8fe9ce
+        m_api.Command.trustdomain_find.side_effect = trustdomain_find()
8fe9ce
 
8fe9ce
         framework = object()
8fe9ce
         registry.initialize(framework, config.Config)
8fe9ce
@@ -350,7 +381,8 @@ class TestTrustDomains(BaseTest):
8fe9ce
         assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
         assert result.check == 'IPATrustDomainsCheck'
8fe9ce
         assert result.kw.get('key') == 'domain-list'
8fe9ce
-        assert result.kw.get('trust_domains') == 'ad.example, child.example'
8fe9ce
+        assert result.kw.get('trust_domains') == \
8fe9ce
+            'ad.example, child.ad.example, child.example'
8fe9ce
         assert result.kw.get('sssd_domains') == 'child.example'
8fe9ce
 
8fe9ce
         result = self.results.results[1]
8fe9ce
@@ -428,29 +460,16 @@ class TestTrustCatalog(BaseTest):
8fe9ce
         ds2result.output = 'Active servers:\nAD Global Catalog: ' \
8fe9ce
             'root-dc.ad.vm\nAD Domain Controller: root-dc.ad.vm\n' \
8fe9ce
 
8fe9ce
-        mock_run.side_effect = [dsresult, ds2result]
8fe9ce
+        mock_run.side_effect = [dsresult, ds2result, ds2result]
8fe9ce
         mock_getnamebysid.side_effect = [
8fe9ce
            {'S-1-5-21-abc-500': {'name': 'admin@ad.example', 'type': 3}},
8fe9ce
+           {'S-1-5-21-ghi-500': {'name': 'admin@child.ad.example', 'type': 3}},
8fe9ce
            {'S-1-5-21-def-500': {'name': 'admin@child.example', 'type': 3}}
8fe9ce
         ]
8fe9ce
 
8fe9ce
         # get_trust_domains()
8fe9ce
-        m_api.Command.trust_find.side_effect = [{
8fe9ce
-            'result': [
8fe9ce
-                {
8fe9ce
-                    'cn': ['ad.example'],
8fe9ce
-                    'ipantflatname': ['ADROOT'],
8fe9ce
-                    'ipanttrusteddomainsid': ['S-1-5-21-abc'],
8fe9ce
-                    'trusttype': ['Active Directory domain'],
8fe9ce
-                },
8fe9ce
-                {
8fe9ce
-                    'cn': ['child.example'],
8fe9ce
-                    'ipantflatname': ['ADROOT'],
8fe9ce
-                    'ipanttrusteddomainsid': ['S-1-5-21-def'],
8fe9ce
-                    'trusttype': ['Active Directory domain'],
8fe9ce
-                },
8fe9ce
-            ]
8fe9ce
-        }]
8fe9ce
+        m_api.Command.trust_find.side_effect = trust_find()
8fe9ce
+        m_api.Command.trustdomain_find.side_effect = trustdomain_find()
8fe9ce
 
8fe9ce
         framework = object()
8fe9ce
         registry.initialize(framework, config.Config)
8fe9ce
@@ -459,7 +478,7 @@ class TestTrustCatalog(BaseTest):
8fe9ce
 
8fe9ce
         self.results = capture_results(f)
8fe9ce
 
8fe9ce
-        assert len(self.results) == 6
8fe9ce
+        assert len(self.results) == 9
8fe9ce
 
8fe9ce
         result = self.results.results[0]
8fe9ce
         assert result.result == constants.SUCCESS
8fe9ce
@@ -487,20 +506,40 @@ class TestTrustCatalog(BaseTest):
8fe9ce
         assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
         assert result.check == 'IPATrustCatalogCheck'
8fe9ce
         assert result.kw.get('key') == 'Domain Security Identifier'
8fe9ce
-        assert result.kw.get('sid') == 'S-1-5-21-def'
8fe9ce
+        assert result.kw.get('sid') == 'S-1-5-22-def'
8fe9ce
 
8fe9ce
         result = self.results.results[4]
8fe9ce
         assert result.result == constants.SUCCESS
8fe9ce
         assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
         assert result.check == 'IPATrustCatalogCheck'
8fe9ce
         assert result.kw.get('key') == 'AD Global Catalog'
8fe9ce
-        assert result.kw.get('domain') == 'child.example'
8fe9ce
+        assert result.kw.get('domain') == 'child.ad.example'
8fe9ce
 
8fe9ce
         result = self.results.results[5]
8fe9ce
         assert result.result == constants.SUCCESS
8fe9ce
         assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
         assert result.check == 'IPATrustCatalogCheck'
8fe9ce
         assert result.kw.get('key') == 'AD Domain Controller'
8fe9ce
+
8fe9ce
+        result = self.results.results[6]
8fe9ce
+        assert result.result == constants.SUCCESS
8fe9ce
+        assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
+        assert result.check == 'IPATrustCatalogCheck'
8fe9ce
+        assert result.kw.get('key') == 'Domain Security Identifier'
8fe9ce
+        assert result.kw.get('sid') == 'S-1-5-21-ghi'
8fe9ce
+
8fe9ce
+        result = self.results.results[7]
8fe9ce
+        assert result.result == constants.SUCCESS
8fe9ce
+        assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
+        assert result.check == 'IPATrustCatalogCheck'
8fe9ce
+        assert result.kw.get('key') == 'AD Global Catalog'
8fe9ce
+        assert result.kw.get('domain') == 'child.example'
8fe9ce
+
8fe9ce
+        result = self.results.results[8]
8fe9ce
+        assert result.result == constants.SUCCESS
8fe9ce
+        assert result.source == 'ipahealthcheck.ipa.trust'
8fe9ce
+        assert result.check == 'IPATrustCatalogCheck'
8fe9ce
+        assert result.kw.get('key') == 'AD Domain Controller'
8fe9ce
         assert result.kw.get('domain') == 'child.example'
8fe9ce
 
8fe9ce
 
8fe9ce
-- 
8fe9ce
2.25.4
8fe9ce