[Zope3-dev] Form framework, adapters and pau

Garrett Smith garrett at mojave-corp.com
Mon Apr 4 19:45:29 EDT 2005


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

 -- 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



More information about the Zope3-dev mailing list