On 10/16/2014 12:08 PM, thierry bordaz wrote:
> On 10/15/2014 04:33 PM, Martin Kosek wrote:
>> On 10/15/2014 01:57 PM, thierry bordaz wrote:
>>> On 10/15/2014 01:26 PM, Martin Kosek wrote:
>>>> On 10/15/2014 01:08 PM, thierry bordaz wrote:
>>>>> https://fedorahosted.org/freeipa/ticket/4523
>>>> I see 2 issues with the patch:
>>>>
>>>> 1) Patch description should not contain "
>>>> Reviewed by:", this gets added later by a script (or human)
>>> ok
>>>> 2) The exception handling clause should be as focused as possible, i.e. not
>>>> including whole command, but rather just the failing call, i.e.:
>>>>
>>>>       def post_callback(self, ldap, dn, entry, *keys, **options):
>>>>           try:
>>>>               self.obj.add_aci(entry)
>>>>           except Exception:
>>>>
>>>> You can use
>>>>
>>>>       try:
>>>>           ...
>>>>       except errors.NotFound:
>>>>           self.obj.handle_not_found(*keys)
>>>>
>>>> to raise the right error.
>>>>
>>>> Martin
>>> Currently the exception is handled on the failure of
>>> baseldap.LDAPCreate.execute(). Do you recommend to make the fix inside
>>> baseldap.LDAPCreate.execute rather than at the 'permission_add.execute' 
>>> level ?
>> No, not there. I thought that the exception happens in
>>
>>      def post_callback(self, ldap, dn, entry, *keys, **options):
>>          try:
>>              self.obj.add_aci(entry)
>>          except Exception:
>>             ...
>>
>>> Also using handle_not_found looks good, but it reports something like:
>>>
>>>     ipa permission-add user1 --right read --attrs cn --subtree
>>>     'cn=compat,dc=idm,dc=lab,dc=bos,dc=redhat,dc=com'
>>>     ipa: ERROR: user1: permission not found
>>>
>>>
>>> If the entry 'user1' exists, it is not clear what was not found.
>>> Displaying the dn of the entry would help to know that we are updating an 
>>> entry
>>> into the 'compat' tree.
>> Ah, sorry, I think I mislead you with this advise. You probably could use the
>> same except clause as already used:
>>
>>              except errors.NotFound:
>>                  raise errors.ValidationError(
>>                      name='ipapermlocation',
>>                      error=_('Entry %s does not exist') % location)
>>
>> Martin
> Thanks Martin for your review. Here is a second fix.

I am sorry, this is still not what I meant. You cannot wrap whole
permission-add command, wait for very general error and then report very
specific error. Try-except clauses need to be as close to the guarded problem
as possible.

See PEP8 for example (http://legacy.python.org/dev/peps/pep-0008/):

..
Additionally, for all try/except clauses, limit the try clause to the absolute
minimum amount of code necessary. Again, this avoids masking bugs
...

To speed up the resolution of this patch, please see a proposed patch, I hope
it works for you.

Martin
From 1bf907be3f78c9da4ba39a24a85e0a7915967c66 Mon Sep 17 00:00:00 2001
From: Martin Kosek <mko...@redhat.com>
Date: Thu, 16 Oct 2014 12:40:24 +0200
Subject: [PATCH] Raise better error message for permission added to generated
 tree

https://fedorahosted.org/freeipa/ticket/4523
---
 ipalib/plugins/permission.py | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/ipalib/plugins/permission.py b/ipalib/plugins/permission.py
index 9028f02483bc113c19c75b94d70dd1b133272524..43481b9ebf6a2b35eae301cc2f99315539a2ab1e 100644
--- a/ipalib/plugins/permission.py
+++ b/ipalib/plugins/permission.py
@@ -972,7 +972,7 @@ def pre_callback(self, ldap, dn, entry, attrs_list, *keys, **options):
     def post_callback(self, ldap, dn, entry, *keys, **options):
         try:
             self.obj.add_aci(entry)
-        except Exception:
+        except Exception, e:
             # Adding the ACI failed.
             # We want to be 100% sure the ACI is not there, so try to
             # remove it. (This is a no-op if the ACI was not added.)
@@ -988,6 +988,13 @@ def post_callback(self, ldap, dn, entry, *keys, **options):
                 self.api.Backend['ldap2'].delete_entry(entry)
             except errors.NotFound:
                 pass
+            if isinstance(e, errors.NotFound):
+                # add_aci may raise NotFound if the subtree is only virtual
+                # like cn=compat,SUFFIX and thus passes the LDAP get entry test
+                location = DN(entry.single_value['ipapermlocation'])
+                raise errors.ValidationError(
+                    name='ipapermlocation',
+                    error=_('Cannot store permission ACI to %s') % location)
             # Re-raise original exception
             raise
         self.obj.postprocess_result(entry, options)
-- 
1.9.3

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to