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