Show More
@@ -0,0 +1,1 b'' | |||
|
1 | from pyramid.compat import configparser No newline at end of file |
@@ -209,7 +209,9 b' class RepoAppView(BaseAppView):' | |||
|
209 | 209 | try: |
|
210 | 210 | self.rhodecode_vcs_repo = self.db_repo.scm_instance() |
|
211 | 211 | if self.rhodecode_vcs_repo: |
|
212 |
|
|
|
212 | path_perms = self.rhodecode_vcs_repo.get_path_permissions( | |
|
213 | c.auth_user.username) | |
|
214 | self.path_filter = PathFilter(path_perms) | |
|
213 | 215 | else: |
|
214 | 216 | self.path_filter = PathFilter(None) |
|
215 | 217 | except RepositoryRequirementError as e: |
@@ -218,7 +220,7 b' class RepoAppView(BaseAppView):' | |||
|
218 | 220 | self.rhodecode_vcs_repo = None |
|
219 | 221 | self.path_filter = None |
|
220 | 222 | |
|
221 | c.path_filter = self.path_filter # used by atom_feed_entry.mako | |
|
223 | c.path_filter = self.path_filter # used by atom_feed_entry.mako | |
|
222 | 224 | |
|
223 | 225 | if (not c.repository_requirements_missing |
|
224 | 226 | and self.rhodecode_vcs_repo is None): |
@@ -244,7 +246,8 b' class RepoAppView(BaseAppView):' | |||
|
244 | 246 | return default |
|
245 | 247 | |
|
246 | 248 | def _get_f_path(self, matchdict, default=None): |
|
247 |
|
|
|
249 | f_path_match = self._get_f_path_unchecked(matchdict, default) | |
|
250 | return self.path_filter.assert_path_permissions(f_path_match) | |
|
248 | 251 | |
|
249 | 252 | |
|
250 | 253 | class PathFilter(object): |
@@ -639,10 +639,8 b' class BaseRepository(object):' | |||
|
639 | 639 | warnings.warn("Use in_memory_commit instead", DeprecationWarning) |
|
640 | 640 | return self.in_memory_commit |
|
641 | 641 | |
|
642 | # | |
|
643 | 642 | def get_path_permissions(self, username): |
|
644 | 643 | """ |
|
645 | ||
|
646 | 644 | Returns a path permission checker or None if not supported |
|
647 | 645 | |
|
648 | 646 | :param username: session user name |
@@ -1677,18 +1675,20 b' class PatternPathPermissionChecker(BaseP' | |||
|
1677 | 1675 | def __init__(self, includes, excludes): |
|
1678 | 1676 | self.includes = includes |
|
1679 | 1677 | self.excludes = excludes |
|
1680 |
self.includes_re = [] if not includes else [ |
|
|
1681 |
|
|
|
1678 | self.includes_re = [] if not includes else [ | |
|
1679 | re.compile(fnmatch.translate(pattern)) for pattern in includes] | |
|
1680 | self.excludes_re = [] if not excludes else [ | |
|
1681 | re.compile(fnmatch.translate(pattern)) for pattern in excludes] | |
|
1682 | 1682 | |
|
1683 | 1683 | @property |
|
1684 | 1684 | def has_full_access(self): |
|
1685 | 1685 | return '*' in self.includes and not self.excludes |
|
1686 | 1686 | |
|
1687 | 1687 | def has_access(self, path): |
|
1688 | for re in self.excludes_re: | |
|
1689 | if re.match(path): | |
|
1688 | for regex in self.excludes_re: | |
|
1689 | if regex.match(path): | |
|
1690 | 1690 | return False |
|
1691 | for re in self.includes_re: | |
|
1692 | if re.match(path): | |
|
1691 | for regex in self.includes_re: | |
|
1692 | if regex.match(path): | |
|
1693 | 1693 | return True |
|
1694 | return False No newline at end of file | |
|
1694 | return False |
@@ -28,7 +28,6 b' from itertools import chain' | |||
|
28 | 28 | from StringIO import StringIO |
|
29 | 29 | |
|
30 | 30 | from zope.cachedescriptors.property import Lazy as LazyProperty |
|
31 | from pyramid.compat import configparser | |
|
32 | 31 | |
|
33 | 32 | from rhodecode.lib.datelib import utcdate_fromtimestamp |
|
34 | 33 | from rhodecode.lib.utils import safe_unicode, safe_str |
@@ -40,6 +39,7 b' from rhodecode.lib.vcs.nodes import (' | |||
|
40 | 39 | FileNode, DirNode, NodeKind, RootNode, SubModuleNode, |
|
41 | 40 | ChangedFileNodesGenerator, AddedFileNodesGenerator, |
|
42 | 41 | RemovedFileNodesGenerator, LargeFileNode) |
|
42 | from rhodecode.lib.vcs.compat import configparser | |
|
43 | 43 | |
|
44 | 44 | |
|
45 | 45 | class GitCommit(base.BaseCommit): |
@@ -21,10 +21,9 b'' | |||
|
21 | 21 | """ |
|
22 | 22 | HG repository module |
|
23 | 23 | """ |
|
24 |
import |
|
|
24 | import os | |
|
25 | 25 | import logging |
|
26 | 26 | import binascii |
|
27 | import os | |
|
28 | 27 | import shutil |
|
29 | 28 | import urllib |
|
30 | 29 | |
@@ -32,8 +31,7 b' from zope.cachedescriptors.property impo' | |||
|
32 | 31 | |
|
33 | 32 | from rhodecode.lib.compat import OrderedDict |
|
34 | 33 | from rhodecode.lib.datelib import ( |
|
35 |
date_to_timestamp_plus_offset, utcdate_fromtimestamp, makedate |
|
|
36 | date_astimestamp) | |
|
34 | date_to_timestamp_plus_offset, utcdate_fromtimestamp, makedate) | |
|
37 | 35 | from rhodecode.lib.utils import safe_unicode, safe_str |
|
38 | 36 | from rhodecode.lib.vcs import connection, exceptions |
|
39 | 37 | from rhodecode.lib.vcs.backends.base import ( |
@@ -45,6 +43,7 b' from rhodecode.lib.vcs.backends.hg.inmem' | |||
|
45 | 43 | from rhodecode.lib.vcs.exceptions import ( |
|
46 | 44 | EmptyRepositoryError, RepositoryError, TagAlreadyExistError, |
|
47 | 45 | TagDoesNotExistError, CommitDoesNotExistError, SubrepoMergeError) |
|
46 | from rhodecode.lib.vcs.compat import configparser | |
|
48 | 47 | |
|
49 | 48 | hexlify = binascii.hexlify |
|
50 | 49 | nullid = "\0" * 20 |
@@ -778,6 +777,7 b' class MercurialRepository(BaseRepository' | |||
|
778 | 777 | else: |
|
779 | 778 | merge_possible = True |
|
780 | 779 | |
|
780 | needs_push = False | |
|
781 | 781 | if merge_possible: |
|
782 | 782 | try: |
|
783 | 783 | merge_commit_id, needs_push = shadow_repo._local_merge( |
@@ -892,36 +892,43 b' class MercurialRepository(BaseRepository' | |||
|
892 | 892 | self._remote.invalidate_vcs_cache() |
|
893 | 893 | |
|
894 | 894 | def get_path_permissions(self, username): |
|
895 |
hgacl_file = self.path |
|
|
895 | hgacl_file = os.path.join(self.path, '.hg/hgacl') | |
|
896 | ||
|
897 | def read_patterns(suffix): | |
|
898 | svalue = None | |
|
899 | try: | |
|
900 | svalue = hgacl.get('narrowhgacl', username + suffix) | |
|
901 | except configparser.NoOptionError: | |
|
902 | try: | |
|
903 | svalue = hgacl.get('narrowhgacl', 'default' + suffix) | |
|
904 | except configparser.NoOptionError: | |
|
905 | pass | |
|
906 | if not svalue: | |
|
907 | return None | |
|
908 | result = ['/'] | |
|
909 | for pattern in svalue.split(): | |
|
910 | result.append(pattern) | |
|
911 | if '*' not in pattern and '?' not in pattern: | |
|
912 | result.append(pattern + '/*') | |
|
913 | return result | |
|
914 | ||
|
896 | 915 | if os.path.exists(hgacl_file): |
|
897 | 916 | try: |
|
898 |
hgacl = |
|
|
917 | hgacl = configparser.RawConfigParser() | |
|
899 | 918 | hgacl.read(hgacl_file) |
|
900 | def read_patterns(suffix): | |
|
901 | svalue = None | |
|
902 | try: | |
|
903 | svalue = hgacl.get('narrowhgacl', username + suffix) | |
|
904 | except ConfigParser.NoOptionError: | |
|
905 | try: | |
|
906 | svalue = hgacl.get('narrowhgacl', 'default' + suffix) | |
|
907 | except ConfigParser.NoOptionError: | |
|
908 | pass | |
|
909 | if not svalue: | |
|
910 | return None | |
|
911 | result = ['/'] | |
|
912 | for pattern in svalue.split(): | |
|
913 | result.append(pattern) | |
|
914 | if '*' not in pattern and '?' not in pattern: | |
|
915 | result.append(pattern + '/*') | |
|
916 | return result | |
|
919 | ||
|
917 | 920 | includes = read_patterns('.includes') |
|
918 | 921 | excludes = read_patterns('.excludes') |
|
919 |
return BasePathPermissionChecker.create_from_patterns( |
|
|
922 | return BasePathPermissionChecker.create_from_patterns( | |
|
923 | includes, excludes) | |
|
920 | 924 | except BaseException as e: |
|
921 |
|
|
|
925 | msg = 'Cannot read ACL settings from {} on {}: {}'.format( | |
|
926 | hgacl_file, self.name, e) | |
|
927 | raise exceptions.RepositoryRequirementError(msg) | |
|
922 | 928 | else: |
|
923 | 929 | return None |
|
924 | 930 | |
|
931 | ||
|
925 | 932 | class MercurialIndexBasedCollectionGenerator(CollectionGenerator): |
|
926 | 933 | |
|
927 | 934 | def _commit_factory(self, commit_id): |
General Comments 0
You need to be logged in to leave comments.
Login now