Edgewall Software

Ticket #2580: rss_html_escape.diff

File rss_html_escape.diff, 15.9 KB (added by cboos, 3 years ago)

patch on r2763, take 3

  • trac/db_default.py

     
    11# -*- coding: utf-8 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2005 Daniel Lundin <daniel@edgewall.com> 
     5# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    394395  ('trac', 'metanav', 'login,logout,settings,help,about'), 
    395396  ('trac', 'mainnav', 'wiki,timeline,roadmap,browser,tickets,newticket,search'), 
    396397  ('trac', 'permission_store', 'DefaultPermissionStore'), 
     398  ('trac', 'rss_escape_html', 'false'), 
    397399  ('logging', 'log_type', 'none'), 
    398400  ('logging', 'log_file', 'trac.log'), 
    399401  ('logging', 'log_level', 'DEBUG'), 
  • trac/ticket/web_ui.py

     
    240240                yield ('ticket_details', 'Ticket details', False) 
    241241 
    242242    def get_timeline_events(self, req, start, stop, filters): 
    243         rss = req.args.get('format') == 'rss' # Kludge 
     243        format = req.args.get('format') 
    244244 
    245245        status_map = {'new': ('newticket', 'created'), 
    246246                      'reopened': ('newticket', 'reopened'), 
     
    268268            kind, verb = status_map[status] 
    269269            title = util.Markup('Ticket <em title="%s">#%s</em> (%s) %s by %s', 
    270270                                summary, id, type, verb, author) 
    271             href = rss and self.env.abs_href.ticket(id) \ 
    272                    or self.env.href.ticket(id) 
     271            href = format == 'rss' and self.env.abs_href.ticket(id) or \ 
     272                   self.env.href.ticket(id) 
    273273 
    274274            if status == 'new': 
    275                 message = util.escape(summary) 
     275                message = summary 
    276276            else: 
    277277                message = util.Markup(info) 
    278278                if comment: 
    279                     if rss: 
     279                    if format == 'rss': 
    280280                        message += wiki_to_html(comment, self.env, req, db, 
    281281                                                absurls=True) 
    282282                    else: 
  • trac/ticket/report.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2004 Jonas Borgstr�jonas@edgewall.com> 
     5# Copyright (C) 2006 Christian Boos <cboos@neuf.fr> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    254255 
    255256        title, description, sql = self.get_info(db, id, args) 
    256257 
    257         if req.args.get('format') == 'sql': 
     258        format = req.args.get('format') 
     259        if format == 'sql': 
    258260            self._render_sql(req, id, title, description, sql) 
    259261            return 
    260262 
     
    344346                        id_val = row[id_cols[0]] 
    345347                        value['ticket_href'] = self.env.href.ticket(id_val) 
    346348                elif column == 'description': 
    347                     value['parsed'] = wiki_to_html(cell, self.env, req, db) 
     349                    descr = wiki_to_html(cell, self.env, req, db, 
     350                                         absurls=(format == 'rss')) 
     351                    if format == 'rss': 
     352                        descr = util.rss_escape_html(descr, self.config) 
     353                    value['parsed'] = descr 
    348354                elif column == 'reporter' and cell.find('@') != -1: 
    349355                    value['rss'] = cell 
    350356                elif column == 'report': 
     
    363369            row_idx += 1 
    364370        req.hdf['report.numrows'] = row_idx 
    365371 
    366         format = req.args.get('format') 
    367372        if format == 'rss': 
    368             self._render_rss(req) 
    369373            return 'report_rss.cs', 'application/rss+xml' 
    370374        elif format == 'csv': 
    371375            self._render_csv(req, cols, rows) 
     
    480484                                       .replace('\r',' ') 
    481485            req.write(sep.join(map(sanitize, row)) + '\r\n') 
    482486 
    483     def _render_rss(self, req): 
    484         # Escape HTML in the ticket summaries 
    485         item = req.hdf.getObj('report.items') 
    486         if item: 
    487             item = item.child() 
    488             while item: 
    489                 for col in ('summary', 'description.parsed'): 
    490                     nodename = 'report.items.%s.%s' % (item.name(), col) 
    491                     value = req.hdf.get(nodename, '') 
    492                     req.hdf[nodename] = value 
    493                 item = item.next() 
    494  
    495487    def _render_sql(self, req, id, title, description, sql): 
    496488        req.perm.assert_permission('REPORT_SQL_VIEW') 
    497489        req.send_response(200) 
  • trac/ticket/roadmap.py

     
    316316                title = Markup('Milestone <em>%s</em> completed', name) 
    317317                if format == 'rss': 
    318318                    href = self.env.abs_href.milestone(name) 
    319                     message = wiki_to_html(description or '--', self.env, 
    320                                            req, db, absurls=True) 
     319                    message = wiki_to_html(description, self.env, db, 
     320                                           absurls=True) 
    321321                else: 
    322322                    href = self.env.href.milestone(name) 
    323323                    message = wiki_to_oneliner(description, self.env, db, 
    324324                                               shorten=True) 
    325                 yield 'milestone', href, title, completed, None, message 
     325                yield 'milestone', href, title, completed, None, message or '--' 
    326326 
    327327    # IRequestHandler methods 
    328328 
  • trac/ticket/query.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2004-2005 Edgewall Software 
     3# Copyright (C) 2004-2006 Edgewall Software 
    44# Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 
     5# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    2122from trac.perm import IPermissionRequestor 
    2223from trac.ticket import Ticket, TicketSystem 
    2324from trac.util import escape, unescape, format_datetime, http_date, \ 
    24                       shorten_line, CRLF, Markup 
     25                      shorten_line, CRLF, Markup, rss_escape_html 
    2526from trac.web import IRequestHandler 
    2627from trac.web.chrome import add_link, add_stylesheet, INavigationContributor 
    2728from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiMacroProvider, \ 
     
    590591            result['href'] = self.env.abs_href.ticket(result['id']) 
    591592            if result['reporter'].find('@') == -1: 
    592593                result['reporter'] = '' 
    593             if result['description']: 
    594                 # str() cancels out the Markup() returned by wiki_to_html 
    595                 result['description'] = str(wiki_to_html(result['description'] or '', 
    596                                                          self.env, req, db, 
    597                                                          absurls=1)) 
    598594            if result['time']: 
    599595                result['time'] = http_date(result['time']) 
     596            if result['description']: 
     597                result['description'] = rss_escape_html(result['description'], 
     598                                                        self.config) 
    600599        req.hdf['query.results'] = results 
    601600        req.hdf['query.href'] = self.env.abs_href.query(group=query.group, 
    602601                groupdesc=query.groupdesc and 1 or None, 
  • trac/versioncontrol/web_ui/util.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 
     5# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    1314# history and logs, available at http://projects.edgewall.com/trac/. 
    1415# 
    1516# Author: Jonas Borgstr�jonas@edgewall.com> 
     17#         Christian Boos <cboos@neuf.fr> 
    1618 
    1719import re 
    1820import urllib 
    1921 
    2022from trac.util import escape, format_datetime, pretty_timedelta, shorten_line, \ 
    21                       TracError, Markup 
     23                      TracError, Markup, rss_escape_html 
    2224from trac.wiki import wiki_to_html, wiki_to_oneliner 
    2325 
    2426__all__ = ['get_changes', 'get_path_links', 'get_path_rev_line', 
     
    3032    for rev in revs: 
    3133        changeset = repos.get_changeset(rev) 
    3234        message = changeset.message or '--' 
    33         files = None 
     35        shortlog = wiki_to_oneliner(message, env, db, shorten=True) 
    3436        if format == 'changelog': 
    3537            files = [change[0] for change in changeset.get_changes()] 
    36         elif message: 
    37             if not full: 
    38                 message = wiki_to_oneliner(message, env, db, 
    39                                            shorten=True) 
    40             else: 
    41                 message = wiki_to_html(message, env, req, db, 
    42                                        absurls=(format == 'rss'), 
    43                                        escape_newlines=True) 
    44         if not message: 
    45             message = '--' 
     38        else: 
     39            files = None 
     40            message = full and wiki_to_html(message, env, req, db, 
     41                                            absurls=(format == 'rss'), 
     42                                            escape_newlines=True) or shortlog 
     43            if format == 'rss': 
     44                shortlog = rss_escape_html(shortlog) 
     45                message = rss_escape_html(message, env.config) 
    4646        changes[rev] = { 
    4747            'date_seconds': changeset.date, 
    4848            'date': format_datetime(changeset.date), 
    4949            'age': pretty_timedelta(changeset.date), 
    5050            'author': changeset.author or 'anonymous', 
    5151            'message': message, 
    52             'shortlog': shorten_line(message), 
     52            'shortlog': shortlog, 
    5353            'files': files 
    5454        } 
    5555    return changes 
  • trac/versioncontrol/web_ui/changeset.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 
    55# Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 
     6# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    67# All rights reserved. 
    78# 
    89# This software is licensed as described in the file COPYING, which 
     
    114115            for chgset in repos.get_changesets(start, stop): 
    115116                message = chgset.message or '--' 
    116117                if format == 'rss': 
    117                     title = util.Markup('Changeset <em>[%s]</em>: %s', 
    118                                         chgset.rev, util.shorten_line(message)) 
     118                    title = 'Changeset [%s]: %s' % \ 
     119                            (chgset.rev, util.shorten_line(message)) 
    119120                    href = self.env.abs_href.changeset(chgset.rev) 
    120121                    message = wiki_to_html(message, self.env, req, db, 
    121122                                           absurls=True) 
     
    129130                    files = [] 
    130131                    for chg in chgset.get_changes(): 
    131132                        if show_files > 0 and len(files) >= show_files: 
    132                             files.append('...') 
     133                            files.append('&#133;') # &hellip; 
    133134                            break 
    134                         files.append('<span class="%s">%s</span>' 
    135                                      % (chg[2], util.escape(chg[0]))) 
    136                     message = '<span class="changes">' + ', '.join(files) +\ 
    137                               '</span>: ' + message 
     135                        files.append('<span class="%s">%s</span>' % 
     136                                     (chg[2], util.escape(chg[0]))) 
     137                    message = util.Markup('<span class="changes">%s</span>: %s', 
     138                                          ', '.join(files), message) 
    138139                yield 'changeset', href, title, chgset.date, chgset.author,\ 
    139                       util.Markup(message) 
     140                      message 
    140141 
    141142    # Internal methods 
    142143 
  • trac/versioncontrol/web_ui/log.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 
     5# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    157158                if email: 
    158159                    email_map[username] = email 
    159160            for cs in changes.values(): 
    160                 cs['shortlog'] = cs['shortlog'].replace('\n', ' ') 
    161161                # For RSS, author must be an email address 
    162162                author = cs['author'] 
    163163                author_email = '' 
  • trac/Timeline.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 
    55# Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 
     6# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    67# All rights reserved. 
    78# 
    89# This software is licensed as described in the file COPYING, which 
     
    2122 
    2223from trac.core import * 
    2324from trac.perm import IPermissionRequestor 
    24 from trac.util import format_date, format_time, http_date, Markup 
     25from trac.util import format_date, format_time, http_date, Markup, \ 
     26                      rss_escape_html 
    2527from trac.web import IRequestHandler 
    2628from trac.web.chrome import add_link, add_stylesheet, INavigationContributor 
    2729 
     
    158160 
    159161            if format == 'rss': 
    160162                # Strip/escape HTML markup 
    161                 if isinstance(title, Markup): 
    162                     event['title'] = title.striptags() 
    163                 else: 
    164                     event['title'] = title 
     163                event['title'] = rss_escape_html(title) 
     164                event['message'] = rss_escape_html(message, self.config) 
    165165 
    166166                if author: 
    167167                    # For RSS, author must be an email address 
  • trac/util.py

     
    246246        return text 
    247247    return text.unescape() 
    248248 
     249ENTITIES = re.compile(r"&(?:\w+|#\d+);") 
     250def rss_escape_html(text, config=None): 
     251    if isinstance(text, Markup) and \ 
     252           not (config and config.getbool('trac', 'rss_escape_html')): 
     253        return re.sub(ENTITIES, '', text.striptags()) 
     254    else: 
     255        return str(text) 
     256 
     257 
    249258def to_utf8(text, charset='iso-8859-15'): 
    250259    """Convert a string to UTF-8, assuming the encoding is either UTF-8, ISO 
    251260    Latin-1, or as specified by the optional `charset` parameter."""