Edgewall Software

Ticket #5340: 5340-redirect-forbidden-login-r7455.patch

File 5340-redirect-forbidden-login-r7455.patch, 2.5 KB (added by Remy Blank <remy.blank@…>, 3 months ago)

Fixed patch that also works with TracForge

  • trac/web/api.py

    diff --git a/trac/web/api.py b/trac/web/api.py
    a b  
    181181                      doc='The HTTP method of the request') 
    182182    path_info = property(fget=lambda self: self.environ.get('PATH_INFO', '').decode('utf-8'), 
    183183                         doc='Path inside the application') 
     184    query_string = property(fget=lambda self: self.environ.get('QUERY_STRING', 
     185                                                               ''), 
     186                            doc='Query part of the request') 
    184187    remote_addr = property(fget=lambda self: self.environ.get('REMOTE_ADDR'), 
    185188                           doc='IP address of the remote user') 
    186189    remote_user = property(fget=lambda self: self.environ.get('REMOTE_USER'), 
  • trac/web/auth.py

    diff --git a/trac/web/auth.py b/trac/web/auth.py
    a b  
    197197 
    198198    def _redirect_back(self, req): 
    199199        """Redirect the user back to the URL she came from.""" 
    200         referer = req.get_header('Referer') 
     200        referer = self._referer(req) 
    201201        if referer and not (referer == req.base_url or \ 
    202202                referer.startswith(req.base_url.rstrip('/')+'/')): 
    203203            # only redirect to referer if it is from the same site 
    204204            referer = None 
    205205        req.redirect(referer or req.abs_href()) 
     206 
     207    def _referer(self, req): 
     208        return req.args.get('referer', req.get_header('Referer')) 
    206209 
    207210 
    208211class HTTPAuthentication(object): 
  • trac/web/href.py

    diff --git a/trac/web/href.py b/trac/web/href.py
    a b  
    129129            if type(value) in (list, tuple): 
    130130                for i in [i for i in value if i != None]: 
    131131                    params.append((name, i)) 
    132             elif v != None: 
     132            elif value != None: 
    133133                params.append((name, value)) 
    134134 
    135135        if args: 
  • trac/web/main.py

    diff --git a/trac/web/main.py b/trac/web/main.py
    a b  
    437437        data = {'title': title, 'type': 'TracError', 'message': e.detail, 
    438438                'frames': [], 'traceback': None} 
    439439        try: 
     440            if e.code == 403 and req.authname == 'anonymous': 
     441                referer = req.abs_href(req.path_info) 
     442                if req.query_string: 
     443                    referer += '?' + req.query_string 
     444                req.redirect(req.href('login', {'referer': referer})) 
    440445            req.send_error(sys.exc_info(), status=e.code, env=env, data=data) 
    441446        except RequestDone: 
    442447            pass