Edgewall Software

Ticket #5640: 5640-hide-forbidden-changesets-r8179.patch

File 5640-hide-forbidden-changesets-r8179.patch, 5.6 KB (added by rblank, 3 years ago)

Updated patch for current 0.11-stable head.

  • trac/versioncontrol/api.py

    diff --git a/trac/versioncontrol/api.py b/trac/versioncontrol/api.py
    a b  
    230230        return [] 
    231231     
    232232    def get_changeset(self, rev): 
    233         """Retrieve a Changeset corresponding to the  given revision `rev`.""" 
     233        """Retrieve a Changeset corresponding to the given revision `rev`.""" 
    234234        raise NotImplementedError 
    235235 
    236236    def get_changesets(self, start, stop): 
  • trac/versioncontrol/cache.py

    diff --git a/trac/versioncontrol/cache.py b/trac/versioncontrol/cache.py
    a b  
    1919from datetime import datetime 
    2020 
    2121from trac.core import TracError 
     22from trac.util.compat import any 
    2223from trac.util.datefmt import utc, to_timestamp 
    2324from trac.util.translation import _ 
    2425from trac.versioncontrol import Changeset, Node, Repository, Authorizer, \ 
     
    5657            yield category, name, path, rev 
    5758 
    5859    def get_changeset(self, rev): 
    59         return CachedChangeset(self.repos, self.repos.normalize_rev(rev), 
     60        cset = CachedChangeset(self.repos, self.repos.normalize_rev(rev), 
    6061                               self.getdb, self.authz) 
     62        if rev == 0 or any(cset.get_changes()): 
     63            return cset 
     64        raise NoSuchChangeset(rev) 
    6165 
    6266    def get_changesets(self, start, stop): 
    6367        db = self.getdb() 
     
    6872                       (to_timestamp(start), to_timestamp(stop))) 
    6973        for rev, in cursor: 
    7074            try: 
    71                 if self.authz.has_permission_for_changeset(rev): 
    72                     yield self.get_changeset(rev) 
     75                yield self.get_changeset(rev) 
    7376            except NoSuchChangeset: 
    74                 pass # skip changesets currently being resync'ed 
     77                # Skip unauthorized changesets and changesets currently being 
     78                # resync'ed 
     79                pass 
    7580 
    7681    def sync_changeset(self, rev): 
    7782        cset = self.repos.get_changeset(rev) 
     
    270275            args.append(path) 
    271276            sql += " OR " 
    272277            # changes on path children 
    273             sql += "path "+db.like() 
     278            sql += "path " + db.like() 
    274279            args.append(db.like_escape(path+'/') + '%') 
    275280            sql += " OR " 
    276281            # deletion of path ancestors 
     
    282287            sql += ")" 
    283288 
    284289        sql += " ORDER BY " + db.cast('rev', 'int') + \ 
    285                 (direction == '<' and " DESC" or "") + " LIMIT 1" 
     290                (direction == '<' and " DESC" or "") 
    286291         
    287292        cursor = db.cursor() 
    288293        cursor.execute(sql, args) 
    289294        for rev, in cursor: 
    290             return rev 
     295            if self.authz.has_permission_for_changeset(rev): 
     296                return rev 
    291297 
    292298    def rev_older_than(self, rev1, rev2): 
    293299        return self.repos.rev_older_than(rev1, rev2) 
  • trac/versioncontrol/svn_authz.py

    diff --git a/trac/versioncontrol/svn_authz.py b/trac/versioncontrol/svn_authz.py
    a b  
    2020 
    2121from trac.config import Option 
    2222from trac.core import * 
    23 from trac.versioncontrol import Authorizer 
     23from trac.versioncontrol import Authorizer, NoSuchChangeset 
    2424 
    2525 
    2626class SvnAuthzOptions(Component): 
     
    105105        return 0 
    106106 
    107107    def has_permission_for_changeset(self, rev): 
    108         changeset = self.repos.get_changeset(rev) 
    109         for change in changeset.get_changes(): 
    110             # the repository checks permissions for each change, so just check 
    111             # if any changes can be accessed 
     108        try: 
     109            changeset = self.repos.get_changeset(rev) 
    112110            return 1 
    113         return 0 
     111        except NoSuchChangeset: 
     112            return 0 
    114113 
    115114    # Internal API 
    116115 
  • trac/versioncontrol/svn_fs.py

    diff --git a/trac/versioncontrol/svn_fs.py b/trac/versioncontrol/svn_fs.py
    a b  
    6161from trac.versioncontrol.svn_authz import SubversionAuthorizer 
    6262from trac.versioncontrol.web_ui.browser import IPropertyRenderer 
    6363from trac.util import sorted, embedded_numbers, reversed 
     64from trac.util.compat import any 
    6465from trac.util.text import exception_to_unicode, to_unicode 
    6566from trac.util.translation import _ 
    6667from trac.util.datefmt import utc 
     
    506507 
    507508    def get_changeset(self, rev): 
    508509        rev = self.normalize_rev(rev) 
    509         return SubversionChangeset(rev, self.authz, self.scope, 
     510        cset = SubversionChangeset(rev, self.authz, self.scope, 
    510511                                   self.fs_ptr, self.pool) 
     512        if rev == 0 or any(cset.get_changes()): 
     513            return cset 
     514        raise NoSuchChangeset(rev) 
     515 
     516    def get_changesets(self, start, stop): 
     517        # Overrides Repository.get_changesets() to avoid calling 
     518        # get_changeset() twice for every changeset 
     519        rev = self.youngest_rev 
     520        while rev: 
     521            try: 
     522                chgset = self.get_changeset(rev) 
     523                if chgset.date < start: 
     524                    return 
     525                if chgset.date < stop: 
     526                    yield chgset 
     527            except NoSuchChangeset: 
     528                pass 
     529            rev = self.previous_rev(rev) 
    511530 
    512531    def get_node(self, path, rev=None): 
    513532        path = path or '' 
     
    544563            tmp1, tmp2 = tmp2, tmp1 
    545564            if history_ptr: 
    546565                path_utf8, rev = fs.history_location(history_ptr, tmp2()) 
     566                if not self.authz.has_permission_for_changeset(rev): 
     567                    continue 
    547568                tmp2.clear() 
    548569                if rev < end: 
    549570                    break 
     
    560581                return prev 
    561582        return None 
    562583     
    563  
    564584    def get_oldest_rev(self): 
    565585        if self.oldest is None: 
    566586            self.oldest = 1