483b06
From 65579492d3d545d6acabaedc019c457551c32063 Mon Sep 17 00:00:00 2001
483b06
From: Alexander Bokovoy <abokovoy@redhat.com>
483b06
Date: Mon, 3 Apr 2017 10:29:21 +0300
483b06
Subject: [PATCH] ipaserver/dcerpc: unify error processing
483b06
483b06
Samba error code reporting changes from version to version but we also
483b06
did not provide proper input into DCE RPC error processing method we
483b06
have.
483b06
483b06
Unify error processing and add few more fallback entries.
483b06
483b06
With Samba 4.7 we'll have to change it again because error code
483b06
processing for Samba Python modules will change with introduction of
483b06
samba.ntstatus and samba.werror modules.
483b06
483b06
Note that this commit also changes a message returned for error code
483b06
-1073741772 (NT_STATUS_OBJECT_NOT_FOUND) because it is more general one.
483b06
483b06
Fixes https://pagure.io/freeipa/issue/6859
483b06
483b06
Reviewed-By: Martin Basti <mbasti@redhat.com>
483b06
---
483b06
 ipaserver/dcerpc.py | 23 +++++++++++++++++------
483b06
 1 file changed, 17 insertions(+), 6 deletions(-)
483b06
483b06
diff --git a/ipaserver/dcerpc.py b/ipaserver/dcerpc.py
483b06
index 2d9d7e5577f1cac6f35701dd277199f9a37387f8..d684a17cabe43bbbd43d29f75f534b6e50fccd12 100644
483b06
--- a/ipaserver/dcerpc.py
483b06
+++ b/ipaserver/dcerpc.py
483b06
@@ -117,19 +117,27 @@ dcerpc_error_codes = {
483b06
                   # we simply will skip the binding
483b06
         access_denied_error,
483b06
     -1073741772:  # NT_STATUS_OBJECT_NAME_NOT_FOUND
483b06
-        errors.RemoteRetrieveError(
483b06
-            reason=_('CIFS server configuration does not allow '
483b06
-                     'access to \\\\pipe\\lsarpc')),
483b06
+        errors.NotFound(
483b06
+            reason=_('Cannot find specified domain or server name')),
483b06
 }
483b06
 
483b06
 dcerpc_error_messages = {
483b06
     "NT_STATUS_OBJECT_NAME_NOT_FOUND":
483b06
         errors.NotFound(
483b06
             reason=_('Cannot find specified domain or server name')),
483b06
+    "The object name is not found.":
483b06
+        errors.NotFound(
483b06
+            reason=_('Cannot find specified domain or server name')),
483b06
     "WERR_NO_LOGON_SERVERS":
483b06
         errors.RemoteRetrieveError(
483b06
             reason=_('AD DC was unable to reach any IPA domain controller. '
483b06
                      'Most likely it is a DNS or firewall issue')),
483b06
+    # This is a very long key, don't change it
483b06
+    "There are currently no logon servers available to "
483b06
+    "service the logon request.":
483b06
+        errors.RemoteRetrieveError(
483b06
+            reason=_('AD DC was unable to reach any IPA domain controller. '
483b06
+                     'Most likely it is a DNS or firewall issue')),
483b06
     "NT_STATUS_INVALID_PARAMETER_MIX":
483b06
         errors.RequirementError(
483b06
             name=_('At least the domain or IP address should be specified')),
483b06
@@ -802,7 +810,8 @@ class DomainValidator(object):
483b06
 
483b06
         # Both methods should not fail at the same time
483b06
         if finddc_error and len(info['gc']) == 0:
483b06
-            raise assess_dcerpc_exception(message=str(finddc_error))
483b06
+            num, message = e.args  # pylint: disable=unpacking-non-sequence
483b06
+            raise assess_dcerpc_exception(num=num, message=message)
483b06
 
483b06
         self._info[domain] = info
483b06
         return info
483b06
@@ -908,7 +917,8 @@ class TrustDomainInstance(object):
483b06
             else:
483b06
                 result = netrc.finddc(address=remote_host, flags=flags)
483b06
         except RuntimeError as e:
483b06
-            raise assess_dcerpc_exception(message=str(e))
483b06
+            num, message = e.args  # pylint: disable=unpacking-non-sequence
483b06
+            raise assess_dcerpc_exception(num=num, message=message)
483b06
 
483b06
         if not result:
483b06
             return False
483b06
@@ -1408,7 +1418,8 @@ def fetch_domains(api, mydomain, trustdomain, creds=None, server=None):
483b06
             result = netrc.finddc(domain=trustdomain,
483b06
                                   flags=nbt.NBT_SERVER_LDAP | nbt.NBT_SERVER_DS)
483b06
     except RuntimeError as e:
483b06
-        raise assess_dcerpc_exception(message=str(e))
483b06
+        num, message = e.args  # pylint: disable=unpacking-non-sequence
483b06
+        raise assess_dcerpc_exception(num=num, message=message)
483b06
 
483b06
     td.info['dc'] = unicode(result.pdc_dns_name)
483b06
     td.info['name'] = unicode(result.dns_domain)
483b06
-- 
483b06
2.9.3
483b06