def test_redirect_on_permission_error(self): """The post_process_request method can redirect during exception handling from an exception raised in process_request. """ self.env.enable_component(self.request_filter['RedirectOnPermError']) dispatcher = RequestDispatcher(self.env) req = MockRequest(self.env, method='GET', path_info='/perm-error') req.entered_process_request = False req.entered_post_process_request = False try: dispatcher.dispatch(req) except RequestDone: pass else: self.fail("RequestDone not raised") self.assertTrue(req.entered_process_request) self.assertTrue(req.entered_post_process_request)
def test_invalid_session_id_returns_fake_session(self): """Fake session is returned when session id is invalid.""" sid = 'a' * 23 + '$' # last char invalid, sid must be alphanumeric. req = MockRequest(self.env, path_info='/test-stub', cookie='trac_session=%s;' % sid) request_dispatcher = RequestDispatcher(self.env) request_dispatcher.set_default_callbacks(req) with self.assertRaises(RequestDone): request_dispatcher.dispatch(req) self.assertIn(('DEBUG', "Chosen handler is <Component trac.web.tests" ".main.TestStubRequestHandler>"), self.env.log_messages) self.assertIn(('WARNING', "can't retrieve session: " "Session ID must be alphanumeric."), self.env.log_messages) self.assertIsInstance(req.session, FakeSession) self.assertIsNone(req.session.sid) self.assertEqual('200 Ok', req.status_sent[0]) self.assertIn('<h1>Hello World</h1>', req.response_sent.getvalue())
def test_redirect_on_permission_error(self): """The post_process_request method can redirect during exception handling from an exception raised in process_request. """ class RedirectOnPermissionErrorStub(Component): implements(IRequestHandler, IRequestFilter) def match_request(self, req): return re.match(r'/perm-error', req.path_info) def process_request(self, req): req.entered_process_request = True raise PermissionError("No permission to view") def pre_process_request(self, req, handler): return handler def post_process_request(self, req, template, data, content_type): if (template, data, content_type) == (None, None, None): req.entered_post_process_request = True req.redirect(req.href('/redirect-target')) return template, data, content_type dispatcher = RequestDispatcher(self.env) req = MockRequest(self.env, method='GET', path_info='/perm-error') req.entered_process_request = False req.entered_post_process_request = False try: dispatcher.dispatch(req) except RequestDone: pass else: self.fail("RequestDone not raised") self.assertTrue(req.entered_process_request) self.assertTrue(req.entered_post_process_request)
class AuthenticateTestCase(unittest.TestCase): authenticators = {} request_handlers = [] @classmethod def setUpClass(cls): class UnsuccessfulAuthenticator(Component): implements(IAuthenticator) def authenticate(self, req): return None class RaisingAuthenticator(Component): implements(IAuthenticator) def authenticate(self, req): raise TracError("Bad attempt") class SuccessfulAuthenticator1(Component): implements(IAuthenticator) def authenticate(self, req): return 'user1' class SuccessfulAuthenticator2(Component): implements(IAuthenticator) def authenticate(self, req): return 'user2' class AuthenticateRequestHandler(Component): implements(IRequestHandler) def __init__(self): self.calls = 0 def match_request(self, req): return bool(req.perm) def process_request(self, req): self.calls += 1 req.authname req.send('') cls.authenticators['success1'] = SuccessfulAuthenticator1 cls.authenticators['success2'] = SuccessfulAuthenticator2 cls.authenticators['unsuccess'] = UnsuccessfulAuthenticator cls.authenticators['raising'] = RaisingAuthenticator cls.request_handlers = [AuthenticateRequestHandler] @classmethod def tearDownClass(cls): from trac.core import ComponentMeta for component in cls.authenticators.values() + cls.request_handlers: ComponentMeta.deregister(component) def setUp(self): self.env = EnvironmentStub(enable=('trac.web.main.*', )) self.req = MockRequest(self.env) self.request_dispatcher = RequestDispatcher(self.env) def test_authenticate_returns_first_successful(self): self.env.enable_component(self.authenticators['success1']) self.env.enable_component(self.authenticators['success2']) self.assertEqual(2, len(self.request_dispatcher.authenticators)) self.assertIsInstance(self.request_dispatcher.authenticators[0], self.authenticators['success1']) self.assertIsInstance(self.request_dispatcher.authenticators[1], self.authenticators['success2']) self.assertEqual('user1', self.request_dispatcher.authenticate(self.req)) def test_authenticate_skips_unsuccessful(self): self.env.enable_component(self.authenticators['unsuccess']) self.env.enable_component(self.authenticators['success1']) self.assertEqual(2, len(self.request_dispatcher.authenticators)) self.assertIsInstance(self.request_dispatcher.authenticators[0], self.authenticators['unsuccess']) self.assertIsInstance(self.request_dispatcher.authenticators[1], self.authenticators['success1']) self.assertEqual('user1', self.request_dispatcher.authenticate(self.req)) def test_authenticate_raises(self): self.env.enable_component(self.authenticators['raising']) self.env.enable_component(self.authenticators['success1']) self.assertEqual(2, len(self.request_dispatcher.authenticators)) self.assertIsInstance(self.request_dispatcher.authenticators[0], self.authenticators['raising']) self.assertIsInstance(self.request_dispatcher.authenticators[1], self.authenticators['success1']) self.assertEqual('anonymous', self.request_dispatcher.authenticate(self.req)) self.assertEqual(1, len(self.req.chrome['warnings'])) expected = "Can't authenticate using RaisingAuthenticator: " for level, message in self.env.log_messages: if expected in message.split('\n'): self.assertEqual('ERROR', level) break else: self.fail("Expected log message not found: \"%s\"" % expected) def test_authenticate_once(self): self.env.enable_component(self.authenticators['success1']) self.env.enable_component(self.request_handlers[0]) self.env.config.set('trac', 'default_handler', 'AuthenticateRequestHandler') self.request_dispatcher.set_default_callbacks(self.req) with self.assertRaises(RequestDone): self.request_dispatcher.dispatch(self.req) self.assertEqual(1, len(self.request_dispatcher.authenticators)) self.assertEqual(1, len(self.request_dispatcher.handlers)) self.assertEqual(1, self.request_dispatcher.handlers[0].calls)
if env.base_url: environ['trac.base_url'] = env.base_url # normal project(not "all") args = req.args req = Request(environ, start_response) req.args = args if env and not env.abs_href.base: env._abs_href = req.abs_href try: try: try: dispatcher = RequestDispatcher(env) dispatcher.dispatch(req) except RequestDone: pass return req._response or [] finally: if environ.get('wsgi.multithread', False): try: env.shutdown(threading._get_ident()) unreachable = gc.collect() except Exception, e: pass except HTTPException, e: env.log.warn(e) loadpaths = [] loadpaths.insert(0, os.path.dirname(__file__) + "/templates/")