Graham Dumpleton
grahamd at dscpl.com.au
Fri Sep 1 00:04:36 EDT 2006
In my real job, we are finally converting to using subversion. Now although subversion when used through Apache still supports a level of user authorisation, whereby one can see if a user has read or read/write to different parts of a repository, the paths have to be listed in full, with no support for wildcarding. Also, you can't use its authorisation mechanism to implement a fine grained level of authorisation. For example, we want to allow users to be able to copy the trunk to a tags directory to effectively mark a specific version, and we want to be able to users to check out a copy of a tagged version, but we do not want to allow users to make changes to and commit back in changes into a tagged version of a package. So, mod_python to the rescue. from mod_python import apache import fnmatch BLOCK_URI = '/svn/drives/!svn/*/*/packages/tags/*/*/*' BLOCK_METHOD = [ 'MKCOL', 'PUT', 'PROPPATCH', 'CHECKOUT', 'MERGE', 'MKACTIVITY', 'LOCK', 'UNLOCK' ] def authzhandler(req): if fnmatch.fnmatch(req.uri, BLOCK_URI): if req.method in BLOCK_METHOD: return apache.HTTP_FORBIDDEN return apache.OK The associated Apache configuration is something like: <Location /svn> DAV svn SVNParentPath /usr/local/repository/subversion Require valid-user AuthzSVNAccessFile /usr/local/repository/svnserve.conf PythonInterpreter subversion_authz PythonPath 'sys.path + ["/usr/local/repository/handlers"]' PythonFixupHandler drives_authz::authzhandler PythonDebug On </Location> In the pattern being matched, '/svn/drives' identifies the actual repository root path in the URI. The '/packages/tags/*/*/*' is identifying the directories where we keep our tagged versions. The structure we use is: /packages/tags/package-name/package-version When creating a tag, subversion client uses "COPY" method, so making the copy still works. When doing commits, it needs to at least use 'CHECKOUT', and 'PUT'. Depending on what else it does, it could use the others in the block list. Anyway, end result is that people can't write over tagged versions. Gotta run now, so enjoy. Graham
|