id summary reporter owner description type status priority milestone component version severity resolution keywords cc branch changelog apichanges internalchanges 13253 UnicodeEncodeError raised while rendering timeline rss when author of event is unknown and unicode Jun Omae "I noticed UnicodeEncodeError raised while rendering timeline rss on production environment. {{{#!pycon 2020-02-12 18:42:48,520 ERROR: Genshi UnicodeEncodeError error while rendering template (unknown template location) Traceback (most recent call last): File ""/venv/lib/python2.7/site-packages/trac/web/chrome.py"", line 1180, in iterable_content for chunk in stream.serialize(method, **kwargs): File ""/venv/lib/python2.7/site-packages/genshi/output.py"", line 241, in __call__ for kind, data, pos in stream: File ""/venv/lib/python2.7/site-packages/genshi/output.py"", line 671, in __call__ for kind, data, pos in stream: File ""/venv/lib/python2.7/site-packages/genshi/output.py"", line 776, in __call__ for kind, data, pos in chain(stream, [(None, None, None)]): File ""/venv/lib/python2.7/site-packages/genshi/output.py"", line 596, in __call__ for ev in stream: File ""/venv/lib/python2.7/site-packages/genshi/core.py"", line 292, in _ensure for event in stream: File ""/venv/lib/python2.7/site-packages/genshi/core.py"", line 292, in _ensure for event in stream: File ""/venv/lib/python2.7/site-packages/genshi/template/base.py"", line 639, in _include for event in stream: File ""/venv/lib/python2.7/site-packages/genshi/template/markup.py"", line 327, in _match for event in stream: File ""/venv/lib/python2.7/site-packages/genshi/template/base.py"", line 579, in _flatten for kind, data, pos in stream: File ""/venv/lib/python2.7/site-packages/genshi/template/directives.py"", line 726, in __call__ value = _eval_expr(expr, ctxt, vars) File ""/venv/lib/python2.7/site-packages/genshi/template/base.py"", line 289, in _eval_expr retval = expr.evaluate(ctxt) File ""/venv/lib/python2.7/site-packages/genshi/template/eval.py"", line 178, in evaluate return eval(self.code, _globals, {'__data__': data}) File ""/venv/lib/python2.7/site-packages/trac/templates/author_or_creator.rss"", line 16, in File ""/venv/lib/python2.7/site-packages/genshi/template/eval.py"", line 338, in lookup_item val = getattr(obj, key, UNDEFINED) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-15: ordinal not in range(128) }}} The issue occurs when `email_map[author]` expression is evaluated in genshi template and `author` is not existent in `email_map` dict. ==== How to reproduce same exception {{{#!pycon >>> from genshi.template import MarkupTemplate >>> t = MarkupTemplate('') >>> unicode(t.generate(d={'key': 42}, k=u'\u200b'*16)) Traceback (most recent call last): File """", line 1, in File ""/venv/lib/python2.7/site-packages/genshi/core.py"", line 251, in __unicode__ return self.render(encoding=None) File ""/venv/lib/python2.7/site-packages/genshi/core.py"", line 184, in render return encode(generator, method=method, encoding=encoding, out=out) File ""/venv/lib/python2.7/site-packages/genshi/output.py"", line 57, in encode return _encode(''.join(list(iterator))) File ""/venv/lib/python2.7/site-packages/genshi/output.py"", line 241, in __call__ for kind, data, pos in stream: File ""/venv/lib/python2.7/site-packages/genshi/output.py"", line 671, in __call__ for kind, data, pos in stream: File ""/venv/lib/python2.7/site-packages/genshi/output.py"", line 776, in __call__ for kind, data, pos in chain(stream, [(None, None, None)]): File ""/venv/lib/python2.7/site-packages/genshi/output.py"", line 596, in __call__ for ev in stream: File ""/venv/lib/python2.7/site-packages/genshi/core.py"", line 274, in _ensure event = stream.next() File ""/venv/lib/python2.7/site-packages/genshi/template/base.py"", line 639, in _include for event in stream: File ""/venv/lib/python2.7/site-packages/genshi/template/markup.py"", line 327, in _match for event in stream: File ""/venv/lib/python2.7/site-packages/genshi/template/base.py"", line 579, in _flatten for kind, data, pos in stream: File ""/venv/lib/python2.7/site-packages/genshi/template/directives.py"", line 726, in __call__ value = _eval_expr(expr, ctxt, vars) File ""/venv/lib/python2.7/site-packages/genshi/template/base.py"", line 289, in _eval_expr retval = expr.evaluate(ctxt) File ""/venv/lib/python2.7/site-packages/genshi/template/eval.py"", line 178, in evaluate return eval(self.code, _globals, {'__data__': data}) File """", line 1, in File ""/venv/lib/python2.7/site-packages/genshi/template/eval.py"", line 338, in lookup_item val = getattr(obj, key, UNDEFINED) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-15: ordinal not in range(128) }}} ==== Proposed changes {{{#!diff diff --git a/trac/templates/author_or_creator.rss b/trac/templates/author_or_creator.rss index e0a21bf90..25af76675 100644 --- a/trac/templates/author_or_creator.rss +++ b/trac/templates/author_or_creator.rss @@ -13,7 +13,9 @@ Arguments: py:with=""email_map = value_of('email_map', None)"" py:strip=""""> - + ${format_author(author)} ${format_author(author)} diff --git a/trac/timeline/tests/web_ui.py b/trac/timeline/tests/web_ui.py index 8325198f3..4d24dbdf2 100644 --- a/trac/timeline/tests/web_ui.py +++ b/trac/timeline/tests/web_ui.py @@ -120,6 +120,22 @@ class TimelineModuleTestCase(unittest.TestCase): self.assertIn('prev', req.chrome['links']) + def test_render_rss_with_unicode_unknown_author(self): + self.env.config.set('trac', 'show_email_addresses', 'enabled') + self.env.known_users.append(('blah', 'Blah user', 'blah@example.org')) + req = MockRequest(self.env, path_info='/timeline', + args={'format': 'rss'}) + rv = TimelineModule(self.env).process_request(req) + self.assertEqual('timeline.rss', rv[0]) + event = ('mock', datetime_now(utc), u'jöé', None) + rv[1]['events'] = [ + {'kind': event[0], 'date': event[1], 'author': event[2], + 'data': event[3], 'event': event, 'provider': None, + 'dateuid': '42', 'render': lambda field, context: 'mock'}, + ] + output = Chrome(self.env).render_template(req, rv[0], rv[1], rv[2]) + self.assertIsNotNone(output) + def suite(): suite = unittest.TestSuite() }}}" defect closed normal 1.0.20 timeline normal fixed genshi Fix `UnicodeEncodeError` raised while rendering timeline rss when event's author is unknown and unicode.