#11302 closed defect (fixed)
error with relative link to parent wiki page from an attachment description
| Reported by: | Christian Boos | Owned by: | Christian Boos |
|---|---|---|---|
| Priority: | normal | Milestone: | 1.0.2 |
| Component: | wiki system | Version: | 1.0-stable |
| Severity: | normal | Keywords: | |
| Cc: | Ryan J Ollos | Branch: | |
| Release Notes: |
Fix a glitch making it impossible to edit a page if a description of an attachment contained some forms of relative link. |
||
| API Changes: | |||
| Internal Changes: | |||
Description
How to Reproduce
While doing a GET operation on /wiki/WikiStart, Trac issued an internal error.
The link in question had the form [./@1#TheId].
I stumbled upon this error once I started to edit the page. The attachment operation itself and the wiki view was working fine.
Request parameters:
{'action': u'edit', 'page': u'WikiStart'}
User agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.37 Safari/537.36
System Information
System information not available
Enabled Plugins
Plugin information not available
Python Traceback
Traceback (most recent call last):
File "c:\Trac\repos\1.0-stable\trac\web\main.py", line 497, in _dispatch_request
dispatcher.dispatch(req)
File "c:\Trac\repos\1.0-stable\trac\web\main.py", line 233, in dispatch
content_type)
File "c:\Trac\repos\1.0-stable\trac\web\chrome.py", line 1029, in render_template
encoding='utf-8')
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\core.py", line 183, in render
return encode(generator, method=method, encoding=encoding, out=out)
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\output.py", line 58, in encode
for chunk in iterator:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\output.py", line 350, in __call__
for kind, data, pos in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\output.py", line 829, in __call__
for kind, data, pos in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\output.py", line 669, in __call__
for kind, data, pos in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\output.py", line 774, in __call__
for kind, data, pos in chain(stream, [(None, None, None)]):
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\output.py", line 594, in __call__
for ev in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\core.py", line 288, in _ensure
for event in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\core.py", line 288, in _ensure
for event in stream:
File "c:\Trac\repos\1.0-stable\trac\web\chrome.py", line 1167, in _strip_accesskeys
for kind, data, pos in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\core.py", line 288, in _ensure
for event in stream:
File "c:\Trac\repos\1.0-stable\trac\web\chrome.py", line 1156, in _generate
for kind, data, pos in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\base.py", line 617, in _include
for event in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\markup.py", line 378, in _match
ctxt, start=idx + 1, **vars):
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\markup.py", line 378, in _match
ctxt, start=idx + 1, **vars):
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\markup.py", line 326, in _match
for event in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\base.py", line 557, in _flatten
for kind, data, pos in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\core.py", line 288, in _ensure
for event in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\path.py", line 588, in _generate
subevent = next()
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\base.py", line 617, in _include
for event in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\markup.py", line 315, in _strip
event = next()
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\base.py", line 557, in _flatten
for kind, data, pos in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\core.py", line 288, in _ensure
for event in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\path.py", line 588, in _generate
subevent = next()
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\base.py", line 617, in _include
for event in stream:
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\markup.py", line 315, in _strip
event = next()
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\base.py", line 577, in _flatten
result = _eval_expr(data, ctxt, vars)
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\base.py", line 289, in _eval_expr
retval = expr.evaluate(ctxt)
File "c:\Dev\Python273\lib\site-packages\genshi-0.6.1-py2.7.egg\genshi\template\eval.py", line 178, in evaluate
return eval(self.code, _globals, {'__data__': data})
File "c:\Trac\repos\1.0-stable\trac\templates\list_of_attachments.html", line 34, in <Expression u'wiki_to_oneliner(context, attachment.description)'>
<q py:if="compact and attachment.description">${wiki_to_oneliner(context, attachment.description)}</q>
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 1553, in format_to_oneliner
return InlineHtmlFormatter(env, context, wikidom).generate(shorten)
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 1529, in generate
shorten)
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 1385, in format
result = re.sub(self.wikiparser.rules, self.replace, result)
File "c:\Dev\Python273\lib\re.py", line 151, in sub
return _compile(pattern, flags).sub(repl, string, count)
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 1201, in replace
replacement = self.handle_match(fullmatch)
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 1197, in handle_match
return internal_handler(match, fullmatch)
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 591, in _lhref_formatter
return self._make_lhref_link(match, fullmatch, rel, ns, target, label)
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 621, in _make_lhref_link
label, fullmatch)
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 656, in _make_link
return self._make_intertrac_link(ns, target, label) or \
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 661, in _make_intertrac_link
res = self.get_intertrac_url(ns, target)
File "c:\Trac\repos\1.0-stable\trac\wiki\formatter.py", line 667, in get_intertrac_url
url = intertrac.get(ns + '.url')
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
This happens because context in the template data was the default (toplevel) context, and that was what was used by the list_of_attachments included template.
Fix and test follows.
Attachments (0)
Change History (8)
comment:1 by , 12 years ago
| Status: | new → assigned |
|---|
follow-up: 3 comment:2 by , 12 years ago
This has probably nothing to do with this bug, but is the trailing / necessary? I.e. isn't the canonical representation of that link [.@1#TheId]?
comment:3 by , 12 years ago
Replying to rblank:
… isn't the canonical representation of that link
[.@1#TheId]?
That would be another bug… [.@1#TheId] isn't detected as a relative wiki link, whereas [[.@1#TheId]] is.
Note
Note that [.#Note note] (note) and even [.?version=3#Note note at version 3] (note at version 3) work not only for Wiki pages but also for tickets.
comment:4 by , 12 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
comment:5 by , 12 years ago
# self._tester.go_to_wiki(pagename + '?action=edit') # tc.url has trouble with that...
In the time since you first generated your patch, I encountered and committed a change for that issue in [12152]. Now, the following refactoring is possible:
-
trac/wiki/tests/functional.py
diff --git a/trac/wiki/tests/functional.py b/trac/wiki/tests/functional.py index a021cae..df008ae 100755
a b class RegressionTestTicket10957(FunctionalTwillTestCaseSet 316 316 class RegressionTestTicket11302(FunctionalTwillTestCaseSetup): 317 317 def runTest(self): 318 318 """Test for regression of http://trac.edgewall.org/ticket/11302""" 319 pagename = random_unique_camel() 320 self._tester.create_wiki_page(pagename) 319 pagename = self._tester.create_wiki_page() 321 320 attachment = self._tester.attach_file_to_wiki( 322 321 pagename, description="illustrates [./@1#point1]") 323 # self._tester.go_to_wiki(pagename + '?action=edit') 324 # tc.url has trouble with that... 325 tc.go(self._tester.url + '/wiki/' + pagename + '?action=edit') 322 self._tester.go_to_wiki(pagename + '?action=edit') 326 323 tc.find(r'illustrates <a class="wiki"' 327 324 r' href="/wiki/%s\?version=1#point1">@1</a>' % pagename)
If no issues are spotted with the change, shall I commit it?
comment:6 by , 12 years ago
| Cc: | added |
|---|
comment:7 by , 12 years ago
tc.url(re.escape(url)), ah sure, makes sense. Please apply your follow-up.



See repos:cboos.git:t11302-wiki-edit-context.