[Zope3-Users] xmlrpc access with PAU

C. H. c at kikazi.com
Fri Aug 17 21:46:13 EDT 2007



I'm having difficulty accessing zope 3 objects using xmlrpc in my  
application, so
I've gone back into the 22auth example of Phillip von Weitershausen's  
excellent book and
made some simple modifications to elucidate my question in a simple  
environment
which I describe here:

created a zope 3 instance
    created a site named wcsite
       created a folder named rfolder
          created a recipe named r1
          created a recipe named r2

configured a PAU (at the wcsite level)
with
"No Challenge if Authenticated"
"Session Credentials"

created a Principal Folder named users

Access using a browser works fine. If I attempt to access an object  
that an unauthenticated
user has no access to, I'm presented with a login page and after  
logging in, I acquire and retain access
until I logout. That's good.

I modified Phillip's example python code worldcookery/xmlrpc/ 
recipe.py to authenticate using
a user=u1 and password=p1 (or so I think, hence my problem). That  
program is shown below.

To test:
First, in a browser I log in a manager and I edit the wcsite roles  
and permissions to grant the Site Manager role to All Users.

then run
displayandedit.py http://sasa.local:8080/wcsite/rfolder/r1

This works fine, so I'm able to locate and access and edit the recipe  
data

Next, (using a browser and logged in as the site manager)
I edit the wcsite roles and permissions to UNSET the Site Manager  
role to All Users and
grant  the "Visitor of the WorldCookery website" role to All Users.
Further, I edit wcsite/rfolder/r1 to grant the Site Manager role to  
user u1
So, the user r1 can read everything on the site but can only edit  
wcsite/rfolder/r1

Now, I rerun displayandedit.py http://sasa.local:8080/wcsite/rfolder/r1
and get an Unauthorized error:
xmlrpclib.ProtocolError: <ProtocolError for sasa.local:8080/wcsite/ 
rfolder/r1: 401 Unauthorized>

It is my belief that I should be able to provide xmlrpc access to the  
r1 user in the recipe.py code
but I can't figure out how. Can someone peruse the code below and  
suggest to me the
appropriate technique? The edit method is the one that I modified to  
attempt to provide access.
Thanks in advance.

=================Sample worldcookery/xmlrpc/recipe.py==================
import time
import xmlrpclib
from zope.schema import getFields
from zope.dublincore.interfaces import IZopeDublinCore
from zope.app.publisher.xmlrpc import XMLRPCView
from zope.component import getUtility
from zope.app.security.interfaces import IAuthentication
from zope.app.authentication.interfaces import IPluggableAuthentication

from worldcookery.interfaces import IRecipe

def to_unicode(string):
     if isinstance(string, unicode):
         return string
     return string.decode('utf-8')

class RecipeView(XMLRPCView):

     def info(self):
         return dict((field, getattr(self.context, field))
                     for field in getFields(IRecipe)
                     if field not in ('__parent__', '__name__'))

     def dublincore_info(self):
         dc = IZopeDublinCore(self.context)
         info = dict((field, getattr(dc, field))
                     for field in getFields(IZopeDublinCore))
         for name in ('effective', 'created', 'expires', 'modified'):
             if info[name]:
                 epochtime = time.mktime(info[name].timetuple())
                 info[name] = xmlrpclib.DateTime(epochtime)
             else:
                 info[name] = ''
         return info

     def edit(self, info, user, password):

         edit_return = ""
         pau = getUtility(IAuthentication)
         #
         # make sure there is an authentication utility
         #
         if not IPluggableAuthentication.providedBy(pau):
             edit_return = "# ERROR: No Pluggable Authentication  
Utility instance."
             return edit_return
         else:
             edit_return = "\n" +  "# found a Pluggable  
Authentication Utility instace named " + pau.__name__
         #
         # get the authenticator plugin and authenticate credentials
         #
         for name, plugin in pau.getAuthenticatorPlugins():
             auth_creds =  plugin.authenticateCredentials({'login':  
user, 'password': password})
             edit_return = edit_return + "\n#    authenticated user:"  
+ auth_creds.login + " title:" + auth_creds.title

         context = self.context
         context.name = to_unicode(info['name'])
         context.ingredients = \
             [to_unicode(ingr) for ingr in info['ingredients']]
         context.tools = [to_unicode(tool) for tool in info['tools']]
         context.time_to_cook = info['time_to_cook']
         context.description = to_unicode(info['description'])

         edit_return = edit_return + "\n" +  "# Object updated  
successfully"
         return edit_return




More information about the Zope3-users mailing list