Edgewall Software

Ticket #5025: move-support-for-new-ticket-URLs-in-process_newticket_request-r6692.diff

File move-support-for-new-ticket-URLs-in-process_newticket_request-r6692.diff, 3.2 KB (added by cboos, 4 years ago)

Don't modify req.args in match_request

  • trac/templates/error.html

    # HG changeset patch
    # User Christian Boos <cboos@neuf.fr>
    # Date 1206712277 -3600
    # Node ID baa36083f3a2a4e5de7ab0ad48c8542db50feb0a
    # Parent  fa5a3be904424e558dd86a3d9ecb4b6dc233e9ac
    Move the support for user-friendly /newticket URLs to the process_request method, so that request pre-processors can see the request arguments unmodified. Fixes #5025.
    
    Also reintroduces r6565, to avoid a regression on #5022.
    
    diff --git a/trac/templates/error.html b/trac/templates/error.html
    a b  
    5151  </head> 
    5252 
    5353  <py:def function="create_ticket(teo=False)"> 
    54     <input type="hidden" name="__preview" value="1" /> 
     54    <input type="hidden" name="preview" value="1" /> 
    5555    <input type="hidden" name="reporter" value="${get_reporter_id(req)}" /> 
    5656    <input py:if="teo" type="hidden" name="version" 
    5757           value="${'dev' in trac.version and 'devel' or trac.version}" /> 
  • trac/ticket/web_ui.py

    diff --git a/trac/ticket/web_ui.py b/trac/ticket/web_ui.py
    a b  
    3838from trac.ticket.notification import TicketNotifyEmail 
    3939from trac.timeline.api import ITimelineEventProvider 
    4040from trac.util import get_reporter_id, partition 
    41 from trac.util.compat import any 
     41from trac.util.compat import any, set 
    4242from trac.util.datefmt import to_timestamp, utc 
    4343from trac.util.text import CRLF, shorten_line, obfuscate_email_address 
    4444from trac.util.presentation import separated 
     
    139139 
    140140    def match_request(self, req): 
    141141        if re.match(r'/newticket/?$', req.path_info) is not None: 
    142             if req.method != 'POST': 
    143                 for k in req.args.keys(): 
    144                     if k.startswith('__'): # non field argument 
    145                         req.args[k[2:]] = req.args[k] 
    146                     else: 
    147                         req.args['field_'+k] = req.args[k] 
    148                     del req.args[k] 
    149142            return True 
    150143        match = re.match(r'/ticket/([0-9]+)$', req.path_info) 
    151144        if match: 
     
    154147 
    155148    def process_request(self, req): 
    156149        if 'id' in req.args: 
     150            if req.path_info.startswith('/newticket'): 
     151                raise TracError(_("id can't be set for a new ticket request.")) 
    157152            return self._process_ticket_request(req) 
    158153        return self._process_newticket_request(req) 
    159154 
     
    340335    def _process_newticket_request(self, req): 
    341336        req.perm.require('TICKET_CREATE') 
    342337        ticket = Ticket(self.env) 
     338 
     339        # support user-friendly URLs like /newticket?version=0.11&priority=low 
     340        field_names = set([f['name'] for f in ticket.fields]) 
     341        if req.method != 'POST': 
     342            for k in req.args.keys(): 
     343                if k in field_names: 
     344                    req.args['field_'+k] = req.args[k] 
     345                    del req.args[k] 
     346            # '__preview' used by deployed 0.11dev Tracs (up to beta2) 
     347            if '__preview' in req.args: 
     348                req.args['preview'] = True 
     349                del req.args['__preview'] 
    343350 
    344351        if req.method == 'POST' and 'field_owner' in req.args and \ 
    345352               'TICKET_MODIFY' not in req.perm: