c1b15d3e48
Used to fail is gitosis.repositories is not set.
95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
import os, logging
|
|
from ConfigParser import NoSectionError, NoOptionError
|
|
|
|
from gitosis import group
|
|
|
|
def haveAccess(config, user, mode, path):
|
|
"""
|
|
Map request for write access to allowed path.
|
|
|
|
Note for read-only access, the caller should check for write
|
|
access too.
|
|
|
|
Returns ``None`` for no access, or the physical repository path
|
|
for access granted to that repository.
|
|
"""
|
|
log = logging.getLogger('gitosis.access.haveAccess')
|
|
|
|
log.debug(
|
|
'Access check for %(user)r as %(mode)r on %(path)r...'
|
|
% dict(
|
|
user=user,
|
|
mode=mode,
|
|
path=path,
|
|
))
|
|
|
|
basename, ext = os.path.splitext(path)
|
|
if ext == '.git':
|
|
log.debug(
|
|
'Stripping .git suffix from %(path)r, new value %(basename)r'
|
|
% dict(
|
|
path=path,
|
|
basename=basename,
|
|
))
|
|
path = basename
|
|
|
|
for groupname in group.getMembership(config=config, user=user):
|
|
try:
|
|
repos = config.get('group %s' % groupname, mode)
|
|
except (NoSectionError, NoOptionError):
|
|
repos = []
|
|
else:
|
|
repos = repos.split()
|
|
|
|
mapping = None
|
|
|
|
if path in repos:
|
|
log.debug(
|
|
'Access ok for %(user)r as %(mode)r on %(path)r'
|
|
% dict(
|
|
user=user,
|
|
mode=mode,
|
|
path=path,
|
|
))
|
|
mapping = path
|
|
else:
|
|
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):
|
|
prefix = 'repositories'
|
|
|
|
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
|