Re: [Zope3-Users] Re: how to know if a principal has the right permissions

2006-08-28 Thread Philipp von Weitershausen
Lorenzo Gil Sanchez wrote:
 El dom, 27-08-2006 a las 23:53 +0200, Philipp von Weitershausen
 escribió:
 
 zope.security.canAccess
 zope.security.canWrite
 
 Nice, I didn't know about those and I ended writing my own solution:
 
 def canAdd(self):
 interaction = ZopeSecurityPolicy()
 interaction.add(Participation(self.request.principal))

Ack. Just get the current interaction with
zope.security.management.getInteraction(). With this code you're
hard-wiring yourself to the security policy in zope.app.securitypolicy.

 return interaction.checkPermission(zope.ManageContent,
 self.context)
 
 I'm trying to know if the user can add an item to a container. I don't
 know how to do that with zope.security.canWrite. I tried with
 
 zope.security.canWrite(self.context, '__data') 
 
 since my container inherits from SampleContainer and the '__data'
 attribute is a dictionariy like objet where the children are stored. I
 get a ForbiddenAttribute exception with that code.

Right. Because you're not supposed to poke at __data. The two
underscores should scare you off!

By the way, this is a rule of thumb:

Whenever you get ForbiddenAttribute errors, you're doing something
wrong. Either:

  1. you're missing security declarations

  2. you're accessing something that purposely has no security
 declarations because you're not supposed to access it.

Most of the times when newbies hit ForbiddenAttribute, it's #1. In your
case it's #2.

If you would take advantage of interfaces and look at IContainer, you
would see that contianers are like mappings (=dictionaries). Therefore,
in order to add something in the container, you need to be able to
access the __setitem__ method. Check for that and you'll be all set.

Philipp
___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


Re: [Zope3-Users] Re: how to know if a principal has the right permissions

2006-08-28 Thread Philipp von Weitershausen
Lorenzo Gil Sanchez wrote:
 Right. Because you're not supposed to poke at __data. The two
 underscores should scare you off!

 By the way, this is a rule of thumb:

 Whenever you get ForbiddenAttribute errors, you're doing something
 wrong. Either:

   1. you're missing security declarations

   2. you're accessing something that purposely has no security
  declarations because you're not supposed to access it.

 Most of the times when newbies hit ForbiddenAttribute, it's #1. In your
 case it's #2.

 If you would take advantage of interfaces and look at IContainer, you
 would see that contianers are like mappings (=dictionaries). Therefore,
 in order to add something in the container, you need to be able to
 access the __setitem__ method. Check for that and you'll be all set.

 Sorry, my fault: I forgot to mention that I *did try*
 zope.security.canWrite(obj, '__setitem__') before and it always returns
 False, no matter if I try with the right user.

Why canWrite? You're not trying to *set* __setitem__! You should be
checking for canAccess(container, '__setitem__'). People who want to add
stuff to a container want to *call* container.__setitem__(...). I
suggest you read up on the Python mapping API.

 That's why I started to poke with '__data' which I know was going to be
 a hack. By the way, by your rule of thumb I should not play with
 '__setitem__' neiter (e.g. it has four underscores).

You did not understand my rule of thumb. Read the rule of thumb again
and check whether it contains any mentionings of underscores. It
doesn't. It's about ForbiddenAttribute errors, not underscores. And if
you'd know your Python, you'd know __setitem__ is a standard mapping API
method.

Philipp
___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


Re: [Zope3-Users] Re: how to know if a principal has the right permissions

2006-08-28 Thread Lorenzo Gil Sanchez
El lun, 28-08-2006 a las 20:49 +0200, Philipp von Weitershausen
escribió:
 Lorenzo Gil Sanchez wrote:
  Right. Because you're not supposed to poke at __data. The two
  underscores should scare you off!
 
  By the way, this is a rule of thumb:
 
  Whenever you get ForbiddenAttribute errors, you're doing something
  wrong. Either:
 
1. you're missing security declarations
 
2. you're accessing something that purposely has no security
   declarations because you're not supposed to access it.
 
  Most of the times when newbies hit ForbiddenAttribute, it's #1. In your
  case it's #2.
 
  If you would take advantage of interfaces and look at IContainer, you
  would see that contianers are like mappings (=dictionaries). Therefore,
  in order to add something in the container, you need to be able to
  access the __setitem__ method. Check for that and you'll be all set.
 
  Sorry, my fault: I forgot to mention that I *did try*
  zope.security.canWrite(obj, '__setitem__') before and it always returns
  False, no matter if I try with the right user.
 
 Why canWrite? You're not trying to *set* __setitem__! You should be
 checking for canAccess(container, '__setitem__'). People who want to add
 stuff to a container want to *call* container.__setitem__(...). I
 suggest you read up on the Python mapping API.
 

Oh! that was a stupid error indeed :(

Using canAccess now just does the opposite: it always returns True. I
guess that's because when I register my container in the ZCML file I'm
using zope.Public for the whole interface. I should split my interface
in two interfaces, one for read-only attributes and one for write
attributes, like the IContainer does.

So instead of inheriting my INewsFolder interface from IContainer I
inherit from IReadContainer and I explicit say in the configure.zcml
that it also implements IWriteContainer. That way I can specify
different permission for read and write attributes.

Thanks a lot for your answers Philipp

Lorenzo

___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users


Re: [Zope3-Users] Re: how to know if a principal has the right permissions

2006-08-28 Thread Philipp von Weitershausen
Lorenzo Gil Sanchez wrote:
 El lun, 28-08-2006 a las 20:49 +0200, Philipp von Weitershausen
 escribió:
 Lorenzo Gil Sanchez wrote:
 Right. Because you're not supposed to poke at __data. The two
 underscores should scare you off!

 By the way, this is a rule of thumb:

 Whenever you get ForbiddenAttribute errors, you're doing something
 wrong. Either:

   1. you're missing security declarations

   2. you're accessing something that purposely has no security
  declarations because you're not supposed to access it.

 Most of the times when newbies hit ForbiddenAttribute, it's #1. In your
 case it's #2.

 If you would take advantage of interfaces and look at IContainer, you
 would see that contianers are like mappings (=dictionaries). Therefore,
 in order to add something in the container, you need to be able to
 access the __setitem__ method. Check for that and you'll be all set.

 Sorry, my fault: I forgot to mention that I *did try*
 zope.security.canWrite(obj, '__setitem__') before and it always returns
 False, no matter if I try with the right user.
 Why canWrite? You're not trying to *set* __setitem__! You should be
 checking for canAccess(container, '__setitem__'). People who want to add
 stuff to a container want to *call* container.__setitem__(...). I
 suggest you read up on the Python mapping API.

 
 Oh! that was a stupid error indeed :(
 
 Using canAccess now just does the opposite: it always returns True. I
 guess that's because when I register my container in the ZCML file I'm
 using zope.Public for the whole interface. I should split my interface
 in two interfaces, one for read-only attributes and one for write
 attributes, like the IContainer does.
 
 So instead of inheriting my INewsFolder interface from IContainer I
 inherit from IReadContainer and I explicit say in the configure.zcml
 that it also implements IWriteContainer. That way I can specify
 different permission for read and write attributes.

Or, you leave INewsFolder as it is and only use IReadContainer and
IWriteContainer in the ZCML declarations. That's what I would do. If you
have my book, check the Containers chapter, it's done like this there.

Philipp

___
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users