# HG changeset patch # User Pierre-Yves David # Date 1372090731 -7200 # Node ID fa5bc8aef7ed6c1afbb6f358c8574c7274f0710f # Parent e86fdab3d2961d8478ad66fdfe57afc7937e11c3 [repoapi] add an anonymous_cnx function This function return an anonymous ClientConnection. It aims to replace ``dbapi.anonymous_session``. diff -r e86fdab3d296 -r fa5bc8aef7ed repoapi.py --- a/repoapi.py Fri Jun 21 16:40:12 2013 +0200 +++ b/repoapi.py Mon Jun 24 18:18:51 2013 +0200 @@ -18,7 +18,7 @@ """Official API to access the content of a repository """ from cubicweb.utils import parse_repo_uri -from cubicweb import ConnectionError, ProgrammingError +from cubicweb import ConnectionError, ProgrammingError, AuthenticationError from uuid import uuid4 from contextlib import contextmanager from cubicweb.req import RequestSessionBase @@ -87,6 +87,21 @@ # this is something to consider once we have proper server side Connection. return ClientConnection(session, autoclose_session=True) +def anonymous_cnx(repo): + """return a ClientConnection for Anonymous user. + + The ClientConnection is associated to a new Session object that will be + closed when the ClientConnection is closed. + + raises an AuthenticationError if anonymous usage is not allowed + """ + anoninfo = getattr(repo.config, 'anonymous_user', lambda: None)() + if anoninfo is None: # no anonymous user + raise AuthenticationError('anonymous access is not authorized') + anon_login, anon_password = anoninfo + # use vreg's repository cache + return connect(repo, anon_login, password=anon_password) + def _srv_cnx_func(name): """Decorate ClientConnection method blindly forward to Connection THIS TRANSITIONAL PURPOSE diff -r e86fdab3d296 -r fa5bc8aef7ed test/unittest_repoapi.py --- a/test/unittest_repoapi.py Fri Jun 21 16:40:12 2013 +0200 +++ b/test/unittest_repoapi.py Mon Jun 24 18:18:51 2013 +0200 @@ -21,7 +21,7 @@ from cubicweb.devtools.testlib import CubicWebTC from cubicweb import ProgrammingError -from cubicweb.repoapi import ClientConnection, connect +from cubicweb.repoapi import ClientConnection, connect, anonymous_cnx class REPOAPITC(CubicWebTC): @@ -74,6 +74,15 @@ rset = clt_cnx.execute('Any X WHERE X is CWUser') self.assertTrue(rset) + def test_anonymous_connect(self): + """check that you can get anonymous connection when the data exist""" + + clt_cnx = anonymous_cnx(self.repo) + self.assertEqual('anon', clt_cnx.user.login) + with clt_cnx: + rset = clt_cnx.execute('Any X WHERE X is CWUser') + self.assertTrue(rset) +