8f4e66
From 079fdf41592559de96465080e81aa91252c01a3d Mon Sep 17 00:00:00 2001
8f4e66
From: Alexander Bokovoy <abokovoy@redhat.com>
8f4e66
Date: Tue, 19 Aug 2014 16:24:27 +0300
8f4e66
Subject: [PATCH] ipaserver/dcerpc.py: Make sure trust is established only to
8f4e66
 forest root domain
8f4e66
8f4e66
Part of https://fedorahosted.org/freeipa/ticket/4463
8f4e66
8f4e66
Reviewed-By: Sumit Bose <sbose@redhat.com>
8f4e66
---
8f4e66
 ipalib/errors.py    | 16 ++++++++++++++++
8f4e66
 ipaserver/dcerpc.py |  6 ++++++
8f4e66
 2 files changed, 22 insertions(+)
8f4e66
8f4e66
diff --git a/ipalib/errors.py b/ipalib/errors.py
8f4e66
index 716decb2b41baf5470a1dc23c0cfb5d1c995e5ff..405c5c3bfc25d9b024189be9fcf582052dd10dd3 100644
8f4e66
--- a/ipalib/errors.py
8f4e66
+++ b/ipalib/errors.py
8f4e66
@@ -810,6 +810,22 @@ class DeprecationError(InvocationError):
8f4e66
     errno = 3015
8f4e66
     format = _("Command '%(name)s' has been deprecated")
8f4e66
 
8f4e66
+class NotAForestRootError(InvocationError):
8f4e66
+    """
8f4e66
+    **3016** Raised when an attempt to establish trust is done against non-root domain
8f4e66
+             Forest root domain has the same name as the forest itself
8f4e66
+
8f4e66
+    For example:
8f4e66
+
8f4e66
+    >>> raise NotAForestRootError(forest='example.test', domain='jointops.test')
8f4e66
+    Traceback (most recent call last):
8f4e66
+      ...
8f4e66
+    NotAForestRootError: Domain 'jointops.test' is not a root domain for forest 'example.test'
8f4e66
+    """
8f4e66
+
8f4e66
+    errno = 3016
8f4e66
+    format = _("Domain '%(domain)s' is not a root domain for forest '%(forest)s'")
8f4e66
+
8f4e66
 
8f4e66
 ##############################################################################
8f4e66
 # 4000 - 4999: Execution errors
8f4e66
diff --git a/ipaserver/dcerpc.py b/ipaserver/dcerpc.py
8f4e66
index fcf1e4e775868f17220cac3c0203cc67dba2f839..41f373df3cc4365727200f3ca4667faac2f9e19c 100644
8f4e66
--- a/ipaserver/dcerpc.py
8f4e66
+++ b/ipaserver/dcerpc.py
8f4e66
@@ -1143,6 +1143,9 @@ class TrustDomainJoins(object):
8f4e66
                 realm_passwd
8f4e66
             )
8f4e66
 
8f4e66
+        if self.remote_domain.info['dns_domain'] != self.remote_domain.info['dns_forest']:
8f4e66
+            raise errors.NotAForestRootError(forest=self.remote_domain.info['dns_forest'], domain=self.remote_domain.info['dns_domain'])
8f4e66
+
8f4e66
         if not self.remote_domain.read_only:
8f4e66
             trustdom_pass = samba.generate_random_password(128, 128)
8f4e66
             self.get_realmdomains()
8f4e66
@@ -1159,5 +1162,8 @@ class TrustDomainJoins(object):
8f4e66
         if not(isinstance(self.remote_domain, TrustDomainInstance)):
8f4e66
             self.populate_remote_domain(realm, realm_server, realm_passwd=None)
8f4e66
 
8f4e66
+        if self.remote_domain.info['dns_domain'] != self.remote_domain.info['dns_forest']:
8f4e66
+            raise errors.NotAForestRootError(forest=self.remote_domain.info['dns_forest'], domain=self.remote_domain.info['dns_domain'])
8f4e66
+
8f4e66
         self.local_domain.establish_trust(self.remote_domain, trustdom_passwd)
8f4e66
         return dict(local=self.local_domain, remote=self.remote_domain, verified=False)
8f4e66
-- 
8f4e66
1.9.3
8f4e66