[Zope3-dev] Form framework, adapters and pau

Jim Fulton jim at zope.com
Tue Apr 5 07:46:52 EDT 2005


Garrett Smith wrote:
> I don't understand the pushback against location proxying
> security-proxied objects. LocationProxy does actually play well with
> security-proxied objects.

That was not our experience in the recent past.  I'll have to document
the problems, assuming that I can reproduce them.

I wonder if it would make sense for the trusted adapter machinery to
simply set __parent__ on adapters if either the adapter provides ILocation
*or* the adapter doesn't already have a __parent__.  This would solve the
problem and avoid the proxy.

Jim

> 
>  -- Garrett
> 
> 
> Dominik Huber wrote:
> 
>>Jim Fulton wrote:
>>
>>
>>>Dominik Huber wrote:
>>>
>>>
>>>>A few months ago the following code block was removed in
>>>>editview.py, editwizard.py and schemadisplay.py (revision 29418):
>>>>
>>>>   def _setUpWidgets(self):
>>>>       adapted = self.schema(self.context)
>>>>       if adapted is not self.context:
>>>>           if not ILocation.providedBy(adapted):
>>>>               adapted = LocationProxy(adapted)
>>>>           adapted.__parent__ = self.context
>>>>       self.adapted = adapted
>>>>       setUpEditWidgets(self, self.schema, source=self.adapted,
>>>>                        names=self.fieldNames)
>>>>
>>>>As a consequence each trusted adapter class should now implement
>>>>ILocation
>>>
>>>
>>>One could, as an alternative, use an non-trusted adapter
>>>that is public and rely on the underlying object protection.
>>
>>We can only use trusted adapters for our use case.
>>
>>
>>>>that the TrustedAdapterFactory can set the location of adapter
>>>
>>>>instances correctly. Otherwise, only the global authentication is
>>>>involved and the edit view fails if any local principal tries to
>>>>edit a certain field (security.canWrite(source, name) in
>>>>zope.app.form.utility line 207).
>>>>
>>>>I would like to revert those changes. IMO a framework like the form
>>>>framework knows the context (location) and adapts that context to a
>>>>certain schema. If the following procedures depends on location
>>>>information, the framework itself should pass such informations in a
>>>>smart way. It's an unnecessary
>>>><se?lp=ende&p=/Mn4k.&search=unnecessary> expense
>>>><se?lp=ende&p=/Mn4k.&search=expense> to force all schema adapters
>>>>to implement ILocation: 
>>>>
>>>>- The solution using the location proxy seems fairly famillar
>>>> compared with the container framework and containment that does not
>>>> provide ILocation.
>>>
>>>
>>>Except that the object being location proxied is already security
>>>proxied.  Location proxies were not designed to proxy
>>>security-proxied objects.
>>
>>Theory:
>>I cannot assess this location-proxied securtiy proxy issue. Therefor I
>>have a question about the order of containment proxies:
>>1. contained proxy > security proxy > component
>>2. security proxy > contained proxy > component
>>So far I thought a component is created and proxied by their factory,
>>afterwards it is contained proxied by the container if it does not
>>provide ILocation. Therefor my statemets bases of 1.
>>
>>So for me it is not very obvious what the difference should be between
>>location proxied containement and location proxied trusted adapters:
>>location proxy > security proxy > trusted adapter
>>
>>Practise:
>>The form framework does not work using trusted adapters which do not
>>provide ILocation in combination with the local authentication
>>information. This raises an Unauthorized exception if a local
>>principal with enough privileges tries to access the edit view.
>>(Reason: Because the unlocatable adapter invoke the global
>>authentication only). 
>>
>>We have three oportunities:
>>a) status quo
>>b) location proxy or simalar derivates
>>c) extend security.canWrite(obj, name, context=None)
>>d) ...
>>
>>History:
>>Roger removed the location proxy code because at that time the
>>security information get lost using location proxies (Reason multiple
>>security proxies: security proxy > location proxy > security proxy >
>>trusted adapter). Afterward Garret fixed the proxy method of the
>>Checker class. Since that time proxied object will be only proxied if
>>their were not already proxied before (location proxy > security
>>proxy > trusted adapter) 
>>
>>
>>>>- An adapter that implements more than one interface cannot be
>>>> registered with the implicit adapts and implements informations.
>>>
>>>
>>>True.
>>>
>>>
>>>>- A regular schema does not extend ILocation therefore it is not
>>>> obvious to write an adapter implementing ILocation.
>>>
>>>
>>>True.
>>>
>>
>>If you answers the last two reasons with True then follows IMO a) is
>>a bug. 
>>
>>So we have to choose an other implementation alternative
>>b),  c) or d) would be ok for me.
>>
>>
>>>>Any objections?
>>>
>>>
>>>Yes. :)
>>>
>>>Why not simply use an untrusted public adapter?
>>
>>Use case:
>>We have within the site 's' an extendable containerish component 'f'
>>(Class Fasade) that should fasade its containment . Inside 'f' we can
>>put any component for example component 'any' (Class Any) providing
>>'IAny'.The IWriteContainer declaration of 's' requires the permission
>>'zope.ManageContent'. The IWriteContainer declaration of 'any'
>>requires a dedicated permission for example 'zope.ManageInside'.
>>
>>Now we should provide an edit-view for 'f' that invokes the contained
>>component 'any'. The edit-view should be accessable for local
>>principal of s which have the 'zope.ManageContent' permission.
>>
>>Our design goal tries to satify the following two targets:
>>- demeter's law (No direct access to 'any').
>>- different permission between inside and outside 'f'
>>
>>So we decided to access 'any' on the location of 'f' using an
>>AnyForFasade adapter.
>>IMO this adapter must be trusted to hide inside permission of 'any'.
>>
>>Regards,
>>Dominik Huber
> 
> 
> 


-- 
Jim Fulton           mailto:jim at zope.com       Python Powered!
CTO                  (540) 361-1714            http://www.python.org
Zope Corporation     http://www.zope.com       http://www.zope.org


More information about the Zope3-dev mailing list