diff -r 2f0ea1163b9e -r fd16d9a1234b src/mercurialserver/access.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/mercurialserver/access.py Fri Mar 06 09:15:00 2009 +0000 @@ -0,0 +1,51 @@ +# Copyright 2008-2009 LShift Ltd +# Copyright 2006 Vadim Gelfer +# +# Authors: +# Paul Crowley +# Vadim Gelfer +# +# This software may be used and distributed according to the terms +# of the GNU General Public License, incorporated herein by reference. + +from mercurial.i18n import _ +import mercurial.util +import mercurial.node + +import os +from mercurialserver import ruleset +from mercurialserver import changes + +class Checker(object): + '''acl checker.''' + + def __init__(self, ui, repo): + self.ui = ui + self.repo = repo + + self.rules = ruleset.rules_from_env() + self.rules.set(user = os.environ['REMOTE_USER']) + self.rules.set(repo = os.environ['HG_REPO_PATH']) + + def allow(self, ctx): + branch = ctx.branch() + if not self.rules.allow("write", branch=branch, file=None): + return False + for f in ctx.files(): + if not self.rules.allow("write", branch=branch, file=f): + return False + return True + + def check(self, ctx): + '''return if access allowed, raise exception if not.''' + if not self.allow(ctx): + raise mercurial.util.Abort(_('%s: access denied for changeset %s') % + (__name__, mercurial.node.short(ctx.node()))) + +def hook(ui, repo, hooktype, node=None, source=None, **kwargs): + if hooktype != 'pretxnchangegroup': + raise mercurial.util.Abort(_('config error - hook type "%s" cannot stop ' + 'incoming changesets') % hooktype) + c = Checker(ui, repo) + for ctx in changes.changes(repo, node): + c.check(ctx)