diff -r 0b18604db95e -r 66de4555cefd mercurial/wireprotoserver.py --- a/mercurial/wireprotoserver.py Wed Mar 07 16:02:24 2018 -0800 +++ b/mercurial/wireprotoserver.py Wed Mar 07 16:18:52 2018 -0800 @@ -54,9 +54,10 @@ return ''.join(chunks) class httpv1protocolhandler(wireprototypes.baseprotocolhandler): - def __init__(self, req, ui): + def __init__(self, req, ui, checkperm): self._req = req self._ui = ui + self._checkperm = checkperm @property def name(self): @@ -139,6 +140,9 @@ return caps + def checkperm(self, perm): + return self._checkperm(perm) + # This method exists mostly so that extensions like remotefilelog can # disable a kludgey legacy method only over http. As of early 2018, # there are no other known users, so with any luck we can discard this @@ -146,7 +150,7 @@ def iscmd(cmd): return cmd in wireproto.commands -def parsehttprequest(repo, req, query): +def parsehttprequest(rctx, req, query, checkperm): """Parse the HTTP request for a wire protocol request. If the current request appears to be a wire protocol request, this @@ -156,6 +160,8 @@ ``req`` is a ``wsgirequest`` instance. """ + repo = rctx.repo + # HTTP version 1 wire protocol requests are denoted by a "cmd" query # string parameter. If it isn't present, this isn't a wire protocol # request. @@ -174,13 +180,13 @@ if not iscmd(cmd): return None - proto = httpv1protocolhandler(req, repo.ui) + proto = httpv1protocolhandler(req, repo.ui, + lambda perm: checkperm(rctx, req, perm)) return { 'cmd': cmd, 'proto': proto, - 'dispatch': lambda checkperm: _callhttp(repo, req, proto, cmd, - checkperm), + 'dispatch': lambda: _callhttp(repo, req, proto, cmd), 'handleerror': lambda ex: _handlehttperror(ex, req, cmd), } @@ -224,7 +230,7 @@ opts = {'level': ui.configint('server', 'zliblevel')} return HGTYPE, util.compengines['zlib'], opts -def _callhttp(repo, req, proto, cmd, checkperm): +def _callhttp(repo, req, proto, cmd): def genversion2(gen, engine, engineopts): # application/mercurial-0.2 always sends a payload header # identifying the compression engine. @@ -242,7 +248,7 @@ 'over HTTP')) return [] - checkperm(wireproto.commands[cmd].permission) + proto.checkperm(wireproto.commands[cmd].permission) rsp = wireproto.dispatch(repo, proto, cmd) @@ -392,6 +398,9 @@ def addcapabilities(self, repo, caps): return caps + def checkperm(self, perm): + pass + class sshv2protocolhandler(sshv1protocolhandler): """Protocol handler for version 2 of the SSH protocol."""