47 UnknownEid, AuthenticationError, ExecutionError, |
47 UnknownEid, AuthenticationError, ExecutionError, |
48 BadConnectionId, Unauthorized, ValidationError, |
48 BadConnectionId, Unauthorized, ValidationError, |
49 UniqueTogetherError, onevent) |
49 UniqueTogetherError, onevent) |
50 from cubicweb import cwvreg, schema, server |
50 from cubicweb import cwvreg, schema, server |
51 from cubicweb.server import ShuttingDown, utils, hook, querier, sources |
51 from cubicweb.server import ShuttingDown, utils, hook, querier, sources |
52 from cubicweb.server.session import Session, InternalSession, InternalManager |
52 from cubicweb.server.session import Session, InternalManager |
53 from cubicweb.server.ssplanner import EditedEntity |
53 from cubicweb.server.ssplanner import EditedEntity |
54 |
54 |
55 NO_CACHE_RELATIONS = set( [('owned_by', 'object'), |
55 NO_CACHE_RELATIONS = set( [('owned_by', 'object'), |
56 ('created_by', 'object'), |
56 ('created_by', 'object'), |
57 ('cw_source', 'object'), |
57 ('cw_source', 'object'), |
625 if not rschema.meta) |
625 if not rschema.meta) |
626 cwuserattrs = self._cwuser_attrs |
626 cwuserattrs = self._cwuser_attrs |
627 for k in chain(fetch_attrs, query_attrs): |
627 for k in chain(fetch_attrs, query_attrs): |
628 if k not in cwuserattrs: |
628 if k not in cwuserattrs: |
629 raise Exception('bad input for find_user') |
629 raise Exception('bad input for find_user') |
630 with self.internal_session() as session: |
630 with self.internal_cnx() as cnx: |
631 varmaker = rqlvar_maker() |
631 varmaker = rqlvar_maker() |
632 vars = [(attr, varmaker.next()) for attr in fetch_attrs] |
632 vars = [(attr, varmaker.next()) for attr in fetch_attrs] |
633 rql = 'Any %s WHERE X is CWUser, ' % ','.join(var[1] for var in vars) |
633 rql = 'Any %s WHERE X is CWUser, ' % ','.join(var[1] for var in vars) |
634 rql += ','.join('X %s %s' % (var[0], var[1]) for var in vars) + ',' |
634 rql += ','.join('X %s %s' % (var[0], var[1]) for var in vars) + ',' |
635 rset = session.execute(rql + ','.join('X %s %%(%s)s' % (attr, attr) |
635 rset = cnx.execute(rql + ','.join('X %s %%(%s)s' % (attr, attr) |
636 for attr in query_attrs), |
636 for attr in query_attrs), |
637 query_attrs) |
637 query_attrs) |
638 return rset.rows |
638 return rset.rows |
639 |
639 |
640 def new_session(self, login, **kwargs): |
640 def new_session(self, login, **kwargs): |
641 """open a new session for a given user |
641 """open a new session for a given user |
642 |
642 |
708 if session.timestamp < mintime: |
708 if session.timestamp < mintime: |
709 self.close(session.sessionid) |
709 self.close(session.sessionid) |
710 nbclosed += 1 |
710 nbclosed += 1 |
711 return nbclosed |
711 return nbclosed |
712 |
712 |
713 @deprecated("[3.19] use internal_cnx now\n" |
|
714 "(Beware that integrity hook are now enabled by default)") |
|
715 def internal_session(self, cnxprops=None, safe=False): |
|
716 """return a dbapi like connection/cursor using internal user which have |
|
717 every rights on the repository. The `safe` argument is a boolean flag |
|
718 telling if integrity hooks should be activated or not. |
|
719 |
|
720 /!\ the safe argument is False by default. |
|
721 |
|
722 *YOU HAVE TO* commit/rollback or close (rollback implicitly) the |
|
723 session once the job's done, else you'll leak connections set up to the |
|
724 time where no one is available, causing irremediable freeze... |
|
725 """ |
|
726 session = InternalSession(self, cnxprops) |
|
727 if not safe: |
|
728 session.disable_hook_categories('integrity') |
|
729 session.disable_hook_categories('security') |
|
730 session._cnx.ctx_count += 1 |
|
731 session.set_cnxset() |
|
732 return session |
|
733 |
|
734 @contextmanager |
713 @contextmanager |
735 def internal_cnx(self): |
714 def internal_cnx(self): |
736 """Context manager returning a Connection using internal user which have |
715 """Context manager returning a Connection using internal user which have |
737 every access rights on the repository. |
716 every access rights on the repository. |
738 |
717 |
739 Beware that unlike the older :meth:`internal_session`, internal |
718 Beware that unlike the older :meth:`internal_session`, internal |
740 connections have all hooks beside security enabled. |
719 connections have all hooks beside security enabled. |
741 """ |
720 """ |
742 with InternalSession(self) as session: |
721 with Session(InternalManager(), self) as session: |
743 with session.new_cnx() as cnx: |
722 with session.new_cnx() as cnx: |
744 with cnx.security_enabled(read=False, write=False): |
723 with cnx.security_enabled(read=False, write=False): |
745 with cnx.ensure_cnx_set: |
724 with cnx.ensure_cnx_set: |
746 yield cnx |
725 yield cnx |
747 |
726 |