From c7b5b6b9e961d26ef8818cdf7b29fd831c4410fd Mon Sep 17 00:00:00 2001 From: jomae Date: Sun, 26 May 2024 04:14:14 +0000 Subject: [PATCH] 1.6.1dev: fix blame view not working when repository name has meta characters (closes #13754) git-svn-id: http://trac.edgewall.org/intertrac/log:/branches/1.6-stable@17806 af82e41b-90c4-0310-8c96-b1721e28e2e2 --- trac/versioncontrol/templates/browser.html | 2 +- trac/versioncontrol/web_ui/tests/browser.py | 39 +++++++++++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/trac/versioncontrol/templates/browser.html b/trac/versioncontrol/templates/browser.html index aabdc428dd..9c98c081b8 100644 --- a/trac/versioncontrol/templates/browser.html +++ b/trac/versioncontrol/templates/browser.html @@ -63,7 +63,7 @@ }); # elif file: # if file.annotate == 'blame': - enableBlame("${href.changeset()}/", "${reponame}", "${path}"); + enableBlame(${to_json(href.changeset() + '/')|safe}, ${to_json(reponame)|safe}, ${to_json(path)|safe}); # endif $('#preview table.code').enableCollapsibleColumns( $('#preview table.code thead th.content')); diff --git a/trac/versioncontrol/web_ui/tests/browser.py b/trac/versioncontrol/web_ui/tests/browser.py index b08ca42c40..78066d8daf 100644 --- a/trac/versioncontrol/web_ui/tests/browser.py +++ b/trac/versioncontrol/web_ui/tests/browser.py @@ -24,10 +24,11 @@ from trac.util.datefmt import utc from trac.util.text import to_utf8 from trac.versioncontrol.api import ( - Changeset, DbRepositoryProvider, IRepositoryConnector, Node, NoSuchNode, - Repository, RepositoryManager) + Changeset, DbRepositoryProvider, IRepositoryConnector, Node, + NoSuchChangeset, NoSuchNode, Repository, RepositoryManager) from trac.versioncontrol.web_ui.browser import BrowserModule, IPropertyRenderer from trac.web.api import RequestDone +from trac.web.chrome import Chrome from trac.web.tests.api import RequestHandlerPermissionsTestCaseBase @@ -40,6 +41,7 @@ def get_supported_types(self): def get_repository(self, repos_type, repos_dir, params): t = datetime(2017, 3, 31, 12, 34, 56, tzinfo=utc) + youngest_rev = 1 def get_changeset(rev): return Mock(Changeset, repos, rev, 'message', 'author', t) @@ -74,13 +76,24 @@ def get_node(path, rev): get_last_modified=lambda: t) return node + def normalize_rev(rev): + try: + r = int(rev) + except: + pass + else: + if 0 <= r <= youngest_rev: + return r + raise NoSuchChangeset(rev) + if params['name'] == 'raise': raise TracError("") else: repos = Mock(Repository, params['name'], params, self.log, - get_youngest_rev=lambda: 1, + get_youngest_rev=lambda: youngest_rev, get_changeset=get_changeset, get_node=get_node, + normalize_rev=normalize_rev, previous_rev=lambda rev, path='': None, next_rev=lambda rev, path='': None) return repos @@ -258,6 +271,26 @@ def test_node_with_file_view(self): self.assertEqual('repository', e.resource.parent.realm) self.assertEqual('', e.resource.parent.id) + def test_node_with_blame_view(self): + provider = DbRepositoryProvider(self.env) + provider.add_repository('metachars-&<>"\'-', '/', 'mock') + self.grant_perm('anonymous', 'BROWSER_VIEW', 'FILE_VIEW') + + req = MockRequest(self.env, authname='anonymous', + path_info='/browser/metachars-&<>"\'-/-&<>"\'-file', + args={'annotate': 'blame'}) + rv = self.process_request(req) + fragment = str(Chrome(self.env).render_fragment(req, *rv)) + for line in fragment.splitlines(): + if ' enableBlame(' in line: + break + else: + self.fail('Missing enableBlame(...) line') + self.assertEqual(r'''enableBlame("/trac.cgi/changeset/"''' + r''', "metachars-\u0026\u003c\u003e\"'-"''' + r''', "-\u0026\u003c\u003e\"'-file");''', + line.strip()) + def test_node_in_allowed_repos_with_file_view(self): self.grant_perm('anonymous', 'BROWSER_VIEW', 'FILE_VIEW')