Edgewall Software

Ticket #7116: trac-browser-fine-grained-security-for-directories.patch

File trac-browser-fine-grained-security-for-directories.patch, 2.1 KB (added by esizikov@…, 7 months ago)
  • trac/versioncontrol/web_ui/browser.py

     
    358358            'properties': xhr or self.render_properties('browser', context, 
    359359                                                        node.get_properties()), 
    360360            'path_links': path_links, 
    361             'dir': node.isdir and self._render_dir(req, repos, node, rev), 
     361            'dir': node.isdir and self._render_dir(req, context, repos, 
     362                                                   node, rev), 
    362363            'file': node.isfile and self._render_file(req, context, repos, 
    363364                                                      node, rev), 
    364365            'quickjump_entries': xhr or list(repos.get_quickjump_entries(rev)), 
     
    394395 
    395396    # Internal methods 
    396397 
    397     def _render_dir(self, req, repos, node, rev=None): 
    398         req.perm.require('BROWSER_VIEW') 
     398    def _render_dir(self, req, context, repos, node, rev=None): 
     399        req.perm(context.resource).require('BROWSER_VIEW') 
    399400 
    400401        # Entries metadata 
    401402        class entry(object): 
     
    403404            def __init__(self, node): 
    404405                for f in entry.__slots__: 
    405406                    setattr(self, f, getattr(n, f)) 
    406                  
    407         entries = [entry(n) for n in node.get_entries()] 
     407                     
     408        def test_perm_for_entry(n): 
     409            resource = Context.from_request(req, 
     410                                            context.resource.realm, 
     411                                            n.path, 
     412                                            n.created_rev).resource 
     413            if n.isdir: 
     414                try: 
     415                    req.perm(resource).require('BROWSER_VIEW') 
     416                    return True 
     417                except: 
     418                    pass 
     419                     
     420        entries = [entry(n) 
     421                   for n in node.get_entries() 
     422                   if test_perm_for_entry(n) 
     423                   ] 
    408424        changes = get_changes(repos, [i.rev for i in entries]) 
    409425 
    410426        if rev: