diff --git a/example.conf b/example.conf index 9e86d0a..935dccc 100644 --- a/example.conf +++ b/example.conf @@ -1,5 +1,5 @@ -# TODO commented sections not done yet -# [gitosis] +[gitosis] +repositories = repo [group quux] members = jdoe wsmith @anothergroup diff --git a/gitosis/access.py b/gitosis/access.py index 1146c2d..77be0c8 100644 --- a/gitosis/access.py +++ b/gitosis/access.py @@ -1,4 +1,4 @@ -import logging +import os, logging from ConfigParser import NoSectionError, NoOptionError from gitosis import group @@ -31,6 +31,8 @@ def haveAccess(config, user, mode, path): else: repos = repos.split() + mapping = None + if path in repos: log.debug( 'Access ok for %(user)r as %(mode)r on %(path)r' @@ -39,20 +41,45 @@ def haveAccess(config, user, mode, path): mode=mode, path=path, )) - return path - - try: - mapping = config.get('group %s' % groupname, - 'map %s %s' % (mode, path)) - except (NoSectionError, NoOptionError): - pass + mapping = path else: - log.debug( - 'Access ok for %(user)r as %(mode)r on %(path)r=%(mapping)r' - % dict( - user=user, - mode=mode, - path=path, - mapping=mapping, - )) + try: + mapping = config.get('group %s' % groupname, + 'map %s %s' % (mode, path)) + except (NoSectionError, NoOptionError): + pass + else: + log.debug( + 'Access ok for %(user)r as %(mode)r on %(path)r=%(mapping)r' + % dict( + user=user, + mode=mode, + path=path, + mapping=mapping, + )) + + if mapping is not None: + prefix = None + try: + prefix = config.get( + 'group %s' % groupname, 'repositories') + except (NoSectionError, NoOptionError): + try: + prefix = config.get('gitosis', 'repositories') + except (NoSectionError, NoOptionError): + pass + + if prefix is not None: + log.debug( + 'Using prefix %(prefix)r for %(path)r' + % dict( + prefix=prefix, + path=mapping, + )) + mapping = os.path.join(prefix, mapping) + log.debug( + 'New path is %(path)r' + % dict( + path=mapping, + )) return mapping diff --git a/gitosis/test/test_access.py b/gitosis/test/test_access.py index 00b1fe8..6e41a99 100644 --- a/gitosis/test/test_access.py +++ b/gitosis/test/test_access.py @@ -77,3 +77,46 @@ def test_read_yes_map_wouldHaveWritable(): cfg.set('group fooers', 'map writable foo/bar', 'quux/thud') eq(access.haveAccess(config=cfg, user='jdoe', mode='readonly', path='foo/bar'), None) + +def test_base_global_absolute(): + cfg = RawConfigParser() + cfg.add_section('gitosis') + cfg.set('gitosis', 'repositories', '/a/leading/path') + cfg.add_section('group fooers') + cfg.set('group fooers', 'members', 'jdoe') + cfg.set('group fooers', 'map writable foo/bar', 'baz/quux/thud') + eq(access.haveAccess( + config=cfg, user='jdoe', mode='writable', path='foo/bar'), + '/a/leading/path/baz/quux/thud') + +def test_base_global_relative(): + cfg = RawConfigParser() + cfg.add_section('gitosis') + cfg.set('gitosis', 'repositories', 'some/relative/path') + cfg.add_section('group fooers') + cfg.set('group fooers', 'members', 'jdoe') + cfg.set('group fooers', 'map writable foo/bar', 'baz/quux/thud') + eq(access.haveAccess( + config=cfg, user='jdoe', mode='writable', path='foo/bar'), + 'some/relative/path/baz/quux/thud') + +def test_base_global_relative_simple(): + cfg = RawConfigParser() + cfg.add_section('gitosis') + cfg.set('gitosis', 'repositories', 'some/relative/path') + cfg.add_section('group fooers') + cfg.set('group fooers', 'members', 'jdoe') + cfg.set('group fooers', 'readonly', 'foo xyzzy bar') + eq(access.haveAccess( + config=cfg, user='jdoe', mode='readonly', path='xyzzy'), + 'some/relative/path/xyzzy') + +def test_base_local(): + cfg = RawConfigParser() + cfg.add_section('group fooers') + cfg.set('group fooers', 'repositories', 'some/relative/path') + cfg.set('group fooers', 'members', 'jdoe') + cfg.set('group fooers', 'map writable foo/bar', 'baz/quux/thud') + eq(access.haveAccess( + config=cfg, user='jdoe', mode='writable', path='foo/bar'), + 'some/relative/path/baz/quux/thud')