[Zope3-Users] xmlrpc access with PAU
Shailesh Kumar
shaileshk at gmail.com
Sat Aug 18 09:29:47 EDT 2007
Hi,
apart from Session Credentials, I would also have Zope Realm
Basic-Auth in my credentials plugin (as the last one).
For the normal browser based access, the session credentials plugin
does the work.
For XMLRPC access, I fall back on 'Zope Realm Basic-Auth'.
The URL for XMLRPC server proxy would include login and password
information like:
objProxy = xmlrpclib.Server('http://login:password@localhost:8080/path/to/object")
objProxy.method(arguments)
Hope this helps.
With regards,
-Shailesh
On 8/18/07, C. H. <c at kikazi.com> wrote:
>
>
> 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
>
>
> _______________________________________________
> Zope3-users mailing list
> Zope3-users at zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users
>
More information about the Zope3-users
mailing list