def test_invalid_log_configuration_not_saved(self): """Invalid log configuration is reverted and not saved.""" logging_config = self.env.config['logging'] log_type = logging_config.get('log_type') log_file = logging_config.get('log_file') log_level = logging_config.get('log_level') req = MockRequest(self.env, path_info='/admin/general/logging', method='POST', args={ 'log_type': 'file', 'log_level': log_level, 'log_file': '/path/to/invalid/file' }) mod = AdminModule(self.env) self.assertTrue(mod.match_request(req)) self.assertRaises(RequestDone, mod.process_request, req) self.assertEqual(1, len(req.chrome['warnings'])) self.assertIn('Changes not saved. Logger configuration error:', req.chrome['warnings'][0]) self.assertNotEqual('file', log_type) self.assertEqual(log_type, logging_config.get('log_type')) self.assertEqual(log_level, logging_config.get('log_level')) self.assertEqual(log_file, logging_config.get('log_file'))
def test_change_log_file(self): """Change the log file.""" logging_config = self.env.config['logging'] log_type = 'file' logging_config.set('log_type', log_type) log_level = logging_config.get('log_level') log_file = logging_config.get('log_file') req = MockRequest(self.env, path_info='/admin/general/logging', method='POST', args={ 'log_type': log_type, 'log_level': log_level, 'log_file': 'trac.log.1' }) mod = AdminModule(self.env) self.assertTrue(mod.match_request(req)) self.assertRaises(RequestDone, mod.process_request, req) self.assertEqual(0, len(req.chrome['warnings'])) self.assertEqual(log_type, logging_config.get('log_type')) self.assertEqual(log_level, logging_config.get('log_level')) self.assertNotEqual('trac.log.1', log_file) self.assertEqual('trac.log.1', logging_config.get('log_file'))
def test_log_type_none(self): """When log type is none, TracError is not raised even if log level and log file in the parameters are missing. """ logging_config = self.env.config['logging'] logging_config.set('log_type', 'file') logging_config.set('log_level', 'WARN') logging_config.set('log_file', os.devnull) mod = AdminModule(self.env) req = MockRequest(self.env, path_info='/admin/general/logging') self.assertTrue(mod.match_request(req)) data = mod.process_request(req)[1] self.assertEqual('WARNING', data['log']['level']) self.assertIn('WARNING', data['log']['levels']) req = MockRequest(self.env, path_info='/admin/general/logging', method='POST', args={'log_type': 'none'}) self.assertTrue(mod.match_request(req)) self.assertRaises(RequestDone, mod.process_request, req) self.assertEqual('none', logging_config.get('log_type')) self.assertEqual('WARN', logging_config.get('log_level')) self.assertEqual(os.devnull, logging_config.get('log_file'))
def test_complete_milestone_retarget_tickets(self): name = 'milestone1' target = 'milestone2' insert_ticket(self.env, summary='Ticket 1', milestone=name) insert_ticket(self.env, summary='Ticket 2', milestone=name) ps = PermissionSystem(self.env) ps.grant_permission('user1', 'TICKET_ADMIN') ps.grant_permission('user1', 'MILESTONE_MODIFY') req = MockRequest(self.env, authname='user1', method='POST', path_info='/admin/ticket/milestones/%s' % name, args=dict(action='edit', save='Submit changes', name=name, description='', retarget='on', target=target, comment='', completed='on', completeddate='May 20, 2020, 9:07:52 PM')) mod = AdminModule(self.env) self.assertTrue(mod.match_request(req)) with self.assertRaises(RequestDone): mod.process_request(req) self.assertEqual(2, len(req.chrome['notices'])) self.assertEqual( 'The open tickets associated with milestone "milestone1" ' 'have been retargeted to milestone "milestone2".', req.chrome['notices'][0]) self.assertEqual('Your changes have been saved.', req.chrome['notices'][1]) self.assertEqual([], req.chrome['warnings']) self.assertEqual(['303 See Other'], req.status_sent) self.assertEqual('http://example.org/trac.cgi/admin/ticket/milestones', req.headers_sent['Location']) self.assertTrue(Milestone(self.env, name).is_completed) self.assertEqual(target, Ticket(self.env, 1)['milestone']) self.assertEqual(target, Ticket(self.env, 2)['milestone'])
def test_invalid_log_type_raises(self): """Invalid log type raises TracError.""" req = MockRequest(self.env, path_info='/admin/general/logging', method='POST', args={'log_type': 'invalid'}) mod = AdminModule(self.env) self.assertTrue(mod.match_request(req)) self.assertRaises(TracError, mod.process_request, req)
def test_empty_log_file_raises(self): """Empty log file raises TracError.""" req = MockRequest(self.env, path_info='/admin/general/logging', method='POST', args={'log_type': 'file', 'log_level': 'DEBUG', 'log_file': ''}) mod = AdminModule(self.env) self.assertTrue(mod.match_request(req)) self.assertRaises(TracError, mod.process_request, req)
def post_process_request(self, req, template, data, content_type): if template is None: # Some kind of exception in progress if req.authname != 'anonymous': # Already logged in return template, data, content_type exctype, exc = sys.exc_info()[0:2] if issubclass(exctype, PermissionError): req.redirect(req.href.login()) try: if req.path_info.startswith('/admin') and \ not AdminModule(self.env)._get_panels(req)[0]: # No admin panels available, assume user should log in. req.redirect(req.href.login()) except RequestDone: # Reraise on redirect raise except Exception: # It is possible the error we got called on happened inside # the _get_panels call. Be sure to ignore it. pass return template, data, content_type
def test_render_admin_panel(self): """GET request for admin panel.""" req = MockRequest(self.env, path_info='/admin/general/logging', method='GET') mod = AdminModule(self.env) self.assertTrue(mod.match_request(req)) data = mod.process_request(req)[1] self.assertEqual('none', data['log']['type']) self.assertEqual(['none', 'stderr', 'file', 'syslog', 'eventlog'], [t['name'] for t in data['log']['types']]) self.assertEqual('DEBUG', data['log']['level']) self.assertEqual(['CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG'], data['log']['levels']) self.assertEqual('trac.log', data['log']['file']) self.assertEqual(self.env.log_dir, data['log']['dir'])
def _get_panels(self, req): if isinstance(self.env, ProductEnvironment): panels, providers = AdminModule(self.env)._get_panels(req) # Filter based on ACLs panels = [p for p in panels if self._check_panel(p[0], p[2])] # providers = dict([k, p] for k, p in providers.iteritems() # if self._check_panel(*k)) return panels, providers else: return [], []
def pre_process_request(self, req, handler): """Intercept admin requests in product context if `TRAC_ADMIN` expectations are not met. """ if isinstance(self.env, ProductEnvironment) and \ handler is AdminModule(self.env) and \ not req.perm.has_permission('TRAC_ADMIN') and \ req.perm.has_permission('PRODUCT_ADMIN'): # Intercept admin request return self return handler
def post_process_request(self, req, template, data, content_type): if not self.redirect_login: return template, data, content_type if template is None: # Some kind of exception in progress if req.authname != 'anonymous': # Already logged in return template, data, content_type ref_url = req.base_url + req.path_info if req.query_string: ref_url = ref_url + "?" + req.query_string exctype, exc = sys.exc_info()[0:2] if exctype is None: self.log.debug("template and exctype both None for request " "to %s: %s" % (ref_url, pformat(req.environ))) return template, data, content_type login_url = req.href.login(referer=ref_url) if issubclass(exctype, PermissionError): req.redirect(login_url) try: if req.path_info.startswith('/admin') and \ not AdminModule(self.env)._get_panels(req)[0]: # No admin panels available, assume user should log in. req.redirect(login_url) except RequestDone: # Reraise on redirect raise except Exception: # It is possible the error we got called on happened inside # the _get_panels call. Be sure to ignore it. pass return template, data, content_type